import React, { ChangeEventHandler, FormEventHandler, useCallback, useEffect, useMemo, useState, } from 'react'; import { Box, Text, IconButton, Icon, Icons, Scroll, Input, Avatar, Button, Chip, Overlay, OverlayBackdrop, OverlayCenter, Modal, Dialog, Header, config, Spinner, } from 'folds'; 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 { useMatrixClient } from '../../../hooks/useMatrixClient'; import { UserProfile, useUserProfile } from '../../../hooks/useUserProfile'; import { getMxIdLocalPart, mxcUrlToHttp } from '../../../utils/matrix'; import { UserAvatar } from '../../../components/user-avatar'; import { useMediaAuthentication } from '../../../hooks/useMediaAuthentication'; import { nameInitials } from '../../../utils/common'; import { copyToClipboard } from '../../../utils/dom'; import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; import { useFilePicker } from '../../../hooks/useFilePicker'; import { useObjectURL } from '../../../hooks/useObjectURL'; import { stopPropagation } from '../../../utils/keyboard'; import { ImageEditor } from '../../../components/image-editor'; import { ModalWide } from '../../../styles/Modal.css'; import { createUploadAtom, UploadSuccess } from '../../../state/upload'; import { CompactUploadCardRenderer } from '../../../components/upload-card'; import { useCapabilities } from '../../../hooks/useCapabilities'; function MatrixId() { const mx = useMatrixClient(); const userId = mx.getUserId()!; return ( Matrix ID copyToClipboard(userId)}> Copy } /> ); } type ProfileProps = { profile: UserProfile; userId: string; }; function ProfileAvatar({ profile, userId }: ProfileProps) { const mx = useMatrixClient(); const useAuthentication = useMediaAuthentication(); const capabilities = useCapabilities(); const [alertRemove, setAlertRemove] = useState(false); const disableSetAvatar = capabilities['m.set_avatar_url']?.enabled === false; const defaultDisplayName = profile.displayName ?? getMxIdLocalPart(userId) ?? userId; const avatarUrl = profile.avatarUrl ? mxcUrlToHttp(mx, profile.avatarUrl, useAuthentication, 96, 96, 'crop') ?? undefined : undefined; const [imageFile, setImageFile] = useState(); const imageFileURL = useObjectURL(imageFile); const uploadAtom = useMemo(() => { if (imageFile) return createUploadAtom(imageFile); return undefined; }, [imageFile]); const pickFile = useFilePicker(setImageFile, false); const handleRemoveUpload = useCallback(() => { setImageFile(undefined); }, []); const handleUploaded = useCallback( (upload: UploadSuccess) => { const { mxc } = upload; mx.setAvatarUrl(mxc); handleRemoveUpload(); }, [mx, handleRemoveUpload] ); const handleRemoveAvatar = () => { mx.setAvatarUrl(''); setAlertRemove(false); }; return ( Avatar } after={ {nameInitials(defaultDisplayName)}} /> } > {uploadAtom ? ( ) : ( {avatarUrl && ( )} )} {imageFileURL && ( }> )} }> setAlertRemove(false), clickOutsideDeactivates: true, escapeDeactivates: stopPropagation, }} >
Remove Avatar setAlertRemove(false)} radii="300">
Are you sure you want to remove profile avatar?
); } function ProfileDisplayName({ profile, userId }: ProfileProps) { const mx = useMatrixClient(); const capabilities = useCapabilities(); const disableSetDisplayname = capabilities['m.set_displayname']?.enabled === false; const defaultDisplayName = profile.displayName ?? getMxIdLocalPart(userId) ?? userId; const [displayName, setDisplayName] = useState(defaultDisplayName); const [changeState, changeDisplayName] = useAsyncCallback( useCallback((name: string) => mx.setDisplayName(name), [mx]) ); const changingDisplayName = changeState.status === AsyncStatus.Loading; useEffect(() => { setDisplayName(defaultDisplayName); }, [defaultDisplayName]); const handleChange: ChangeEventHandler = (evt) => { const name = evt.currentTarget.value; setDisplayName(name); }; const handleReset = () => { setDisplayName(defaultDisplayName); }; const handleSubmit: FormEventHandler = (evt) => { evt.preventDefault(); if (changingDisplayName) return; const target = evt.target as HTMLFormElement | undefined; const displayNameInput = target?.displayNameInput as HTMLInputElement | undefined; const name = displayNameInput?.value; if (!name) return; changeDisplayName(name); }; const hasChanges = displayName !== defaultDisplayName; return ( Display Name } > ) } /> ); } function Profile() { const mx = useMatrixClient(); const userId = mx.getUserId()!; const profile = useUserProfile(userId); return ( Profile ); } function ContactInformation() { const mx = useMatrixClient(); const [threePIdsState, loadThreePIds] = useAsyncCallback( useCallback(() => mx.getThreePids(), [mx]) ); const threePIds = threePIdsState.status === AsyncStatus.Success ? threePIdsState.data.threepids : undefined; const emailIds = threePIds?.filter((id) => id.medium === 'email'); useEffect(() => { loadThreePIds(); }, [loadThreePIds]); return ( Contact Information {emailIds?.map((email) => ( {email.address} ))} {/* */} ); } type AccountProps = { requestClose: () => void; }; export function Account({ requestClose }: AccountProps) { return ( Account ); }