diff --git a/src/app.jsx b/src/app.jsx index a4f373e..8cc0e58 100644 --- a/src/app.jsx +++ b/src/app.jsx @@ -20,7 +20,7 @@ import Settings from './pages/settings'; import Status from './pages/status'; import Welcome from './pages/welcome'; import { getAccessToken } from './utils/auth'; -import states from './utils/states'; +import states, { saveStatus } from './utils/states'; import store from './utils/store'; const { VITE_CLIENT_NAME: CLIENT_NAME } = import.meta.env; @@ -300,18 +300,12 @@ async function startStream() { }); } - states.statuses[status.id] = status; - if (status.reblog) { - states.statuses[status.reblog.id] = status.reblog; - } + saveStatus(status); }, 5000); stream.on('update', handleNewStatus); stream.on('status.update', (status) => { console.log('STATUS.UPDATE', status); - states.statuses[status.id] = status; - if (status.reblog) { - states.statuses[status.reblog.id] = status.reblog; - } + saveStatus(status); }); stream.on('delete', (statusID) => { console.log('DELETE', statusID); @@ -332,16 +326,7 @@ async function startStream() { states.notificationsNew.unshift(notification); } - if (notification.status && !states.statuses[notification.status.id]) { - states.statuses[notification.status.id] = notification.status; - if ( - notification.status.reblog && - !states.statuses[notification.status.reblog.id] - ) { - states.statuses[notification.status.reblog.id] = - notification.status.reblog; - } - } + saveStatus(notification.status, { override: false }); }); stream.ws.onclose = () => { @@ -393,10 +378,7 @@ function startVisibility() { newStatuses[0].id !== states.home[0].id ) { states.homeNew = newStatuses.map((status) => { - states.statuses[status.id] = status; - if (status.reblog) { - states.statuses[status.reblog.id] = status.reblog; - } + saveStatus(status); return { id: status.id, reblog: status.reblog?.id, @@ -418,19 +400,7 @@ function startVisibility() { states.notificationsNew.unshift(notification); } - if ( - notification.status && - !states.statuses[notification.status.id] - ) { - states.statuses[notification.status.id] = notification.status; - if ( - notification.status.reblog && - !states.statuses[notification.status.reblog.id] - ) { - states.statuses[notification.status.reblog.id] = - notification.status.reblog; - } - } + saveStatus(notification.status, { override: false }); } } catch (e) { // Silently fail diff --git a/src/components/status.jsx b/src/components/status.jsx index fafe5dc..a6bb7f3 100644 --- a/src/components/status.jsx +++ b/src/components/status.jsx @@ -22,7 +22,7 @@ import NameText from '../components/name-text'; import enhanceContent from '../utils/enhance-content'; import htmlContentLength from '../utils/html-content-length'; import shortenNumber from '../utils/shorten-number'; -import states from '../utils/states'; +import states, { saveStatus } from '../utils/states'; import store from '../utils/store'; import useDebouncedCallback from '../utils/useDebouncedCallback'; import visibilityIconsMap from '../utils/visibility-icons-map'; @@ -531,12 +531,10 @@ function Status({ const newStatus = await masto.v1.statuses.unreblog( id, ); - states.statuses[newStatus.id] = newStatus; + saveStatus(newStatus); } else { const newStatus = await masto.v1.statuses.reblog(id); - states.statuses[newStatus.id] = newStatus; - states.statuses[newStatus.reblog.id] = - newStatus.reblog; + saveStatus(newStatus); } } catch (e) { console.error(e); @@ -568,10 +566,10 @@ function Status({ const newStatus = await masto.v1.statuses.unfavourite( id, ); - states.statuses[newStatus.id] = newStatus; + saveStatus(newStatus); } else { const newStatus = await masto.v1.statuses.favourite(id); - states.statuses[newStatus.id] = newStatus; + saveStatus(newStatus); } } catch (e) { console.error(e); @@ -599,10 +597,10 @@ function Status({ const newStatus = await masto.v1.statuses.unbookmark( id, ); - states.statuses[newStatus.id] = newStatus; + saveStatus(newStatus); } else { const newStatus = await masto.v1.statuses.bookmark(id); - states.statuses[newStatus.id] = newStatus; + saveStatus(newStatus); } } catch (e) { console.error(e); diff --git a/src/pages/home.jsx b/src/pages/home.jsx index e198dfc..76a7f5d 100644 --- a/src/pages/home.jsx +++ b/src/pages/home.jsx @@ -7,7 +7,7 @@ import { useSnapshot } from 'valtio'; import Icon from '../components/icon'; import Loader from '../components/loader'; import Status from '../components/status'; -import states from '../utils/states'; +import states, { saveStatus } from '../utils/states'; import useDebouncedCallback from '../utils/useDebouncedCallback'; import useScroll from '../utils/useScroll'; @@ -38,10 +38,7 @@ function Home({ hidden }) { return { done: true }; } const homeValues = allStatuses.value.map((status) => { - states.statuses[status.id] = status; - if (status.reblog) { - states.statuses[status.reblog.id] = status.reblog; - } + saveStatus(status); return { id: status.id, reblog: status.reblog?.id, diff --git a/src/utils/states.js b/src/utils/states.js index c65344b..2c52034 100644 --- a/src/utils/states.js +++ b/src/utils/states.js @@ -1,6 +1,6 @@ import { proxy } from 'valtio'; -export default proxy({ +const states = proxy({ history: [], statuses: {}, home: [], @@ -19,3 +19,14 @@ export default proxy({ showAccount: false, composeCharacterCount: 0, }); +export default states; + +export function saveStatus(status, opts) { + const { override } = Object.assign({ override: true }, opts); + if (!status) return; + if (!override && states.statuses[status.id]) return; + states.statuses[status.id] = status; + if (status.reblog) { + states.statuses[status.reblog.id] = status.reblog; + } +}