a tool for shared writing and social publishing
1import { deleteSubscription } from "actions/subscriptions/deleteSubscription"; 2import { useSearchParams } from "next/navigation"; 3import { useEffect } from "react"; 4import useSWR, { mutate } from "swr"; 5 6type Subscription = { 7 id: string; 8 email: string; 9 entity: string; 10 confirmed: boolean; 11}; 12type SubscriptionStorage = { 13 version: number; 14 subscriptions: Array<Subscription>; 15}; 16 17let defaultValue: SubscriptionStorage = { 18 version: 1, 19 subscriptions: [], 20}; 21 22const key = "subscriptions-v1"; 23export function useSubscriptionStatus(entityID: string) { 24 let params = useSearchParams(); 25 let sub_id = params.get("sub_id"); 26 useEffect(() => { 27 if (!sub_id) return; 28 let entity = params.get("entity"); 29 let email = params.get("email"); 30 if (!entity || !email) return; 31 //How do I get subscribed state here huh? 32 addSubscription({ 33 id: sub_id, 34 email: email, 35 entity: entity, 36 confirmed: true, 37 }); 38 39 const url = new URL(window.location.href); 40 url.searchParams.delete("sub_id"); 41 url.searchParams.delete("entity"); 42 url.searchParams.delete("email"); 43 window.history.replaceState({}, "", url.toString()); 44 }, [sub_id, params]); 45 let { data: docs } = useSWR("subscriptions", () => getSubscriptions(), {}); 46 if (!docs) return null; 47 return docs.find((d) => d.entity === entityID); 48} 49 50export function getSubscriptions() { 51 let homepageDocs: SubscriptionStorage = JSON.parse( 52 window.localStorage.getItem(key) || JSON.stringify(defaultValue), 53 ); 54 return homepageDocs.subscriptions; 55} 56 57export function addSubscription(s: Subscription) { 58 let subscriptions = getSubscriptions(); 59 let newSubscriptions = subscriptions.filter((d) => d.id !== s.id); 60 newSubscriptions.push(s); 61 let newValue: SubscriptionStorage = { 62 version: 1, 63 subscriptions: newSubscriptions, 64 }; 65 window.localStorage.setItem(key, JSON.stringify(newValue)); 66 mutate("subscriptions", newSubscriptions, false); 67} 68 69export function removeSubscription(s: Subscription) { 70 let subscriptions = getSubscriptions(); 71 let newDocs = subscriptions.filter((d) => d.id !== s.id); 72 let newValue: SubscriptionStorage = { 73 version: 1, 74 subscriptions: newDocs, 75 }; 76 // Call the unsubscribe action 77 78 window.localStorage.setItem(key, JSON.stringify(newValue)); 79 mutate("subscriptions", newDocs, false); 80} 81 82export async function unsubscribe(s: Subscription) { 83 removeSubscription(s); 84 await deleteSubscription(s.id); 85}