/*
* Wire
* Copyright (C) 2023 Wire Swiss GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*
*/
import {useState, useEffect} from 'react';
import {PrimaryModal, removeCurrentModal} from 'Components/Modals/PrimaryModal';
import {ModalOptions} from 'Components/Modals/PrimaryModal/PrimaryModalTypes';
import {t} from 'Util/LocalizerUtil';
import {downloadFile} from 'Util/util';
const COPY_MESSAGE_TIMEOUT = 3000;
const DOWNLOAD_CERTIFICATE_TIMEOUT = 500;
const CERTIFICATE_NAME = 'certificate.pem';
const CERTIFICATE_TYPE = 'application/x-pem-file';
const ModalMessageWrapper = ({message}: {message: string}) => (
);
export const useCertificateDetailsModal = (certificate: string) => {
const [isTextCopied, setIsTextCopied] = useState(false);
const [isDownloading, setIsDownloading] = useState(false);
const [isModalActive, setIsModalActive] = useState(false);
useEffect(() => {
if (isModalActive) {
removeCurrentModal();
showModal();
// removeCurrentModal will trigger the close callback of the previous modal, so we need to reset the state
setIsModalActive(true);
}
}, [isTextCopied, isDownloading, isModalActive]);
const onDownload = () => {
setIsDownloading(true);
const certificateUrl = `data:${CERTIFICATE_TYPE},${encodeURIComponent(certificate)}`;
downloadFile(certificateUrl, CERTIFICATE_NAME, CERTIFICATE_TYPE);
setTimeout(() => {
setIsDownloading(false);
}, DOWNLOAD_CERTIFICATE_TIMEOUT);
};
const onCopy = async () => {
try {
await navigator.clipboard.writeText(certificate).then(() => {
setIsTextCopied(true);
setTimeout(() => {
setIsTextCopied(false);
}, COPY_MESSAGE_TIMEOUT);
});
} catch (err) {
console.error('Failed to copy: ', err);
}
};
const modalOptions: ModalOptions = {
text: {
title: t('E2EI.certificateDetails'),
message: ,
},
secondaryAction: [
{
action: onCopy,
text: <>{t(isTextCopied ? 'E2EI.certificateCopied' : 'E2EI.copyCertificate')}>,
uieName: 'copy-certificate',
disabled: isTextCopied,
},
{
action: onDownload,
text: t('E2EI.downloadCertificate'),
uieName: 'download-certificate',
disabled: isDownloading,
},
],
closeOnSecondaryAction: false,
close: () => {
setIsModalActive(false);
},
};
const modalType = PrimaryModal.type.MULTI_ACTIONS;
const showModal = () => {
PrimaryModal.show(modalType, modalOptions);
};
return () => {
setIsModalActive(true);
};
};