import React, { MouseEventHandler, useCallback, useState } from 'react'; import { Box, Text, IconButton, Icon, Icons, Scroll, Switch, Overlay, OverlayBackdrop, OverlayCenter, Modal, Chip, Button, PopOut, RectCords, Menu, config, MenuItem, } from 'folds'; import { MatrixEvent } from 'matrix-js-sdk'; import FocusTrap from 'focus-trap-react'; 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 { useAccountDataCallback } from '../../../hooks/useAccountDataCallback'; import { TextViewer } from '../../../components/text-viewer'; import { stopPropagation } from '../../../utils/keyboard'; import { AccountDataEditor } from './AccountDataEditor'; import { copyToClipboard } from '../../../utils/dom'; function AccountData() { const mx = useMatrixClient(); const [view, setView] = useState(false); const [accountData, setAccountData] = useState(() => Array.from(mx.store.accountData.values())); const [selectedEvent, selectEvent] = useState(); const [menuCords, setMenuCords] = useState(); const [selectedOption, selectOption] = useState<'edit' | 'inspect'>(); useAccountDataCallback( mx, useCallback( () => setAccountData(Array.from(mx.store.accountData.values())), [mx, setAccountData] ) ); const handleMenu: MouseEventHandler = (evt) => { const target = evt.currentTarget; const eventType = target.getAttribute('data-event-type'); if (eventType) { const mEvent = accountData.find((mEvt) => mEvt.getType() === eventType); setMenuCords(evt.currentTarget.getBoundingClientRect()); selectEvent(mEvent); } }; const handleMenuClose = () => setMenuCords(undefined); const handleEdit = () => { selectOption('edit'); setMenuCords(undefined); }; const handleInspect = () => { selectOption('inspect'); setMenuCords(undefined); }; const handleClose = useCallback(() => { selectEvent(undefined); selectOption(undefined); }, []); return ( Account Data setView(!view)} variant="Secondary" fill="Soft" size="300" radii="300" outlined before={ } > {view ? 'Collapse' : 'Expand'} } /> {view && ( Types } > Add New {accountData.map((mEvent) => ( {mEvent.getType()} ))} )} evt.key === 'ArrowDown' || evt.key === 'ArrowRight', isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp' || evt.key === 'ArrowLeft', escapeDeactivates: stopPropagation, }} > Inspect Edit } /> {selectedEvent && selectedOption === 'inspect' && ( }> )} {selectedOption === 'edit' && ( }> )} ); } type DeveloperToolsProps = { requestClose: () => void; }; export function DeveloperTools({ requestClose }: DeveloperToolsProps) { const mx = useMatrixClient(); const [developerTools, setDeveloperTools] = useSetting(settingsAtom, 'developerTools'); return ( Developer Tools Options } /> {developerTools && ( copyToClipboard(mx.getAccessToken() ?? '') } variant="Secondary" fill="Soft" size="300" radii="300" outlined > Copy } /> )} {developerTools && } ); }