preparing to sync topics

This commit is contained in:
Roland Osborne 2022-09-29 11:31:55 -07:00
parent a65c8c1ccd
commit c6485d5b47
23 changed files with 219 additions and 128 deletions

View File

@ -1,9 +1,9 @@
import { checkResponse, fetchWithTimeout } from './fetchUtil';
export async function addChannel(token, cards, subject, description ) {
export async function addChannel(server, token, cards, subject, description ) {
let data = { subject, description };
let params = { dataType: 'superbasic', data: JSON.stringify(data), groups: [], cards };
let channel = await fetchWithTimeout(`/content/channels?agent=${token}`, { method: 'POST', body: JSON.stringify(params)} );
let channel = await fetchWithTimeout(`https://${server}/content/channels?agent=${token}`, { method: 'POST', body: JSON.stringify(params)} );
checkResponse(channel);
return await channel.json();
}

View File

@ -1,9 +1,9 @@
import { checkResponse, fetchWithTimeout } from './fetchUtil';
export async function addChannelTopic(token, channelId, message, assets ): string {
export async function addChannelTopic(server, token, channelId, message, assets ): string {
if (message == null && (assets == null || assets.length === 0)) {
let topic = await fetchWithTimeout(`/content/channels/${channelId}/topics?agent=${token}`,
let topic = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/topics?agent=${token}`,
{ method: 'POST', body: JSON.stringify({}) });
checkResponse(topic);
let slot = await topic.json();
@ -14,7 +14,7 @@ export async function addChannelTopic(token, channelId, message, assets ): strin
if (value !== null) return value
}), datatype: 'superbasictopic' };
let topic = await fetchWithTimeout(`/content/channels/${channelId}/topics?agent=${token}&confirm=true`,
let topic = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/topics?agent=${token}&confirm=true`,
{ method: 'POST', body: JSON.stringify(subject) });
checkResponse(topic);
let slot = await topic.json();
@ -22,7 +22,7 @@ export async function addChannelTopic(token, channelId, message, assets ): strin
}
else {
let topic = await fetchWithTimeout(`/content/channels/${channelId}/topics?agent=${token}`,
let topic = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/topics?agent=${token}`,
{ method: 'POST', body: JSON.stringify({}) });
checkResponse(topic);
let slot = await topic.json();
@ -34,7 +34,7 @@ export async function addChannelTopic(token, channelId, message, assets ): strin
const formData = new FormData();
formData.append('asset', asset.image);
let transform = encodeURIComponent(JSON.stringify(["ithumb;photo", "icopy;photo"]));
let topicAsset = await fetch(`/content/channels/${channelId}/topics/${slot.id}/assets?transforms=${transform}&agent=${token}`, { method: 'POST', body: formData });
let topicAsset = await fetch(`https://${server}/content/channels/${channelId}/topics/${slot.id}/assets?transforms=${transform}&agent=${token}`, { method: 'POST', body: formData });
checkResponse(topicAsset);
let assetEntry = await topicAsset.json();
message.assets.push({
@ -49,7 +49,7 @@ export async function addChannelTopic(token, channelId, message, assets ): strin
formData.append('asset', asset.video);
let thumb = 'vthumb;video;' + asset.position;
let transform = encodeURIComponent(JSON.stringify(["vlq;video", "vhd;video", thumb]));
let topicAsset = await fetch(`/content/channels/${channelId}/topics/${slot.id}/assets?transforms=${transform}&agent=${token}`, { method: 'POST', body: formData });
let topicAsset = await fetch(`https://${server}/content/channels/${channelId}/topics/${slot.id}/assets?transforms=${transform}&agent=${token}`, { method: 'POST', body: formData });
checkResponse(topicAsset);
let assetEntry = await topicAsset.json();
message.assets.push({
@ -64,7 +64,7 @@ export async function addChannelTopic(token, channelId, message, assets ): strin
const formData = new FormData();
formData.append('asset', asset.audio);
let transform = encodeURIComponent(JSON.stringify(["acopy;audio"]));
let topicAsset = await fetch(`/content/channels/${channelId}/topics/${slot.id}/assets?transforms=${transform}&agent=${token}`, { method: 'POST', body: formData });
let topicAsset = await fetch(`https://${server}/content/channels/${channelId}/topics/${slot.id}/assets?transforms=${transform}&agent=${token}`, { method: 'POST', body: formData });
checkResponse(topicAsset);
let assetEntry = await topicAsset.json();
message.assets.push({
@ -80,11 +80,11 @@ export async function addChannelTopic(token, channelId, message, assets ): strin
if (value !== null) return value
}), datatype: 'superbasictopic' };
let unconfirmed = await fetchWithTimeout(`/content/channels/${channelId}/topics/${slot.id}/subject?agent=${token}`,
let unconfirmed = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/topics/${slot.id}/subject?agent=${token}`,
{ method: 'PUT', body: JSON.stringify(subject) });
checkResponse(unconfirmed);
let confirmed = await fetchWithTimeout(`/content/channels/${channelId}/topics/${slot.id}/confirmed?agent=${token}`,
let confirmed = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/topics/${slot.id}/confirmed?agent=${token}`,
{ method: 'PUT', body: JSON.stringify('confirmed') });
checkResponse(confirmed);
return slot.id;

View File

@ -1,13 +1,8 @@
import { checkResponse, fetchWithTimeout } from './fetchUtil';
export async function addContactChannelTopic(server, token, channelId, message, assets ) {
let host = "";
if (server) {
host = `https://${server}`
}
if (message == null && (assets == null || assets.length === 0)) {
let topic = await fetchWithTimeout(`${host}/content/channels/${channelId}/topics?contact=${token}`,
let topic = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/topics?contact=${token}`,
{ method: 'POST', body: JSON.stringify({}) });
checkResponse(topic);
let slot = await topic.json();
@ -18,14 +13,14 @@ export async function addContactChannelTopic(server, token, channelId, message,
if (value !== null) return value
}), datatype: 'superbasictopic' };
let topic = await fetchWithTimeout(`${host}/content/channels/${channelId}/topics?contact=${token}&confirm=true`,
let topic = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/topics?contact=${token}&confirm=true`,
{ method: 'POST', body: JSON.stringify(subject) });
checkResponse(topic);
let slot = await topic.json();
return slot.id;
}
else {
let topic = await fetchWithTimeout(`${host}/content/channels/${channelId}/topics?contact=${token}`,
let topic = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/topics?contact=${token}`,
{ method: 'POST', body: JSON.stringify({}) });
checkResponse(topic);
let slot = await topic.json();
@ -37,7 +32,7 @@ export async function addContactChannelTopic(server, token, channelId, message,
const formData = new FormData();
formData.append('asset', asset.image);
let transform = encodeURIComponent(JSON.stringify(["ithumb;photo", "icopy;photo"]));
let topicAsset = await fetch(`${host}/content/channels/${channelId}/topics/${slot.id}/assets?transforms=${transform}&contact=${token}`, { method: 'POST', body: formData });
let topicAsset = await fetch(`https://${server}/content/channels/${channelId}/topics/${slot.id}/assets?transforms=${transform}&contact=${token}`, { method: 'POST', body: formData });
checkResponse(topicAsset);
let assetEntry = await topicAsset.json();
message.assets.push({
@ -52,7 +47,7 @@ export async function addContactChannelTopic(server, token, channelId, message,
formData.append('asset', asset.video);
let thumb = "vthumb;video;" + asset.position
let transform = encodeURIComponent(JSON.stringify(["vhd;video", "vlq;video", thumb]));
let topicAsset = await fetch(`${host}/content/channels/${channelId}/topics/${slot.id}/assets?transforms=${transform}&contact=${token}`, { method: 'POST', body: formData });
let topicAsset = await fetch(`https://${server}/content/channels/${channelId}/topics/${slot.id}/assets?transforms=${transform}&contact=${token}`, { method: 'POST', body: formData });
checkResponse(topicAsset);
let assetEntry = await topicAsset.json();
message.assets.push({
@ -67,7 +62,7 @@ export async function addContactChannelTopic(server, token, channelId, message,
const formData = new FormData();
formData.append('asset', asset.audio);
let transform = encodeURIComponent(JSON.stringify(["acopy;audio"]));
let topicAsset = await fetch(`${host}/content/channels/${channelId}/topics/${slot.id}/assets?transforms=${transform}&contact=${token}`, { method: 'POST', body: formData });
let topicAsset = await fetch(`https://${server}/content/channels/${channelId}/topics/${slot.id}/assets?transforms=${transform}&contact=${token}`, { method: 'POST', body: formData });
checkResponse(topicAsset);
let assetEntry = await topicAsset.json();
message.assets.push({
@ -83,11 +78,11 @@ export async function addContactChannelTopic(server, token, channelId, message,
if (value !== null) return value
}), datatype: 'superbasictopic' };
let unconfirmed = await fetchWithTimeout(`${host}/content/channels/${channelId}/topics/${slot.id}/subject?contact=${token}`,
let unconfirmed = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/topics/${slot.id}/subject?contact=${token}`,
{ method: 'PUT', body: JSON.stringify(subject) });
checkResponse(unconfirmed);
let confirmed = await fetchWithTimeout(`${host}/content/channels/${channelId}/topics/${slot.id}/confirmed?contact=${token}`,
let confirmed = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/topics/${slot.id}/confirmed?contact=${token}`,
{ method: 'PUT', body: JSON.stringify('confirmed') });
checkResponse(confirmed);
return slot.id;

View File

@ -1,7 +1,7 @@
import { checkResponse, fetchWithTimeout } from './fetchUtil';
export async function clearChannelCard(token, channelId, cardId ) {
let channel = await fetchWithTimeout(`/content/channels/${channelId}/cards/${cardId}?agent=${token}`, {method: 'DELETE'});
export async function clearChannelCard(server, token, channelId, cardId ) {
let channel = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/cards/${cardId}?agent=${token}`, {method: 'DELETE'});
checkResponse(channel);
return await channel.json();
}

View File

@ -1,7 +1,7 @@
import { checkResponse, fetchWithTimeout } from './fetchUtil';
export async function getChannelTopic(token, channelId, topicId) {
let topic = await fetchWithTimeout(`/content/channels/${channelId}/topics/${topicId}/detail?agent=${token}`,
export async function getChannelTopic(server, token, channelId, topicId) {
let topic = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/topics/${topicId}/detail?agent=${token}`,
{ method: 'GET' });
checkResponse(topic)
return await topic.json()

View File

@ -1,4 +1,4 @@
export function getChannelTopicAssetUrl(token, channelId, topicId, assetId) {
return `/content/channels/${channelId}/topics/${topicId}/assets/${assetId}?agent=${token}`
export function getChannelTopicAssetUrl(server, token, channelId, topicId, assetId) {
return `https://${server}/content/channels/${channelId}/topics/${topicId}/assets/${assetId}?agent=${token}`
}

View File

@ -1,6 +1,6 @@
import { checkResponse, fetchWithTimeout } from './fetchUtil';
export async function getChannelTopics(token, channelId, revision, count, begin, end) {
export async function getChannelTopics(server, token, channelId, revision, count, begin, end) {
let rev = ''
if (revision != null) {
rev = `&revision=${revision}`
@ -17,7 +17,7 @@ export async function getChannelTopics(token, channelId, revision, count, begin,
if (end != null) {
edn = `&end=${end}`
}
let topics = await fetchWithTimeout(`/content/channels/${channelId}/topics?agent=${token}${rev}${cnt}${bgn}${edn}`,
let topics = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/topics?agent=${token}${rev}${cnt}${bgn}${edn}`,
{ method: 'GET' });
checkResponse(topics)
return {

View File

@ -1,12 +1,7 @@
import { checkResponse, fetchWithTimeout } from './fetchUtil';
export async function getContactChannelTopic(server, token, channelId, topicId) {
let host = "";
if (server) {
host = `https://${server}`;
}
let topic = await fetchWithTimeout(`${host}/content/channels/${channelId}/topics/${topicId}/detail?contact=${token}`,
let topic = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/topics/${topicId}/detail?contact=${token}`,
{ method: 'GET' });
checkResponse(topic)
return await topic.json()

View File

@ -1,9 +1,4 @@
export function getContactChannelTopicAssetUrl(server, token, channelId, topicId, assetId) {
let host = "";
if (server) {
host = `https://${server}`;
}
return `${host}/content/channels/${channelId}/topics/${topicId}/assets/${assetId}?contact=${token}`
return `https://${server}/content/channels/${channelId}/topics/${topicId}/assets/${assetId}?contact=${token}`
}

View File

@ -1,11 +1,6 @@
import { checkResponse, fetchWithTimeout } from './fetchUtil';
export async function getContactChannelTopics(server, token, channelId, revision, count, begin, end) {
let host = "";
if (server) {
host = `https://${server}`;
}
let rev = ''
if (revision != null) {
rev = `&revision=${revision}`
@ -22,7 +17,7 @@ export async function getContactChannelTopics(server, token, channelId, revision
if (end != null) {
edn = `&end=${end}`
}
let topics = await fetchWithTimeout(`${host}/content/channels/${channelId}/topics?contact=${token}${rev}${cnt}${bgn}${edn}`,
let topics = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/topics?contact=${token}${rev}${cnt}${bgn}${edn}`,
{ method: 'GET' });
checkResponse(topics)
return {

View File

@ -1,8 +1,8 @@
import { checkResponse, fetchWithTimeout } from './fetchUtil';
export async function removeChannel(token, channelId) {
export async function removeChannel(server, token, channelId) {
let channel = await fetchWithTimeout(`/content/channels/${channelId}?agent=${token}`,
let channel = await fetchWithTimeout(`https://${server}/content/channels/${channelId}?agent=${token}`,
{ method: 'DELETE' });
checkResponse(channel);
}

View File

@ -1,8 +1,8 @@
import { checkResponse, fetchWithTimeout } from './fetchUtil';
export async function removeChannelTopic(token, channelId, topicId) {
export async function removeChannelTopic(server, token, channelId, topicId) {
let channel = await fetchWithTimeout(`/content/channels/${channelId}/topics/${topicId}?agent=${token}`,
let channel = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/topics/${topicId}?agent=${token}`,
{ method: 'DELETE' });
checkResponse(channel);
}

View File

@ -1,12 +1,7 @@
import { checkResponse, fetchWithTimeout } from './fetchUtil';
export async function removeContactChannel(server, token, channelId) {
let host = "";
if (server) {
host = `https://${server}`;
}
let channel = await fetchWithTimeout(`${host}/content/channels/${channelId}?contact=${token}`,
let channel = await fetchWithTimeout(`https://${server}/content/channels/${channelId}?contact=${token}`,
{ method: 'DELETE' });
checkResponse(channel);
}

View File

@ -1,12 +1,7 @@
import { checkResponse, fetchWithTimeout } from './fetchUtil';
export async function removeContactChannelTopic(server, token, channelId, topicId) {
let host = "";
if (server) {
host = `https://${server}`;
}
let channel = await fetchWithTimeout(`${host}/content/channels/${channelId}/topics/${topicId}?contact=${token}`,
let channel = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/topics/${topicId}?contact=${token}`,
{ method: 'DELETE' });
checkResponse(channel);
}

View File

@ -1,9 +1,9 @@
import { checkResponse, fetchWithTimeout } from './fetchUtil';
export async function setChannelSubject(token, channelId, subject ) {
export async function setChannelSubject(server, token, channelId, subject ) {
let data = { subject };
let params = { dataType: 'superbasic', data: JSON.stringify(data) };
let channel = await fetchWithTimeout(`/content/channels/${channelId}/subject?agent=${token}`, { method: 'PUT', body: JSON.stringify(params)} );
let channel = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/subject?agent=${token}`, { method: 'PUT', body: JSON.stringify(params)} );
checkResponse(channel);
return await channel.json();
}

View File

@ -1,11 +1,11 @@
import { checkResponse, fetchWithTimeout } from './fetchUtil';
export async function setChannelTopicSubject(token, channelId, topicId, data) {
export async function setChannelTopicSubject(server, token, channelId, topicId, data) {
let subject = { data: JSON.stringify(data, (key, value) => {
if (value !== null) return value
}), datatype: 'superbasictopic' };
let channel = await fetchWithTimeout(`/content/channels/${channelId}/topics/${topicId}/subject?agent=${token}&confirm=true`,
let channel = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/topics/${topicId}/subject?agent=${token}&confirm=true`,
{ method: 'PUT', body: JSON.stringify(subject) });
checkResponse(channel);
}

View File

@ -1,16 +1,11 @@
import { checkResponse, fetchWithTimeout } from './fetchUtil';
export async function setContactChannelTopicSubject(server, token, channelId, topicId, data) {
let host = "";
if (server) {
host = `https://${server}`;
}
let subject = { data: JSON.stringify(data, (key, value) => {
if (value !== null) return value
}), datatype: 'superbasictopic' };
let channel = await fetchWithTimeout(`${host}/content/channels/${channelId}/topics/${topicId}/subject?contact=${token}&confirm=true`,
let channel = await fetchWithTimeout(`https://${server}/content/channels/${channelId}/topics/${topicId}/subject?contact=${token}&confirm=true`,
{ method: 'PUT', body: JSON.stringify(subject) });
checkResponse(channel);
}

View File

@ -5,7 +5,6 @@ import { getCardProfile } from 'api/getCardProfile';
import { getCardDetail } from 'api/getCardDetail';
import { getContactChannels } from 'api/getContactChannels';
import { getContactChannelTopics } from 'api/getContactChannelTopics';
import { getContactChannelDetail } from 'api/getContactChannelDetail';
import { getContactChannelSummary } from 'api/getContactChannelSummary';
import { getCardImageUrl } from 'api/getCardImageUrl';
@ -18,6 +17,14 @@ import { setCardOpenMessage } from 'api/setCardOpenMessage';
import { getCardCloseMessage } from 'api/getCardCloseMessage';
import { setCardCloseMessage } from 'api/setCardCloseMessage';
import { getContactChannelTopic } from 'api/getContactChannelTopic';
import { getContactChannelTopics } from 'api/getContactChannelTopics';
import { getContactChannelTopicAssetUrl } from 'api/getContactChannelTopicAssetUrl';
import { addContactChannelTopic } from 'api/addContactChannelTopic';
import { setContactChannelTopicSubject } from 'api/setContactChannelTopicSubject';
import { removeContactChannel } from 'api/removeContactChannel';
import { removeContactChannelTopic } from 'api/removeContactChannelTopic';
export function useCardContext() {
const [state, setState] = useState({
cards: new Map(),
@ -162,6 +169,17 @@ export function useCardContext() {
}
}
}
const setCardChannelSyncRevision = (cardId, channelId, revision) => {
let card = cards.current.get(cardId);
if (card) {
let channel = card.channels.get(channelId);
if (channel) {
channel.syncRevision = revision;
card.channels.set(channelId, channel);
cards.current.set(cardId, card);
}
}
}
const clearCardChannel = (cardId, channelId) => {
let card = cards.current.get(cardId);
if (card) {
@ -404,34 +422,46 @@ export function useCardContext() {
await store.actions.clearCardItemBlocked(guid, cardId);
updateState({ cards: cards.current });
},
getSyncRevision: async (cardId, channelId) => {
const { guid } = session.current;
return await store.actions.getCardChannelItemSyncRevision(guid, cardId, channelId);
},
setSyncRevision: async (cardId, channelId, revision) => {
const { guid } = session.current;
return await store.actions.setCardChannelItemSyncRevision(guid, cardId, channelId, revision);
await store.actions.setCardChannelItemSyncRevision(guid, cardId, channelId, revision);
setCardChannelSyncRevision(cardId, channelId, revision);
updateState({ cards: cards.current });
},
getTopicItems: async (cardId, channelId) => {
getChannelTopicItems: async (cardId, channelId) => {
const { guid } = session.current;
return await store.actions.getCardChannelTopicItems(guid, cardId, channelId);
},
getTopicDeltaItems: async (cardId, channelId, revision) => {
getChannelTopicDeltaItems: async (cardId, channelId, revision) => {
const { guid } = session.current;
return await store.actions.getCardChannelTopicDeltaItems(guid, cardId, channelId, revision);
},
setTopicItem: async (cardId, channelId, topicId, channelRevision, topic) => {
setChannelTopicItem: async (cardId, channelId, topicId, channelRevision, topic) => {
const { guid } = session.current;
return await store.actions.setCardChannelTopicItem(guid, cardId, channelId, topicId, channelRevision, topic);
},
clearTopicItem: async (cardId, channelId, topicId) => {
clearChannelTopicItem: async (cardId, channelId, topicId) => {
const { guid } = session.current;
return await store.actions.clearCardChannelTopicItem(guid, cardId, channelId, topicId);
},
clearTopicItems: async (cardId, channelId) => {
clearChannelTopicItems: async (cardId, channelId) => {
const { guid } = session.current;
return await store.actions.clearCardChannelTopicItems(guid, cardId, channelId);
},
getChannelTopic: async (cardId, channelId, topicId) => {
},
getChannelTopics: async (cardId, channelId) => {
},
getChannelTopicAssetUrl: async (cardId, channelId, assetId) => {
},
addChannelTopic: async (cardId, channelId, message, assets) => {
},
setChannelTopicSubject: async (cardId, channelId, topicId, data) => {
},
removeChannel: async (cardId, channelId) => {
},
removeChannelTopic: async (cardId, channelId, topicId) => {
},
}
return { state, actions }

View File

@ -3,6 +3,17 @@ import { StoreContext } from 'context/StoreContext';
import { getChannels } from 'api/getChannels';
import { getChannelDetail } from 'api/getChannelDetail';
import { getChannelSummary } from 'api/getChannelSummary';
import { addChannel } from 'api/addChannel';
import { removeChannel } from 'api/removeChannel';
import { removeChannelTopic } from 'api/removeChannelTopic';
import { setChannelTopicSubject } from 'api/setChannelTopicSubject';
import { addChannelTopic } from 'api/addChannelTopic';
import { getChannelTopics } from 'api/getChannelTopics';
import { getChannelTopic } from 'api/getChannelTopic';
import { getChannelTopicAssetUrl } from 'api/getChannelTopicAssetUrl';
import { setChannelSubject } from 'api/setChannelSubject';
import { setChannelCard } from 'api/setChannelCard';
import { clearChannelCard } from 'api/clearChannelCard';
export function useChannelContext() {
const [state, setState] = useState({
@ -63,6 +74,13 @@ export function useChannelContext() {
channels.current.set(channelId, channel);
}
}
const setChannelSyncRevision = (channelId, revision) => {
let channel = channels.current.get(channelId);
if (channel) {
channel.syncRevision = revision;
channels.current.set(channelId, channel);
}
}
const sync = async () => {
@ -156,13 +174,11 @@ export function useChannelContext() {
setChannelReadRevision(channelId, rev);
updateState({ channels: channels.current });
},
getSyncRevision: async (channelId) => {
const { guid } = session.current;
return await store.actions.getChannelItemSyncRevision(guid, channelId);
},
setSyncRevision: async (channelId, revision) => {
const { guid } = session.current;
return await store.actions.setChannelItemSyncRevision(guid, channelId, revision);
await store.actions.setChannelItemSyncRevision(guid, channelId, revision);
setChannelSyncRevision(channelId, revision);
updateState({ channels: channels.current });
},
getTopicItems: async (channelId) => {
const { guid } = session.current;
@ -184,7 +200,20 @@ export function useChannelContext() {
const { guid } = session.current;
return await store.actions.clearChannelTopicItems(guid, channelId);
},
getTopic: async (channelId, topicId) => {
},
getTopics: async (channelId) => {
},
getTopicAssetUrl: async (channelId, assetId) => {
},
addTopic: async (channelId, message, assets) => {
},
setTopicSubject: async (channelId, topicId, data) => {
},
remove: async (channelId) => {
},
removeTopic: async (channelId, topicId) => {
},
}
return { state, actions }

View File

@ -17,31 +17,99 @@ export function useConversationContext() {
const profile = useContext(ProfileContext);
const topics = useRef(new Map());
const revision = useRef(0);
const detailRevision = useRef(0);
const syncRevision = useRef(0);
const syncing = useRef(false);
const cardId = useRef(null);
const channelId = useRef(null);
const conversationId = useRef(null);
const setView = useRef(0);
const updateState = (value) => {
setState((s) => ({ ...s, ...value }))
}
const getTopicItems = async (cardId, channelId) => {
if (cardId) {
return await card.actions.getChannelTopicItems(cardId, channelId);
}
return await channel.actions.getTopicItems(channelId);
}
const getTopicDeltaItems = async (cardId, channelId, revision) => {
if (cardId) {
return await card.actions.getChannelTopicDeltaItems(cardId, channelId, revision);
}
return await channel.actions.getTopicDeltaItems(channelId, revision);
}
const setTopicItem = async (cardId, channelId, revision, topic) => {
if (cardId) {
return await card.actions.setChannelTopicItem(cardId, channelId, revision, topic);
}
return await channel.actions.setTopicItem(channelId, revision, topic);
}
const clearTopicItem = async (cardId, channelId, topicId) => {
if (cardId) {
return await card.actions.clearChannelTopicItem(cardId, channelId, topicId);
}
return await channel.actions.clearTopicItem(channelId, topicId);
}
const getTopic = async (cardId, channelId, topicId) => {
}
const getTopics = async (cardId, channelId) => {
}
const getTopicAssetUrl = async (cardId, channelId, assetId) => {
}
const addTopic = async (cardId, channelId, message, asssets) => {
}
const setTopicSubject = async (cardId, channelId, topicId, data) => {
}
const removeChannel = async (cardId, channelId) => {
}
const removeChannelTopic = async (cardId, channelId, topicId) => {
}
const sync = async () => {
const curView = setView.current;
const item = getChannel(cardId.current, channelId.current);
if (!syncing.current && item?.revision !== revision.current) {
if (!syncing.current && conversationId.current) {
const { cardId, channelId } = conversationId.current;
const item = getChannel(cardId, channelId);
if (item && (item.revision !== revision.current || item.syncRevision != syncRevision.current)) {
syncing.current = true;
// stuff
setChannel(item);
// set channel details
if (detailRevision.current != item.detailRevision) {
if (curView === setView.current) {
revision.current = item?.revision;
setChannel(item);
detailRevision.current = item.detailRevision;
}
}
// set channel topics
if (syncRevision.current != item.syncRevision) {
if (syncRevision.current) {
const topics = getTopicDeltaItems(cardId, channelId);
}
else {
const topics = getTopicItems(cardId, channelId);
}
if (curView === setView.current) {
syncRevision.current = item.syncRevision;
}
}
// sync from server to store
if (item.topicRevision !== item.syncRevision) {
console.log("pull latest topics");
}
// update revision
if (curView === setView.current) {
revision.current = item.revision;
}
syncing.current = false;
sync();
}
}
}
const getCard = (guid) => {
let contact = null
@ -134,12 +202,20 @@ export function useConversationContext() {
const actions = {
setChannel: (channel) => {
if (channel.cardId !== cardId.current || channel.channelId !== channelId.current) {
if (channel == null) {
setView.current++;
revision.current = 0;
conversationId.current = null;
updateState({ subject: null, logo: null, contacts: [], topics: [] });
}
else if (channel.cardId !== conversationId.current?.cardId || channel.channelId !== conversationId.current?.channelId) {
setView.current++;
conversationId.current = channel;
updateState({ subject: null, logo: null, contacts: [], topics: [] });
revision.current = null;
detailRevision.current = null;
syncRevision.current = null;
topics.current = new Map();
channelId.current = channel.channelId;
cardId.current = channel.cardId;
sync();
}
},

View File

@ -186,9 +186,6 @@ export function useStoreContext() {
setChannelItemReadRevision: async (guid, channelId, revision) => {
await db.current.executeSql(`UPDATE channel_${guid} set read_revision=? where channel_id=?`, [revision, channelId]);
},
getChannelItemSyncRevision: async (guid, cardId, channelId) => {
return getValue(`SELECT sync_revision as value FROM channel_${guid} where channel_id=?`, [channelId]);
},
setChannelItemSyncRevision: async (guid, channelId, revision) => {
await db.current.executeSql(`UPDATE channel_${guid} set sync_revision=? where channel_id=?`, [revision, channelId]);
},
@ -210,13 +207,14 @@ export function useStoreContext() {
};
},
getChannelItems: async (guid) => {
const values = await getAppValues(db.current, `SELECT channel_id, read_revision, revision, detail_revision, topic_revision, detail, summary FROM channel_${guid}`, []);
const values = await getAppValues(db.current, `SELECT channel_id, read_revision, revision, sync_revision, detail_revision, topic_revision, detail, summary FROM channel_${guid}`, []);
return values.map(channel => ({
channelId: channel.channel_id,
revision: channel.revision,
readRevision: channel.read_revision,
detailRevision: channel.detail_revision,
topicRevision: channel.topic_revision,
syncRevsion: channel.sync_revision,
detail: decodeObject(channel.detail),
summary: decodeObject(channel.summary),
}));
@ -265,9 +263,6 @@ export function useStoreContext() {
setCardChannelItemReadRevision: async (guid, cardId, channelId, revision) => {
await db.current.executeSql(`UPDATE card_channel_${guid} set read_revision=? where card_id=? and channel_id=?`, [revision, cardId, channelId]);
},
getCardChannelItemSyncRevision: async (guid, cardId, channelId) => {
return getValue(`SELECT sync_revision as value FROM card_channel_${guid} where card_id=? and channel_id=?`, [cardId, channelId]);
},
setCardChannelItemSyncRevision: async (guid, cardId, channelId, revision) => {
await db.current.executeSql(`UPDATE card_channel_${guid} set sync_revision=? where card_id=? and channel_id=?`, [revision, cardId, channelId]);
},
@ -289,7 +284,7 @@ export function useStoreContext() {
};
},
getCardChannelItems: async (guid) => {
const values = await getAppValues(db.current, `SELECT card_id, channel_id, read_revision, revision, blocked, detail_revision, topic_revision, detail, summary FROM card_channel_${guid}`, []);
const values = await getAppValues(db.current, `SELECT card_id, channel_id, read_revision, sync_revision, revision, blocked, detail_revision, topic_revision, detail, summary FROM card_channel_${guid}`, []);
return values.map(channel => ({
cardId: channel.card_id,
channelId: channel.channel_id,
@ -297,6 +292,7 @@ export function useStoreContext() {
readRevision: channel.read_revision,
detailRevision: channel.detail_revision,
topicRevision: channel.topic_revision,
syncRevision: channel.sync_revision,
detail: decodeObject(channel.detail),
summary: decodeObject(channel.summary),
blocked: channel.blocked,
@ -388,11 +384,4 @@ async function getAppValues(sql: SQLite.SQLiteDatabase, query: string, params) {
return values;
}
async function getValue(sql: SQLite.SQLiteDatabase, query: string, params) {
const res = await sql.executeSql(query, params);
if (hasResult(res)) {
return res[0].rows.item(0).value
}
return null;
}

View File

@ -1,5 +1,5 @@
import { View, TouchableOpacity, Text } from 'react-native';
import { useState, useEffect } from 'react';
import { useState, useEffect, useContext } from 'react';
import { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { createDrawerNavigator } from '@react-navigation/drawer';
@ -21,6 +21,7 @@ import { Welcome } from './welcome/Welcome';
import { ChannelsTitle, ChannelsBody, Channels } from './channels/Channels';
import { useChannels } from './channels/useChannels.hook';
import { CommonActions } from '@react-navigation/native';
import { ConversationContext } from 'context/ConversationContext';
const ConversationStack = createStackNavigator();
const ProfileStack = createStackNavigator();
@ -77,6 +78,11 @@ export function Session() {
}
const channels = useChannels();
const conversation = useContext(ConversationContext);
useEffect(() => {
conversation.actions.setChannel(selected);
}, [selected]);
return (
<ConversationStack.Navigator screenOptions={({ route }) => ({ headerShown: true, headerTintColor: Colors.primary })}>

View File

@ -15,10 +15,6 @@ export function useConversation(cardId, channelId) {
setState((s) => ({ ...s, ...value }));
}
useEffect(() => {
conversation.actions.setChannel({ cardId, channelId });
}, [cardId, channelId]);
useEffect(() => {
const { topics, subject, logo } = conversation.state;
updateState({ topics, subject, logo });