@@ -9,10 +9,13 @@ import type { RouteProp } from '../react-navigation';
9
9
import type { AppNavigationProp } from '../nav/AppNavigator' ;
10
10
import { useSelector } from '../react-redux' ;
11
11
import Input from '../common/Input' ;
12
+ import EmojiInput from './EmojiInput' ;
13
+ import type { Value as EmojiInputValue } from './EmojiInput' ;
14
+ import { emojiTypeFromReactionType , reactionTypeFromEmojiType } from '../emoji/data' ;
12
15
import SelectableOptionRow from '../common/SelectableOptionRow' ;
13
16
import Screen from '../common/Screen' ;
14
17
import ZulipButton from '../common/ZulipButton' ;
15
- import { getAuth , getOwnUserId } from '../selectors' ;
18
+ import { getZulipFeatureLevel , getAuth , getOwnUserId } from '../selectors' ;
16
19
import { getUserStatus } from './userStatusesModel' ;
17
20
import type { UserStatus } from '../api/modelTypes' ;
18
21
import { IconCancel , IconDone } from '../common/Icons' ;
@@ -46,41 +49,82 @@ const statusTextFromInputValue = (v: string): $PropertyType<UserStatus, 'status_
46
49
47
50
const inputValueFromStatusText = ( t : $PropertyType < UserStatus , 'status_text' > ) : string => t ?? '' ;
48
51
52
+ const statusEmojiFromInputValue = ( v : EmojiInputValue ) : $PropertyType < UserStatus , 'status_emoji' > =>
53
+ v
54
+ ? {
55
+ emoji_name : v . name ,
56
+ emoji_code : v . code ,
57
+ reaction_type : reactionTypeFromEmojiType ( v . type , v . name ) ,
58
+ }
59
+ : null ;
60
+
61
+ const inputValueFromStatusEmoji = ( e : $PropertyType < UserStatus , 'status_emoji' > ) : EmojiInputValue =>
62
+ e
63
+ ? {
64
+ type : emojiTypeFromReactionType ( e . reaction_type ) ,
65
+ code : e . emoji_code ,
66
+ name : e . emoji_name ,
67
+ }
68
+ : null ;
69
+
49
70
export default function UserStatusScreen ( props : Props ) : Node {
50
71
const { navigation } = props ;
51
72
73
+ // TODO(server-5.0): Cut conditionals on emoji-status support (emoji
74
+ // supported as of FL 86: https://zulip.com/api/changelog )
75
+ const serverSupportsEmojiStatus = useSelector ( getZulipFeatureLevel ) >= 86 ;
76
+
52
77
const _ = useContext ( TranslationContext ) ;
53
78
const auth = useSelector ( getAuth ) ;
54
79
const ownUserId = useSelector ( getOwnUserId ) ;
55
80
const userStatusText = useSelector ( state => getUserStatus ( state , ownUserId ) . status_text ) ;
81
+ const userStatusEmoji = useSelector ( state => getUserStatus ( state , ownUserId ) . status_emoji ) ;
56
82
57
83
const [ textInputValue , setTextInputValue ] = useState < string > (
58
84
inputValueFromStatusText ( userStatusText ) ,
59
85
) ;
86
+ const [ emojiInputValue , setEmojiInputValue ] = useState < EmojiInputValue > (
87
+ inputValueFromStatusEmoji ( userStatusEmoji ) ,
88
+ ) ;
60
89
61
90
const sendToServer = useCallback (
62
91
partialUserStatus => {
63
- api . updateUserStatus ( auth , partialUserStatus ) ;
92
+ const copy = { ...partialUserStatus } ;
93
+ // TODO: Put conditional inside `api.updateUserStatus` itself; see
94
+ // https://github.com/zulip/zulip-mobile/issues/4659#issuecomment-914996061
95
+ if ( ! serverSupportsEmojiStatus ) {
96
+ delete copy . status_emoji ;
97
+ }
98
+ api . updateUserStatus ( auth , copy ) ;
64
99
navigation . goBack ( ) ;
65
100
} ,
66
- [ navigation , auth ] ,
101
+ [ serverSupportsEmojiStatus , navigation , auth ] ,
67
102
) ;
68
103
69
104
const handlePressUpdate = useCallback ( ( ) => {
70
- sendToServer ( { status_text : statusTextFromInputValue ( textInputValue ) } ) ;
71
- } , [ textInputValue , sendToServer ] ) ;
105
+ sendToServer ( {
106
+ status_text : statusTextFromInputValue ( textInputValue ) ,
107
+ status_emoji : statusEmojiFromInputValue ( emojiInputValue ) ,
108
+ } ) ;
109
+ } , [ textInputValue , emojiInputValue , sendToServer ] ) ;
72
110
73
111
const handlePressClear = useCallback ( ( ) => {
74
112
setTextInputValue ( inputValueFromStatusText ( null ) ) ;
75
- sendToServer ( { status_text : null } ) ;
113
+ setEmojiInputValue ( inputValueFromStatusEmoji ( null ) ) ;
114
+ sendToServer ( { status_text : null , status_emoji : null } ) ;
76
115
} , [ sendToServer ] ) ;
77
116
78
117
return (
79
118
< Screen title = "User status" >
80
119
< View style = { styles . inputRow } >
81
- {
82
- // TODO: Input for emoji status
83
- }
120
+ { serverSupportsEmojiStatus && (
121
+ < EmojiInput
122
+ navigation = { navigation }
123
+ value = { emojiInputValue }
124
+ onChangeValue = { setEmojiInputValue }
125
+ rightMargin
126
+ />
127
+ ) }
84
128
< Input
85
129
autoFocus
86
130
maxLength = { 60 }
0 commit comments