import type { ChangeEvent } from 'react'; import type { FC } from '../../lib/teact/teact'; import React, { useState, useEffect, memo, useCallback, } from '../../lib/teact/teact'; import buildClassName from '../../util/buildClassName'; import CropModal from './CropModal'; import './AvatarEditable.scss'; interface OwnProps { title?: string; disabled?: boolean; isForForum?: boolean; currentAvatarBlobUrl?: string; onChange: (file: File) => void; } const AvatarEditable: FC = ({ title = 'Change your profile picture', disabled, isForForum, currentAvatarBlobUrl, onChange, }) => { const [selectedFile, setSelectedFile] = useState(); const [croppedBlobUrl, setCroppedBlobUrl] = useState(currentAvatarBlobUrl); useEffect(() => { setCroppedBlobUrl(currentAvatarBlobUrl); }, [currentAvatarBlobUrl]); function handleSelectFile(event: ChangeEvent) { const target = event.target as HTMLInputElement; if (!target?.files?.[0]) { return; } setSelectedFile(target.files[0]); target.value = ''; } const handleAvatarCrop = useCallback((croppedImg: File) => { setSelectedFile(undefined); onChange(croppedImg); if (croppedBlobUrl && croppedBlobUrl !== currentAvatarBlobUrl) { URL.revokeObjectURL(croppedBlobUrl); } setCroppedBlobUrl(URL.createObjectURL(croppedImg)); }, [croppedBlobUrl, currentAvatarBlobUrl, onChange]); const handleModalClose = useCallback(() => { setSelectedFile(undefined); }, []); const labelClassName = buildClassName( croppedBlobUrl && 'filled', disabled && 'disabled', isForForum && 'rounded-square', ); return (
); }; export default memo(AvatarEditable);