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}