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"
1
7
import TextField from "@material-ui/core/TextField"
2
8
import { Group } from "api/typesGenerated"
3
9
import { ChooseOne , Cond } from "components/Conditionals/ChooseOne"
10
+ import { OpenDropdown } from "components/DropdownArrows/DropdownArrows"
4
11
import { FormFooter } from "components/FormFooter/FormFooter"
5
12
import { FullPageForm } from "components/FullPageForm/FullPageForm"
6
13
import { FullScreenLoader } from "components/Loader/FullScreenLoader"
7
14
import { Margins } from "components/Margins/Margins"
8
15
import { useFormik } from "formik"
9
- import React from "react"
16
+ import React , { useRef , useState } from "react"
17
+ import { colors } from "theme/colors"
10
18
import { getFormHelpers , nameValidator , onChangeTrimmed } from "util/formUtils"
11
19
import * as Yup from "yup"
12
20
@@ -26,6 +34,7 @@ const UpdateGroupForm: React.FC<{
26
34
onCancel : ( ) => void
27
35
isLoading : boolean
28
36
} > = ( { group, errors, onSubmit, onCancel, isLoading } ) => {
37
+ const [ isEmojiPickerOpen , setIsEmojiPickerOpen ] = useState ( false )
29
38
const form = useFormik < FormData > ( {
30
39
initialValues : {
31
40
name : group . name ,
@@ -35,6 +44,10 @@ const UpdateGroupForm: React.FC<{
35
44
onSubmit,
36
45
} )
37
46
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" )
38
51
39
52
return (
40
53
< FullPageForm title = "Group settings" onCancel = { onCancel } >
@@ -53,9 +66,60 @@ const UpdateGroupForm: React.FC<{
53
66
onChange = { onChangeTrimmed ( form ) }
54
67
autoFocus
55
68
fullWidth
56
- label = "Avatar URL "
69
+ label = "Icon "
57
70
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
+ } }
58
86
/>
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
+
59
123
< FormFooter onCancel = { onCancel } isLoading = { isLoading } />
60
124
</ form >
61
125
</ FullPageForm >
@@ -100,4 +164,21 @@ export const SettingsGroupPageView: React.FC<SettingsGroupPageViewProps> = ({
100
164
)
101
165
}
102
166
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
+
103
184
export default SettingsGroupPageView
0 commit comments