feat(draft): serialize sigit and save/load to local storage
This commit is contained in:
parent
0834e52316
commit
13b88516ca
19
src/types/draft.ts
Normal file
19
src/types/draft.ts
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import { SigitFile } from '../utils/file'
|
||||||
|
import { User } from './core'
|
||||||
|
import { DrawnField } from './drawing'
|
||||||
|
|
||||||
|
export interface SigitFileDraft {
|
||||||
|
name: string
|
||||||
|
file: string
|
||||||
|
pages: DrawnField[][]
|
||||||
|
}
|
||||||
|
export interface SigitDraft {
|
||||||
|
title: string
|
||||||
|
users: User[]
|
||||||
|
files: SigitFile[]
|
||||||
|
}
|
||||||
|
export interface SerializedSigitDraft {
|
||||||
|
title: string
|
||||||
|
users: User[]
|
||||||
|
files: SigitFileDraft[]
|
||||||
|
}
|
@ -4,3 +4,5 @@ export * from './nostr'
|
|||||||
export * from './relay'
|
export * from './relay'
|
||||||
export * from './zip'
|
export * from './zip'
|
||||||
export * from './event'
|
export * from './event'
|
||||||
|
export * from './drawing'
|
||||||
|
export * from './draft'
|
||||||
|
112
src/utils/draft.ts
Normal file
112
src/utils/draft.ts
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
import {
|
||||||
|
DrawnField,
|
||||||
|
SerializedSigitDraft,
|
||||||
|
SigitDraft,
|
||||||
|
SigitFileDraft
|
||||||
|
} from '../types'
|
||||||
|
import {
|
||||||
|
getMediaType,
|
||||||
|
extractFileExtension,
|
||||||
|
toFile,
|
||||||
|
getSigitFile
|
||||||
|
} from './file'
|
||||||
|
|
||||||
|
let saveSigitDraftTimeout: number | null = null
|
||||||
|
const serializeSigitDraft = async (
|
||||||
|
draft: SigitDraft
|
||||||
|
): Promise<SerializedSigitDraft> => {
|
||||||
|
const serializedFiles = draft.files.map((file) => {
|
||||||
|
return new Promise<SigitFileDraft>((resolve, reject) => {
|
||||||
|
const reader = new FileReader()
|
||||||
|
reader.onload = () => {
|
||||||
|
const pages = file.pages
|
||||||
|
? file.pages.map((page) =>
|
||||||
|
page.drawnFields.map(
|
||||||
|
(field) =>
|
||||||
|
({
|
||||||
|
left: field.left,
|
||||||
|
top: field.top,
|
||||||
|
width: field.width,
|
||||||
|
height: field.height,
|
||||||
|
type: field.type,
|
||||||
|
counterpart: field.counterpart
|
||||||
|
}) as DrawnField
|
||||||
|
)
|
||||||
|
)
|
||||||
|
: []
|
||||||
|
resolve({
|
||||||
|
name: file.name,
|
||||||
|
pages: pages,
|
||||||
|
file: reader.result as string
|
||||||
|
})
|
||||||
|
}
|
||||||
|
reader.onerror = (error) => reject(error)
|
||||||
|
reader.readAsDataURL(file)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
const serializedFileDraft = await Promise.all(serializedFiles)
|
||||||
|
return {
|
||||||
|
title: draft.title,
|
||||||
|
users: [...draft.users],
|
||||||
|
files: serializedFileDraft
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const deserializeSigitDraft = async (
|
||||||
|
serializedDraft: SerializedSigitDraft
|
||||||
|
): Promise<SigitDraft> => {
|
||||||
|
const files = await Promise.all(
|
||||||
|
serializedDraft.files.map(async (draft) => {
|
||||||
|
const response = await fetch(draft.file)
|
||||||
|
const arrayBuffer = await response.arrayBuffer()
|
||||||
|
const type = getMediaType(extractFileExtension(draft.name))
|
||||||
|
const file = toFile(arrayBuffer, draft.name, type)
|
||||||
|
const sigitFile = await getSigitFile(file)
|
||||||
|
if (draft.pages) {
|
||||||
|
for (let i = 0; i < draft.pages.length; i++) {
|
||||||
|
const drawnFields = draft.pages[i]
|
||||||
|
if (sigitFile.pages) sigitFile.pages[i].drawnFields = [...drawnFields]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sigitFile
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
...serializedDraft,
|
||||||
|
files: files
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const saveSigitDraft = (draft: SigitDraft) => {
|
||||||
|
if (saveSigitDraftTimeout) {
|
||||||
|
clearTimeout(saveSigitDraftTimeout)
|
||||||
|
}
|
||||||
|
|
||||||
|
saveSigitDraftTimeout = window.setTimeout(() => {
|
||||||
|
serializeSigitDraft(draft)
|
||||||
|
.then((draftToSave) => {
|
||||||
|
localStorage.setItem('sigitDraft', JSON.stringify(draftToSave))
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.log(`Error while saving sigit draft. Error: `, error)
|
||||||
|
})
|
||||||
|
}, 1000)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getSigitDraft = async () => {
|
||||||
|
const sigitDraft = localStorage.getItem('sigitDraft')
|
||||||
|
if (!sigitDraft) return null
|
||||||
|
|
||||||
|
try {
|
||||||
|
const serializedDraft = JSON.parse(sigitDraft) as SerializedSigitDraft
|
||||||
|
return await deserializeSigitDraft(serializedDraft)
|
||||||
|
} catch {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const clearSigitDraft = () => {
|
||||||
|
localStorage.removeItem('sigitDraft')
|
||||||
|
}
|
@ -12,3 +12,4 @@ export * from './string'
|
|||||||
export * from './url'
|
export * from './url'
|
||||||
export * from './utils'
|
export * from './utils'
|
||||||
export * from './zip'
|
export * from './zip'
|
||||||
|
export * from './draft'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user