Skip to content

Commit

Permalink
[web] Introduce ThreadEmojiAvatarSelectionModal
Browse files Browse the repository at this point in the history
Summary:
Enables setting of emoji avatars on `web`. As of this diff all varieties of thread avatar can be set from `web`. We just need to make a few layout tweaks in `ThreadSettingsModalGeneralTab` in order to get this ready to ship.

---

Depends on D8855

Test Plan: Works as expected: {F694299}

Reviewers: ashoat, ginsu

Reviewed By: ashoat

Subscribers: tomek

Differential Revision: https://phab.comm.dev/D8856
  • Loading branch information
atulsmadhugiri committed Aug 22, 2023
1 parent 0a2f6fe commit 28b1e51
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 2 deletions.
25 changes: 23 additions & 2 deletions web/avatars/edit-thread-avatar-menu.react.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@ import invariant from 'invariant';
import * as React from 'react';

import { EditThreadAvatarContext } from 'lib/components/base-edit-thread-avatar-provider.react.js';
import { useModalContext } from 'lib/components/modal-provider.react.js';
import SWMansionIcon from 'lib/components/SWMansionIcon.react.js';
import type { RawThreadInfo, ThreadInfo } from 'lib/types/thread-types.js';

import { useUploadAvatarMedia } from './avatar-hooks.react.js';
import css from './edit-avatar-menu.css';
import ThreadEmojiAvatarSelectionModal from './thread-emoji-avatar-selection-modal.react.js';
import MenuItem from '../components/menu-item.react.js';
import Menu from '../components/menu.react.js';
import { allowedMimeTypeString } from '../media/file-utils.js';
Expand Down Expand Up @@ -77,13 +79,32 @@ function EditThreadAvatarMenu(props: Props): React.Node {
[onImageMenuItemClicked],
);

const { pushModal } = useModalContext();
const openEmojiSelectionModal = React.useCallback(
() =>
pushModal(<ThreadEmojiAvatarSelectionModal threadInfo={threadInfo} />),
[pushModal, threadInfo],
);

const emojiMenuItem = React.useMemo(
() => (
<MenuItem
key="emoji"
text="Select emoji"
icon="emote-smile"
onClick={openEmojiSelectionModal}
/>
),
[openEmojiSelectionModal],
);

const menuItems = React.useMemo(() => {
const items = [imageMenuItem];
const items = [emojiMenuItem, imageMenuItem];
if (threadInfo.avatar) {
items.push(removeMenuItem);
}
return items;
}, [imageMenuItem, removeMenuItem, threadInfo.avatar]);
}, [emojiMenuItem, imageMenuItem, removeMenuItem, threadInfo.avatar]);

return (
<div>
Expand Down
53 changes: 53 additions & 0 deletions web/avatars/thread-emoji-avatar-selection-modal.react.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// @flow

import invariant from 'invariant';
import * as React from 'react';

import { EditThreadAvatarContext } from 'lib/components/base-edit-thread-avatar-provider.react.js';
import {
getDefaultAvatar,
useAvatarForThread,
} from 'lib/shared/avatar-utils.js';
import type {
ClientAvatar,
ClientEmojiAvatar,
} from 'lib/types/avatar-types.js';
import type { RawThreadInfo, ThreadInfo } from 'lib/types/thread-types.js';

import EmojiAvatarSelectionModal from './emoji-avatar-selection-modal.react.js';

type Props = {
+threadInfo: ThreadInfo | RawThreadInfo,
};

function ThreadEmojiAvatarSelectionModal(props: Props): React.Node {
const { threadInfo } = props;
const editThreadAvatarContext = React.useContext(EditThreadAvatarContext);
invariant(editThreadAvatarContext, 'editThreadAvatarContext should be set');

const { baseSetThreadAvatar, threadAvatarSaveInProgress } =
editThreadAvatarContext;

const currentThreadAvatar: ClientAvatar = useAvatarForThread(threadInfo);
const defaultThreadAvatar: ClientEmojiAvatar = getDefaultAvatar(
threadInfo.id,
threadInfo.color,
);

const setEmojiAvatar = React.useCallback(
(pendingEmojiAvatar: ClientEmojiAvatar): Promise<void> =>
baseSetThreadAvatar(threadInfo.id, pendingEmojiAvatar),
[baseSetThreadAvatar, threadInfo.id],
);

return (
<EmojiAvatarSelectionModal
currentAvatar={currentThreadAvatar}
defaultAvatar={defaultThreadAvatar}
setEmojiAvatar={setEmojiAvatar}
avatarSaveInProgress={threadAvatarSaveInProgress}
/>
);
}

export default ThreadEmojiAvatarSelectionModal;

0 comments on commit 28b1e51

Please sign in to comment.