mirror of
https://github.com/balzack/databag.git
synced 2025-02-12 03:29:16 +00:00
syncing cards
This commit is contained in:
parent
1abe9d197b
commit
160fa45373
@ -1,8 +1,8 @@
|
||||
import { checkResponse, fetchWithTimeout } from './fetchUtil';
|
||||
|
||||
export async function getCardDetail(token, cardId) {
|
||||
export async function getCardDetail(server, token, cardId) {
|
||||
let param = "?agent=" + token
|
||||
let detail = await fetchWithTimeout(`/contact/cards/${cardId}/detail${param}`, { method: 'GET' });
|
||||
let detail = await fetchWithTimeout(`https://${server}/contact/cards/${cardId}/detail${param}`, { method: 'GET' });
|
||||
checkResponse(detail);
|
||||
return await detail.json()
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { checkResponse, fetchWithTimeout } from './fetchUtil';
|
||||
|
||||
export async function getCardProfile(token, cardId) {
|
||||
let profile = await fetchWithTimeout(`/contact/cards/${cardId}/profile?agent=${token}`, { method: 'GET' });
|
||||
export async function getCardProfile(server, token, cardId) {
|
||||
let profile = await fetchWithTimeout(`https://${server}/contact/cards/${cardId}/profile?agent=${token}`, { method: 'GET' });
|
||||
checkResponse(profile);
|
||||
return await profile.json()
|
||||
}
|
||||
|
@ -1,11 +1,11 @@
|
||||
import { checkResponse, fetchWithTimeout } from './fetchUtil';
|
||||
|
||||
export async function getCards(token, revision) {
|
||||
export async function getCards(server, token, revision) {
|
||||
let param = "agent=" + token
|
||||
if (revision != null) {
|
||||
param += '&revision=' + revision
|
||||
}
|
||||
let cards = await fetchWithTimeout(`/contact/cards?${param}`, { method: 'GET' });
|
||||
let cards = await fetchWithTimeout(`https://${server}/contact/cards?${param}`, { method: 'GET' });
|
||||
checkResponse(cards)
|
||||
return await cards.json()
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ import { getUsername } from 'api/getUsername';
|
||||
import { StoreContext } from 'context/StoreContext';
|
||||
import { AccountContext } from 'context/AccountContext';
|
||||
import { ProfileContext } from 'context/ProfileContext';
|
||||
import { CardContext } from 'context/CardContext';
|
||||
import { ChannelContext } from 'context/ChannelContext';
|
||||
|
||||
export function useAppContext() {
|
||||
@ -17,6 +18,7 @@ export function useAppContext() {
|
||||
const store = useContext(StoreContext);
|
||||
const account = useContext(AccountContext);
|
||||
const profile = useContext(ProfileContext);
|
||||
const card = useContext(CardContext);
|
||||
const channel = useContext(ChannelContext);
|
||||
|
||||
const delay = useRef(2);
|
||||
@ -43,6 +45,7 @@ export function useAppContext() {
|
||||
const setSession = async (access) => {
|
||||
await account.actions.setSession(access);
|
||||
await profile.actions.setSession(access);
|
||||
await card.actions.setSession(access);
|
||||
await channel.actions.setSession(access);
|
||||
updateState({ session: true });
|
||||
setWebsocket(access.server, access.appToken);
|
||||
@ -51,6 +54,7 @@ export function useAppContext() {
|
||||
const clearSession = async () => {
|
||||
account.actions.clearSession();
|
||||
profile.actions.clearSession();
|
||||
card.actions.clearSession();
|
||||
channel.actions.clearSession();
|
||||
updateState({ session: false });
|
||||
clearWebsocket();
|
||||
@ -91,7 +95,8 @@ export function useAppContext() {
|
||||
try {
|
||||
profile.actions.setRevision(rev.profile);
|
||||
account.actions.setRevision(rev.account);
|
||||
channel.actions.setRevision(rev.channel);
|
||||
card.actions.setRevision(rev.channel);
|
||||
channel.actions.setRevision(rev.card);
|
||||
}
|
||||
catch(err) {
|
||||
console.log(err);
|
||||
|
@ -1,5 +1,8 @@
|
||||
import { useState, useRef, useContext } from 'react';
|
||||
import { StoreContext } from 'context/StoreContext';
|
||||
import { getCards } from 'api/getCards';
|
||||
import { getCardProfile } from 'api/getCardProfile';
|
||||
import { getCardDetail } from 'api/getCardDetail';
|
||||
|
||||
export function useCardContext() {
|
||||
const [state, setState] = useState({
|
||||
@ -24,9 +27,57 @@ export function useCardContext() {
|
||||
const { server, appToken, guid } = session.current;
|
||||
|
||||
// get and store
|
||||
const delta = await getCards(server, appToken, setRevision.current);
|
||||
console.log("DELTA:", delta);
|
||||
|
||||
for (let card of delta) {
|
||||
if (card.data) {
|
||||
if (card.data.cardDetail && card.data.cardProfile) {
|
||||
await store.actions.setCardItem(guid, card);
|
||||
}
|
||||
else {
|
||||
const { detailRevision, profileRevision, cardDetail, cardProfile, notifiedView, notifiedArticle, notifiedProfile, notifiedChannel } = channel.data;
|
||||
const view = await store.actions.getCardItemView(guid, card.id);
|
||||
if (view.detailRevision != detailRevision) {
|
||||
const detail = await getCardDetail(server, appToken, card.id);
|
||||
await store.actions.setCardItemDetail(guid, card.id, detailRevision, detail);
|
||||
}
|
||||
if (view.profileRevision != profileRevision) {
|
||||
const profile = await getCardProfile(server, appToken, card.id);
|
||||
await store.actions.setCardItemProfile(guid, card.id, profileRevision, profile);
|
||||
}
|
||||
if (view.notifiedView != notifiedView) {
|
||||
// TODO clear contact and channels
|
||||
// TODO get articles
|
||||
await store.actions.setCardNotifiedArticle(guid, card.id, notifiedArticle);
|
||||
// TODO get channels
|
||||
await store.actions.setCardNotifiedChannel(guid, card.id, notifiedChannel);
|
||||
|
||||
await store.actions.setCardNotifiedView(guid, card.id, notifiedView);
|
||||
}
|
||||
else {
|
||||
if (view.notifiedArticle != notifiedArticle) {
|
||||
// TODO get article delta
|
||||
await store.actions.setCardNotifiedArticle(guid, card.id, notifiedArticle);
|
||||
}
|
||||
if (view.notifiedChannel != notifiedChannel) {
|
||||
// TODO get channel delta
|
||||
await store.actions.setCardNotifiedChannel(guid, card.id, notifiedChannel);
|
||||
}
|
||||
}
|
||||
if (view.notifiedProflile != notifiedProfile) {
|
||||
// TODO update contact profile
|
||||
await store.actions.setCardNotifiedProfile(guid, card.id, notifiedProfile);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
await store.actions.clearCardItem(guid, card.id);
|
||||
}
|
||||
}
|
||||
|
||||
updateState({ status });
|
||||
setRevision.current = revision;
|
||||
await store.actions.setCardRevision(guid, revision);
|
||||
}
|
||||
catch(err) {
|
||||
console.log(err);
|
||||
|
@ -48,7 +48,7 @@ export function useChannelContext() {
|
||||
}
|
||||
}
|
||||
else {
|
||||
await store.actions.clearChannelItem(channel.id);
|
||||
await store.actions.clearChannelItem(guid, channel.id);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { useEffect, useState, useRef, useContext } from 'react';
|
||||
import SQLite from "react-native-sqlite-storage";
|
||||
|
||||
const DATABAG_DB = 'databag_v011.db';
|
||||
const DATABAG_DB = 'databag_v015.db';
|
||||
|
||||
export function useStoreContext() {
|
||||
const [state, setState] = useState({});
|
||||
@ -13,7 +13,10 @@ export function useStoreContext() {
|
||||
|
||||
const initSession = async (guid) => {
|
||||
await db.current.executeSql(`CREATE TABLE IF NOT EXISTS channel_${guid} (channel_id text, revision integer, detail_revision integer, topic_revision integer, detail text, summary text, unique(channel_id))`);
|
||||
await db.current.executeSql(`CREATE TABLE IF NOT EXISTS topic_${guid} (channel_id text, topic_id text, revision integer, detail_revision integer, detail text, unique(channel_id, topic_id))`);
|
||||
await db.current.executeSql(`CREATE TABLE IF NOT EXISTS channel_topic_${guid} (channel_id text, topic_id text, revision integer, detail_revision integer, detail text, unique(channel_id, topic_id))`);
|
||||
await db.current.executeSql(`CREATE TABLE IF NOT EXISTS card_${guid} (card_id text, revision integer, detail_revision integer, profile_revision integer, detail text, profile text, notified_view integer, notified_article integer, notified_profile integer, notified_channel integer, unique(card_id))`);
|
||||
await db.current.executeSql(`CREATE TABLE IF NOT EXISTS contact_channel_${guid} (card_id text, channel_id text, revision integer, detail_revision integer, topic_revision integer, detail text, summary text, unique(card_id, channel_id))`);
|
||||
await db.current.executeSql(`CREATE TABLE IF NOT EXISTS contact_channel_topic_${guid} (card_id text, channel_id text, topic_id text, revision integer, detail_revision integer, detail text, unique(card_id, channel_id, topic_id))`);
|
||||
}
|
||||
|
||||
const actions = {
|
||||
@ -75,6 +78,64 @@ export function useStoreContext() {
|
||||
const dataId = `${guid}_cardRevision`;
|
||||
await db.current.executeSql("INSERT OR REPLACE INTO app (key, value) values (?, ?);", [dataId, encodeObject(revision)]);
|
||||
},
|
||||
setCardItem: async (guid, card) => {
|
||||
const { id, revision, data } = card;
|
||||
await db.current.executeSql(`INSERT OR REPLACE INTO card_${guid} (card_id, revision, detail_revision, profile_revision, detail, profile, notified_view, notified_profile, notified_article, notified_channel) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);`, [id, revision, data.detailRevision, data.profileRevision, encodeObject(data.cardDetail), encodeObject(data.cardProfile), data.notifiedView, data.notifiedProfile, data.notifiedArticle, data.notifiedChannel]);
|
||||
},
|
||||
clearCardItem: async (guid, cardId) => {
|
||||
await db.current.executeSql(`DELETE FROM card_${guid} WHERE card_id=?`, [cardId]);
|
||||
},
|
||||
setCardItemRevision: async (guid, cardId, revision) => {
|
||||
await db.current.executeSql(`UPDATE card_${guid} set revision=? where card_id=?`, [revision, cardId]);
|
||||
},
|
||||
setCardItemNotifiedView: async (guid, cardId, notified) => {
|
||||
await db.current.executeSql(`UPDATE card_${guid} set notified_view=? where card_id=?`, [notified, cardId]);
|
||||
},
|
||||
setCardItemNotifiedArtcile: async (guid, cardId, notified) => {
|
||||
await db.current.executeSql(`UPDATE card_${guid} set notified_article=? where card_id=?`, [notified, cardId]);
|
||||
},
|
||||
setCardItemNotifiedProfile: async (guid, cardId, notified) => {
|
||||
await db.current.executeSql(`UPDATE card_${guid} set notified_profile=? where card_id=?`, [notified, cardId]);
|
||||
},
|
||||
setCardItemNotifiedChannel: async (guid, cardId, notified) => {
|
||||
await db.current.executeSql(`UPDATE card_${guid} set notified_channel=? where card_id=?`, [notified, cardId]);
|
||||
},
|
||||
setCardItemDetail: async (guid, cardId, revision, detail) => {
|
||||
await db.current.executeSql(`UPDATE card_${guid} set detail_revision=?, detail=? where card_id=?`, [revision, encodeObject(detail), cardId]);
|
||||
},
|
||||
setCardItemProfile: async (guid, cardId, revision, profile) => {
|
||||
await db.current.executeSql(`UPDATE card_${guid} set profile_revision=?, profile=? where card_id=?`, [revision, encodeObject(profile), cardId]);
|
||||
},
|
||||
getCardItemView: async (guid, cardId) => {
|
||||
const values = await getAppValues(db.current, `SELECT revision, detail_revision, profile_revision, notifed_view, notified_article, notifed_profile, notified_channel FROM card_${guid} WHERE card_id=?`, [cardId]);
|
||||
if (!values.length) {
|
||||
return {};
|
||||
}
|
||||
return {
|
||||
revision: values[0].revision,
|
||||
detailRevision: values[0].detail_revision,
|
||||
profileRevision: values[0].profile_revision,
|
||||
notifiedView: values[0].notified_view,
|
||||
notifiedArticle: values[0].notified_article,
|
||||
notifiedProfile: values[0].notified_profile,
|
||||
notifiedChannel: values[0].notified_cahnnel,
|
||||
};
|
||||
},
|
||||
getCardItems: async (guid) => {
|
||||
const values = await getAppValues(db.current, `SELECT card_id, revision, detail_revision, profile_revision, detail, profile, notified_view, notified_profile, notified_article, notified_channel FROM channel_${guid}`, []);
|
||||
return values.map(card => ({
|
||||
cardId: card.card_id,
|
||||
revision: card.revision,
|
||||
detailRevision: card.detail_revision,
|
||||
profileRevision: card.profile_revision,
|
||||
detail: decodeObject(card.detail),
|
||||
profile: decodeObject(card.profile),
|
||||
notifiedView: card.notified_view,
|
||||
notifiedProfile: card.notified_profile,
|
||||
notifiedArticle: card.notified_article,
|
||||
notifiedChannel: card.notified_channel,
|
||||
}));
|
||||
},
|
||||
|
||||
getChannelRevision: async (guid) => {
|
||||
const dataId = `${guid}_channelRevision`;
|
||||
@ -101,7 +162,6 @@ export function useStoreContext() {
|
||||
await db.current.executeSql(`UPDATE channel_${guid} set topic_revision=?, summary=? where channel_id=?`, [revision, encodeObject(summary), channelId]);
|
||||
},
|
||||
getChannelItemView: async (guid, channelId) => {
|
||||
console.log("HERE", channelId);
|
||||
const values = await getAppValues(db.current, `SELECT revision, detail_revision, topic_revision FROM channel_${guid} WHERE channel_id=?`, [channelId]);
|
||||
if (!values.length) {
|
||||
return {};
|
||||
|
Loading…
Reference in New Issue
Block a user