a tool for shared writing and social publishing
at feature/reader 68 lines 1.9 kB view raw
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}