From 1b6090572db74551b8f70a6659d5e5d77b56d81d Mon Sep 17 00:00:00 2001 From: totegamma Date: Mon, 3 Feb 2025 01:05:29 +0900 Subject: [PATCH] wip --- client/client.ts | 16 ++++++++ src/components/Importer/ImportMasterkey.tsx | 38 +++++++++--------- src/components/Importer/ImportSubkey.tsx | 2 +- src/components/SubprofileSelector.tsx | 2 +- src/context/StorageContext.tsx | 2 +- src/pages/GuestMessage.tsx | 43 +++++++++++---------- src/pages/GuestProfile.tsx | 40 ++++++++++--------- src/pages/GuestTimeline.tsx | 37 ++++++++++-------- 8 files changed, 101 insertions(+), 79 deletions(-) diff --git a/client/client.ts b/client/client.ts index 7daf0d14..2077aee1 100644 --- a/client/client.ts +++ b/client/client.ts @@ -23,6 +23,8 @@ import { SubKeyAuthProvider, Socket, SocketListener, + InMemoryKVS, + GuestAuthProvider, } from '@concrnt/client' import { Schemas, Schema } from "./schemas"; @@ -186,6 +188,20 @@ export class Client { opts?.progressCallback?.("done") return c } + + static async createAsGuest(host: FQDN, _opts?: ClientOptions): Promise { + const cacheEngine = new InMemoryKVS() + const authProvider = new GuestAuthProvider(host) + const api = new Api(authProvider, cacheEngine) + const c = new Client(api) + + c.server = await c.api.getDomain(host).catch((e) => { + console.error('CLIENT::create::getDomain::error', e) + return null + }) ?? undefined + + return c + } async reloadUser(): Promise { if (!this.ccid) return diff --git a/src/components/Importer/ImportMasterkey.tsx b/src/components/Importer/ImportMasterkey.tsx index 527519b4..277e54c5 100644 --- a/src/components/Importer/ImportMasterkey.tsx +++ b/src/components/Importer/ImportMasterkey.tsx @@ -53,21 +53,22 @@ export function ImportMasterKey(): JSX.Element { const timer = setTimeout(() => { try { - const client = new Client(searchTarget, keypair, ccid) - client.api - .getEntity(ccid, searchTarget) - .then((entity) => { - if (entity?.domain) { - setDomainInput(entity.domain) - setErrorMessage('') - } else { - setDomainAutoDetectionFailed(true) + Client.createAsGuest(searchTarget).then((client) => { + client.api + .getEntity(ccid, searchTarget) + .then((entity) => { + if (entity?.domain) { + setDomainInput(entity.domain) + setErrorMessage('') + } else { + setDomainAutoDetectionFailed(true) + setErrorMessage(t('notFound')) + } + }) + .catch((_) => { setErrorMessage(t('notFound')) - } - }) - .catch((_) => { - setErrorMessage(t('notFound')) - }) + }) + }) } catch (e) { console.error(e) } @@ -82,14 +83,13 @@ export function ImportMasterKey(): JSX.Element { if (!domainInput || !keypair || !ccid) return const timer = setTimeout(() => { try { - const client = new Client(domainInput, keypair, ccid) - client.api.fetchWithCredential(domainInput, '/api/v1/entity', {}).then((res) => { - if (res.ok) { + Client.create(keypair.privatekey, domainInput).then((client) => { + client.api.fetchWithCredential(domainInput, '/api/v1/entity', {}).then((_) => { setErrorMessage('') setRegistrationOK(true) - } else { + }).catch((_) => { setRegistrationOK(false) - } + }) }) } catch (e) { console.error(e) diff --git a/src/components/Importer/ImportSubkey.tsx b/src/components/Importer/ImportSubkey.tsx index 317bf13a..9364cb57 100644 --- a/src/components/Importer/ImportSubkey.tsx +++ b/src/components/Importer/ImportSubkey.tsx @@ -5,7 +5,7 @@ import { useTranslation } from 'react-i18next' import Visibility from '@mui/icons-material/Visibility' import VisibilityOff from '@mui/icons-material/VisibilityOff' import CheckCircleIcon from '@mui/icons-material/CheckCircle' -import { Client } from '@concurrent-world/client' +import { Client } from 'client' export const ImportSubkey = (): JSX.Element => { const { t } = useTranslation('', { keyPrefix: 'import' }) diff --git a/src/components/SubprofileSelector.tsx b/src/components/SubprofileSelector.tsx index eeb2a0bf..2b37902d 100644 --- a/src/components/SubprofileSelector.tsx +++ b/src/components/SubprofileSelector.tsx @@ -68,7 +68,7 @@ export const SubprofileSelector = (props: SubprofileSelectorProps): JSX.Element }} > - + ) diff --git a/src/context/StorageContext.tsx b/src/context/StorageContext.tsx index dd5e2c30..40740134 100644 --- a/src/context/StorageContext.tsx +++ b/src/context/StorageContext.tsx @@ -122,7 +122,7 @@ export const StorageProvider = ({ children }: { children: JSX.Element | JSX.Elem const xhr = new XMLHttpRequest() xhr.open('POST', `https://${client.host}/storage/files`, true) xhr.setRequestHeader('Content-Type', file.type) - xhr.setRequestHeader('Authorization', `Bearer ${client.api.generateApiToken(client.host)}`) + xhr.setRequestHeader('Authorization', `Bearer ${client.api.authProvider.getAuthToken(client.host)}`) xhr.upload.onprogress = (e) => { if (e.lengthComputable) { diff --git a/src/pages/GuestMessage.tsx b/src/pages/GuestMessage.tsx index 701dbcb5..7d52dfe1 100644 --- a/src/pages/GuestMessage.tsx +++ b/src/pages/GuestMessage.tsx @@ -44,32 +44,33 @@ export default function GuestMessagePage(): JSX.Element { const [client, initializeClient] = useState() useEffect(() => { if (!authorID || !messageID) return - const client = new Client('ariake.concrnt.net') - initializeClient(client) let isMounted = true - client - .getMessage(messageID, authorID) - .then((msg) => { - if (!isMounted || !msg) return - setMessage(msg) + Client.createAsGuest('ariake.concrnt.net').then((client) => { + initializeClient(client) + client + .getMessage(messageID, authorID) + .then((msg) => { + if (!isMounted || !msg) return + setMessage(msg) - msg.getReplyMessages().then((replies) => { - if (!isMounted) return - setReplies(replies) - }) - - if (msg.schema === Schemas.replyMessage) { - msg.getReplyTo().then((replyTo) => { + msg.getReplyMessages().then((replies) => { if (!isMounted) return - setReplyTo(replyTo) + setReplies(replies) }) - } - }) - .finally(() => { - if (!isMounted) return - setIsFetching(false) - }) + + if (msg.schema === Schemas.replyMessage) { + msg.getReplyTo().then((replyTo) => { + if (!isMounted) return + setReplyTo(replyTo) + }) + } + }) + .finally(() => { + if (!isMounted) return + setIsFetching(false) + }) + }) return () => { isMounted = false diff --git a/src/pages/GuestProfile.tsx b/src/pages/GuestProfile.tsx index 7790edef..2de70ede 100644 --- a/src/pages/GuestProfile.tsx +++ b/src/pages/GuestProfile.tsx @@ -28,27 +28,29 @@ export default function GuestProfilePage(): JSX.Element { useEffect(() => { if (!id) return - const client = new Client('ariake.concrnt.net') - initializeClient(client) - client.getUser(id).then((u) => { - if (!u) return - setUser(u) - const timelineID = subProfileID ? 'world.concrnt.t-subhome.' + subProfileID + '@' + u.ccid : u.homeTimeline - setTargetStream([timelineID]) + Client.createAsGuest('ariake.concrnt.net').then((client) => { + initializeClient(client) - client.api.getTimeline(timelineID).then((t) => { - if (!t) return - if (t.policy !== 'https://policy.concrnt.world/t/inline-read-write.json' || !t.policyParams) { - setIsPrivateTimeline(false) - return - } - try { - const params = JSON.parse(t.policyParams) - setIsPrivateTimeline(params.isReadPublic === false) - } catch (e) { - console.error(e) - } + client.getUser(id).then((u) => { + if (!u) return + setUser(u) + const timelineID = subProfileID ? 'world.concrnt.t-subhome.' + subProfileID + '@' + u.ccid : u.homeTimeline + setTargetStream([timelineID]) + + client.api.getTimeline(timelineID).then((t) => { + if (!t) return + if (t.policy !== 'https://policy.concrnt.world/t/inline-read-write.json' || !t.policyParams) { + setIsPrivateTimeline(false) + return + } + try { + const params = JSON.parse(t.policyParams) + setIsPrivateTimeline(params.isReadPublic === false) + } catch (e) { + console.error(e) + } + }) }) }) }, [id, path.hash]) diff --git a/src/pages/GuestTimeline.tsx b/src/pages/GuestTimeline.tsx index acc3dc93..4bc1538c 100644 --- a/src/pages/GuestTimeline.tsx +++ b/src/pages/GuestTimeline.tsx @@ -2,7 +2,8 @@ import { useEffect, useState } from 'react' import { Box, Button, Paper, Typography } from '@mui/material' import { useParams, Link as NavLink } from 'react-router-dom' import { Timeline } from '../components/Timeline/main' -import { Client, type CoreTimeline } from '@concurrent-world/client' +import { Client } from 'client' +import { Timeline as CoreTimeline } from '@concrnt/client' import { FullScreenLoading } from '../components/ui/FullScreenLoading' import { ClientProvider } from '../context/ClientContext' import { TimelineHeader } from '../components/TimelineHeader' @@ -27,21 +28,23 @@ export default function GuestTimelinePage(): JSX.Element { if (!id) return setTargetStream([id]) const resolver = id.split('@')[1] - const client = new Client(resolver) - initializeClient(client) - client.api.getTimeline(id).then((e) => { - if (!e) return - setTimeline(e) + Client.createAsGuest(resolver).then((client) => { + initializeClient(client) - if (e.policy === 'https://policy.concrnt.world/t/inline-read-write.json' && e?.policyParams) { - try { - const params = JSON.parse(e.policyParams) - setIsPrivateTimeline(!params.isReadPublic) - } catch (e) { - setIsPrivateTimeline(true) + client.api.getTimeline(id).then((e) => { + if (!e) return + setTimeline(e) + + if (e.policy === 'https://policy.concrnt.world/t/inline-read-write.json' && e?.policyParams) { + try { + const params = JSON.parse(e.policyParams) + setIsPrivateTimeline(!params.isReadPublic) + } catch (e) { + setIsPrivateTimeline(true) + } } - } + }) }) }, [id]) @@ -51,12 +54,12 @@ export default function GuestTimelinePage(): JSX.Element { <> - {`#${timeline.document.body.name || 'No Title'} - Concrt`} + {`#${timeline.parsedDoc.body.name || 'No Title'} - Concrt`} @@ -105,7 +108,7 @@ export default function GuestTimelinePage(): JSX.Element { }} > : } />