From be8abbb75a7efd3023bf0431c8816e0e934f3d1e Mon Sep 17 00:00:00 2001 From: Jared Pereira Date: Wed, 14 May 2025 16:44:03 -0400 Subject: [PATCH] wire up draft metadata --- .../updateLeafletDraftMetadata.ts | 26 ++++++ app/lish/[handle]/[publication]/DraftList.tsx | 25 ++---- app/lish/[handle]/[publication]/page.tsx | 25 +----- components/PageSWRDataProvider.tsx | 1 + components/Pages/PublicationMetadata.tsx | 79 +++++++++++++++++++ components/Pages/index.tsx | 19 +---- src/hooks/useDebouncedEffect.ts | 18 +++++ 7 files changed, 135 insertions(+), 58 deletions(-) create mode 100644 actions/publications/updateLeafletDraftMetadata.ts create mode 100644 components/Pages/PublicationMetadata.tsx create mode 100644 src/hooks/useDebouncedEffect.ts diff --git a/actions/publications/updateLeafletDraftMetadata.ts b/actions/publications/updateLeafletDraftMetadata.ts new file mode 100644 index 00000000..c15fb1eb --- /dev/null +++ b/actions/publications/updateLeafletDraftMetadata.ts @@ -0,0 +1,26 @@ +"use server"; + +import { getIdentityData } from "actions/getIdentityData"; +import { supabaseServerClient } from "supabase/serverClient"; + +export async function updateLeafletDraftMetadata( + leafletID: string, + publication_uri: string, + title: string, + description: string, +) { + let identity = await getIdentityData(); + if (!identity?.atp_did) return null; + let { data: publication } = await supabaseServerClient + .from("publications") + .select() + .eq("uri", publication_uri) + .single(); + if (!publication || publication.identity_did !== identity.atp_did) + return null; + await supabaseServerClient + .from("leaflets_in_publications") + .update({ title, description }) + .eq("leaflet", leafletID) + .eq("publication", publication_uri); +} diff --git a/app/lish/[handle]/[publication]/DraftList.tsx b/app/lish/[handle]/[publication]/DraftList.tsx index ccdbc745..a9581f7e 100644 --- a/app/lish/[handle]/[publication]/DraftList.tsx +++ b/app/lish/[handle]/[publication]/DraftList.tsx @@ -8,7 +8,11 @@ import { NewDraftSecondaryButton } from "./NewDraftButton"; export function DraftList(props: { publication: string; - drafts: { id: string; initialFacts: Fact[]; root_entity: string }[]; + drafts: { + leaflet: string; + description: string; + title: string; + }[]; }) { let rel = usePublicationRelationship(); let { publication } = usePublicationContext(); @@ -18,29 +22,16 @@ export function DraftList(props: {
{props.drafts.map((d) => { - return ( - - - - ); + return ; })}
); } -function Draft(props: { id: string }) { +function Draft(props: { id: string; title: string }) { return ( - {props.id} +

{props.title}

); } diff --git a/app/lish/[handle]/[publication]/page.tsx b/app/lish/[handle]/[publication]/page.tsx index d8612d89..3433ff18 100644 --- a/app/lish/[handle]/[publication]/page.tsx +++ b/app/lish/[handle]/[publication]/page.tsx @@ -11,8 +11,6 @@ import { Footer } from "components/ActionBar/Footer"; import { PublicationDashboard } from "./PublicationDashboard"; import { DraftList } from "./DraftList"; import { NewDraftActionButton } from "./NewDraftButton"; -import { use } from "react"; -import { IdentityContext } from "components/IdentityProvider"; import { getIdentityData } from "actions/getIdentityData"; const idResolver = new IdResolver(); @@ -61,24 +59,6 @@ export default async function Publication(props: { if (!publication || identity.atp_did !== publication.identity_did) return ; - let all_facts = await supabaseServerClient.rpc("get_facts_for_roots", { - max_depth: 2, - roots: publication.leaflets_in_publications.map( - (l) => l.permission_tokens?.root_entity!, - ), - }); - let facts = - all_facts.data?.reduce( - (acc, fact) => { - if (!acc[fact.root_id]) acc[fact.root_id] = []; - acc[fact.root_id].push( - fact as unknown as Fact, - ); - return acc; - }, - {} as { [key: string]: Fact[] }, - ) || {}; - try { return (
@@ -92,10 +72,7 @@ export default async function Publication(props: { Drafts: ( ({ - ...d.permission_tokens!, - initialFacts: facts[d.permission_tokens?.root_entity!], - }))} + drafts={publication.leaflets_in_publications} /> ), Published:
none yet lol
, diff --git a/components/PageSWRDataProvider.tsx b/components/PageSWRDataProvider.tsx index 03d9cc71..7ae70fff 100644 --- a/components/PageSWRDataProvider.tsx +++ b/components/PageSWRDataProvider.tsx @@ -59,6 +59,7 @@ export function useLeafletPublicationData() { let { data, mutate } = useLeafletData(); return { data: data?.data?.leaflets_in_publications, + mutate, }; } export function useLeafletDomains() { diff --git a/components/Pages/PublicationMetadata.tsx b/components/Pages/PublicationMetadata.tsx new file mode 100644 index 00000000..56362174 --- /dev/null +++ b/components/Pages/PublicationMetadata.tsx @@ -0,0 +1,79 @@ +import Link from "next/link"; +import { useLeafletPublicationData } from "components/PageSWRDataProvider"; +import { Input } from "components/Input"; +import { useEffect, useState } from "react"; +import { useDebouncedEffect } from "src/hooks/useDebouncedEffect"; +import { updateLeafletDraftMetadata } from "actions/publications/updateLeafletDraftMetadata"; +import { useReplicache } from "src/replicache"; +import { useIdentityData } from "components/IdentityProvider"; +export const PublicationMetadata = ({ + cardBorderHidden, +}: { + cardBorderHidden: boolean; +}) => { + let { permission_token } = useReplicache(); + let { identity } = useIdentityData(); + let { data: publicationData, mutate } = useLeafletPublicationData(); + let pub = publicationData?.[0]; + let [titleState, setTitleState] = useState(pub?.title || ""); + let [descriptionState, setDescriptionState] = useState(pub?.title || ""); + + useEffect(() => { + setTitleState(pub?.title || ""); + setDescriptionState(pub?.description || ""); + }, [pub]); + useDebouncedEffect( + async () => { + if (!pub || !pub.publications) return; + if (pub.title === titleState && pub.description === descriptionState) + return; + await updateLeafletDraftMetadata( + permission_token.id, + pub.publications?.uri, + titleState, + descriptionState, + ); + mutate(); + }, + 1000, + [pub, titleState, descriptionState, permission_token], + ); + if (!pub || !pub.publications) return null; + + return ( +
+ + {pub.publications?.name} + + { + setTitleState(e.currentTarget.value); + }} + placeholder="Untitled" + /> +