refactor of store context

This commit is contained in:
Roland Osborne 2022-09-13 11:46:28 -07:00
parent 91e7a242f2
commit 87e6760818

View File

@ -7,49 +7,37 @@ export function useStoreContext() {
const [state, setState] = useState({ const [state, setState] = useState({
init: false, init: false,
session: null, session: null,
revision: null, sessionId: 0,
profileRevision: null,
cardRevision: null,
channelRevision: null,
accountRevision: null,
}); });
const db = useRef(null); const db = useRef(null);
const loaded = useRef(false); const session = useRef(null);
const syncing = useRef(false); const sessionId = useRef(0);
const setRevision = useRef(null);
const appRevision = useRef({});
const appSession = useRef(null);
const updateState = (value) => { const updateState = (value) => {
setState((s) => ({ ...s, ...value })) setState((s) => ({ ...s, ...value }))
} }
const setAppRevision = async () => { useEffect(() => {
if (syncing.current) { initialize();
return; }, []);
}
if (!setRevision.current) {
return;
}
if (!loaded.current) {
return;
}
if (!appSession.current) {
return;
}
// sync revisions useEffect(() => {
syncing.current = true; if (state.init && state.session && sessionId.current === state.sessionId) {
const rev = setRevision.current; const revision = {
accountRevision: state.accountRevision,
try { profileRevision: state.profileRevision,
const id = `${appSession.current.guid}_revision`; cardRevision: state.cardRevision,
await db.current.executeSql(`UPDATE app SET value=? WHERE key='${id}';`, [encodeObject(rev)]); channelRevision: state.channelRevision,
appRevision.current = setRevision.current; }
const revisionId = `${session.current.guid}_revision`;
db.current.executeSql(`UPDATE app SET value=? WHERE key='${revisionId}';`, [encodeObject(revision)]);
} }
catch (err) { }, [state]);
console.log(err);
}
syncing.current = false;
};
const initialize = async () => { const initialize = async () => {
SQLite.DEBUG(false); SQLite.DEBUG(false);
@ -57,16 +45,16 @@ export function useStoreContext() {
db.current = await SQLite.openDatabase({ name: DATABAG_DB, location: "default" }); db.current = await SQLite.openDatabase({ name: DATABAG_DB, location: "default" });
await db.current.executeSql("CREATE TABLE IF NOT EXISTS app (key text, value text, unique(key));"); await db.current.executeSql("CREATE TABLE IF NOT EXISTS app (key text, value text, unique(key));");
await db.current.executeSql("INSERT OR IGNORE INTO app (key, value) values ('session', null);"); await db.current.executeSql("INSERT OR IGNORE INTO app (key, value) values ('session', null);");
await db.current.executeSql("INSERT OR IGNORE INTO app (key, value) values ('revision', null);");
appSession.current = await getAppValue(db.current, 'session'); session.current = await getAppValue(db.current, 'session');
if (appSession.current) { if (!session.current) {
const revisionId = `${appSession.current.guid}_revision`; updateState({ init: true });
appRevision.currrent = await getAppValue(db.current, revisionId); }
else {
const revisionId = `${session.current.guid}_revision`;
const revision = await getAppValue(db.current, revisionId, {});
updateState({ init: true, session: session.current, ...revision });
} }
loaded.current = true;
updateState({ init: true, session: appSession.current, revision: appRevision.current });
}; };
const actions = { const actions = {
@ -74,26 +62,39 @@ export function useStoreContext() {
await db.current.executeSql("UPDATE app SET value=? WHERE key='session';", [encodeObject(access)]); await db.current.executeSql("UPDATE app SET value=? WHERE key='session';", [encodeObject(access)]);
const revisionId = `${access.guid}_revision`; const revisionId = `${access.guid}_revision`;
appRevision.currrent = await getAppValue(db.current, revisionId); const revision = await getAppValue(db.current, revisionId, {});
appSession.current = access; session.current = access;
updateState({ session: access, revision: appRevision.current }); sessionId.current++;
updateState({ session: access, sessionId: sessionId.current, ...revision });
}, },
clearSession: async () => { clearSession: async () => {
await db.current.executeSql("UPDATE app set value=? WHERE key='session';", [null]); await db.current.executeSql("UPDATE app set value=? WHERE key='session';", [null]);
appSession.current = null; session.current = null;
updateState({ session: null }); updateState({ session: null });
}, },
setRevision: (rev) => { setProfileRevision: (id, profileRevision) => {
setRevision.current = rev; if (sessionId.current === id) {
setAppRevision(); updateState({ profileRevision });
}
},
setAccountRevision: (id, accountRevision) => {
if (sessionId.current === id) {
updateState({ accountRevision });
}
},
setCardRevision: (id, cardRevision) => {
if (sessionId.current === id) {
updateState({ cardRevision });
}
},
setChannelRevision: (channelRevision) => {
if (sessionId.current === id) {
updateState({ channelRevision });
}
}, },
} }
useEffect(() => {
initialize();
}, []);
return { state, actions } return { state, actions }
} }
@ -118,12 +119,12 @@ function hasResult(res) {
return true; return true;
} }
async function getAppValue(sql: SQLite.SQLiteDatabase, id: string) { async function getAppValue(sql: SQLite.SQLiteDatabase, id: string, unset) {
const res = await sql.executeSql(`SELECT * FROM app WHERE key='${id}';`); const res = await sql.executeSql(`SELECT * FROM app WHERE key='${id}';`);
if (hasResult(res)) { if (hasResult(res)) {
return decodeObject(res[0].rows.item(0).value); return decodeObject(res[0].rows.item(0).value);
} }
return null; return unset;
} }