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,9 @@ 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 ( )
38
50
39
51
return (
40
52
< FullPageForm title = "Group settings" onCancel = { onCancel } >
@@ -53,9 +65,60 @@ const UpdateGroupForm: React.FC<{
53
65
onChange = { onChangeTrimmed ( form ) }
54
66
autoFocus
55
67
fullWidth
56
- label = "Avatar URL "
68
+ label = "Icon "
57
69
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
+ } }
58
85
/>
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
+
59
122
< FormFooter onCancel = { onCancel } isLoading = { isLoading } />
60
123
</ form >
61
124
</ FullPageForm >
@@ -100,4 +163,21 @@ export const SettingsGroupPageView: React.FC<SettingsGroupPageViewProps> = ({
100
163
)
101
164
}
102
165
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
+
103
183
export default SettingsGroupPageView
0 commit comments