diff --git a/app/(home-pages)/home/LeafletList/LeafletOptions.tsx b/app/(home-pages)/home/LeafletList/LeafletOptions.tsx index 7781906b..1a6125fc 100644 --- a/app/(home-pages)/home/LeafletList/LeafletOptions.tsx +++ b/app/(home-pages)/home/LeafletList/LeafletOptions.tsx @@ -24,6 +24,14 @@ import { ShareButton } from "components/ShareOptions"; import { ShareSmall } from "components/Icons/ShareSmall"; import { PermissionToken } from "src/replicache"; +import { + useIdentityData, + mutateIdentityData, +} from "components/IdentityProvider"; +import { + usePublicationData, + mutatePublicationData, +} from "app/lish/[did]/[publication]/dashboard/PublicationSWRProvider"; export const LeafletOptions = (props: { leaflet: PermissionToken; @@ -99,6 +107,8 @@ const DefaultOptions = (props: { archived?: boolean | null; }) => { let toaster = useToaster(); + let { mutate: mutatePub } = usePublicationData(); + let { mutate: mutateIdentity } = useIdentityData(); return ( <> { if (!props.archived) { + mutateIdentityData(mutateIdentity, (data) => { + let item = data.permission_token_on_homepage.find( + (p) => p.permission_tokens?.id === props.leaflet.id, + ); + if (item) item.archived = true; + }); + mutatePublicationData(mutatePub, (data) => { + let item = data.publication?.leaflets_in_publications.find( + (l) => l.permission_tokens?.id === props.leaflet.id, + ); + if (item) item.archived = true; + }); await archivePost(props.leaflet.id); toaster({ content: ( @@ -131,6 +153,18 @@ const DefaultOptions = (props: { { + mutateIdentityData(mutateIdentity, (data) => { + let item = data.permission_token_on_homepage.find( + (p) => p.permission_tokens?.id === props.leaflet.id, + ); + if (item) item.archived = false; + }); + mutatePublicationData(mutatePub, (data) => { + let item = data.publication?.leaflets_in_publications.find( + (l) => l.permission_tokens?.id === props.leaflet.id, + ); + if (item) item.archived = false; + }); await unarchivePost(props.leaflet.id); toaster({ content: ( @@ -149,6 +183,18 @@ const DefaultOptions = (props: { type: "success", }); } else { + mutateIdentityData(mutateIdentity, (data) => { + let item = data.permission_token_on_homepage.find( + (p) => p.permission_tokens?.id === props.leaflet.id, + ); + if (item) item.archived = false; + }); + mutatePublicationData(mutatePub, (data) => { + let item = data.publication?.leaflets_in_publications.find( + (l) => l.permission_tokens?.id === props.leaflet.id, + ); + if (item) item.archived = false; + }); await unarchivePost(props.leaflet.id); toaster({ content:
Unarchived!
, @@ -240,6 +286,8 @@ const DeleteAreYouSureForm = (props: { draft?: boolean; }) => { let toaster = useToaster(); + let { mutate: mutatePub } = usePublicationData(); + let { mutate: mutateIdentity } = useIdentityData(); return (
@@ -253,6 +301,19 @@ const DeleteAreYouSureForm = (props: { { + mutateIdentityData(mutateIdentity, (data) => { + data.permission_token_on_homepage = + data.permission_token_on_homepage.filter( + (p) => p.permission_tokens?.id !== props.leaflet.id, + ); + }); + mutatePublicationData(mutatePub, (data) => { + if (!data.publication) return; + data.publication.leaflets_in_publications = + data.publication.leaflets_in_publications.filter( + (l) => l.permission_tokens?.id !== props.leaflet.id, + ); + }); if (props.document_uri) { await deletePost(props.document_uri); } diff --git a/app/lish/[did]/[publication]/dashboard/PublicationSWRProvider.tsx b/app/lish/[did]/[publication]/dashboard/PublicationSWRProvider.tsx index b6da3cbd..96f51b9c 100644 --- a/app/lish/[did]/[publication]/dashboard/PublicationSWRProvider.tsx +++ b/app/lish/[did]/[publication]/dashboard/PublicationSWRProvider.tsx @@ -3,7 +3,10 @@ import type { GetPublicationDataReturnType } from "app/api/rpc/[command]/get_publication_data"; import { callRPC } from "app/api/rpc/client"; import { createContext, useContext, useEffect } from "react"; -import useSWR, { SWRConfig, mutate } from "swr"; +import useSWR, { SWRConfig, KeyedMutator, mutate } from "swr"; +import { produce, Draft } from "immer"; + +export type PublicationData = GetPublicationDataReturnType["result"]; const PublicationContext = createContext({ name: "", did: "" }); export function PublicationSWRDataProvider(props: { @@ -45,3 +48,16 @@ export function usePublicationData() { ); return { data, mutate }; } + +export function mutatePublicationData( + mutate: KeyedMutator, + recipe: (draft: Draft>) => void, +) { + mutate( + (data) => { + if (!data) return data; + return produce(data, recipe); + }, + { revalidate: false }, + ); +} diff --git a/components/IdentityProvider.tsx b/components/IdentityProvider.tsx index 746d3551..a880080e 100644 --- a/components/IdentityProvider.tsx +++ b/components/IdentityProvider.tsx @@ -4,16 +4,30 @@ import { createContext, useContext, useEffect } from "react"; import useSWR, { KeyedMutator, mutate } from "swr"; import { DashboardState } from "./PageLayouts/DashboardLayout"; import { supabaseBrowserClient } from "supabase/browserClient"; +import { produce, Draft } from "immer"; export type InterfaceState = { dashboards: { [id: string]: DashboardState | undefined }; }; -type Identity = Awaited>; +export type Identity = Awaited>; let IdentityContext = createContext({ identity: null as Identity, mutate: (() => {}) as KeyedMutator, }); export const useIdentityData = () => useContext(IdentityContext); + +export function mutateIdentityData( + mutate: KeyedMutator, + recipe: (draft: Draft>) => void, +) { + mutate( + (data) => { + if (!data) return data; + return produce(data, recipe); + }, + { revalidate: false }, + ); +} export function IdentityContextProvider(props: { children: React.ReactNode; initialValue: Identity;