From b00d84b05c26bd28796faa8695e815b6335fd1a9 Mon Sep 17 00:00:00 2001 From: Roland Osborne Date: Thu, 21 Jul 2022 13:14:37 -0700 Subject: [PATCH] mark conversation update only after login timestamp --- doc/api.oa3 | 14 +++- net/server/internal/api_addAccountApp.go | 7 +- net/server/internal/models.go | 7 ++ .../Contacts/Channels/useChannels.hook.js | 8 +++ net/web/src/context/useAppContext.hook.js | 68 +++++++++++-------- 5 files changed, 74 insertions(+), 30 deletions(-) diff --git a/doc/api.oa3 b/doc/api.oa3 index 392d00d9..56aa451b 100644 --- a/doc/api.oa3 +++ b/doc/api.oa3 @@ -681,7 +681,7 @@ paths: content: application/json: schema: - type: string + $ref: '#/components/schemas/LoginAccess' '401': description: invalid token '406': @@ -3226,6 +3226,18 @@ components: properties: appToken: type: string + + LoginAccess { + type: object + required: + - appToken + - created + properties: + appToken: + type: string + created: + type: integer + format: int64 Revision: type: object diff --git a/net/server/internal/api_addAccountApp.go b/net/server/internal/api_addAccountApp.go index 6cdcf850..938dc3cd 100644 --- a/net/server/internal/api_addAccountApp.go +++ b/net/server/internal/api_addAccountApp.go @@ -53,6 +53,11 @@ func AddAccountApp(w http.ResponseWriter, r *http.Request) { return } - WriteResponse(w, account.Guid + "." + access) + login := LoginAccess { + AppToken: account.Guid + "." + access, + Created: app.Created, + } + + WriteResponse(w, login) } diff --git a/net/server/internal/models.go b/net/server/internal/models.go index dc5ae385..e4e89e20 100644 --- a/net/server/internal/models.go +++ b/net/server/internal/models.go @@ -322,6 +322,13 @@ type IdList struct { Ids []string `json:"ids"` } +type LoginAccess struct { + + AppToken string `json:"appToken"` + + Created int64 `json:"created"` +} + type NodeConfig struct { Domain string `json:"domain"` diff --git a/net/web/src/User/SideBar/Contacts/Channels/useChannels.hook.js b/net/web/src/User/SideBar/Contacts/Channels/useChannels.hook.js index 5f8e9efc..9fe6bc51 100644 --- a/net/web/src/User/SideBar/Contacts/Channels/useChannels.hook.js +++ b/net/web/src/User/SideBar/Contacts/Channels/useChannels.hook.js @@ -57,6 +57,14 @@ export function useChannels() { }; const setUpdated = (chan) => { + const login = store.state['login:timestamp']; + const update = chan?.data?.channelSummary?.lastTopic?.created; + + if (!update || (login && update < login)) { + chan.updated = false; + return; + } + let key = `${chan.id}::${chan.cardId}` if (store.state[key] && store.state[key] == chan.revision) { chan.updated = false; diff --git a/net/web/src/context/useAppContext.hook.js b/net/web/src/context/useAppContext.hook.js index 23a0020a..0b7c8146 100644 --- a/net/web/src/context/useAppContext.hook.js +++ b/net/web/src/context/useAppContext.hook.js @@ -14,34 +14,6 @@ import { ChannelContext } from './ChannelContext'; import { StoreContext } from './StoreContext'; import { UploadContext } from './UploadContext'; -async function appCreate(username, password, token, updateState, setWebsocket) { - await addAccount(username, password, token); - let access = await setLogin(username, password) - updateState({ token: access, access: 'user' }); - setWebsocket(access) - localStorage.setItem("session", JSON.stringify({ token: access, access: 'user' })); -} - -async function appLogin(username, password, updateState, setWebsocket) { - let access = await setLogin(username, password) - updateState({ token: access, access: 'user' }); - setWebsocket(access) - localStorage.setItem("session", JSON.stringify({ token: access, access: 'user' })); -} - -async function appAccess(token, updateState, setWebsocket) { - let access = await setAccountAccess(token) - updateState({ token: access, access: 'user' }); - setWebsocket(access) - localStorage.setItem("session", JSON.stringify({ token: access, access: 'user' })); -} - -function appLogout(updateState, clearWebsocket) { - updateState({ token: null, access: null }); - clearWebsocket() - localStorage.removeItem("session"); -} - export function useAppContext() { const [state, setState] = useState(null); const [appRevision, setAppRevision] = useState(); @@ -97,6 +69,46 @@ export function useAppContext() { } } + const appCreate = async (username, password, token) => { + await addAccount(username, password, token); + let access = await setLogin(username, password) + updateState({ token: access.appToken, access: 'user' }); + storeContext.actions.setValue('login:timestamp', access.created); + setWebsocket(access.appToken) + localStorage.setItem("session", JSON.stringify({ + token: access.appToken, + access: 'user', + timestamp: access.created, + })); + return access.created; + } + + const appLogin = async (username, password) => { + let access = await setLogin(username, password) + updateState({ token: access.appToken, access: 'user' }); + storeContext.actions.setValue('login:timestamp', access.created); + setWebsocket(access.appToken) + localStorage.setItem("session", JSON.stringify({ + token: access.appToken, + access: 'user', + timestamp: access.created, + })); + return access.created; + } + + const appAccess = async (token) => { + let access = await setAccountAccess(token) + updateState({ token: access, access: 'user' }); + setWebsocket(access) + localStorage.setItem("session", JSON.stringify({ token: access, access: 'user' })); + } + + function appLogout(updateState) { + updateState({ token: null, access: null }); + clearWebsocket() + localStorage.removeItem("session"); + } + const accessActions = { access: async (token) => { await appAccess(token, updateState, setWebsocket)