new release #190
@ -514,6 +514,9 @@ export const CreatePage = () => {
|
|||||||
return (
|
return (
|
||||||
file.pages?.flatMap((page, index) => {
|
file.pages?.flatMap((page, index) => {
|
||||||
return page.drawnFields.map((drawnField) => {
|
return page.drawnFields.map((drawnField) => {
|
||||||
|
if (!drawnField.counterpart) {
|
||||||
|
throw new Error('Missing counterpart')
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
type: drawnField.type,
|
type: drawnField.type,
|
||||||
location: {
|
location: {
|
||||||
@ -670,6 +673,7 @@ export const CreatePage = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const generateCreateSignature = async (
|
const generateCreateSignature = async (
|
||||||
|
markConfig: Mark[],
|
||||||
fileHashes: {
|
fileHashes: {
|
||||||
[key: string]: string
|
[key: string]: string
|
||||||
},
|
},
|
||||||
@ -677,7 +681,6 @@ export const CreatePage = () => {
|
|||||||
) => {
|
) => {
|
||||||
const signers = users.filter((user) => user.role === UserRole.signer)
|
const signers = users.filter((user) => user.role === UserRole.signer)
|
||||||
const viewers = users.filter((user) => user.role === UserRole.viewer)
|
const viewers = users.filter((user) => user.role === UserRole.viewer)
|
||||||
const markConfig = createMarks(fileHashes)
|
|
||||||
|
|
||||||
const content: CreateSignatureEventContent = {
|
const content: CreateSignatureEventContent = {
|
||||||
signers: signers.map((signer) => hexToNpub(signer.pubkey)),
|
signers: signers.map((signer) => hexToNpub(signer.pubkey)),
|
||||||
@ -721,131 +724,152 @@ export const CreatePage = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const handleCreate = async () => {
|
const handleCreate = async () => {
|
||||||
if (!validateInputs()) return
|
try {
|
||||||
|
if (!validateInputs()) return
|
||||||
|
|
||||||
setIsLoading(true)
|
setIsLoading(true)
|
||||||
setLoadingSpinnerDesc('Generating file hashes')
|
setLoadingSpinnerDesc('Generating file hashes')
|
||||||
const fileHashes = await generateFileHashes()
|
const fileHashes = await generateFileHashes()
|
||||||
if (!fileHashes) {
|
if (!fileHashes) {
|
||||||
|
setIsLoading(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
setLoadingSpinnerDesc('Generating encryption key')
|
||||||
|
const encryptionKey = await generateEncryptionKey()
|
||||||
|
|
||||||
|
if (await isOnline()) {
|
||||||
|
setLoadingSpinnerDesc('generating files.zip')
|
||||||
|
const arrayBuffer = await generateFilesZip()
|
||||||
|
if (!arrayBuffer) {
|
||||||
|
setIsLoading(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
setLoadingSpinnerDesc('Encrypting files.zip')
|
||||||
|
const encryptedArrayBuffer = await encryptZipFile(
|
||||||
|
arrayBuffer,
|
||||||
|
encryptionKey
|
||||||
|
)
|
||||||
|
|
||||||
|
const markConfig = createMarks(fileHashes)
|
||||||
|
|
||||||
|
setLoadingSpinnerDesc('Uploading files.zip to file storage')
|
||||||
|
const fileUrl = await uploadFile(encryptedArrayBuffer)
|
||||||
|
if (!fileUrl) {
|
||||||
|
setIsLoading(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
setLoadingSpinnerDesc('Generating create signature')
|
||||||
|
const createSignature = await generateCreateSignature(
|
||||||
|
markConfig,
|
||||||
|
fileHashes,
|
||||||
|
fileUrl
|
||||||
|
)
|
||||||
|
if (!createSignature) {
|
||||||
|
setIsLoading(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
setLoadingSpinnerDesc('Generating keys for decryption')
|
||||||
|
|
||||||
|
// generate key pairs for decryption
|
||||||
|
const pubkeys = users.map((user) => user.pubkey)
|
||||||
|
// also add creator in the list
|
||||||
|
if (pubkeys.includes(usersPubkey!)) {
|
||||||
|
pubkeys.push(usersPubkey!)
|
||||||
|
}
|
||||||
|
|
||||||
|
const keys = await generateKeys(pubkeys, encryptionKey)
|
||||||
|
|
||||||
|
if (!keys) {
|
||||||
|
setIsLoading(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const meta: Meta = {
|
||||||
|
createSignature,
|
||||||
|
keys,
|
||||||
|
modifiedAt: unixNow(),
|
||||||
|
docSignatures: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
setLoadingSpinnerDesc('Updating user app data')
|
||||||
|
const event = await updateUsersAppData(meta)
|
||||||
|
if (!event) {
|
||||||
|
setIsLoading(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
setLoadingSpinnerDesc('Sending notifications to counterparties')
|
||||||
|
const promises = sendNotifications(meta)
|
||||||
|
|
||||||
|
await Promise.all(promises)
|
||||||
|
.then(() => {
|
||||||
|
toast.success('Notifications sent successfully')
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
toast.error('Failed to publish notifications')
|
||||||
|
})
|
||||||
|
|
||||||
|
navigate(appPrivateRoutes.sign, { state: { meta: meta } })
|
||||||
|
} else {
|
||||||
|
const zip = new JSZip()
|
||||||
|
|
||||||
|
selectedFiles.forEach((file) => {
|
||||||
|
zip.file(`files/${file.name}`, file)
|
||||||
|
})
|
||||||
|
|
||||||
|
const markConfig = createMarks(fileHashes)
|
||||||
|
|
||||||
|
setLoadingSpinnerDesc('Generating create signature')
|
||||||
|
const createSignature = await generateCreateSignature(
|
||||||
|
markConfig,
|
||||||
|
fileHashes,
|
||||||
|
''
|
||||||
|
)
|
||||||
|
if (!createSignature) {
|
||||||
|
setIsLoading(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const meta: Meta = {
|
||||||
|
createSignature,
|
||||||
|
modifiedAt: unixNow(),
|
||||||
|
docSignatures: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// add meta to zip
|
||||||
|
try {
|
||||||
|
const stringifiedMeta = JSON.stringify(meta, null, 2)
|
||||||
|
zip.file('meta.json', stringifiedMeta)
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err)
|
||||||
|
toast.error('An error occurred in converting meta json to string')
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
const arrayBuffer = await generateZipFile(zip)
|
||||||
|
if (!arrayBuffer) {
|
||||||
|
setIsLoading(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
setLoadingSpinnerDesc('Encrypting zip file')
|
||||||
|
const encryptedArrayBuffer = await encryptZipFile(
|
||||||
|
arrayBuffer,
|
||||||
|
encryptionKey
|
||||||
|
)
|
||||||
|
|
||||||
|
await handleOfflineFlow(encryptedArrayBuffer, encryptionKey)
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
if (error instanceof Error) {
|
||||||
|
toast.error(error.message)
|
||||||
|
}
|
||||||
|
console.error(error)
|
||||||
|
} finally {
|
||||||
setIsLoading(false)
|
setIsLoading(false)
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
setLoadingSpinnerDesc('Generating encryption key')
|
|
||||||
const encryptionKey = await generateEncryptionKey()
|
|
||||||
|
|
||||||
if (await isOnline()) {
|
|
||||||
setLoadingSpinnerDesc('generating files.zip')
|
|
||||||
const arrayBuffer = await generateFilesZip()
|
|
||||||
if (!arrayBuffer) {
|
|
||||||
setIsLoading(false)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
setLoadingSpinnerDesc('Encrypting files.zip')
|
|
||||||
const encryptedArrayBuffer = await encryptZipFile(
|
|
||||||
arrayBuffer,
|
|
||||||
encryptionKey
|
|
||||||
)
|
|
||||||
|
|
||||||
setLoadingSpinnerDesc('Uploading files.zip to file storage')
|
|
||||||
const fileUrl = await uploadFile(encryptedArrayBuffer)
|
|
||||||
if (!fileUrl) {
|
|
||||||
setIsLoading(false)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
setLoadingSpinnerDesc('Generating create signature')
|
|
||||||
const createSignature = await generateCreateSignature(fileHashes, fileUrl)
|
|
||||||
if (!createSignature) {
|
|
||||||
setIsLoading(false)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
setLoadingSpinnerDesc('Generating keys for decryption')
|
|
||||||
|
|
||||||
// generate key pairs for decryption
|
|
||||||
const pubkeys = users.map((user) => user.pubkey)
|
|
||||||
// also add creator in the list
|
|
||||||
if (pubkeys.includes(usersPubkey!)) {
|
|
||||||
pubkeys.push(usersPubkey!)
|
|
||||||
}
|
|
||||||
|
|
||||||
const keys = await generateKeys(pubkeys, encryptionKey)
|
|
||||||
|
|
||||||
if (!keys) {
|
|
||||||
setIsLoading(false)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const meta: Meta = {
|
|
||||||
createSignature,
|
|
||||||
keys,
|
|
||||||
modifiedAt: unixNow(),
|
|
||||||
docSignatures: {}
|
|
||||||
}
|
|
||||||
|
|
||||||
setLoadingSpinnerDesc('Updating user app data')
|
|
||||||
const event = await updateUsersAppData(meta)
|
|
||||||
if (!event) {
|
|
||||||
setIsLoading(false)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
setLoadingSpinnerDesc('Sending notifications to counterparties')
|
|
||||||
const promises = sendNotifications(meta)
|
|
||||||
|
|
||||||
await Promise.all(promises)
|
|
||||||
.then(() => {
|
|
||||||
toast.success('Notifications sent successfully')
|
|
||||||
})
|
|
||||||
.catch(() => {
|
|
||||||
toast.error('Failed to publish notifications')
|
|
||||||
})
|
|
||||||
|
|
||||||
navigate(appPrivateRoutes.sign, { state: { meta: meta } })
|
|
||||||
} else {
|
|
||||||
const zip = new JSZip()
|
|
||||||
|
|
||||||
selectedFiles.forEach((file) => {
|
|
||||||
zip.file(`files/${file.name}`, file)
|
|
||||||
})
|
|
||||||
|
|
||||||
setLoadingSpinnerDesc('Generating create signature')
|
|
||||||
const createSignature = await generateCreateSignature(fileHashes, '')
|
|
||||||
if (!createSignature) {
|
|
||||||
setIsLoading(false)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const meta: Meta = {
|
|
||||||
createSignature,
|
|
||||||
modifiedAt: unixNow(),
|
|
||||||
docSignatures: {}
|
|
||||||
}
|
|
||||||
|
|
||||||
// add meta to zip
|
|
||||||
try {
|
|
||||||
const stringifiedMeta = JSON.stringify(meta, null, 2)
|
|
||||||
zip.file('meta.json', stringifiedMeta)
|
|
||||||
} catch (err) {
|
|
||||||
console.error(err)
|
|
||||||
toast.error('An error occurred in converting meta json to string')
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
const arrayBuffer = await generateZipFile(zip)
|
|
||||||
if (!arrayBuffer) {
|
|
||||||
setIsLoading(false)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
setLoadingSpinnerDesc('Encrypting zip file')
|
|
||||||
const encryptedArrayBuffer = await encryptZipFile(
|
|
||||||
arrayBuffer,
|
|
||||||
encryptionKey
|
|
||||||
)
|
|
||||||
|
|
||||||
await handleOfflineFlow(encryptedArrayBuffer, encryptionKey)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user