Split up some state stuff

This commit is contained in:
Jon Staab
2026-03-27 13:04:09 -07:00
parent 2be7f4406a
commit 4611baec9d
5 changed files with 96 additions and 81 deletions
-2
View File
@@ -3,7 +3,6 @@ import { Router, Route, useLocation, useNavigate } from "@solidjs/router"
import type { Component } from "solid-js" import type { Component } from "solid-js"
import AppShell from "./components/AppShell" import AppShell from "./components/AppShell"
import Home from "./pages/Home" import Home from "./pages/Home"
import Login from "./pages/Login"
import RelayList from "./pages/relays/RelayList" import RelayList from "./pages/relays/RelayList"
import RelayNew from "./pages/relays/RelayNew" import RelayNew from "./pages/relays/RelayNew"
import RelayDetail from "./pages/relays/RelayDetail" import RelayDetail from "./pages/relays/RelayDetail"
@@ -59,7 +58,6 @@ export default function App() {
return ( return (
<Router root={Layout}> <Router root={Layout}>
<Route path="/" component={Home} /> <Route path="/" component={Home} />
<Route path="/login" component={Login} />
<Route path="/relays" component={requireTenant(RelayList)} /> <Route path="/relays" component={requireTenant(RelayList)} />
<Route path="/relays/new" component={requireTenant(RelayNew)} /> <Route path="/relays/new" component={requireTenant(RelayNew)} />
<Route path="/relays/:id" component={requireTenant(RelayDetail)} /> <Route path="/relays/:id" component={requireTenant(RelayDetail)} />
+15 -78
View File
@@ -1,20 +1,12 @@
import { createEffect, createResource, createSignal, onCleanup } from "solid-js" 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 { getProfilePicture } from "applesauce-core/helpers/profile"
import { createOutboxMap, selectOptimalRelays, setFallbackRelays } from "applesauce-core/helpers/relay-selection" import { createOutboxMap, selectOptimalRelays, setFallbackRelays } from "applesauce-core/helpers/relay-selection"
import { includeMailboxes } from "applesauce-core/observable" import { includeMailboxes } from "applesauce-core/observable"
import { createEventLoaderForStore } from "applesauce-loaders/loaders"
import { Relay as NostrRelay, RelayManagement } from "applesauce-relay" import { Relay as NostrRelay, RelayManagement } from "applesauce-relay"
import { RelayPool } from "applesauce-relay"
import { NostrConnectSigner } from "applesauce-signers"
import { map, of } from "rxjs" import { map, of } from "rxjs"
import { import {
createRelay, createRelay,
deactivateRelay, deactivateRelay,
getIdentity,
getRelay, getRelay,
getTenant, getTenant,
listRelays, listRelays,
@@ -28,77 +20,22 @@ import {
type Tenant, type Tenant,
type UpdateRelayInput, type UpdateRelayInput,
} from "./api" } from "./api"
import { account, eventStore, pool } from "./state"
export type UnsignedEvent = { export {
kind: number PLATFORM_NAME,
content: string accountManager,
created_at: number account,
tags: string[][] setAccount,
} identity,
refetchIdentity,
export type SignedEvent = UnsignedEvent & { setIdentity,
id: string eventStore,
pubkey: string pool,
sig: string type EventSigner,
} type SignedEvent,
type UnsignedEvent,
export type EventSigner = { } from "./state"
signEvent(event: UnsignedEvent): Promise<SignedEvent>
}
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<IAccount | undefined>()
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 function useProfilePicture(pubkey: () => string | undefined) { export function useProfilePicture(pubkey: () => string | undefined) {
const [picture, setPicture] = createSignal<string | undefined>() const [picture, setPicture] = createSignal<string | undefined>()
+80
View File
@@ -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<SignedEvent>
}
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<IAccount | undefined>()
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()
})
})()
+1 -1
View File
@@ -5,7 +5,7 @@ import ExternalLinkIcon from "../components/ExternalLinkIcon"
import PricingTable from "../components/PricingTable" import PricingTable from "../components/PricingTable"
import RelayForm, { type RelayFormValues } from "../components/RelayForm" import RelayForm, { type RelayFormValues } from "../components/RelayForm"
import Modal from "../components/Modal" import Modal from "../components/Modal"
import Login from "./Login" import Login from "../views/Login"
import { account, createRelayForActiveTenant } from "../lib/hooks" import { account, createRelayForActiveTenant } from "../lib/hooks"
import { slugify } from "../lib/slugify" import { slugify } from "../lib/slugify"