import { createRWS } from "/src/solid/rws"; import { standalone } from "../env"; import { createDatasets } from "../scripts/datasets"; import { createPresets } from "../scripts/presets"; import { createUserConfig } from "../scripts/user/config"; import { sleep } from "../scripts/utils/sleep"; import { readBooleanFromStorage, saveToStorage, } from "../scripts/utils/storage"; import { readBooleanURLParam, writeURLParam } from "../scripts/utils/urlParams"; import { webSockets } from "../scripts/ws"; import { classPropToString } from "../solid/classes"; import { ChartFrame } from "./frames/chart"; import { FoldersFrame } from "./frames/folders"; import { HistoryFrame } from "./frames/history"; import { SettingsFrame } from "./frames/settings"; import { StripDesktop, StripMobile } from "./strip"; import { Update } from "./update"; const LOCAL_STORAGE_BAR_KEY = "bar-width"; const LOCAL_STORAGE_FULLSCREEN = "fullscrenn"; export const INPUT_PRESET_SEARCH_ID = "input-search-preset"; export function App() { const tabFocused = createRWS(true); const qrcode = createRWS(""); const dark = createRWS(false); const userConfig = createUserConfig({ dark, }); const fullscreen = createRWS( readBooleanURLParam(LOCAL_STORAGE_FULLSCREEN) || readBooleanFromStorage(LOCAL_STORAGE_FULLSCREEN) || false, ); const windowWidth = createRWS(window.innerWidth); const windowWidth60p = createMemo(() => windowWidth() * 0.6); const windowResizeCallback = () => { windowWidth.set(window.innerWidth); }; window.addEventListener("resize", windowResizeCallback); onCleanup(() => window.removeEventListener("resize", windowResizeCallback)); const windowSizeIsAtLeastMedium = createMemo(() => windowWidth() >= 768); const minBarWidth = 384; const barWidth = createRWS( Number(localStorage.getItem(LOCAL_STORAGE_BAR_KEY)) || minBarWidth, ); createEffect(() => { localStorage.setItem(LOCAL_STORAGE_BAR_KEY, String(barWidth())); }); createEffect(() => { if (fullscreen()) { writeURLParam(LOCAL_STORAGE_FULLSCREEN, "true"); saveToStorage(LOCAL_STORAGE_FULLSCREEN, fullscreen()); } else { writeURLParam(LOCAL_STORAGE_FULLSCREEN, undefined); saveToStorage(LOCAL_STORAGE_FULLSCREEN, undefined); } }); const _selectedFrame = createRWS("Chart"); const selectedFrame = createMemo(() => windowSizeIsAtLeastMedium() && _selectedFrame() === "Chart" ? "Folders" : _selectedFrame(), ); const presets = createPresets(); const resizingBarStart = createRWS(undefined); const resizingBarWidth = createRWS(0); createEffect( () => { if (!windowSizeIsAtLeastMedium() && presets.selected()) { _selectedFrame.set("Chart"); } }, { deffer: true, }, ); const datasets = createDatasets(); onMount(() => { webSockets.openAll(); createEffect(() => { const latest = webSockets.liveKrakenCandle.latest(); if (latest) { const close = latest.close; console.log("close:", close); document.title = `${latest.close.toLocaleString("en-us")} | Satonomics`; } }); }); const documentVisibilityChange = () => tabFocused.set(document.visibilityState === "visible"); document.addEventListener("visibilitychange", documentVisibilityChange); onCleanup(() => document.removeEventListener("visibilitychange", documentVisibilityChange), ); const documentOnKeyDown = async (event: KeyboardEvent) => { switch (event.key) { case "Escape": { event.stopPropagation(); event.preventDefault(); _selectedFrame.set("Chart"); break; } case "/": { event.stopPropagation(); event.preventDefault(); _selectedFrame.set("Search"); await sleep(50); document.getElementById(INPUT_PRESET_SEARCH_ID)?.focus(); break; } } }; document.addEventListener("keydown", documentOnKeyDown); onCleanup(() => document.removeEventListener("keydown", documentOnKeyDown)); const SearchFrame = lazy(() => import("./frames/search").then((d) => ({ default: d.SearchFrame, })), ); const Qrcode = lazy(() => import("./qrcode").then((d) => ({ default: d.Qrcode, })), ); return ( <>
{ const startingClientX = resizingBarStart(); if (startingClientX !== undefined) { barWidth.set( Math.min( Math.max( resizingBarWidth() + event.clientX - startingClientX, minBarWidth, ), windowWidth60p(), ), ); } }} onMouseUp={() => resizingBarStart.set(undefined)} onMouseLeave={() => resizingBarStart.set(undefined)} onTouchEnd={() => resizingBarStart.set(undefined)} onTouchCancel={() => resizingBarStart.set(undefined)} >
selectedFrame() !== "Chart"} qrcode={qrcode} standalone={false} datasets={datasets} dark={dark} />
{/*
); }