import { useStore } from '../../hooks/useStore';
import { accessSecretStorage } from '../settings/SecretStorageAccess';
-function EmojiVerificationContent({ request, requestClose }) {
+function EmojiVerificationContent({ data, requestClose }) {
const [sas, setSas] = useState(null);
const [process, setProcess] = useState(false);
+ const { request, targetDevice } = data;
const mx = initMatrix.matrixClient;
const mountStore = useStore();
- useEffect(() => {
- mountStore.setItem(true);
- const handleChange = () => {
- if (request.done || request.cancelled) requestClose();
- };
-
- if (request === null) return null;
- const req = request;
- req.on('change', handleChange);
- return () => {
- req.off('change', handleChange);
- if (!req.cancelled && !req.done) {
- req.cancel();
- }
- };
- }, [request]);
-
- const acceptRequest = async () => {
+ const beginVerification = async () => {
if (isCrossVerified(mx.deviceId) && !hasPrivateKey(getDefaultSSKey())) {
const keyData = await accessSecretStorage('Session verification');
if (!keyData) {
setProcess(true);
await request.accept();
- let targetDevice;
- try {
- targetDevice = request.targetDevice;
- } catch {
- targetDevice = {
- userId: mx.getUserId(),
- deviceId: request.channel.devices[0],
- };
- }
-
const verifier = request.beginKeyVerification('m.sas.v1', targetDevice);
- const handleVerifier = (data) => {
+ const handleVerifier = (sasData) => {
verifier.off('show_sas', handleVerifier);
if (!mountStore.getItem()) return;
- setSas(data);
+ setSas(sasData);
setProcess(false);
};
verifier.on('show_sas', handleVerifier);
setProcess(true);
};
+ useEffect(() => {
+ mountStore.setItem(true);
+ const handleChange = () => {
+ if (targetDevice && request.started) {
+ beginVerification();
+ }
+ if (request.done || request.cancelled) requestClose();
+ };
+
+ if (request === null) return null;
+ const req = request;
+ req.on('change', handleChange);
+ return () => {
+ req.off('change', handleChange);
+ if (!req.cancelled && !req.done) {
+ req.cancel();
+ }
+ };
+ }, [request]);
+
const renderWait = () => (
<>
<Spinner size="small" />
);
}
+ if (targetDevice) {
+ return (
+ <div className="emoji-verification__content">
+ <Text>Please accept the request from other device.</Text>
+ <div className="emoji-verification__buttons">
+ {renderWait()}
+ </div>
+ </div>
+ );
+ }
+
return (
<div className="emoji-verification__content">
<Text>Click accept to start the verification process</Text>
{
process
? renderWait()
- : <Button variant="primary" onClick={acceptRequest}>Accept</Button>
+ : <Button variant="primary" onClick={beginVerification}>Accept</Button>
}
</div>
</div>
);
}
EmojiVerificationContent.propTypes = {
- request: PropTypes.shape({}).isRequired,
+ data: PropTypes.shape({}).isRequired,
requestClose: PropTypes.func.isRequired,
};
function useVisibilityToggle() {
- const [request, setRequest] = useState(null);
+ const [data, setData] = useState(null);
const mx = initMatrix.matrixClient;
useEffect(() => {
- const handleOpen = (req) => setRequest(req);
+ const handleOpen = (request, targetDevice) => {
+ setData({ request, targetDevice });
+ };
navigation.on(cons.events.navigation.EMOJI_VERIFICATION_OPENED, handleOpen);
mx.on('crypto.verification.request', handleOpen);
return () => {
};
}, []);
- const requestClose = () => setRequest(null);
+ const requestClose = () => setData(null);
- return [request, requestClose];
+ return [data, requestClose];
}
function EmojiVerification() {
- const [request, requestClose] = useVisibilityToggle();
+ const [data, requestClose] = useVisibilityToggle();
return (
<Dialog
- isOpen={request !== null}
+ isOpen={data !== null}
className="emoji-verification"
title={(
<Text variant="s1" weight="medium" primary>
onRequestClose={requestClose}
>
{
- request !== null
- ? <EmojiVerificationContent request={request} requestClose={requestClose} />
+ data !== null
+ ? <EmojiVerificationContent data={data} requestClose={requestClose} />
: <div />
}
</Dialog>