From 4611baec9d3268783c3f3ea39a27dd7ed0b6ded4 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Fri, 27 Mar 2026 13:04:09 -0700 Subject: [PATCH] Split up some state stuff --- frontend/src/App.tsx | 2 - frontend/src/lib/hooks.ts | 93 ++++--------------------- frontend/src/lib/state.ts | 80 +++++++++++++++++++++ frontend/src/pages/Home.tsx | 2 +- frontend/src/{pages => views}/Login.tsx | 0 5 files changed, 96 insertions(+), 81 deletions(-) create mode 100644 frontend/src/lib/state.ts rename frontend/src/{pages => views}/Login.tsx (100%) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 2af43ab..80ea6c4 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -3,7 +3,6 @@ import { Router, Route, useLocation, useNavigate } from "@solidjs/router" import type { Component } from "solid-js" import AppShell from "./components/AppShell" import Home from "./pages/Home" -import Login from "./pages/Login" import RelayList from "./pages/relays/RelayList" import RelayNew from "./pages/relays/RelayNew" import RelayDetail from "./pages/relays/RelayDetail" @@ -59,7 +58,6 @@ export default function App() { return ( - diff --git a/frontend/src/lib/hooks.ts b/frontend/src/lib/hooks.ts index 12d4a4e..e9aae78 100644 --- a/frontend/src/lib/hooks.ts +++ b/frontend/src/lib/hooks.ts @@ -1,20 +1,12 @@ import { createEffect, createResource, createSignal, onCleanup } from "solid-js" -import { AccountManager } from "applesauce-accounts" -import type { IAccount } from "applesauce-accounts" -import { registerCommonAccountTypes } from "applesauce-accounts/accounts" -import { EventStore } from "applesauce-core" import { getProfilePicture } from "applesauce-core/helpers/profile" import { createOutboxMap, selectOptimalRelays, setFallbackRelays } from "applesauce-core/helpers/relay-selection" import { includeMailboxes } from "applesauce-core/observable" -import { createEventLoaderForStore } from "applesauce-loaders/loaders" import { Relay as NostrRelay, RelayManagement } from "applesauce-relay" -import { RelayPool } from "applesauce-relay" -import { NostrConnectSigner } from "applesauce-signers" import { map, of } from "rxjs" import { createRelay, deactivateRelay, - getIdentity, getRelay, getTenant, listRelays, @@ -28,77 +20,22 @@ import { type Tenant, type UpdateRelayInput, } from "./api" +import { account, eventStore, pool } from "./state" -export type UnsignedEvent = { - kind: number - content: string - created_at: number - tags: string[][] -} - -export type SignedEvent = UnsignedEvent & { - id: string - pubkey: string - sig: string -} - -export type EventSigner = { - signEvent(event: UnsignedEvent): Promise -} - -export const PLATFORM_NAME = import.meta.env.VITE_PLATFORM_NAME || "Caravel" - -export const eventStore = new EventStore() -export const pool = new RelayPool() - -createEventLoaderForStore(eventStore, pool, { - lookupRelays: ["wss://purplepag.es/", "wss://relay.damus.io/", "wss://indexer.coracle.social/"], - extraRelays: ["wss://relay.damus.io/", "wss://nos.lol/", "wss://relay.primal.net/"], -}) - -NostrConnectSigner.subscriptionMethod = pool.subscription.bind(pool) -NostrConnectSigner.publishMethod = pool.publish.bind(pool) - -export const accountManager = new AccountManager() - -registerCommonAccountTypes(accountManager) - -export const [account, setAccount] = createSignal() - -export const [identity, { refetch: refetchIdentity, mutate: setIdentity }] = createResource( - () => account()?.pubkey, - pubkey => { - if (pubkey) return getIdentity() - } -) - -;(() => { - try { - accountManager.fromJSON(JSON.parse(localStorage.getItem("caravel.accounts")!)) - } catch { - // pass - } - - const active = localStorage.getItem("caravel.accounts.active") - - if (active) { - accountManager.setActive(active) - } - - accountManager.active$.subscribe(account => { - setAccount(account) - - localStorage.setItem("caravel.accounts", JSON.stringify(accountManager.toJSON(true))) - - if (account) { - localStorage.setItem("caravel.accounts.active", account.id) - } else { - localStorage.removeItem("caravel.accounts.active") - } - - refetchIdentity() - }) -})() +export { + PLATFORM_NAME, + accountManager, + account, + setAccount, + identity, + refetchIdentity, + setIdentity, + eventStore, + pool, + type EventSigner, + type SignedEvent, + type UnsignedEvent, +} from "./state" export function useProfilePicture(pubkey: () => string | undefined) { const [picture, setPicture] = createSignal() diff --git a/frontend/src/lib/state.ts b/frontend/src/lib/state.ts new file mode 100644 index 0000000..7f99917 --- /dev/null +++ b/frontend/src/lib/state.ts @@ -0,0 +1,80 @@ +import { createResource, createSignal } from "solid-js" +import { AccountManager } from "applesauce-accounts" +import type { IAccount } from "applesauce-accounts" +import { registerCommonAccountTypes } from "applesauce-accounts/accounts" +import { EventStore } from "applesauce-core" +import { createEventLoaderForStore } from "applesauce-loaders/loaders" +import { RelayPool } from "applesauce-relay" +import { NostrConnectSigner } from "applesauce-signers" +import { getIdentity } from "./api" + +export type UnsignedEvent = { + kind: number + content: string + created_at: number + tags: string[][] +} + +export type SignedEvent = UnsignedEvent & { + id: string + pubkey: string + sig: string +} + +export type EventSigner = { + signEvent(event: UnsignedEvent): Promise +} + +export const PLATFORM_NAME = import.meta.env.VITE_PLATFORM_NAME || "Caravel" + +export const eventStore = new EventStore() +export const pool = new RelayPool() + +createEventLoaderForStore(eventStore, pool, { + lookupRelays: ["wss://purplepag.es/", "wss://relay.damus.io/", "wss://indexer.coracle.social/"], + extraRelays: ["wss://relay.damus.io/", "wss://nos.lol/", "wss://relay.primal.net/"], +}) + +NostrConnectSigner.subscriptionMethod = pool.subscription.bind(pool) +NostrConnectSigner.publishMethod = pool.publish.bind(pool) + +export const accountManager = new AccountManager() + +registerCommonAccountTypes(accountManager) + +export const [account, setAccount] = createSignal() + +export const [identity, { refetch: refetchIdentity, mutate: setIdentity }] = createResource( + () => account()?.pubkey, + pubkey => { + if (pubkey) return getIdentity() + } +) + +;(() => { + try { + accountManager.fromJSON(JSON.parse(localStorage.getItem("caravel.accounts")!)) + } catch { + // pass + } + + const active = localStorage.getItem("caravel.accounts.active") + + if (active) { + accountManager.setActive(active) + } + + accountManager.active$.subscribe(account => { + setAccount(account) + + localStorage.setItem("caravel.accounts", JSON.stringify(accountManager.toJSON(true))) + + if (account) { + localStorage.setItem("caravel.accounts.active", account.id) + } else { + localStorage.removeItem("caravel.accounts.active") + } + + refetchIdentity() + }) +})() diff --git a/frontend/src/pages/Home.tsx b/frontend/src/pages/Home.tsx index 5b7606c..1e69483 100644 --- a/frontend/src/pages/Home.tsx +++ b/frontend/src/pages/Home.tsx @@ -5,7 +5,7 @@ import ExternalLinkIcon from "../components/ExternalLinkIcon" import PricingTable from "../components/PricingTable" import RelayForm, { type RelayFormValues } from "../components/RelayForm" import Modal from "../components/Modal" -import Login from "./Login" +import Login from "../views/Login" import { account, createRelayForActiveTenant } from "../lib/hooks" import { slugify } from "../lib/slugify" diff --git a/frontend/src/pages/Login.tsx b/frontend/src/views/Login.tsx similarity index 100% rename from frontend/src/pages/Login.tsx rename to frontend/src/views/Login.tsx