import { useState } from 'react'; import { useDispatch } from 'react-redux'; import styled from 'styled-components'; import { clearOurAvatar, uploadOurAvatar } from '../../interactions/conversationInteractions'; import { ToastUtils } from '../../session/utils'; import { editProfileModal, updateEditProfilePictureModel } from '../../state/ducks/modalDialog'; import { pickFileForAvatar } from '../../types/attachments/VisualAttachment'; import { SessionWrapperModal } from '../SessionWrapperModal'; import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton'; import { SpacerLG } from '../basic/Text'; import { SessionIconButton } from '../icon'; import { SessionSpinner } from '../loading'; import { ProfileAvatar } from './EditProfileDialog'; const StyledAvatarContainer = styled.div` cursor: pointer; `; const UploadImageButton = () => { return (
); }; const uploadProfileAvatar = async (scaledAvatarUrl: string | null) => { if (scaledAvatarUrl?.length) { try { const blobContent = await (await fetch(scaledAvatarUrl)).blob(); if (!blobContent || !blobContent.size) { throw new Error('Failed to fetch blob content from scaled avatar'); } await uploadOurAvatar(await blobContent.arrayBuffer()); } catch (error) { if (error.message && error.message.length) { ToastUtils.pushToastError('edit-profile', error.message); } window.log.error( 'showEditProfileDialog Error ensuring that image is properly sized:', error && error.stack ? error.stack : error ); } } }; export type EditProfilePictureModalProps = { avatarPath: string | null; profileName: string | undefined; ourId: string; }; export const EditProfilePictureModal = (props: EditProfilePictureModalProps) => { const dispatch = useDispatch(); const [newAvatarObjectUrl, setNewAvatarObjectUrl] = useState(props.avatarPath); const [loading, setLoading] = useState(false); if (!props) { return null; } const { avatarPath, profileName, ourId } = props; const closeDialog = () => { dispatch(updateEditProfilePictureModel(null)); dispatch(editProfileModal({})); }; const handleAvatarClick = async () => { const updatedAvatarObjectUrl = await pickFileForAvatar(); if (updatedAvatarObjectUrl) { setNewAvatarObjectUrl(updatedAvatarObjectUrl); } }; const handleUpload = async () => { setLoading(true); if (newAvatarObjectUrl === avatarPath) { window.log.debug('Avatar Object URL has not changed!'); return; } await uploadProfileAvatar(newAvatarObjectUrl); setLoading(false); dispatch(updateEditProfilePictureModel(null)); }; const handleRemove = async () => { setLoading(true); await clearOurAvatar(); setNewAvatarObjectUrl(null); setLoading(false); dispatch(updateEditProfilePictureModel(null)); }; return (
void handleAvatarClick()} data-testid={'image-upload-click'} > {newAvatarObjectUrl || avatarPath ? ( ) : ( )}
{loading ? ( ) : ( <>
)}
); };