Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0d27b59

Browse files
authored
feat: Add emoji picker to group settings (coder#4685)
Fixes coder#4413.
1 parent c8e299c commit 0d27b59

File tree

2 files changed

+86
-2
lines changed

2 files changed

+86
-2
lines changed

site/src/i18n/en/common.json

+3
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,8 @@
3131
},
3232
"warningsAndErrors": {
3333
"somethingWentWrong": "Something went wrong."
34+
},
35+
"emojiPicker": {
36+
"select": "Select emoji"
3437
}
3538
}

site/src/pages/GroupsPage/SettingsGroupPageView.tsx

+83-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
1+
import data from "@emoji-mart/data/sets/14/twitter.json"
2+
import Picker from "@emoji-mart/react"
3+
import Button from "@material-ui/core/Button"
4+
import InputAdornment from "@material-ui/core/InputAdornment"
5+
import Popover from "@material-ui/core/Popover"
6+
import { makeStyles } from "@material-ui/core/styles"
17
import TextField from "@material-ui/core/TextField"
28
import { Group } from "api/typesGenerated"
39
import { ChooseOne, Cond } from "components/Conditionals/ChooseOne"
10+
import { OpenDropdown } from "components/DropdownArrows/DropdownArrows"
411
import { FormFooter } from "components/FormFooter/FormFooter"
512
import { FullPageForm } from "components/FullPageForm/FullPageForm"
613
import { FullScreenLoader } from "components/Loader/FullScreenLoader"
714
import { Margins } from "components/Margins/Margins"
815
import { useFormik } from "formik"
9-
import React from "react"
16+
import React, { useRef, useState } from "react"
17+
import { colors } from "theme/colors"
1018
import { getFormHelpers, nameValidator, onChangeTrimmed } from "util/formUtils"
1119
import * as Yup from "yup"
1220

@@ -26,6 +34,7 @@ const UpdateGroupForm: React.FC<{
2634
onCancel: () => void
2735
isLoading: boolean
2836
}> = ({ group, errors, onSubmit, onCancel, isLoading }) => {
37+
const [isEmojiPickerOpen, setIsEmojiPickerOpen] = useState(false)
2938
const form = useFormik<FormData>({
3039
initialValues: {
3140
name: group.name,
@@ -35,6 +44,10 @@ const UpdateGroupForm: React.FC<{
3544
onSubmit,
3645
})
3746
const getFieldHelpers = getFormHelpers<FormData>(form, errors)
47+
const hasIcon = form.values.avatar_url && form.values.avatar_url !== ""
48+
const emojiButtonRef = useRef<HTMLButtonElement>(null)
49+
const styles = useStyles()
50+
const { t } = useTranslation("common")
3851

3952
return (
4053
<FullPageForm title="Group settings" onCancel={onCancel}>
@@ -53,9 +66,60 @@ const UpdateGroupForm: React.FC<{
5366
onChange={onChangeTrimmed(form)}
5467
autoFocus
5568
fullWidth
56-
label="Avatar URL"
69+
label="Icon"
5770
variant="outlined"
71+
InputProps={{
72+
endAdornment: hasIcon ? (
73+
<InputAdornment position="end">
74+
<img
75+
alt=""
76+
src={form.values.avatar_url}
77+
className={styles.adornment}
78+
// This prevent browser to display the ugly error icon if the
79+
// image path is wrong or user didn't finish typing the url
80+
onError={(e) => (e.currentTarget.style.display = "none")}
81+
onLoad={(e) => (e.currentTarget.style.display = "inline")}
82+
/>
83+
</InputAdornment>
84+
) : undefined,
85+
}}
5886
/>
87+
88+
<Button
89+
fullWidth
90+
ref={emojiButtonRef}
91+
variant="outlined"
92+
size="small"
93+
endIcon={<OpenDropdown />}
94+
onClick={() => {
95+
setIsEmojiPickerOpen((v) => !v)
96+
}}
97+
>
98+
{t("emojiPicker.select")}
99+
</Button>
100+
101+
<Popover
102+
id="emoji"
103+
open={isEmojiPickerOpen}
104+
anchorEl={emojiButtonRef.current}
105+
onClose={() => {
106+
setIsEmojiPickerOpen(false)
107+
}}
108+
>
109+
<Picker
110+
theme="dark"
111+
data={data}
112+
onEmojiSelect={(emojiData) => {
113+
form
114+
.setFieldValue("avatar_url", `/emojis/${emojiData.unified}.png`)
115+
.catch((ex) => {
116+
console.error(ex)
117+
})
118+
setIsEmojiPickerOpen(false)
119+
}}
120+
/>
121+
</Popover>
122+
59123
<FormFooter onCancel={onCancel} isLoading={isLoading} />
60124
</form>
61125
</FullPageForm>
@@ -100,4 +164,21 @@ export const SettingsGroupPageView: React.FC<SettingsGroupPageViewProps> = ({
100164
)
101165
}
102166

167+
const useStyles = makeStyles((theme) => ({
168+
"@global": {
169+
"em-emoji-picker": {
170+
"--rgb-background": theme.palette.background.paper,
171+
"--rgb-input": colors.gray[17],
172+
"--rgb-color": colors.gray[4],
173+
},
174+
},
175+
adornment: {
176+
width: theme.spacing(3),
177+
height: theme.spacing(3),
178+
},
179+
iconField: {
180+
paddingBottom: theme.spacing(0.5),
181+
},
182+
}))
183+
103184
export default SettingsGroupPageView

0 commit comments

Comments
 (0)