import React, { forwardRef, useImperativeHandle, useState } from 'react'; import { InteractionManager, StyleSheet, Text, View } from 'react-native'; import Modal from 'react-native-modal'; import { connect } from 'react-redux'; import I18n from '../../i18n'; import Button from '../../containers/Button'; import TextInput from '../../containers/TextInput'; import sharedStyles from '../Styles'; import { themes } from '../../lib/constants'; import { IApplicationState } from '../../definitions'; import { Services } from '../../lib/services'; import { TSupportedThemes } from '../../theme'; const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center' }, content: { padding: 16, width: '100%', borderRadius: 4 }, title: { fontSize: 16, paddingBottom: 8, ...sharedStyles.textBold, ...sharedStyles.textAlignCenter }, button: { minWidth: 96, marginBottom: 0 }, buttonContainer: { flexDirection: 'row', justifyContent: 'space-between' }, tablet: { height: undefined } }); export interface IJoinCodeProps { rid: string; t: string; onJoin: Function; isMasterDetail: boolean; theme: TSupportedThemes; } export interface IJoinCode { show: () => void; } const JoinCode = React.memo( forwardRef(({ rid, t, onJoin, isMasterDetail, theme }, ref) => { const [visible, setVisible] = useState(false); const [error, setError] = useState(false); const [code, setCode] = useState(''); const show = () => setVisible(true); const hide = () => setVisible(false); const handleJoinRoom = async () => { try { await Services.joinRoom(rid, code, t as any); onJoin(); hide(); } catch (e) { setError(true); } }; useImperativeHandle(ref, () => ({ show })); return ( {I18n.t('Insert_Join_Code')} InteractionManager.runAfterInteractions(() => e?.getNativeRef()?.focus())} returnKeyType='send' autoCapitalize='none' onChangeText={setCode} onSubmitEditing={handleJoinRoom} placeholder={I18n.t('Join_Code')} secureTextEntry error={error ? { error: 'error-code-invalid', reason: I18n.t('Code_or_password_invalid') } : undefined} testID='join-code-input' />