an appview-less Bluesky client using Constellation and PDS Queries
reddwarf.app
frontend
spa
bluesky
reddwarf
microcosm
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// }