a tool for shared writing and social publishing
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}