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

Skip to content

Commit 95d062e

Browse files
committed
feat: Add emoji picker to group settings
Fixes #4413.
1 parent 72288c3 commit 95d062e

File tree

1 file changed

+82
-2
lines changed

1 file changed

+82
-2
lines changed

site/src/pages/GroupsPage/SettingsGroupPageView.tsx

+82-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,9 @@ 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()
3850

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

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

0 commit comments

Comments
 (0)