/* eslint-disable react/prop-types */ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import './EmojiVerification.scss'; import { twemojify } from '../../../util/twemojify'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import navigation from '../../../client/state/navigation'; import Text from '../../atoms/text/Text'; import IconButton from '../../atoms/button/IconButton'; import Button from '../../atoms/button/Button'; import Spinner from '../../atoms/spinner/Spinner'; import Dialog from '../../molecules/dialog/Dialog'; import CrossIC from '../../../../public/res/ic/outlined/cross.svg'; import { useStore } from '../../hooks/useStore'; function EmojiVerificationContent({ request, requestClose }) { const [sas, setSas] = useState(null); const [process, setProcess] = useState(false); const mountStore = useStore(); mountStore.setItem(true); const handleChange = () => { if (request.done || request.cancelled) requestClose(); }; useEffect(() => { mountStore.setItem(true); if (request === null) return null; const req = request; req.on('change', handleChange); return () => req.off('change', handleChange); }, [request]); const acceptRequest = async () => { setProcess(true); await request.accept(); const verifier = request.beginKeyVerification('m.sas.v1'); verifier.on('show_sas', (data) => { if (!mountStore.getItem()) return; setSas(data); setProcess(false); }); await verifier.verify(); }; const sasMismatch = () => { sas.mismatch(); setProcess(true); }; const sasConfirm = () => { sas.confirm(); setProcess(true); }; const renderWait = () => ( <> Waiting for response from other device... ); if (sas !== null) { return (
Confirm the emoji below are displayed on both devices, in the same order:
{sas.sas.emoji.map((emoji) => (
{twemojify(emoji[0])} {emoji[1]}
))}
{process ? renderWait() : ( <> )}
); } return (
Click accept to start the verification process
{ process ? renderWait() : }
); } EmojiVerificationContent.propTypes = { request: PropTypes.shape({}).isRequired, requestClose: PropTypes.func.isRequired, }; function useVisibilityToggle() { const [request, setRequest] = useState(null); const mx = initMatrix.matrixClient; useEffect(() => { const handleOpen = (req) => setRequest(req); navigation.on(cons.events.navigation.EMOJI_VERIFICATION_OPENED, handleOpen); mx.on('crypto.verification.request', handleOpen); return () => { navigation.removeListener(cons.events.navigation.EMOJI_VERIFICATION_OPENED, handleOpen); mx.removeListener('crypto.verification.request', handleOpen); }; }, []); const requestClose = () => setRequest(null); return [request, requestClose]; } function EmojiVerification() { const [request, requestClose] = useVisibilityToggle(); return ( Emoji verification )} contentOptions={} onRequestClose={requestClose} > { request !== null ? :
}
); } export default EmojiVerification;