From d499a9213ae513df7f72469094ab716026f54abb Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Fri, 21 Oct 2022 17:13:32 +0000 Subject: [PATCH] feat: Add emoji picker to group settings Fixes #4413. --- site/src/i18n/en/common.json | 3 + .../GroupsPage/SettingsGroupPageView.tsx | 85 ++++++++++++++++++- 2 files changed, 86 insertions(+), 2 deletions(-) diff --git a/site/src/i18n/en/common.json b/site/src/i18n/en/common.json index 463a8176bf164..18afb7754453a 100644 --- a/site/src/i18n/en/common.json +++ b/site/src/i18n/en/common.json @@ -31,5 +31,8 @@ }, "warningsAndErrors": { "somethingWentWrong": "Something went wrong." + }, + "emojiPicker": { + "select": "Select emoji" } } diff --git a/site/src/pages/GroupsPage/SettingsGroupPageView.tsx b/site/src/pages/GroupsPage/SettingsGroupPageView.tsx index 55c59ccd93fc9..100b1b8fe6766 100644 --- a/site/src/pages/GroupsPage/SettingsGroupPageView.tsx +++ b/site/src/pages/GroupsPage/SettingsGroupPageView.tsx @@ -1,12 +1,20 @@ +import data from "@emoji-mart/data/sets/14/twitter.json" +import Picker from "@emoji-mart/react" +import Button from "@material-ui/core/Button" +import InputAdornment from "@material-ui/core/InputAdornment" +import Popover from "@material-ui/core/Popover" +import { makeStyles } from "@material-ui/core/styles" import TextField from "@material-ui/core/TextField" import { Group } from "api/typesGenerated" import { ChooseOne, Cond } from "components/Conditionals/ChooseOne" +import { OpenDropdown } from "components/DropdownArrows/DropdownArrows" import { FormFooter } from "components/FormFooter/FormFooter" import { FullPageForm } from "components/FullPageForm/FullPageForm" import { FullScreenLoader } from "components/Loader/FullScreenLoader" import { Margins } from "components/Margins/Margins" import { useFormik } from "formik" -import React from "react" +import React, { useRef, useState } from "react" +import { colors } from "theme/colors" import { getFormHelpers, nameValidator, onChangeTrimmed } from "util/formUtils" import * as Yup from "yup" @@ -26,6 +34,7 @@ const UpdateGroupForm: React.FC<{ onCancel: () => void isLoading: boolean }> = ({ group, errors, onSubmit, onCancel, isLoading }) => { + const [isEmojiPickerOpen, setIsEmojiPickerOpen] = useState(false) const form = useFormik({ initialValues: { name: group.name, @@ -35,6 +44,10 @@ const UpdateGroupForm: React.FC<{ onSubmit, }) const getFieldHelpers = getFormHelpers(form, errors) + const hasIcon = form.values.avatar_url && form.values.avatar_url !== "" + const emojiButtonRef = useRef(null) + const styles = useStyles() + const { t } = useTranslation("common") return ( @@ -53,9 +66,60 @@ const UpdateGroupForm: React.FC<{ onChange={onChangeTrimmed(form)} autoFocus fullWidth - label="Avatar URL" + label="Icon" variant="outlined" + InputProps={{ + endAdornment: hasIcon ? ( + + (e.currentTarget.style.display = "none")} + onLoad={(e) => (e.currentTarget.style.display = "inline")} + /> + + ) : undefined, + }} /> + + + + { + setIsEmojiPickerOpen(false) + }} + > + { + form + .setFieldValue("avatar_url", `/emojis/${emojiData.unified}.png`) + .catch((ex) => { + console.error(ex) + }) + setIsEmojiPickerOpen(false) + }} + /> + + @@ -100,4 +164,21 @@ export const SettingsGroupPageView: React.FC = ({ ) } +const useStyles = makeStyles((theme) => ({ + "@global": { + "em-emoji-picker": { + "--rgb-background": theme.palette.background.paper, + "--rgb-input": colors.gray[17], + "--rgb-color": colors.gray[4], + }, + }, + adornment: { + width: theme.spacing(3), + height: theme.spacing(3), + }, + iconField: { + paddingBottom: theme.spacing(0.5), + }, +})) + export default SettingsGroupPageView