diff --git a/src/app/components/AccountDataEditor.tsx b/src/app/components/AccountDataEditor.tsx index 07334543..d328a849 100644 --- a/src/app/components/AccountDataEditor.tsx +++ b/src/app/components/AccountDataEditor.tsx @@ -14,6 +14,7 @@ import { Scroll, config, } from 'folds'; +import { AccountDataEvent } from 'neurone/lib/api/types'; import { Cursor } from '../plugins/text-area'; import { syntaxErrorPosition } from '../utils/dom'; import { AsyncStatus, useAsyncCallback } from '../hooks/useAsyncCallback'; @@ -27,17 +28,12 @@ const EDITOR_INTENT_SPACE_COUNT = 2; export type AccountDataSubmitCallback = (type: string, content: object) => Promise; -type AccountDataInfo = { - type: string; - content: object; -}; - type AccountDataEditProps = { type: string; defaultContent: string; submitChange: AccountDataSubmitCallback; onCancel: () => void; - onSave: (info: AccountDataInfo) => void; + onSave: (info: AccountDataEvent) => void; }; function AccountDataEdit({ type, @@ -243,34 +239,30 @@ function AccountDataView({ type, defaultContent, onEdit }: AccountDataViewProps) } export type AccountDataEditorProps = { - type?: string; - content?: object; + event?: AccountDataEvent; submitChange: AccountDataSubmitCallback; requestClose: () => void; }; -export function AccountDataEditor({ - type, - content, - submitChange, - requestClose, -}: AccountDataEditorProps) { - const [data, setData] = useState({ - type: type ?? '', - content: content ?? {}, - }); +export function AccountDataEditor({ event, submitChange, requestClose }: AccountDataEditorProps) { + const [data, setData] = useState( + event ?? { + type: '', + content: {}, + } + ); - const [edit, setEdit] = useState(!type); + const [edit, setEdit] = useState(!data.type); const closeEdit = useCallback(() => { - if (!type) { + if (!event) { requestClose(); return; } setEdit(false); - }, [type, requestClose]); + }, [event, requestClose]); - const handleSave = useCallback((info: AccountDataInfo) => { + const handleSave = useCallback((info: AccountDataEvent) => { setData(info); setEdit(false); }, []); diff --git a/src/app/features/settings/developer-tools/AccountData.tsx b/src/app/features/settings/developer-tools/AccountData.tsx index 8bccb62e..5b5a736f 100644 --- a/src/app/features/settings/developer-tools/AccountData.tsx +++ b/src/app/features/settings/developer-tools/AccountData.tsx @@ -1,29 +1,20 @@ -import React, { useCallback, useState } from 'react'; +import React from 'react'; import { Box, Text, Icon, Icons, Button, MenuItem } from 'folds'; +import { AccountDataEvent } from 'neurone/lib/api/types'; import { SequenceCard } from '../../../components/sequence-card'; import { SequenceCardStyle } from '../styles.css'; import { SettingTile } from '../../../components/setting-tile'; -import { useMatrixClient } from '../../../hooks/useMatrixClient'; -import { useAccountDataCallback } from '../../../hooks/useAccountDataCallback'; import { CutoutCard } from '../../../components/cutout-card'; +import { useAccountDataEvents } from '../../../hooks/storage/useAccountData'; type AccountDataProps = { expand: boolean; onExpandToggle: (expand: boolean) => void; - onSelect: (type: string | null) => void; + onSelect: (type: AccountDataEvent | null) => void; }; export function AccountData({ expand, onExpandToggle, onSelect }: AccountDataProps) { - const mx = useMatrixClient(); - const [accountDataTypes, setAccountDataKeys] = useState(() => - Array.from(mx.store.accountData.keys()) - ); - - useAccountDataCallback( - mx, - useCallback(() => { - setAccountDataKeys(Array.from(mx.store.accountData.keys())); - }, [mx]) - ); + const accountDataEventsResult = useAccountDataEvents(); + const accountDataEvents = accountDataEventsResult.value; return ( @@ -57,7 +48,7 @@ export function AccountData({ expand, onExpandToggle, onSelect }: AccountDataPro Events - Total: {accountDataTypes.length} + {accountDataEvents && Total: {accountDataEvents.length}} - {accountDataTypes.sort().map((type) => ( - } - onClick={() => onSelect(type)} - > - - - {type} - - - - ))} + {accountDataEvents + ?.sort((e1, e2) => (e1 < e2 ? -1 : 1)) + .map((event) => ( + } + onClick={() => onSelect(event)} + > + + + {event.type} + + + + ))} )} diff --git a/src/app/features/settings/developer-tools/DevelopTools.tsx b/src/app/features/settings/developer-tools/DevelopTools.tsx index a3f04567..8b7463df 100644 --- a/src/app/features/settings/developer-tools/DevelopTools.tsx +++ b/src/app/features/settings/developer-tools/DevelopTools.tsx @@ -1,42 +1,52 @@ import React, { useCallback, useState } from 'react'; import { Box, Text, IconButton, Icon, Icons, Scroll, Switch, Button } from 'folds'; +import { putAccountData } from 'neurone/lib/api/matrix/client/v3/user'; +import { parseMatrixResp } from 'neurone/lib/matrix-request'; +import { AccountDataEvent } from 'neurone/lib/api/types'; import { Page, PageContent, PageHeader } from '../../../components/page'; import { SequenceCard } from '../../../components/sequence-card'; import { SequenceCardStyle } from '../styles.css'; import { SettingTile } from '../../../components/setting-tile'; import { useSetting } from '../../../state/hooks/settings'; import { settingsAtom } from '../../../state/settings'; -import { useMatrixClient } from '../../../hooks/useMatrixClient'; import { AccountDataEditor, AccountDataSubmitCallback, } from '../../../components/AccountDataEditor'; import { copyToClipboard } from '../../../utils/dom'; +import { useClient } from '../../../hooks/useClient'; import { AccountData } from './AccountData'; type DeveloperToolsProps = { requestClose: () => void; }; export function DeveloperTools({ requestClose }: DeveloperToolsProps) { - const mx = useMatrixClient(); + const ct = useClient(); const [developerTools, setDeveloperTools] = useSetting(settingsAtom, 'developerTools'); + const [expand, setExpend] = useState(false); - const [accountDataType, setAccountDataType] = useState(); + const [editAccountData, setEditAccountData] = useState(); const submitAccountData: AccountDataSubmitCallback = useCallback( async (type, content) => { - await mx.setAccountData(type, content); + const resp = await ct.requestAuthJSON( + putAccountData({ + pathParams: { type, userId: ct.session.userId }, + body: content, + }) + ); + const [err] = await parseMatrixResp(resp); + if (err) throw new Error(err.data.error ?? err.data.errcode); }, - [mx] + [ct] ); - if (accountDataType !== undefined) { + if (editAccountData !== undefined) { return ( setAccountDataType(undefined)} + requestClose={() => setEditAccountData(undefined)} /> ); } @@ -92,9 +102,7 @@ export function DeveloperTools({ requestClose }: DeveloperToolsProps) { description="Copy access token to clipboard." after={