an appview-less Bluesky client using Constellation and PDS Queries reddwarf.app
frontend spa bluesky reddwarf microcosm
at button 2.4 kB view raw
1import { atom, createStore, useAtomValue } from "jotai"; 2import { atomWithStorage } from "jotai/utils"; 3import { useEffect } from "react"; 4 5export const store = createStore(); 6 7export const quickAuthAtom = atomWithStorage<string | null>( 8 "quickAuth", 9 null 10); 11 12export const selectedFeedUriAtom = atomWithStorage<string | null>( 13 "selectedFeedUri", 14 null 15); 16 17//export const feedScrollPositionsAtom = atom<Record<string, number>>({}); 18 19export const feedScrollPositionsAtom = atomWithStorage<Record<string, number>>( 20 "feedscrollpositions", 21 {} 22); 23 24export const likedPostsAtom = atomWithStorage<Record<string, string>>( 25 "likedPosts", 26 {} 27); 28 29export const defaultconstellationURL = "constellation.microcosm.blue"; 30export const constellationURLAtom = atomWithStorage<string>( 31 "constellationURL", 32 defaultconstellationURL 33); 34export const defaultslingshotURL = "slingshot.microcosm.blue"; 35export const slingshotURLAtom = atomWithStorage<string>( 36 "slingshotURL", 37 defaultslingshotURL 38); 39export const defaultImgCDN = "cdn.bsky.app"; 40export const imgCDNAtom = atomWithStorage<string>("imgcdnurl", defaultImgCDN); 41export const defaultVideoCDN = "video.bsky.app"; 42export const videoCDNAtom = atomWithStorage<string>( 43 "videocdnurl", 44 defaultVideoCDN 45); 46 47export const defaulthue = 28; 48export const hueAtom = atomWithStorage<number>("hue", defaulthue); 49 50export const isAtTopAtom = atom<boolean>(true); 51 52type ComposerState = 53 | { kind: "closed" } 54 | { kind: "root" } 55 | { kind: "reply"; parent: string } 56 | { kind: "quote"; subject: string }; 57export const composerAtom = atom<ComposerState>({ kind: "closed" }); 58 59//export const agentAtom = atom<Agent | null>(null); 60//export const authedAtom = atom<boolean>(false); 61 62export function useAtomCssVar(atom: typeof hueAtom, cssVar: string) { 63 const value = useAtomValue(atom); 64 65 useEffect(() => { 66 document.documentElement.style.setProperty(cssVar, value.toString()); 67 }, [value, cssVar]); 68 69 useEffect(() => { 70 document.documentElement.style.setProperty(cssVar, value.toString()); 71 }, []); 72} 73 74hueAtom.onMount = (setAtom) => { 75 const stored = localStorage.getItem("hue"); 76 if (stored != null) setAtom(Number(stored)); 77}; 78// export function initAtomToCssVar(atom: typeof hueAtom, cssVar: string) { 79// const initial = store.get(atom); 80// console.log("atom get ", initial); 81// document.documentElement.style.setProperty(cssVar, initial.toString()); 82// }