diff --git a/src/pages/sign/index.tsx b/src/pages/sign/index.tsx index c9404f7..aa26270 100644 --- a/src/pages/sign/index.tsx +++ b/src/pages/sign/index.tsx @@ -34,6 +34,7 @@ import { CreateSignatureEventContent, Meta, ProfileMetadata, + SignedEventContent, User, UserRole } from '../../types' @@ -52,7 +53,12 @@ import { uploadToFileStorage } from '../../utils' import styles from './style.module.scss' -import { Download } from '@mui/icons-material' +import { + Cancel, + CheckCircle, + Download, + HourglassTop +} from '@mui/icons-material' enum SignedStatus { Fully_Signed, @@ -350,9 +356,13 @@ export const SignPage = () => { setLoadingSpinnerDesc('Generating hashes for files') setLoadingSpinnerDesc('Signing nostr event') + + const prevSig = getPrevSignersSig(hexToNpub(usersPubkey!)) + if (!prevSig) return + const signedEvent = await signEventForMetaFile( JSON.stringify({ - fileHashes: currentFileHashes + prevSig }), nostrController, setIsLoading @@ -461,7 +471,7 @@ export const SignPage = () => { key, npubToHex(nextSigner)!, nostrController, - false, + true, setAuthUrl ) } @@ -488,9 +498,13 @@ export const SignPage = () => { setIsLoading(true) setLoadingSpinnerDesc('Signing nostr event') + + const prevSig = await getLastSignersSig() + if (!prevSig) return + const signedEvent = await signEventForMetaFile( JSON.stringify({ - fileHashes: currentFileHashes + prevSig }), nostrController, setIsLoading @@ -535,6 +549,70 @@ export const SignPage = () => { navigate(appPrivateRoutes.verify) } + /** + * This function accepts an npub of a signer and return the signature of its previous signer. + * This prevSig will be used in the content of the provided signer's signedEvent + */ + const getPrevSignersSig = (npub: string) => { + if (!meta) return null + + // if user is first signer then use creator's signature + if (signers[0] === npub) { + try { + const createSignatureEvent: Event = JSON.parse(meta.createSignature) + return createSignatureEvent.sig + } catch (error) { + return null + } + } + + // find the index of signer + const currentSignerIndex = signers.findIndex((signer) => signer === npub) + // return null if could not found user in signer's list + if (currentSignerIndex === -1) return null + // find prev signer + const prevSigner = signers[currentSignerIndex - 1] + + // get the signature of prev signer + try { + const prevSignersEvent: Event = JSON.parse(meta.docSignatures[prevSigner]) + return prevSignersEvent.sig + } catch (error) { + return null + } + } + + /** + * This function returns the signature of last signer + * It will be used in the content of export signature's signedEvent + */ + const getLastSignersSig = () => { + if (!meta) return null + + // if there're no signers then use creator's signature + if (signers.length === 0) { + try { + const createSignatureEvent: Event = JSON.parse(meta.createSignature) + return createSignatureEvent.sig + } catch (error) { + return null + } + } + + // get last signer + const lastSigner = signers[signers.length - 1] + + // get the signature of last signer + try { + const lastSignatureEvent: Event = JSON.parse( + meta.docSignatures[lastSigner] + ) + return lastSignatureEvent.sig + } catch (error) { + return null + } + } + if (authUrl) { return (