a tool for shared writing and social publishing
1import type { PermissionToken } from "src/replicache";
2import { mutate } from "swr";
3
4export type HomeDoc = {
5 token: PermissionToken;
6 added_at: string;
7 hidden?: boolean;
8};
9type HomeDocsStorage = {
10 version: number;
11 docs: Array<HomeDoc>;
12};
13let defaultValue: HomeDocsStorage = {
14 version: 1,
15 docs: [],
16};
17const key = "homepageDocs-v1";
18let tokenCache = new Map<string, PermissionToken>();
19export function getHomeDocs() {
20 let homepageDocs: HomeDocsStorage = JSON.parse(
21 window.localStorage.getItem(key) || JSON.stringify(defaultValue),
22 );
23 return homepageDocs.docs.map((d) => {
24 let cachedToken = tokenCache.get(d.token.id);
25 if (!cachedToken) {
26 cachedToken = d.token;
27 tokenCache.set(d.token.id, d.token);
28 }
29 return { ...d, token: cachedToken };
30 });
31}
32
33export function addDocToHome(doc: PermissionToken) {
34 let homepageDocs = getHomeDocs();
35 if (homepageDocs.find((d) => d.token.id === doc.id)) return;
36 homepageDocs.push({ token: doc, added_at: new Date().toISOString() });
37 let newValue: HomeDocsStorage = {
38 version: 1,
39 docs: homepageDocs,
40 };
41 window.localStorage.setItem(key, JSON.stringify(newValue));
42}
43
44export function removeDocFromHome(doc: PermissionToken) {
45 let homepageDocs = getHomeDocs();
46 let newDocs = homepageDocs.filter((d) => d.token.id !== doc.id);
47 let newValue: HomeDocsStorage = {
48 version: 1,
49 docs: newDocs,
50 };
51 window.localStorage.setItem(key, JSON.stringify(newValue));
52}
53
54export function hideDoc(doc: PermissionToken) {
55 let homepageDocs = getHomeDocs();
56 let newDocs = homepageDocs.filter((d) => d.token.id !== doc.id);
57 newDocs.push({
58 token: doc,
59 added_at: new Date().toISOString(),
60 hidden: true,
61 });
62 let newValue: HomeDocsStorage = {
63 version: 1,
64 docs: newDocs,
65 };
66 window.localStorage.setItem(key, JSON.stringify(newValue));
67 mutate("leaflets");
68}