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}