diff --git a/package.json b/package.json index 63fe582..2e4f1f3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package", "name": "tutu", - "version": "1.0.2", + "version": "1.0.0", "description": "", "private": true, "type": "module", diff --git a/src/App.tsx b/src/App.tsx index 4a36e23..c5fa9fd 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,27 +1,12 @@ import { Route, Router } from "@solidjs/router"; import { ThemeProvider } from "@suid/material"; -import { - Component, - createRenderEffect, - createSignal, - ErrorBoundary, - lazy, -} from "solid-js"; +import { Component, lazy } from "solid-js"; import { useRootTheme } from "./material/mui.js"; -import { - Provider as ClientProvider, - createMastoClientFor, - type Session, -} from "./masto/clients.js"; -import "./App.css"; -import { $accounts } from "./accounts/stores.js"; -import { useStore } from "@nanostores/solid"; +import "./App.css" const AccountSignIn = lazy(() => import("./accounts/SignIn.js")); -const AccountMastodonOAuth2Callback = lazy( - () => import("./accounts/MastodonOAuth2Callback.js"), -); -const TimelineHome = lazy(() => import("./timelines/Home.js")); +const AccountMastodonOAuth2Callback = lazy(() => import("./accounts/MastodonOAuth2Callback.js")) +const TimelineHome = lazy(() => import("./timelines/Home.js")) const Routing: Component = () => { return ( @@ -29,10 +14,7 @@ const Routing: Component = () => { - + ); @@ -40,29 +22,10 @@ const Routing: Component = () => { const App: Component = () => { const theme = useRootTheme(); - const accts = useStore($accounts); - const clientStore = createSignal([]); - - createRenderEffect(() => { - const [, setClients] = clientStore; - setClients( - accts().map((x) => ({ account: x, client: createMastoClientFor(x) })), - ); - }); - return ( - { - console.error(err); - return <>; - }} - > - - - - - - + + + ); }; diff --git a/src/accounts/stores.ts b/src/accounts/stores.ts index fe408f9..96c6499 100644 --- a/src/accounts/stores.ts +++ b/src/accounts/stores.ts @@ -1,6 +1,9 @@ import { persistentAtom } from "@nanostores/persistent"; +import { useStore } from "@nanostores/solid"; +import { useNavigate } from "@solidjs/router"; import { createOAuthAPIClient, createRestAPIClient } from "masto"; import { action } from "nanostores"; +import { createRenderEffect } from "solid-js"; export type Account = { site: string; @@ -172,3 +175,15 @@ export const getOrRegisterApp = action( return all[site]; }, ); + +export function useAccts() { + const accts = useStore($accounts); + const naviagte = useNavigate(); + + createRenderEffect(() => { + if (accts().length > 0) return; + naviagte("/accounts/sign-in"); + }); + + return accts; +} diff --git a/src/masto/acct.ts b/src/masto/acct.ts index eafd297..51c8ea2 100644 --- a/src/masto/acct.ts +++ b/src/masto/acct.ts @@ -1,7 +1,9 @@ import { Accessor, createResource } from "solid-js"; -import type { mastodon } from "masto"; +import { Account } from "../accounts/stores"; +import { useMastoClientFor } from "./clients"; -export function useAcctProfile(client: Accessor) { +export function useAcctProfile(account: Accessor) { + const client = useMastoClientFor(account) return createResource(client, (client) => { return client.v1.accounts.verifyCredentials() }, { diff --git a/src/masto/clients.ts b/src/masto/clients.ts index 9e71b8c..3ff1be6 100644 --- a/src/masto/clients.ts +++ b/src/masto/clients.ts @@ -1,78 +1,41 @@ -import { - Accessor, - createContext, - createRenderEffect, - createResource, - Signal, - useContext, -} from "solid-js"; +import { Accessor, createMemo, createResource } from "solid-js"; import { Account } from "../accounts/stores"; import { createRestAPIClient, mastodon } from "masto"; -import { useLocation, useNavigate } from "@solidjs/router"; -const restfulCache: Record = {}; +const restfulCache: Record = {} export function createMastoClientFor(account: Account) { - const cacheKey = [account.site, account.accessToken].join(""); - const cache = restfulCache[cacheKey]; + const cacheKey = [account.site, account.accessToken].join('') + const cache = restfulCache[cacheKey] if (cache) return cache; const client = createRestAPIClient({ url: account.site, accessToken: account.accessToken, - }); - restfulCache[cacheKey] = client; + }) + restfulCache[cacheKey] = client - return client; + return client +} + +export function useMastoClientFor(account: Accessor) { + return createMemo(() => createMastoClientFor(account())) } export function createUnauthorizedClient(site: string) { - const cache = restfulCache[site]; + const cache = restfulCache[site] if (cache) return cache; const client = createRestAPIClient({ - url: site, - }); - restfulCache[site] = client; + url: site + }) + restfulCache[site] = client - return client; + return client } export function useInstance(client: Accessor) { return createResource(client, async (client) => { - return await client.v2.instance.fetch(); - }); -} - -export type Session = { - account: Account; - client: mastodon.rest.Client; -}; - -const Context = /* @__PURE__ */ createContext>(); - -export const Provider = Context.Provider; - -export function useSessions() { - const [sessions] = useSessionsRw(); - const navigate = useNavigate(); - const location = useLocation(); - - createRenderEffect(() => { - if (sessions().length > 0) return; - navigate( - "/accounts/sign-in?back=" + encodeURIComponent(location.pathname), - { replace: true }, - ); - }); - - return sessions; -} - -export function useSessionsRw() { - const store = useContext(Context); - if (!store) { - throw new TypeError("sessions are not provided"); - } - return store; + return await client.v2.instance.fetch() + }) } diff --git a/src/timelines/Home.tsx b/src/timelines/Home.tsx index 16fa2e1..696c0a2 100644 --- a/src/timelines/Home.tsx +++ b/src/timelines/Home.tsx @@ -3,12 +3,15 @@ import { For, onCleanup, createSignal, + createEffect, Show, untrack, onMount, } from "solid-js"; +import { $accounts, useAccts } from "../accounts/stores"; import { useDocumentTitle } from "../utils"; -import { useSessions } from "../masto/clients"; +import { useStore } from "@nanostores/solid"; +import { useMastoClientFor } from "../masto/clients"; import { type mastodon } from "masto"; import Scaffold from "../material/Scaffold"; import { @@ -21,6 +24,7 @@ import { MenuItem, Switch, Toolbar, + Typography, } from "@suid/material"; import { css } from "solid-styled"; import { TimeSourceProvider, createTimeSource } from "../platform/timesrc"; @@ -148,11 +152,11 @@ const TimelinePanel: Component<{ const Home: Component = () => { let panelList: HTMLDivElement; useDocumentTitle("Timelines"); + const accounts = useAccts(); const now = createTimeSource(); - const sessions = useSessions(); - const client = () => sessions()[0].client; - const [profile] = useAcctProfile(client); + const client = useMastoClientFor(() => accounts()[0]); + const [profile] = useAcctProfile(() => accounts()[0]); const [panelOffset, setPanelOffset] = createSignal(0); const [prefetching, setPrefetching] = createSignal(true);