a tool for shared writing and social publishing
1"use client";
2import { getRSVPData } from "actions/getRSVPData";
3import { SWRConfig } from "swr";
4import { useReplicache } from "src/replicache";
5import useSWR from "swr";
6import { callRPC } from "app/api/rpc/client";
7import { getPollData } from "actions/pollActions";
8import type { GetLeafletDataReturnType } from "app/api/rpc/[command]/get_leaflet_data";
9import { createContext, useContext } from "react";
10
11export const StaticLeafletDataContext = createContext<
12 null | GetLeafletDataReturnType["result"]["data"]
13>(null);
14export function PageSWRDataProvider(props: {
15 leaflet_id: string;
16 leaflet_data: GetLeafletDataReturnType["result"];
17 rsvp_data: Awaited<ReturnType<typeof getRSVPData>>;
18 poll_data: Awaited<ReturnType<typeof getPollData>>;
19 children: React.ReactNode;
20}) {
21 return (
22 <SWRConfig
23 value={{
24 fallback: {
25 rsvp_data: props.rsvp_data,
26 poll_data: props.poll_data,
27 [`${props.leaflet_id}-leaflet_data`]: props.leaflet_data.data,
28 },
29 }}
30 >
31 {props.children}
32 </SWRConfig>
33 );
34}
35
36export function useRSVPData() {
37 let { permission_token } = useReplicache();
38 return useSWR(`rsvp_data`, () =>
39 getRSVPData(
40 permission_token.permission_token_rights.map((pr) => pr.entity_set),
41 ),
42 );
43}
44export function usePollData() {
45 let { permission_token } = useReplicache();
46 return useSWR(`poll_data`, () =>
47 getPollData(
48 permission_token.permission_token_rights.map((pr) => pr.entity_set),
49 ),
50 );
51}
52
53let useLeafletData = () => {
54 let { permission_token } = useReplicache();
55 let staticLeafletData = useContext(StaticLeafletDataContext);
56 let res = useSWR(
57 staticLeafletData ? null : `${permission_token.id}-leaflet_data`,
58 async () =>
59 permission_token.id
60 ? (await callRPC("get_leaflet_data", { token_id: permission_token.id }))
61 ?.result.data
62 : undefined,
63 );
64 if (staticLeafletData) return { data: staticLeafletData, mutate: res.mutate };
65 return res;
66};
67export function useLeafletPublicationData() {
68 let { data, mutate } = useLeafletData();
69 return {
70 data:
71 data?.leaflets_in_publications?.[0] ||
72 data?.permission_token_rights[0].entity_sets?.permission_tokens?.find(
73 (p) => p.leaflets_in_publications.length,
74 )?.leaflets_in_publications?.[0] ||
75 null,
76 mutate,
77 };
78}
79export function useLeafletDomains() {
80 let { data, mutate } = useLeafletData();
81 return { data: data?.custom_domain_routes, mutate: mutate };
82}