a tool for shared writing and social publishing
298
fork

Configure Feed

Select the types of activity you want to include in your feed.

at 09f1e55e3663cdeea4d9bfe7633dbf7401728c70 85 lines 2.5 kB view raw
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}