diff --git a/web/avatars/emoji-avatar-selection-modal.react.js b/web/avatars/emoji-avatar-selection-modal.react.js index d6253c5ac..d446698de 100644 --- a/web/avatars/emoji-avatar-selection-modal.react.js +++ b/web/avatars/emoji-avatar-selection-modal.react.js @@ -1,158 +1,185 @@ // @flow import data from '@emoji-mart/data'; import Picker from '@emoji-mart/react'; import * as React from 'react'; import { useModalContext } from 'lib/components/modal-provider.react.js'; import SWMansionIcon from 'lib/components/SWMansionIcon.react.js'; import type { ClientAvatar, ClientEmojiAvatar, } from 'lib/types/avatar-types.js'; import Avatar from './avatar.react.js'; import css from './emoji-avatar-selection-modal.css'; import Button, { buttonThemes } from '../components/button.react.js'; -import Tabs from '../components/tabs-legacy.react.js'; +import Tabs, { type TabData } from '../components/tabs.react.js'; import LoadingIndicator from '../loading-indicator.react.js'; import Modal from '../modals/modal.react.js'; import ColorSelector from '../modals/threads/color-selector.react.js'; type TabType = 'emoji' | 'color'; +const tabsData: $ReadOnlyArray> = [ + { + id: 'emoji', + header: 'Emoji', + }, + { + id: 'color', + header: 'Color', + }, +]; + type Props = { +currentAvatar: ClientAvatar, +defaultAvatar: ClientEmojiAvatar, +setEmojiAvatar: (pendingEmojiAvatar: ClientEmojiAvatar) => Promise, +avatarSaveInProgress: boolean, }; function EmojiAvatarSelectionModal(props: Props): React.Node { const { popModal } = useModalContext(); const { currentAvatar, defaultAvatar, setEmojiAvatar, avatarSaveInProgress } = props; const [updateAvatarStatus, setUpdateAvatarStatus] = React.useState(); const [pendingAvatarEmoji, setPendingAvatarEmoji] = React.useState( currentAvatar.type === 'emoji' ? currentAvatar.emoji : defaultAvatar.emoji, ); const [pendingAvatarColor, setPendingAvatarColor] = React.useState( currentAvatar.type === 'emoji' ? currentAvatar.color : defaultAvatar.color, ); const pendingEmojiAvatar: ClientEmojiAvatar = React.useMemo( () => ({ type: 'emoji', emoji: pendingAvatarEmoji, color: pendingAvatarColor, }), [pendingAvatarColor, pendingAvatarEmoji], ); const onEmojiSelect = React.useCallback( (selection: { +native: string, ... }) => { setUpdateAvatarStatus(); setPendingAvatarEmoji(selection.native); }, [], ); const onColorSelection = React.useCallback((hex: string) => { setUpdateAvatarStatus(); setPendingAvatarColor(hex); }, []); const onSaveAvatar = React.useCallback(async () => { try { await setEmojiAvatar(pendingEmojiAvatar); setUpdateAvatarStatus('success'); } catch { setUpdateAvatarStatus('failure'); } }, [setEmojiAvatar, pendingEmojiAvatar]); let saveButtonContent; let buttonColor; if (avatarSaveInProgress) { buttonColor = buttonThemes.standard; saveButtonContent = ; } else if (updateAvatarStatus === 'success') { buttonColor = buttonThemes.success; saveButtonContent = ( <> {'Avatar update succeeded.'} ); } else if (updateAvatarStatus === 'failure') { buttonColor = buttonThemes.danger; saveButtonContent = ( <> {'Avatar update failed. Please try again.'} ); } else { buttonColor = buttonThemes.standard; saveButtonContent = 'Save Avatar'; } const [currentTabType, setCurrentTabType] = React.useState('emoji'); + const tabs = React.useMemo( + () => ( + + ), + [currentTabType], + ); + + const tabContent = React.useMemo(() => { + if (currentTabType === 'emoji') { + return ( +
+
+ +
+
+ ); + } + return ( +
+ +
+ ); + }, [currentTabType, onEmojiSelect, onColorSelection, pendingAvatarColor]); + return (
- - -
-
- -
-
-
- -
- -
-
-
+ {tabs} + {tabContent}
); } export default EmojiAvatarSelectionModal;