a tool for shared writing and social publishing
at main 1.3 kB view raw
1"use client"; 2import { createContext, useContext } from "react"; 3import type { PostPageData } from "app/lish/[did]/[publication]/[rkey]/getPostPageData"; 4 5// Derive types from PostPageData 6type NonNullPostPageData = NonNullable<PostPageData>; 7export type PublicationContext = NonNullPostPageData["publication"]; 8export type CommentOnDocument = NonNullPostPageData["comments"][number]; 9export type DocumentMention = NonNullPostPageData["mentions"][number]; 10export type QuotesAndMentions = NonNullPostPageData["quotesAndMentions"]; 11 12export type DocumentContextValue = Pick< 13 NonNullPostPageData, 14 | "uri" 15 | "normalizedDocument" 16 | "normalizedPublication" 17 | "theme" 18 | "prevNext" 19 | "quotesAndMentions" 20 | "publication" 21 | "comments" 22 | "mentions" 23 | "leafletId" 24>; 25 26const DocumentContext = createContext<DocumentContextValue | null>(null); 27 28export function useDocument() { 29 const ctx = useContext(DocumentContext); 30 if (!ctx) throw new Error("useDocument must be used within DocumentProvider"); 31 return ctx; 32} 33 34export function useDocumentOptional() { 35 return useContext(DocumentContext); 36} 37 38export function DocumentProvider({ 39 children, 40 value, 41}: { 42 children: React.ReactNode; 43 value: DocumentContextValue; 44}) { 45 return ( 46 <DocumentContext.Provider value={value}> 47 {children} 48 </DocumentContext.Provider> 49 ); 50}