Dev #3
|
@ -13,6 +13,7 @@
|
|||
"@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",
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -13,6 +13,7 @@ import {
|
|||
} 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) {
|
||||
|
@ -48,7 +49,7 @@ export const wordInfo = word => async dispatch => {
|
|||
await dispatch(setAvailableApi(api1));
|
||||
const wordDictionary = await createDictionary(api1);
|
||||
dispatch(setDictioanry(wordDictionary));
|
||||
dispatch(setFields(wordDictionary));
|
||||
sendWord(setFields(wordDictionary));
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
|
|
27
src/actions/api/f-json.js
Normal file
27
src/actions/api/f-json.js
Normal file
|
@ -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;
|
||||
});
|
||||
};
|
|
@ -1,182 +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 = `
|
||||
<div class="big">{{Word or sentence}}</div>
|
||||
<ul class="list">
|
||||
<li>
|
||||
<div class="small">{{Part of speech 1}}</div>
|
||||
</li>
|
||||
<li>
|
||||
<div class="small">{{Part of speech 2}}</div>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="sound--container">
|
||||
<div class="transcription">{{Transcription}}</div>
|
||||
<span class="sound">{{Sound}}</span>
|
||||
`;
|
||||
|
||||
const questionFmt2 = '<div class="big">{{Translation 1}}</div>';
|
||||
|
||||
const questionFormat = [questionFmt1, questionFmt2];
|
||||
|
||||
const answerFmt1 = `
|
||||
<div class="big">{{Word or sentence}}</div>
|
||||
<div class="sound--container">
|
||||
<div class="transcription">{{Transcription}}</div>
|
||||
<span class="sound">{{Sound}}</span>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="usage">{{Usage example}}</div>
|
||||
<hr />
|
||||
<ul class="list">
|
||||
<li>
|
||||
<div>
|
||||
<div class="small">{{Part of speech 1}}</div>
|
||||
<pre class="definition">{{Definition 1}}</pre>
|
||||
<div>{{Translation 1}}</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<div>
|
||||
<div class="small">{{Part of speech 2}}</div>
|
||||
<pre class="definition">{{Definition 2}}</pre>
|
||||
<div>{{Translation 2}}</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>`;
|
||||
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));
|
||||
sendDataToLocaleStorage(
|
||||
setAnkiNoteCreator(selectedDeck), //send creator to locale storage
|
||||
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));
|
||||
|
@ -186,6 +39,14 @@ export const createAnkiLanModel = model => async dispatch => {
|
|||
};
|
||||
|
||||
//creator is an object what have to store in locale storage.
|
||||
export const addNote = (creator, words, template) => {
|
||||
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');
|
||||
};
|
||||
|
|
|
@ -3,10 +3,17 @@ import {
|
|||
ANKILAN_NOTE_CREATOR,
|
||||
ANKILAN_NOTE_TEMPLATE,
|
||||
} from '../constants/anki-constants';
|
||||
import JSONfn from 'jsonfn';
|
||||
|
||||
const sendDataToLocaleStorage = async (creator, template) => {
|
||||
try {
|
||||
await AsyncStorage.setItem(ANKILAN_NOTE_CREATOR, JSON.stringify(creator));
|
||||
await AsyncStorage.setItem(ANKILAN_NOTE_TEMPLATE, JSON.stringify(template));
|
||||
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');
|
||||
|
@ -18,9 +25,10 @@ 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 value;
|
||||
return JSONfn.parse(value);
|
||||
}
|
||||
} catch (e) {
|
||||
// error reading value
|
||||
|
@ -29,10 +37,10 @@ export const getTemplate = async () => {
|
|||
|
||||
export const getCreator = async () => {
|
||||
try {
|
||||
const value = await AsyncStorage.getItem(ANKILAN_NOTE_TEMPLATE);
|
||||
const value = await AsyncStorage.getItem(ANKILAN_NOTE_CREATOR);
|
||||
if (value !== null) {
|
||||
// value previously stored
|
||||
return value;
|
||||
return JSONfn.parse(value);
|
||||
}
|
||||
} catch (e) {
|
||||
// error reading value
|
||||
|
|
|
@ -1 +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);
|
||||
};
|
||||
|
|
165
src/constants/anki-model-values.js
Normal file
165
src/constants/anki-model-values.js
Normal file
|
@ -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 = `
|
||||
<div class="big">{{Word or sentence}}</div>
|
||||
<ul class="list">
|
||||
<li>
|
||||
<div class="small">{{Part of speech 1}}</div>
|
||||
</li>
|
||||
<li>
|
||||
<div class="small">{{Part of speech 2}}</div>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="sound--container">
|
||||
<div class="transcription">{{Transcription}}</div>
|
||||
<span class="sound">{{Sound}}</span>
|
||||
`;
|
||||
|
||||
const questionFmt2 = '<div class="big">{{Translation 1}}</div>';
|
||||
|
||||
const questionFormat = [questionFmt1, questionFmt2];
|
||||
|
||||
const answerFmt1 = `
|
||||
<div class="big">{{Word or sentence}}</div>
|
||||
<div class="sound--container">
|
||||
<div class="transcription">{{Transcription}}</div>
|
||||
<span class="sound">{{Sound}}</span>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="usage">{{Usage example}}</div>
|
||||
<hr />
|
||||
<ul class="list">
|
||||
<li>
|
||||
<div>
|
||||
<div class="small">{{Part of speech 1}}</div>
|
||||
<pre class="definition">{{Definition 1}}</pre>
|
||||
<div>{{Translation 1}}</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<div>
|
||||
<div class="small">{{Part of speech 2}}</div>
|
||||
<pre class="definition">{{Definition 2}}</pre>
|
||||
<div>{{Translation 2}}</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>`;
|
||||
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;
|
|
@ -20,7 +20,7 @@ const initialState = {
|
|||
mainFieldIsAvailable: false,
|
||||
fieldList: [],
|
||||
ankiLanModelIsAlreadyExists: false,
|
||||
ankiLanModelName: 'AnkiLan_final1',
|
||||
ankiLanModelName: '1AnkiLan1111',
|
||||
noteCreator: {},
|
||||
noteTemplate: [],
|
||||
};
|
||||
|
|
|
@ -5026,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"
|
||||
|
|
Loading…
Reference in a new issue