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);