diff --git a/android/app/build.gradle b/android/app/build.gradle index ce1e5c2..e1796ef 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -179,6 +179,7 @@ android { } dependencies { + implementation project(':@react-native-community_async-storage') implementation fileTree(dir: "libs", include: ["*.jar"]) implementation "com.facebook.react:react-native:+" // From node_modules diff --git a/android/app/src/main/java/com/ankilan/MainApplication.java b/android/app/src/main/java/com/ankilan/MainApplication.java index 69ee2fb..dcbf61c 100644 --- a/android/app/src/main/java/com/ankilan/MainApplication.java +++ b/android/app/src/main/java/com/ankilan/MainApplication.java @@ -4,6 +4,7 @@ import android.app.Application; import android.content.Context; import com.facebook.react.PackageList; import com.facebook.react.ReactApplication; +import com.reactnativecommunity.asyncstorage.AsyncStoragePackage; import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactPackage; import com.facebook.soloader.SoLoader; diff --git a/android/settings.gradle b/android/settings.gradle index af32d65..8078645 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,3 +1,5 @@ rootProject.name = 'ankilan' +include ':@react-native-community_async-storage' +project(':@react-native-community_async-storage').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/async-storage/android') apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) include ':app' diff --git a/ios/Podfile b/ios/Podfile index 74196d8..0cc14b5 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -34,6 +34,8 @@ target 'ankilan' do pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec' pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec' + pod 'RNCAsyncStorage', :path => '../node_modules/@react-native-community/async-storage' + target 'ankilanTests' do inherit! :search_paths # Pods for testing diff --git a/package.json b/package.json index e94eacd..ca8c2e0 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,10 @@ "lint": "eslint ." }, "dependencies": { + "@react-native-community/async-storage": "^1.8.1", "axios": "^0.19.2", "babel-preset-react-native": "^4.0.1", + "jsonfn": "^0.31.0", "native-base": "^2.13.8", "node-fetch": "^2.6.0", "react": "16.13.0", diff --git a/src/actions/anki-get-actions.js b/src/actions/anki-get-actions.js index 810053a..86d9343 100644 --- a/src/actions/anki-get-actions.js +++ b/src/actions/anki-get-actions.js @@ -69,7 +69,6 @@ export const getModelList = () => async dispatch => { if (err) { throw err; } - console.log(res); await dispatch(setModelList(res)); } catch (err) { console.log(err); diff --git a/src/actions/anki-set-actions.js b/src/actions/anki-set-actions.js index fb13d2c..19a7f06 100644 --- a/src/actions/anki-set-actions.js +++ b/src/actions/anki-set-actions.js @@ -1,8 +1,8 @@ -import {AnkiDroid} from 'react-native-ankidroid/dist/ankidroid'; import { SET_ANKI_NOTE_CREATOR, SET_CREATOR_TEMPLATE, SET_DECK, + SET_FIELDS, } from '../constants/anki-constants'; export const selectDeck = id => ({ @@ -19,3 +19,41 @@ export const setCreatorTemplate = template => ({ type: SET_CREATOR_TEMPLATE, payload: template, }); + +const parseToAnkiFormat = dict => { + /* +*** TEMPLATE *** +const modelFields = [ + 'Word or sentence', + 'Part of speech 1', + 'Translation 1', + 'Definition 1', + 'Part of speech 2', + 'Translation 2', + 'Definition 2', + 'Usage example', + 'Transcription', + 'Sound', +] +*/ + + const tr1 = dict.compounded[0]; + const tr2 = dict.compounded[1] || {}; + return [ + dict.word, + tr1.pos, + tr1.tr, + tr1.definition, + tr2.pos || '', + tr2.tr || '', + tr2.definition || '', + `${tr1.example || ''} \n ${tr2.example || ''}`, + dict.pronunciation, + `[sound:${dict.sound}]`, + ]; +}; + +export const setFields = dict => ({ + type: SET_FIELDS, + payload: parseToAnkiFormat(dict), +}); diff --git a/src/actions/api/dictionary.js b/src/actions/api/dictionary.js index f58ee61..cfbf269 100644 --- a/src/actions/api/dictionary.js +++ b/src/actions/api/dictionary.js @@ -1,6 +1,7 @@ import {search} from 'urban-dictionary-client'; import { SET_AVAILABLE_API, + SET_PARSED_DICTIONARY, URBAN_DICTIONARY_API, WORDS_API, } from '../../constants/api-constants'; @@ -11,6 +12,8 @@ import { parseUrbanDictionaryApi, } from './urban-dictionary'; import {createDictionary} from '../dictionary/create-dictionary'; +import {setFields} from '../anki-set-actions'; +import {sendWord, submit} from '../form-actions'; const getAvailableApi = (apiArray = []) => { for (const api of apiArray) { @@ -25,6 +28,10 @@ const setAvailableApi = api => ({ type: SET_AVAILABLE_API, payload: api, }); +const setDictioanry = dictioanry => ({ + type: SET_PARSED_DICTIONARY, + payload: dictioanry, +}); export const wordInfo = word => async dispatch => { try { @@ -40,7 +47,9 @@ export const wordInfo = word => async dispatch => { //function which return universal template for more simple interaction with api //TODO available dictionary instead api1 await dispatch(setAvailableApi(api1)); - await createDictionary(api1); + const wordDictionary = await createDictionary(api1); + dispatch(setDictioanry(wordDictionary)); + sendWord(setFields(wordDictionary)); } catch (e) { console.log(e); } diff --git a/src/actions/api/f-json.js b/src/actions/api/f-json.js new file mode 100644 index 0000000..7285e89 --- /dev/null +++ b/src/actions/api/f-json.js @@ -0,0 +1,27 @@ +// The object +// the string version of a function with /Function( +// in front and )/ at the end. +export const fJsonStingify = obj => { + return JSON.stringify(obj, function(key, value) { + if (typeof value === 'function') { + return '/Function(' + value.toString() + ')/'; + } + return value; + }); +}; +// Convert to an object using a reviver function that +// recognizes the /Function(...)/ value and converts it +// into a function via -shudder- `eval`. +export const fJsonParse = json => { + return JSON.parse(json, function(key, value) { + if ( + typeof value === 'string' && + value.startsWith('/Function(') && + value.endsWith(')/') + ) { + value = value.substring(10, value.length - 2); + return eval('(' + value + ')'); + } + return value; + }); +}; diff --git a/src/actions/api/word-sound.js b/src/actions/api/word-sound.js index 2b561a1..bdf2726 100644 --- a/src/actions/api/word-sound.js +++ b/src/actions/api/word-sound.js @@ -1,12 +1,11 @@ const getAudio = async word => { - const site = await fetch(word, { + const site = await fetch(`https://www.lexico.com/definition/${word}`, { method: 'GET', headers: {'Content-Type': 'text/html'}, }); const html = await site.text(); const getSrc = new RegExp(''); const src = html.match(getSrc)[1]; - console.log(src); return src; }; diff --git a/src/actions/api/yandex-dictionary.js b/src/actions/api/yandex-dictionary.js index f95c7a9..a14eef3 100644 --- a/src/actions/api/yandex-dictionary.js +++ b/src/actions/api/yandex-dictionary.js @@ -13,7 +13,6 @@ const yDictionary = async ( {method: 'GET'}, ); const json = await res.json(); - // console.log(word, json.def); return findPartofSpeech(json.def); } catch (e) { console.log('err in yandex-dictionary.js: ', e); diff --git a/src/actions/createAnkiLanModel.js b/src/actions/createAnkiLanModel.js index 5e0f5ae..99589fc 100644 --- a/src/actions/createAnkiLanModel.js +++ b/src/actions/createAnkiLanModel.js @@ -1,177 +1,35 @@ import {AnkiDroid} from 'react-native-ankidroid/dist/ankidroid'; import {setAnkiNoteCreator, setCreatorTemplate} from './anki-set-actions'; +import sendDataToLocaleStorage from './filesystem'; +import setSettings, { + modelFields, + valueFields, +} from '../constants/anki-model-values'; import { checkAnkiLanModelForExisting, getFieldList, getModelList, } from './anki-get-actions'; +import JSONfn from 'jsonfn'; +import store from '../store'; export const createAnkiLanModel = model => async dispatch => { try { - const deckName = model.deck.name; - const modelName = model.name; - const dbDeckReference = 'com.anki.decks'; - const dbModelReference = 'com.anki.models'; - const tags = ['AnkiLan']; - const modelFields = [ - 'Word or sentence', - 'Part of speech 1', - 'Translation 1', - 'Definition 1', - 'Part of speech 2', - 'Translation 2', - 'Definition 2', - 'Usage example', - 'Transcription', - 'Sound', - ]; - const cardNames = ['Russian>English', 'English>Russian']; - const css = `.card { - font-family: 'Roboto', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif; - font-size: 24px; - text-align: center; - color: black; - background-color: white; - word-wrap: break-word; - } + const settings = setSettings(model); - .big { - font-size: 48px; - } - - .small { - font-size: 18px; - } - - .sound--container { - display: flex; - justify-content: center; - padding: 0px; - align-items: center; - } - - .sound { - padding-left: 10px; - } - - .transcription { - color: #1e7efc; - font-weight: bold; - } - .list{ - list-style: none; - display: flex; - flex-direction:column; - align-items:center; - padding: 0; - } - .definition{ - font-size: 20px; - font-famyli: sans-serif; - font-style: italic; - display: block; - margin: 7px ; - padding: 0 20px ; - white-space: normal; - width: 70vw; - } - .usage{ - background-color: rgba(100,100,100,0.1); - padding: 10px; - font-size: 20px; - white-space: normal; - width: 70vw; - margin: 0 auto; - border-radius: 5px; - }`; - - const questionFmt1 = ` -
{{Word or sentence}}
- -
-
{{Transcription}}
- {{Sound}} - `; - - const questionFmt2 = '
{{Translation 1}}
'; - - const questionFormat = [questionFmt1, questionFmt2]; - - const answerFmt1 = ` -
{{Word or sentence}}
-
-
{{Transcription}}
- {{Sound}} -
-
-
{{Usage example}}
-
- -
`; - const answerFormat = [answerFmt1, answerFmt1]; - - // ADDING NOTES // - - const deckProperties = { - name: deckName, - reference: dbDeckReference, - }; - const modelProperties = { - name: modelName, - reference: dbModelReference, - fields: modelFields, - tags, - cardNames, - questionFormat, - answerFormat, - css, - }; - - const valueFields = [ - 'AnkiLan', - 'Translate by typing the word', - '', - 'You can type the word in input field and get translate, sound and definition of this word', - 'Translate via sharing', - '', - 'You can mark the word in you phone and share it with AnkiLan', - 'IMAGE WILL BE HERE', - 'guide', - '', - ]; - - const settings = { - modelId: undefined, - modelProperties: modelProperties, - deckId: model.deck.id, - deckProperties: deckProperties, - }; const selectedDeck = new AnkiDroid(settings); await dispatch(setAnkiNoteCreator(selectedDeck)); await dispatch(setCreatorTemplate(modelFields)); + // const sd = JSON.parse(JSON.stringify(selectedDeck)); + // console.log(sd === selectedDeck); + // **************** + alert('oh shit'); addNote(selectedDeck, valueFields, modelFields); + // **************** + // sendDataToLocaleStorage( + // setAnkiNoteCreator(sd), //send creator to locale storage + // setCreatorTemplate(modelFields), + // ); checkAnkiLanModelForExisting(model.name, model.list); await dispatch(getModelList()); await dispatch(getFieldList(model.name)); @@ -180,6 +38,15 @@ export const createAnkiLanModel = model => async dispatch => { } }; -export const addNote = (creator, words, template) => { +//creator is an object what have to store in locale storage. +export const addNote = words => { + const template = store.getState().anki.noteTemplate; + const settings = { + deckId: '1', + modelId: '1585139654585', + }; + const creator = new AnkiDroid(settings); + creator.addNote(words, template); + alert('sucssess'); }; diff --git a/src/actions/dictionary/create-dictionary.js b/src/actions/dictionary/create-dictionary.js index 470be96..0aa7bf2 100644 --- a/src/actions/dictionary/create-dictionary.js +++ b/src/actions/dictionary/create-dictionary.js @@ -5,6 +5,7 @@ import {compoundWithYDictionary} from './get-translate'; export const createDictionary = async apiRes => { const word = apiRes.word; const parsedDictionary = parseDictionary(apiRes); - // const audio = await getAudio(word); - await compoundWithYDictionary(parsedDictionary, word); + const audio = await getAudio(word); + const compounded = await compoundWithYDictionary(parsedDictionary, word); + return {...compounded, sound: audio}; }; diff --git a/src/actions/dictionary/get-translate.js b/src/actions/dictionary/get-translate.js index 788a579..f4955fd 100644 --- a/src/actions/dictionary/get-translate.js +++ b/src/actions/dictionary/get-translate.js @@ -5,7 +5,6 @@ export const compoundWithYDictionary = async (definitionList, word) => { let compounded = []; // console.log('YANDEX ', translations); // console.log('WORDS', definitionList); - translations.forEach(translate => { definitionList.words.forEach(definition => { if (definition.pos === translate.pos) { @@ -17,7 +16,12 @@ export const compoundWithYDictionary = async (definitionList, word) => { compounded.push(translate); } }); - console.log(`RESPONSE FOR: ${word}`, compounded); + // console.log(`RESPONSE FOR: ${word}`, {word, compounded}); + return { + word, + pronunciation: `/${definitionList.pronunciation}/`, + compounded, + }; } catch (e) { console.log('erris HERE', e); } @@ -35,6 +39,5 @@ export const compoundWithYDictionary = async (definitionList, word) => { }); })(); const yDictionaryRes = smallStore.res.payload; - alert('foo'); console.log(yDictionaryRes, definitionList); };*/ diff --git a/src/actions/filesystem.js b/src/actions/filesystem.js new file mode 100644 index 0000000..aad5d6d --- /dev/null +++ b/src/actions/filesystem.js @@ -0,0 +1,48 @@ +import AsyncStorage from '@react-native-community/async-storage'; +import { + ANKILAN_NOTE_CREATOR, + ANKILAN_NOTE_TEMPLATE, +} from '../constants/anki-constants'; +import JSONfn from 'jsonfn'; + +const sendDataToLocaleStorage = async (creator, template) => { + try { + await AsyncStorage.clear(); + + await AsyncStorage.setItem(ANKILAN_NOTE_CREATOR, JSONfn.stringify(creator)); + await AsyncStorage.setItem( + ANKILAN_NOTE_TEMPLATE, + JSONfn.stringify(template), + ); + } catch (e) { + // saving error + alert('Error while syncing with filesystem'); + console.log(e); + } +}; +export default sendDataToLocaleStorage; + +export const getTemplate = async () => { + try { + const value = await AsyncStorage.getItem(ANKILAN_NOTE_TEMPLATE); + console.log(value); + if (value !== null) { + // value previously stored + return JSONfn.parse(value); + } + } catch (e) { + // error reading value + } +}; + +export const getCreator = async () => { + try { + const value = await AsyncStorage.getItem(ANKILAN_NOTE_CREATOR); + if (value !== null) { + // value previously stored + return JSONfn.parse(value); + } + } catch (e) { + // error reading value + } +}; diff --git a/src/actions/form-actions.js b/src/actions/form-actions.js new file mode 100644 index 0000000..9f6bf0a --- /dev/null +++ b/src/actions/form-actions.js @@ -0,0 +1,12 @@ +import {getCreator, getTemplate} from './filesystem'; +import {addNote} from './createAnkiLanModel'; + +export const submit = () => ({}); +export const sendWord = async fields => { + // const creator = await getCreator(); + // const template = JSON.parse(await getTemplate()).payload; + // console.log(creator); + // console.log(template); + console.log(fields); + addNote(fields.payload); +}; diff --git a/src/components/anki-form.jsx b/src/components/anki-form.jsx index 24c1316..de9c3a3 100644 --- a/src/components/anki-form.jsx +++ b/src/components/anki-form.jsx @@ -1,4 +1,4 @@ -import React, {useEffect} from 'react'; +import React, {useEffect, useState} from 'react'; import {connect} from 'react-redux'; import DeckPicker from './view/deck-picker'; import {Form, Container, Item} from 'native-base'; @@ -8,22 +8,30 @@ import SubmitButton from './view/submit-button'; import {wordInfo} from "../actions/api/dictionary"; const AnkiForm = props => { + const [target, setTarget] = useState('') useEffect(() => { - props.wordInfo('Urge'); - props.wordInfo('Maze'); - props.wordInfo('Ramification'); - props.wordInfo('Dare'); - props.wordInfo('Entrepreneurship'); - props.wordInfo('meagre'); - props.wordInfo('meager'); + // props.wordInfo('Urge'); + // props.wordInfo('Maze'); + // props.wordInfo('Ramification'); + // props.wordInfo('Dare'); + // props.wordInfo('Entrepreneurship'); + // props.wordInfo('meagre'); + // props.wordInfo('meager'); }, []); + const getWord = (word) => { + setTarget(word) + }; + const submit = () => { + props.wordInfo(target); + }; + return ( -
alert('hell')}> + - - + +
); diff --git a/src/components/view/submit-button.jsx b/src/components/view/submit-button.jsx index 874f26e..8dc8eea 100644 --- a/src/components/view/submit-button.jsx +++ b/src/components/view/submit-button.jsx @@ -4,9 +4,10 @@ import {Button, Text} from 'native-base'; const SubmitButton = props => { return ( - ); }; -export default connect()(SubmitButton); +export default SubmitButton + diff --git a/src/components/view/translatable-word.jsx b/src/components/view/translatable-word.jsx index 892a377..b7c7d08 100644 --- a/src/components/view/translatable-word.jsx +++ b/src/components/view/translatable-word.jsx @@ -1,9 +1,11 @@ -import React from 'react'; +import React, {useRef} from 'react'; import {connect} from 'react-redux'; import {TextField} from 'react-native-material-textfield'; const InputWord = props => { - const submit = () => {}; - return ; + const sendWord = (word) => { + props.word(word) + }; + return sendWord(word)} onSubmitEditing={props.onSubmit}/>; }; export default connect(state => ({}), {})(InputWord); diff --git a/src/constants/anki-constants.js b/src/constants/anki-constants.js index eeee433..75b2927 100644 --- a/src/constants/anki-constants.js +++ b/src/constants/anki-constants.js @@ -17,7 +17,12 @@ export const SET_WORD_SOUND = 'SET_WORD_SOUND'; export const SET_WORD_TRANSLATE = 'SET_WORD_TRANSLATE'; export const SET_ANKI_NOTE_CREATOR = 'SET_ANKI_NOTE_CREATOR'; export const SET_CREATOR_TEMPLATE = 'SET_CREATOR_TEMPLATE'; +export const SET_FIELDS = 'SET_FIELDS'; //Anki ui actions export const SHOW_FIELDS = 'SHOW_FIELDS'; // Anki check actions export const SET_EXISTING_OF_ANKI_LAN_MODEL = 'SET_EXISTING_OF_ANKI_LAN_MODEL'; + +//rn-async-storage kesy +export const ANKILAN_NOTE_CREATOR = '@ANKILAN_NOTE_CREATOR'; +export const ANKILAN_NOTE_TEMPLATE = '@ANKILAN_NOTE_TEMPLATE'; diff --git a/src/constants/anki-model-values.js b/src/constants/anki-model-values.js new file mode 100644 index 0000000..e145dca --- /dev/null +++ b/src/constants/anki-model-values.js @@ -0,0 +1,165 @@ +export const modelFields = [ + 'Word or sentence', + 'Part of speech 1', + 'Translation 1', + 'Definition 1', + 'Part of speech 2', + 'Translation 2', + 'Definition 2', + 'Usage example', + 'Transcription', + 'Sound', +]; + +export const valueFields = [ + 'AnkiLan', + 'Translate by typing the word', + '', + 'You can type the word in input field and get translate, sound and definition of this word', + 'Translate via sharing', + '', + 'You can mark the word in you phone and share it with AnkiLan', + 'IMAGE WILL BE HERE', + 'guide', + '', +]; + +const setSettings = model => { + const deckName = model.deck.name; + const modelName = model.name; + const dbDeckReference = 'com.anki.decks'; + const dbModelReference = 'com.anki.models'; + const tags = ['AnkiLan']; + + const cardNames = ['Russian>English', 'English>Russian']; + const css = `.card { + font-family: 'Roboto', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif; + font-size: 24px; + text-align: center; + color: black; + background-color: white; + word-wrap: break-word; + } + + .big { + font-size: 48px; + } + + .small { + font-size: 18px; + } + + .sound--container { + display: flex; + justify-content: center; + padding: 0px; + align-items: center; + } + + .sound { + padding-left: 10px; + } + + .transcription { + color: #1e7efc; + font-weight: bold; + } + .list{ + list-style: none; + display: flex; + flex-direction:column; + align-items:center; + padding: 0; + } + .definition{ + font-size: 20px; + font-famyli: sans-serif; + font-style: italic; + display: block; + margin: 7px ; + padding: 0 20px ; + white-space: normal; + width: 70vw; + } + .usage{ + background-color: rgba(100,100,100,0.1); + padding: 10px; + font-size: 20px; + white-space: normal; + width: 70vw; + margin: 0 auto; + border-radius: 5px; + }`; + + const questionFmt1 = ` +
{{Word or sentence}}
+
    +
  • +
    {{Part of speech 1}}
    +
  • +
  • +
    {{Part of speech 2}}
    +
  • +
+
+
{{Transcription}}
+ {{Sound}} + `; + + const questionFmt2 = '
{{Translation 1}}
'; + + const questionFormat = [questionFmt1, questionFmt2]; + + const answerFmt1 = ` +
{{Word or sentence}}
+
+
{{Transcription}}
+ {{Sound}} +
+
+
{{Usage example}}
+
+
    +
  • +
    +
    {{Part of speech 1}}
    +
    {{Definition 1}}
    +
    {{Translation 1}}
    +
    +
  • +
  • +
    +
    {{Part of speech 2}}
    +
    {{Definition 2}}
    +
    {{Translation 2}}
    +
    +
  • +
+
`; + const answerFormat = [answerFmt1, answerFmt1]; + + // ADDING NOTES // + + const deckProperties = { + name: deckName, + reference: dbDeckReference, + }; + const modelProperties = { + name: modelName, + reference: dbModelReference, + fields: modelFields, + tags, + cardNames, + questionFormat, + answerFormat, + css, + }; + + return { + modelId: undefined, + modelProperties: modelProperties, + deckId: model.deck.id, + deckProperties: deckProperties, + }; +}; +export default setSettings; diff --git a/src/reducers/anki-reducer.js b/src/reducers/anki-reducer.js index fc1bfb8..5c4d4ee 100644 --- a/src/reducers/anki-reducer.js +++ b/src/reducers/anki-reducer.js @@ -20,7 +20,7 @@ const initialState = { mainFieldIsAvailable: false, fieldList: [], ankiLanModelIsAlreadyExists: false, - ankiLanModelName: 'AnkiLan3', + ankiLanModelName: '1AnkiLan1111', noteCreator: {}, noteTemplate: [], }; diff --git a/src/reducers/api-reducer.js b/src/reducers/api-reducer.js index 13a5f96..b595531 100644 --- a/src/reducers/api-reducer.js +++ b/src/reducers/api-reducer.js @@ -1,5 +1,6 @@ import { SET_AVAILABLE_API, + SET_PARSED_DICTIONARY, SET_YANDEX_DICTIONARY_RESPONSE, } from '../constants/api-constants'; @@ -26,6 +27,11 @@ const apiReducer = (state = initialState, action) => { availableApi: action.payload, availableApiName: action.payload.source, }; + case SET_PARSED_DICTIONARY: + return { + ...state, + parsedDictionary: action.payload, + }; default: return state; } diff --git a/yarn.lock b/yarn.lock index 13f78ba..0bf8f72 100644 --- a/yarn.lock +++ b/yarn.lock @@ -928,6 +928,11 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" +"@react-native-community/async-storage@^1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@react-native-community/async-storage/-/async-storage-1.8.1.tgz#c93e69dcf948667b207e409b8039b7edf199159b" + integrity sha512-MA1fTp4SB7OOtDmNAwds6jIpiwwty1NIoFboWjEWkoyWW35zIuxlhHxD4joSy21aWEzUVwvv6JJ2hSsP/HTb7A== + "@react-native-community/cli-debugger-ui@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-3.0.0.tgz#d01d08d1e5ddc1633d82c7d84d48fff07bd39416" @@ -2744,9 +2749,9 @@ data-urls@^1.1.0: whatwg-url "^7.0.0" dayjs@^1.8.15: - version "1.8.22" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.22.tgz#5e835d776b373e216678be8d12c336da71a25a9c" - integrity sha512-N8IXfxBD62Y9cKTuuuSoOlCXRnnzaTj1vu91r855iq6FbY5cZqOZnW/95nUn6kJiR+W9PHHrLykEoQOe6fUKxQ== + version "1.8.23" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.23.tgz#07b5a8e759c4d75ae07bdd0ad6977f851c01e510" + integrity sha512-NmYHMFONftoZbeOhVz6jfiXI4zSiPN6NoVWJgC0aZQfYVwzy/ZpESPHuCcI0B8BUMpSJQ08zenHDbofOLKq8hQ== debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: version "2.6.9" @@ -3049,9 +3054,9 @@ eslint-plugin-prettier@2.6.2: jest-docblock "^21.0.0" eslint-plugin-react-hooks@^2.0.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.5.0.tgz#c50ab7ca5945ce6d1cf8248d9e185c80b54171b6" - integrity sha512-bzvdX47Jx847bgAYf0FPX3u1oxU+mKU8tqrpj4UX9A96SbAmj/HVEefEy6rJUog5u8QIlOPTKZcBpGn5kkKfAQ== + version "2.5.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.5.1.tgz#4ef5930592588ce171abeb26f400c7fbcbc23cd0" + integrity sha512-Y2c4b55R+6ZzwtTppKwSmK/Kar8AdLiC2f9NADCuxbcTgPPg41Gyqa6b9GppgXSvCtkRw43ZE86CT5sejKC6/g== eslint-plugin-react-native-globals@^0.1.1: version "0.1.2" @@ -3696,9 +3701,9 @@ fs.realpath@^1.0.0: integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.2.7: - version "1.2.11" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" - integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== + version "1.2.12" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c" + integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q== dependencies: bindings "^1.5.0" nan "^2.12.1" @@ -5001,11 +5006,11 @@ json-stringify-safe@~5.0.1: integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json5@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" - integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== + version "2.1.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e" + integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ== dependencies: - minimist "^1.2.0" + minimist "^1.2.5" jsonfile@^2.1.0: version "2.4.0" @@ -5021,6 +5026,11 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfn@^0.31.0: + version "0.31.0" + resolved "https://registry.yarnpkg.com/jsonfn/-/jsonfn-0.31.0.tgz#8cd09ee376d46df75c2c0de3c548a95dbb81dc8b" + integrity sha1-jNCe43bUbfdcLA3jxUipXbuB3Is= + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -5675,17 +5685,12 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - minimist@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.0.tgz#cdf225e8898f840a258ded44fc91776770afdc93" integrity sha1-zfIl6ImPhAolje1E/JF3Z3Cv3JM= -minimist@^1.1.1, minimist@^1.2.0: +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -5699,11 +5704,11 @@ mixin-deep@^1.2.0: is-extendable "^1.0.1" mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c" + integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg== dependencies: - minimist "0.0.8" + minimist "^1.2.5" moment@2.x.x: version "2.24.0" @@ -6435,9 +6440,9 @@ promise@^7.1.1: asap "~2.0.3" prompts@^2.0.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.1.tgz#b63a9ce2809f106fa9ae1277c275b167af46ea05" - integrity sha512-qIP2lQyCwYbdzcqHIUi2HAxiWixhoM9OdLCWf8txXsapC/X9YdsCoeyRIXE/GP+Q0J37Q7+XN/MFqbUa7IzXNA== + version "2.3.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" + integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== dependencies: kleur "^3.0.3" sisteransi "^1.0.4" @@ -6533,9 +6538,9 @@ react-devtools-core@^3.6.3: ws "^3.3.1" react-is@^16.12.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0: - version "16.13.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.0.tgz#0f37c3613c34fe6b37cd7f763a0d6293ab15c527" - integrity sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA== + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-native-ankidroid@^0.4.0: version "0.4.0" @@ -6791,9 +6796,9 @@ regenerator-transform@^0.10.0: private "^0.1.6" regenerator-transform@^0.14.2: - version "0.14.3" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.3.tgz#54aebff2ef58c0ae61e695ad1b9a9d65995fff78" - integrity sha512-zXHNKJspmONxBViAb3ZUmFoFPnTBs3zFhCEZJiwp/gkNzxVbTqNJVjYKx6Qk1tQ1P4XLf4TbH9+KBB7wGoAaUw== + version "0.14.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" + integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== dependencies: "@babel/runtime" "^7.8.4" private "^0.1.8" @@ -7243,9 +7248,9 @@ scheduler@0.15.0: object-assign "^4.1.1" scheduler@^0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.0.tgz#a715d56302de403df742f4a9be11975b32f5698d" - integrity sha512-xowbVaTPe9r7y7RUejcK73/j8tt2jfiyTednOvHbA8JoClvMYCp+r8QegLwK/n8zWQAtZb1fFnER4XLBZXrCxA== + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -7395,9 +7400,9 @@ simple-swizzle@^0.2.2: is-arrayish "^0.3.1" sisteransi@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3" - integrity sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig== + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^2.0.0: version "2.0.0" @@ -8502,18 +8507,18 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^13.1.1: - version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.0.tgz#1b0ab1118ebd41f68bb30e729f4c83df36ae84c3" - integrity sha512-o/Jr6JBOv6Yx3pL+5naWSoIA2jJ+ZkMYQG/ie9qFbukBe4uzmBatlXFOiu/tNKRWEtyf+n5w7jc/O16ufqOTdQ== +yargs-parser@^18.1.1: + version "18.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.1.tgz#bf7407b915427fc760fcbbccc6c82b4f0ffcbd37" + integrity sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" @@ -8544,9 +8549,9 @@ yargs@^12.0.5: yargs-parser "^11.1.1" yargs@^13.2.2: - version "13.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" - integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== dependencies: cliui "^5.0.0" find-up "^3.0.0" @@ -8557,12 +8562,12 @@ yargs@^13.2.2: string-width "^3.0.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^13.1.1" + yargs-parser "^13.1.2" yargs@^15.0.0: - version "15.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.0.tgz#403af6edc75b3ae04bf66c94202228ba119f0976" - integrity sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA== + version "15.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" + integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== dependencies: cliui "^6.0.0" decamelize "^1.2.0" @@ -8574,7 +8579,7 @@ yargs@^15.0.0: string-width "^4.2.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^18.1.0" + yargs-parser "^18.1.1" yargs@^9.0.0: version "9.0.1"