import Link from "next/link"; import { useLeafletPublicationData } from "components/PageSWRDataProvider"; import { useRef } from "react"; import { useReplicache } from "src/replicache"; import { AsyncValueAutosizeTextarea } from "components/utils/AutosizeTextarea"; import { Separator } from "components/Layout"; import { AtUri } from "@atproto/syntax"; import { PubLeafletDocument } from "lexicons/api"; import { getBasePublicationURL, getPublicationURL, } from "app/lish/createPub/getPublicationURL"; import { useSubscribe } from "src/replicache/useSubscribe"; import { useEntitySetContext } from "components/EntitySetProvider"; import { timeAgo } from "src/utils/timeAgo"; import { useIdentityData } from "components/IdentityProvider"; export const PublicationMetadata = () => { let { rep } = useReplicache(); let { data: pub } = useLeafletPublicationData(); let { identity } = useIdentityData(); let title = useSubscribe(rep, (tx) => tx.get("publication_title")); let description = useSubscribe(rep, (tx) => tx.get("publication_description"), ); let record = pub?.documents?.data as PubLeafletDocument.Record | null; let publishedAt = record?.publishedAt; if (!pub || !pub.publications) return null; if (typeof title !== "string") { title = pub?.title || ""; } if (typeof description !== "string") { description = pub?.description || ""; } return (
{pub.publications?.name}
Editor
{ await rep?.mutate.updatePublicationDraft({ title: newTitle, description, }); }} placeholder="Untitled" /> { await rep?.mutate.updatePublicationDraft({ title, description: newDescription, }); }} /> {pub.doc ? (

Published {publishedAt && timeAgo(publishedAt)}

View Post
) : (

Draft

)}
); }; export const TextField = ({ value, onChange, className, placeholder, }: { value: string; onChange: (v: string) => Promise; className: string; placeholder: string; }) => { let { undoManager } = useReplicache(); let actionTimeout = useRef(null); let { permissions } = useEntitySetContext(); let previousSelection = useRef(null); let ref = useRef(null); return ( { let start = e.currentTarget.selectionStart, end = e.currentTarget.selectionEnd; previousSelection.current = { start, end }; }} className={className} value={value} onBlur={async () => { if (actionTimeout.current) { undoManager.endGroup(); window.clearTimeout(actionTimeout.current); actionTimeout.current = null; } }} onChange={async (e) => { let newValue = e.currentTarget.value; let oldValue = value; let start = e.currentTarget.selectionStart, end = e.currentTarget.selectionEnd; await onChange(e.currentTarget.value); if (actionTimeout.current) { window.clearTimeout(actionTimeout.current); } else { undoManager.startGroup(); } actionTimeout.current = window.setTimeout(() => { undoManager.endGroup(); actionTimeout.current = null; }, 200); let previousStart = previousSelection.current?.start || null, previousEnd = previousSelection.current?.end || null; undoManager.add({ redo: async () => { await onChange(newValue); ref.current?.setSelectionRange(start, end); ref.current?.focus(); }, undo: async () => { await onChange(oldValue); ref.current?.setSelectionRange(previousStart, previousEnd); ref.current?.focus(); }, }); }} placeholder={placeholder} /> ); }; export const PublicationMetadataPreview = () => { let { data: pub } = useLeafletPublicationData(); let record = pub?.documents?.data as PubLeafletDocument.Record | null; let publishedAt = record?.publishedAt; if (!pub || !pub.publications) return null; return (
{pub.publications?.name}
{pub.title ? pub.title : "Untitled"}
{pub.description}
{pub.doc ? (

Published {publishedAt && timeAgo(publishedAt)}

) : (

Draft

)}
); };