@arbidocs/react 0.5.65 → 0.5.66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/annotations/freeze/index.cjs +14 -14
- package/dist/annotations/freeze/index.js +3 -3
- package/dist/artifacts/index.cjs +49 -49
- package/dist/artifacts/index.js +10 -10
- package/dist/bundle-IC65W2AO.cjs +14 -0
- package/dist/{bundle-DCWPYNGD.cjs.map → bundle-IC65W2AO.cjs.map} +1 -1
- package/dist/bundle-YNOX7VIL.js +5 -0
- package/dist/{bundle-JCKKGEJE.js.map → bundle-YNOX7VIL.js.map} +1 -1
- package/dist/calls/livekit/index.cjs +47 -47
- package/dist/calls/livekit/index.js +8 -8
- package/dist/{chunk-MS3T4C4Q.cjs → chunk-24Q3WUQK.cjs} +7 -7
- package/dist/{chunk-MS3T4C4Q.cjs.map → chunk-24Q3WUQK.cjs.map} +1 -1
- package/dist/{chunk-FZ4P7W67.cjs → chunk-3BFSALPC.cjs} +5 -5
- package/dist/{chunk-FZ4P7W67.cjs.map → chunk-3BFSALPC.cjs.map} +1 -1
- package/dist/{chunk-Y2WKLPN3.js → chunk-3NBPMR3X.js} +5 -5
- package/dist/{chunk-Y2WKLPN3.js.map → chunk-3NBPMR3X.js.map} +1 -1
- package/dist/{chunk-QL6CHRQ5.js → chunk-4DTTEUVY.js} +4 -4
- package/dist/{chunk-QL6CHRQ5.js.map → chunk-4DTTEUVY.js.map} +1 -1
- package/dist/{chunk-XFF66SHT.cjs → chunk-GOJHU7RZ.cjs} +26 -26
- package/dist/{chunk-XFF66SHT.cjs.map → chunk-GOJHU7RZ.cjs.map} +1 -1
- package/dist/{chunk-ZDAILE45.cjs → chunk-LMW46NBD.cjs} +6 -6
- package/dist/{chunk-ZDAILE45.cjs.map → chunk-LMW46NBD.cjs.map} +1 -1
- package/dist/{chunk-A2XSLTIP.js → chunk-NIKPG4PW.js} +3 -3
- package/dist/{chunk-A2XSLTIP.js.map → chunk-NIKPG4PW.js.map} +1 -1
- package/dist/{chunk-MZ7EYCGH.js → chunk-NNWMHMEC.js} +3 -3
- package/dist/{chunk-MZ7EYCGH.js.map → chunk-NNWMHMEC.js.map} +1 -1
- package/dist/{chunk-B6I2HRRF.cjs → chunk-PC4O3JDV.cjs} +3 -3
- package/dist/{chunk-B6I2HRRF.cjs.map → chunk-PC4O3JDV.cjs.map} +1 -1
- package/dist/{chunk-HZUMY365.js → chunk-QGOYIYLI.js} +4 -4
- package/dist/{chunk-HZUMY365.js.map → chunk-QGOYIYLI.js.map} +1 -1
- package/dist/{chunk-MN4BTKHE.cjs → chunk-RS6UUPD2.cjs} +6 -6
- package/dist/{chunk-MN4BTKHE.cjs.map → chunk-RS6UUPD2.cjs.map} +1 -1
- package/dist/{chunk-CHLDCP3J.js → chunk-SI7DJWBT.js} +3 -3
- package/dist/{chunk-CHLDCP3J.js.map → chunk-SI7DJWBT.js.map} +1 -1
- package/dist/{chunk-2PMH4DTL.cjs → chunk-TGSEQGM3.cjs} +4 -4
- package/dist/{chunk-2PMH4DTL.cjs.map → chunk-TGSEQGM3.cjs.map} +1 -1
- package/dist/{chunk-PLF2OEZZ.js → chunk-YIIML7Y5.js} +5 -5
- package/dist/{chunk-PLF2OEZZ.js.map → chunk-YIIML7Y5.js.map} +1 -1
- package/dist/{chunk-6QGAXWHR.js → chunk-ZTPJNKF2.js} +5 -5
- package/dist/{chunk-6QGAXWHR.js.map → chunk-ZTPJNKF2.js.map} +1 -1
- package/dist/{chunk-WEJHHBA2.cjs → chunk-ZWFMFOGP.cjs} +3 -3
- package/dist/{chunk-WEJHHBA2.cjs.map → chunk-ZWFMFOGP.cjs.map} +1 -1
- package/dist/document-tools/core.cjs +103 -103
- package/dist/document-tools/core.js +7 -7
- package/dist/document-tools/index.cjs +106 -106
- package/dist/document-tools/index.js +9 -9
- package/dist/index.cjs +1308 -1308
- package/dist/index.js +24 -24
- package/dist/shell/index.cjs +36 -36
- package/dist/shell/index.js +5 -5
- package/dist/ui/index.cjs +195 -195
- package/dist/ui/index.js +4 -4
- package/package.json +3 -3
- package/dist/bundle-DCWPYNGD.cjs +0 -14
- package/dist/bundle-JCKKGEJE.js +0 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/document-tools/markup-store.ts","../src/document-tools/markup-transfer.ts","../src/document-tools/useDocumentMarkup.ts","../src/document-tools/frozen-copy.ts","../src/document-tools/can-annotate.ts","../src/document-tools/useIsOnline.ts","../src/document-tools/useDocumentBytes.ts","../src/document-tools/signing.ts","../src/document-tools/verification.ts","../src/document-tools/signature-requests.ts","../src/document-tools/saved-signature.ts","../src/document-tools/file-shares.ts"],"names":["detail","AnnotationStoreOfflineError","parseLayer","LAYER_SCHEMA_VERSION","mergeLayers","emptyLayer","useDocumentTools","useMemo","useState","useCallback","useEffect","SIGNED_LOCKED_REASON","fetchMarkupPdf","useSyncExternalStore","onlineManager","useQuery","documentBytesKey","fetchDocumentFile","fetchDocumentPdf","parseVersionRef","arbiQueryKeys","client","unlockIdentityWithPassword","signMessage","useQueryClient","useMutation","useArbiHost","workspaces","getUserEncryptionKeypair","initSodium","sealedBoxDecrypt","sealedBoxEncrypt"],"mappings":"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","file":"chunk-XFF66SHT.cjs","sourcesContent":["/**\n * The annotation store for a document version's MARKUP on the server: `GET`/`PUT\n * /v1/document/{id}/markup`. The server keeps the marks as native PDF annotations in an encrypted\n * `{doc}-markup.pdf` next to the version (same document id, the document's own privacy); this store\n * only moves the layer and its revision.\n *\n * Optimistic concurrency: every save names the revision it started from. When someone else saved\n * first the server answers 409; the store then re-reads the latest layer, merges it with ours by\n * annotation id (`mergeLayers`: union, last edit wins per mark, replies unioned, our deletions\n * stay deleted) and saves again. The merged layer is returned so the viewer shows their marks too.\n *\n * Deletions are tracked as tombstones for the session: an id this session has seen that is no\n * longer in the layer it saves was deleted here, and a concurrent edit elsewhere cannot bring it\n * back.\n */\n\nimport {\n AnnotationStoreOfflineError,\n LAYER_SCHEMA_VERSION,\n mergeLayers,\n parseLayer,\n type AnnotationLayer,\n type AnnotationStore,\n} from '../annotations'\nimport type { DocumentToolsClient } from './environment'\n\n/** How many times a save re-reads and merges after a 409 before giving up (each is a real race). */\nexport const MAX_MERGE_ATTEMPTS = 5\n/** Below this many bytes a save uses `keepalive`, so it completes even if the page unloads. */\nconst KEEPALIVE_LIMIT = 60_000\n\nexport interface MarkupSnapshot {\n revision: number\n count: number\n canEdit: boolean\n}\n\nexport interface MarkupStoreOptions {\n /** The version the markup belongs to; omitted = the document's current version. */\n version?: number\n /** The ARBI API client (see `DocumentToolsEnvironment.client`). */\n client: DocumentToolsClient\n /** After every successful save: the new revision and how many marks the markup holds. */\n onSaved?: (snapshot: MarkupSnapshot) => void\n}\n\nexport interface MarkupStore extends AnnotationStore {\n snapshot(): MarkupSnapshot\n}\n\ninterface ServerLayer {\n revision: number\n layer: AnnotationLayer\n canEdit: boolean\n}\n\nexport class MarkupStoreError extends Error {\n constructor(\n message: string,\n readonly status?: number\n ) {\n super(message)\n this.name = 'MarkupStoreError'\n }\n}\n\nconst detailOf = (error: unknown, fallback: string) => {\n const detail = (error as { detail?: unknown } | undefined)?.detail\n return typeof detail === 'string' ? detail : fallback\n}\n\n/** A request that never reached the server (no network, DNS, CORS) is \"offline\", not a failure. */\nasync function call<T>(request: () => Promise<T>): Promise<T> {\n try {\n return await request()\n } catch (e) {\n if (e instanceof TypeError || (typeof navigator !== 'undefined' && !navigator.onLine)) {\n throw new AnnotationStoreOfflineError()\n }\n throw e\n }\n}\n\nexport function createMarkupStore({ version, client, onSaved }: MarkupStoreOptions): MarkupStore {\n let revision = 0\n let count = 0\n let canEdit = false\n /** The layer as last read from or written to the server: the base of a merge. */\n let base: AnnotationLayer | null = null\n /** Every mark id this session has held: one missing from a save was deleted here. */\n const seen = new Set<string>()\n const remember = (layer: AnnotationLayer) => {\n for (const a of layer.annotations) seen.add(a.id)\n }\n const query = version ? { version } : {}\n\n async function read(documentId: string, ifNoneMatch?: number): Promise<ServerLayer | null> {\n const { data, error, response } = await call(() =>\n client.GET('/v1/document/{document_ext_id}/markup', {\n params: { path: { document_ext_id: documentId }, query },\n headers: ifNoneMatch === undefined ? undefined : { 'If-None-Match': `\"${ifNoneMatch}\"` },\n })\n )\n if (response.status === 304) return null\n if (error || !data) {\n throw new MarkupStoreError(\n detailOf(error, `The markup could not be loaded (${response.status})`),\n response.status\n )\n }\n const layer = parseLayer({\n schema: LAYER_SCHEMA_VERSION,\n documentId,\n annotations: data.annotations ?? [],\n updatedAt: data.updated_at ?? new Date().toISOString(),\n })\n return { revision: data.revision ?? 0, layer, canEdit: !!data.can_edit }\n }\n\n function adopt(server: ServerLayer) {\n revision = server.revision\n canEdit = server.canEdit\n base = server.layer\n count = server.layer.annotations.length\n remember(server.layer)\n }\n\n async function put(layer: AnnotationLayer, from: number) {\n return call(() =>\n client.PUT('/v1/document/{document_ext_id}/markup', {\n params: { path: { document_ext_id: layer.documentId }, query },\n headers: { 'If-Match': `\"${from}\"` },\n body: { annotations: layer.annotations as never, base_revision: from },\n // A save started as the page closes must outlive it; browsers cap such bodies at 64 KB.\n keepalive: JSON.stringify(layer.annotations).length < KEEPALIVE_LIMIT,\n })\n )\n }\n\n return {\n snapshot: () => ({ revision, count, canEdit }),\n canEdit: () => canEdit,\n\n async load(documentId) {\n const server = await read(documentId)\n if (!server) throw new MarkupStoreError('The markup could not be loaded')\n adopt(server)\n return server.layer\n },\n\n async save(layer) {\n remember(layer)\n let mine = layer\n for (let attempt = 0; attempt < MAX_MERGE_ATTEMPTS; attempt++) {\n const { data, error, response } = await put(mine, revision)\n if (response.ok && data) {\n revision = data.revision\n count = data.count\n base = mine\n remember(mine)\n onSaved?.({ revision, count, canEdit })\n return mine\n }\n if (response.status === 409) {\n // Someone saved first: their layer, merged with ours, is what we save next.\n const latest = await read(layer.documentId)\n if (!latest) throw new MarkupStoreError('The markup could not be re-read')\n const deleted = new Set(\n [...seen].filter((id) => !mine.annotations.some((a) => a.id === id))\n )\n const merged = mergeLayers({ base, mine, theirs: latest.layer, deleted })\n revision = latest.revision\n canEdit = latest.canEdit\n base = latest.layer\n remember(latest.layer)\n mine = merged\n continue\n }\n if (response.status === 403) canEdit = false\n throw new MarkupStoreError(\n detailOf(error, `The markup could not be saved (${response.status})`),\n response.status\n )\n }\n throw new MarkupStoreError('The markup keeps changing; it will be saved on the next edit')\n },\n\n async pull(documentId) {\n const server = await read(documentId, revision)\n if (!server || server.revision === revision) return null\n adopt(server)\n return server.layer\n },\n }\n}\n","/**\n * Moving marks INTO a version's markup without the viewer: the one-time migration of layers kept in\n * this browser before markup lived on the server, and \"copy open comments\" from an older version's\n * markup onto the current one (a new version — signed, synced from Drive, saved from Word — starts\n * with an empty markup; redactions never carry over).\n *\n * Both are unions by annotation id, so running them twice adds nothing twice.\n */\n\nimport {\n LAYER_SCHEMA_VERSION,\n emptyLayer,\n mergeLayers,\n parseLayer,\n type Annotation,\n type AnnotationLayer,\n} from '../annotations'\nimport type { DocumentToolsClient } from './environment'\nimport { createMarkupStore } from './markup-store'\n\nexport const LEGACY_LAYER_PREFIX = 'arbi:annotations:'\n\nexport interface VersionInfo {\n n: number\n created_at?: string | null\n markup_count?: number | null\n}\n\nfunction storage(): Storage | undefined {\n try {\n return typeof localStorage === 'undefined' ? undefined : localStorage\n } catch {\n return undefined\n }\n}\n\n/** The layer this browser kept for a document before markup moved to the server, if any. */\nexport function readLegacyLayer(documentId: string): AnnotationLayer | null {\n try {\n const raw = storage()?.getItem(LEGACY_LAYER_PREFIX + documentId)\n if (!raw) return null\n return parseLayer(JSON.parse(raw))\n } catch {\n return null // unreadable: nothing worth migrating\n }\n}\n\nexport function forgetLegacyLayer(documentId: string): void {\n try {\n storage()?.removeItem(LEGACY_LAYER_PREFIX + documentId)\n } catch {\n // storage blocked: nothing to forget\n }\n}\n\n/**\n * Which version each legacy mark belongs to: the version that was current when it was made. A\n * document's id is the id of its first version (older layers were made on it); a layer made after\n * the versions moved inside the document was made on whatever version was then current.\n */\nexport function marksByVersion(\n layer: AnnotationLayer,\n versions: VersionInfo[]\n): Map<number, Annotation[]> {\n const sorted = [...versions].sort((a, b) => a.n - b.n)\n const out = new Map<number, Annotation[]>()\n for (const mark of layer.annotations) {\n const at = Date.parse(mark.createdAt)\n let target = sorted[0]?.n ?? 1\n for (const v of sorted) {\n const created = v.created_at ? Date.parse(v.created_at) : Number.NaN\n if (!Number.isNaN(created) && !Number.isNaN(at) && created <= at) target = v.n\n }\n out.set(target, [...(out.get(target) ?? []), mark])\n }\n return out\n}\n\n/** Add marks to one version's markup (union by id); returns how many were new. */\nexport async function addToMarkup(\n documentId: string,\n version: number | undefined,\n marks: Annotation[],\n client: DocumentToolsClient\n): Promise<number> {\n const store = createMarkupStore({ version, client })\n const current = await store.load(documentId)\n const incoming: AnnotationLayer = {\n ...emptyLayer(documentId, new Date().toISOString()),\n annotations: marks,\n }\n // Theirs (the server) wins any tie: a mark already in the markup is never overwritten by an\n // older browser copy of it.\n const merged = mergeLayers({ base: null, mine: current, theirs: incoming })\n const added = merged.annotations.length - current.annotations.length\n if (added > 0) await store.save(parseLayer({ ...merged, schema: LAYER_SCHEMA_VERSION }))\n return added\n}\n\n/**\n * Migrate this browser's layer for a document into its markup, version by version, then forget\n * the browser copy. Throws (and keeps the browser copy) if any version could not be saved.\n */\nexport async function migrateLegacyLayer(\n documentId: string,\n layer: AnnotationLayer,\n versions: VersionInfo[],\n currentVersion: number,\n client: DocumentToolsClient\n): Promise<number> {\n let added = 0\n for (const [n, marks] of marksByVersion(layer, versions.length ? versions : [{ n: 1 }])) {\n added += await addToMarkup(documentId, n === currentVersion ? undefined : n, marks, client)\n }\n forgetLegacyLayer(documentId)\n return added\n}\n\n/** The unresolved comment threads (with replies) of a version's markup. */\nexport async function openThreadsOf(\n documentId: string,\n version: number,\n client: DocumentToolsClient\n): Promise<Annotation[]> {\n const layer = await createMarkupStore({ version, client }).load(documentId)\n return layer.annotations.filter((a) => a.kind === 'comment' && !a.resolved)\n}\n\n/** Copy the open comment threads of an older version onto the current version's markup. */\nexport async function copyOpenThreads(\n documentId: string,\n fromVersion: number,\n client: DocumentToolsClient\n): Promise<number> {\n const threads = await openThreadsOf(documentId, fromVersion, client)\n if (!threads.length) return 0\n return addToMarkup(documentId, undefined, threads, client)\n}\n\n/** Version entries of a document as the API returns them (`DocResponse.versions`). */\nexport function versionsWithMarkup(versions: VersionInfo[] | null | undefined): VersionInfo[] {\n return (versions ?? []).filter((v) => (v.markup_count ?? 0) > 0)\n}\n","/**\n * Markup state for the document page: whether the version on screen has markup (so the viewer\n * opens on it, the default view), the \"Show original\" toggle, \"Download with markup\", the one-time\n * migration of this browser's old annotation layer, and the note shown when the markup is on an\n * older version (with \"copy open comments\").\n *\n * Whether a version has markup comes from the document's version entries (`markup_count`), kept\n * current by the viewer's own saves (`onMarkupChange`) until the document is refetched.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useDocumentTools } from './environment'\nimport type { MarkupSnapshot } from './markup-store'\nimport { SIGNED_LOCKED_REASON, fetchMarkupPdf } from './markup-download'\nimport {\n copyOpenThreads,\n forgetLegacyLayer,\n migrateLegacyLayer,\n readLegacyLayer,\n versionsWithMarkup,\n type VersionInfo,\n} from './markup-transfer'\n\nexport const SIGNED_UNCHANGED =\n 'The signed PDF is unchanged: the comments are kept beside it as markup.'\n\nexport interface MarkupDocument {\n external_id: string\n shared?: boolean | null\n current_version?: number | null\n versions?: VersionInfo[] | null\n}\n\nexport interface LegacyPrompt {\n count: number\n busy: boolean\n add: () => void\n discard: () => void\n}\n\nexport interface OlderMarkupNote {\n version: number\n busy: boolean\n /** The current version is a signed copy: say that copying leaves its signed PDF as it is. */\n signed: boolean\n copy: () => void\n}\n\nexport function useDocumentMarkup(\n documentData: MarkupDocument | null | undefined,\n /** The version on screen when it is an older one (a read-only snapshot). */\n snapshotVersion: number | undefined,\n /**\n * Whether the version on screen is a signed, sealed copy: locked, so no \"Download with markup\"\n * (and, for the current version, copied comments leave its signed PDF as it is).\n */\n currentSigned = false\n) {\n const { client, notify, saveFile, onDocumentsChanged } = useDocumentTools()\n const documentId = documentData?.external_id\n const currentVersion = documentData?.current_version ?? 1\n const shownVersion = snapshotVersion ?? currentVersion\n const versions = useMemo(() => documentData?.versions ?? [], [documentData?.versions])\n\n // Counts from this session's saves win over the (possibly stale) document record.\n const [localCounts, setLocalCounts] = useState<Record<string, number>>({})\n const countOf = useCallback(\n (n: number) =>\n localCounts[`${documentId}@${n}`] ?? versions.find((v) => v.n === n)?.markup_count ?? 0,\n [localCounts, documentId, versions]\n )\n const hasMarkup = countOf(shownVersion) > 0\n\n const [showOriginal, setShowOriginal] = useState(false)\n useEffect(() => setShowOriginal(false), [documentId, snapshotVersion])\n\n const refresh = useCallback(() => {\n if (!documentId || !onDocumentsChanged) return\n Promise.resolve(onDocumentsChanged([documentId], 'markup')).catch((e: unknown) =>\n console.warn('Could not refresh the document after a markup change', e)\n )\n }, [documentId, onDocumentsChanged])\n\n const onMarkupChange = useCallback(\n (snapshot: MarkupSnapshot) => {\n if (!documentId) return\n const key = `${documentId}@${shownVersion}`\n // The list's \"Download with markup\" and the version entries follow the first/last mark.\n if (countOf(shownVersion) > 0 !== snapshot.count > 0) refresh()\n setLocalCounts((counts) => ({ ...counts, [key]: snapshot.count }))\n },\n [documentId, shownVersion, countOf, refresh]\n )\n\n const downloadMarkup = useCallback(async () => {\n if (!documentId) return\n // A signed version is locked: its markup is never written into its PDF.\n if (currentSigned) {\n notify(SIGNED_LOCKED_REASON, 'info')\n return\n }\n try {\n const { blob, fileName } = await fetchMarkupPdf(\n client,\n documentId,\n snapshotVersion ? snapshotVersion : undefined\n )\n saveFile(blob, fileName)\n } catch (e) {\n notify(e instanceof Error ? e.message : 'The markup could not be downloaded', 'error')\n }\n }, [client, documentId, snapshotVersion, saveFile, notify, currentSigned])\n\n // --- Migration of this browser's layer (arbi:annotations:<docId>) ---\n const [legacyCount, setLegacyCount] = useState(0)\n const [migrating, setMigrating] = useState(false)\n const shared = documentData?.shared\n const loaded = !!documentData\n\n const migrate = useCallback(async () => {\n if (!documentId) return\n const layer = readLegacyLayer(documentId)\n if (!layer) return\n setMigrating(true)\n try {\n const added = await migrateLegacyLayer(documentId, layer, versions, currentVersion, client)\n setLegacyCount(0)\n setLocalCounts({})\n refresh()\n if (added > 0) {\n notify(\n `${added} annotation${added === 1 ? '' : 's'} from this browser saved to the document`,\n 'success',\n {\n description: shared\n ? 'They are now part of the shared markup.'\n : 'They are saved with the document, visible only to you.',\n }\n )\n }\n } catch (e) {\n notify(\n e instanceof Error ? e.message : 'The annotations from this browser could not be saved',\n 'error',\n { description: 'They are still kept in this browser; open the document again to retry.' }\n )\n } finally {\n setMigrating(false)\n }\n }, [client, documentId, versions, currentVersion, refresh, shared, notify])\n\n useEffect(() => {\n if (!documentId || !loaded) return\n const layer = readLegacyLayer(documentId)\n if (!layer) {\n setLegacyCount(0)\n return\n }\n if (layer.annotations.length === 0) {\n forgetLegacyLayer(documentId)\n setLegacyCount(0)\n return\n }\n // A private document is the user's own: its old layer simply becomes its markup. A shared one\n // would show the marks to everyone, so the user decides.\n if (shared) setLegacyCount(layer.annotations.length)\n else void migrate()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [documentId, loaded, shared])\n\n const legacyPrompt: LegacyPrompt | null =\n legacyCount > 0 && !snapshotVersion\n ? {\n count: legacyCount,\n busy: migrating,\n add: () => void migrate(),\n discard: () => {\n if (documentId) forgetLegacyLayer(documentId)\n setLegacyCount(0)\n },\n }\n : null\n\n // --- Markup on an older version (a newer version starts with none) ---\n const [copying, setCopying] = useState(false)\n const olderWithMarkup = versionsWithMarkup(versions)\n .filter((v) => v.n !== currentVersion)\n .sort((a, b) => b.n - a.n)[0]\n const olderNote: OlderMarkupNote | null =\n !snapshotVersion && !hasMarkup && olderWithMarkup\n ? {\n version: olderWithMarkup.n,\n busy: copying,\n signed: currentSigned,\n copy: () => {\n if (!documentId) return\n setCopying(true)\n copyOpenThreads(documentId, olderWithMarkup.n, client)\n .then((n) => {\n if (n > 0) {\n setLocalCounts((c) => ({ ...c, [`${documentId}@${currentVersion}`]: n }))\n refresh()\n }\n notify(\n n > 0\n ? `${n} open comment thread${n === 1 ? '' : 's'} copied to version ${currentVersion}`\n : `Version ${olderWithMarkup.n} has no open comments`,\n n > 0 ? 'success' : 'info',\n // The markup is stored beside the version, so the sealed bytes do not change.\n n > 0 && currentSigned ? { description: SIGNED_UNCHANGED } : undefined\n )\n })\n .catch((e: unknown) =>\n notify(e instanceof Error ? e.message : 'The comments could not be copied', 'error')\n )\n .finally(() => setCopying(false))\n },\n }\n : null\n\n return {\n hasMarkup,\n showOriginal,\n setShowOriginal,\n onMarkupChange,\n downloadMarkup,\n legacyPrompt,\n olderNote,\n }\n}\n","/**\n * Saving a frozen copy: a SEPARATE document derived from the version it was frozen from\n * (`derived_from`, role `redaction` or `annotated`), never a new version of it. The original keeps\n * its place in every list and stays the current version; the copy sits beside it, in the same\n * folder and with the same workspace sharing.\n */\n\nimport type { DocumentToolsEnvironment, DocumentUploadQuery } from './environment'\n\nexport interface FrozenCopySource {\n /** The version on screen, which the copy is derived from. */\n documentId: string\n fileName: string | null | undefined\n shared: boolean\n folder?: string | null\n /**\n * The original's workspace, where the copy goes: named on the upload, so it never lands in\n * whichever workspace the session has open (the server refuses one whose key it lacks).\n */\n workspaceId?: string | null\n}\n\nconst baseName = (fileName: string | null | undefined) =>\n (fileName || 'document').replace(/\\.pdf$/i, '')\n\n/** \"Contract.pdf\" becomes \"Contract (redacted).pdf\"; a .txt or .docx keeps its extension inside. */\nexport function frozenCopyName(fileName: string | null | undefined, redacted: boolean): string {\n return `${baseName(fileName)} (${redacted ? 'redacted' : 'annotated'}).pdf`\n}\n\nexport function redactionLogName(fileName: string | null | undefined): string {\n return `${baseName(fileName)} (redaction log).csv`\n}\n\n/** Upload the frozen bytes as a new document derived from `source`; returns its id, if any. */\nexport async function uploadFrozenCopy(\n upload: NonNullable<DocumentToolsEnvironment['uploadDocument']>,\n bytes: Uint8Array,\n source: FrozenCopySource,\n redacted: boolean\n): Promise<string | undefined> {\n const file = new File([bytes as BlobPart], frozenCopyName(source.fileName, redacted), {\n type: 'application/pdf',\n })\n const query: DocumentUploadQuery = {\n derived_from: [source.documentId],\n derived_role: redacted ? 'redaction' : 'annotated',\n shared: source.shared,\n }\n if (source.folder) query.folder = source.folder\n if (source.workspaceId) query.workspace_ext_id = source.workspaceId\n const response = await upload({ file, query })\n return response?.doc_ext_ids?.[0]\n}\n","/**\n * Whether the document on screen can be annotated: only a PDF the viewer is actually showing.\n * Text and Word files are shown as a PDF too, so they qualify; images, audio, video, files that\n * cannot be previewed, drafts and streaming output do not, and neither does a read-only snapshot\n * or a comparison.\n */\n\nexport interface AnnotatableState {\n activeTab: string\n /** The PDF bytes have been fetched. */\n hasPdf: boolean\n isImage: boolean\n isVideo: boolean\n isAudio: boolean\n isDownloadOnly: boolean\n isDraft: boolean\n isStreaming: boolean\n isSnapshot: boolean\n isComparing: boolean\n}\n\nexport function canAnnotate(s: AnnotatableState): boolean {\n return (\n s.activeTab === 'pdf' &&\n s.hasPdf &&\n !s.isImage &&\n !s.isVideo &&\n !s.isAudio &&\n !s.isDownloadOnly &&\n !s.isDraft &&\n !s.isStreaming &&\n !s.isSnapshot &&\n !s.isComparing\n )\n}\n","/**\n * Reactive connectivity from React Query's `onlineManager` (the browser's online events, plus\n * whatever the host feeds it, e.g. a WebSocket). The markup autosave waits while it is false.\n */\n\nimport { useSyncExternalStore } from 'react'\nimport { onlineManager } from '@tanstack/react-query'\n\nexport function useIsOnline(): boolean {\n return useSyncExternalStore(\n (onChange) => onlineManager.subscribe(onChange),\n () => onlineManager.isOnline(),\n () => true\n )\n}\n","/**\n * The bytes a document viewer shows: the PDF of a document version (`/view`), or for media the\n * stored file itself (`/download`), through the host's API client. Keyed on the version, since a\n * document keeps its id across versions: a new version (a save, a signed copy) must never show the\n * previous one's file.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport { useDocumentTools } from './environment'\nimport { fetchDocumentFile, fetchDocumentPdf } from './document-pdf'\n\nimport type { DocumentBytesKind } from '../query-keys'\nexport type { DocumentBytesKind }\n\nexport { documentBytesKey } from '../query-keys'\nimport { documentBytesKey } from '../query-keys'\n\nexport interface UseDocumentBytesOptions {\n /** The document's current version, so a new one reads afresh. */\n version: number | null | undefined\n kind: DocumentBytesKind\n enabled?: boolean\n /**\n * Bytes to use when the network cannot give them (a copy kept on this device): asked first when\n * offline, and again when the request fails.\n */\n fallback?: () => Promise<Blob | undefined>\n}\n\n/** A document's (or version reference's) bytes; see {@link UseDocumentBytesOptions}. */\nexport function useDocumentBytes(documentRef: string, options: UseDocumentBytesOptions) {\n const { client } = useDocumentTools()\n const { version, kind, enabled = true, fallback } = options\n return useQuery({\n queryKey: documentBytesKey(documentRef, version ?? null, kind),\n queryFn: async ({ signal }) => {\n if (fallback && typeof navigator !== 'undefined' && navigator.onLine === false) {\n const offline = await fallback()\n if (offline) return offline\n }\n try {\n return await (kind === 'original' ? fetchDocumentFile : fetchDocumentPdf)(\n client,\n documentRef,\n { signal }\n )\n } catch (error) {\n const offline = await fallback?.()\n if (offline) return offline\n throw error\n }\n },\n enabled: enabled && !!documentRef,\n // 'always' so it still runs offline: the fallback serves a copy kept on this device.\n networkMode: 'always',\n staleTime: Infinity,\n })\n}\n","/**\n * Electronic signing. The backend (`src/core/esign.py` in ARBI) defines what a signature binds;\n * the helpers mirror the two pieces the browser must reproduce exactly: the statement of intent\n * shown to the signer, and the SHA-256 of the PDF the viewer displayed.\n */\n\nimport { signMessage, unlockIdentityWithPassword, type components } from '@arbidocs/client'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport { parseVersionRef } from '../artifacts/versions'\nimport { useDocumentTools, type DocumentToolsClient } from './environment'\nimport { arbiQueryKeys } from '../query-keys'\n\n/**\n * Who signs: the name only. A role, a firm or a place go on the page as ordinary annotation text,\n * which is not part of the signature.\n */\nexport type SignerDetails = components['schemas']['SignerDetails']\n\n/** Same sentence as `esign.intent_text`; the dialog refuses to sign if the server's differs. */\nexport function intentText(signer: SignerDetails): string {\n return `I, ${signer.name.trim()}, sign this document electronically. I intend this electronic signature to have the same effect as my handwritten signature.`\n}\n\nexport async function sha256Hex(blob: Blob): Promise<string> {\n const digest = await crypto.subtle.digest('SHA-256', new Uint8Array(await blob.arrayBuffer()))\n return Array.from(new Uint8Array(digest), (b) => b.toString(16).padStart(2, '0')).join('')\n}\n\n/** A signature box drawn on the annotation overlay, as the signing API's placement. */\nexport function toAppearance(box: {\n page: number\n rect: { x: number; y: number; w: number; h: number }\n}): { page: number; x: number; y: number; width: number; height: number } {\n // The layer counts pages from 1, the signing API from 0. Both use fractions of the page as\n // displayed, origin top-left.\n return { page: box.page - 1, x: box.rect.x, y: box.rect.y, width: box.rect.w, height: box.rect.h }\n}\n\n/**\n * The smallest box the backend can draw a legible signature in: the signer's name and the\n * details line shrink to fit, so a box under these fractions of the page is shrunk to near\n * unreadable size. The backend's own default box is 0.40 x 0.10.\n */\nconst MIN_SIGNATURE_BOX = { width: 0.3, height: 0.07 }\n\nexport function isLegibleSignatureBox(rect: { w: number; h: number }): boolean {\n return rect.w >= MIN_SIGNATURE_BOX.width && rect.h >= MIN_SIGNATURE_BOX.height\n}\n\n// ── Signing through the API ─────────────────────────────────────────────────────────────────\n\nexport type SignatureAppearance = components['schemas']['SignatureAppearance']\nexport type SignatureStatusResponse = components['schemas']['SignatureStatusResponse']\nexport type SignatureRecord = components['schemas']['SignatureRecord']\nexport type SignDocumentResponse = components['schemas']['SignDocumentResponse']\n\nconst SIGNATURES_PATH = '/v1/document/{document_ext_id}/signatures'\n/**\n * The same key openapi-react-query gives this request (`['get', path, init]`), so a host that\n * reads or persists the API cache by path treats it like its own queries.\n */\n\nfunction errorDetail(error: unknown, fallback: string): string {\n const detail = (error as { detail?: unknown } | undefined)?.detail\n return typeof detail === 'string' ? detail : fallback\n}\n\n/** Whether a document version is a signed copy, and its signatures. */\nexport async function fetchDocumentSignatures(\n client: DocumentToolsClient,\n documentRef: string\n): Promise<SignatureStatusResponse> {\n const { docId, version } = parseVersionRef(documentRef)\n const { data, error } = await client.GET(SIGNATURES_PATH, {\n params: { path: { document_ext_id: docId }, ...(version ? { query: { version } } : {}) },\n })\n if (!data) throw new Error(errorDetail(error, 'The signatures could not be read'))\n return data\n}\n\n/**\n * Is a document version a signed copy? `documentId` is a document id (its current version) or a\n * version reference `doc-…@v{n}`. Needs a React Query `QueryClientProvider`.\n */\nexport function useDocumentSignatures(documentId: string | null | undefined, enabled = true) {\n const { client } = useDocumentTools()\n const { docId, version } = parseVersionRef(documentId)\n return useQuery({\n queryKey: arbiQueryKeys.documentSignatures(docId ?? '', version),\n queryFn: () => fetchDocumentSignatures(client, documentId!),\n enabled: enabled && !!docId,\n staleTime: 60_000,\n })\n}\n\n/**\n * Why the server would not sign: the PDF of a Word or text document is still being rendered\n * (`preparing`, worth another try in a moment), or the version on screen is no longer the current\n * one (`stale`: only the current version can be signed, so the signer reopens it).\n */\nexport type SigningErrorReason = 'preparing' | 'stale' | 'failed'\n\nexport class SigningError extends Error {\n readonly reason: SigningErrorReason\n constructor(message: string, reason: SigningErrorReason) {\n super(message)\n this.name = 'SigningError'\n this.reason = reason\n }\n}\n\n/** The 409s the backend's signing router raises, told apart by their wording. */\nfunction signingErrorReason(detail: string): SigningErrorReason {\n if (/still being prepared/i.test(detail)) return 'preparing'\n if (/no longer the current version/i.test(detail)) return 'stale'\n return 'failed'\n}\n\nfunction signingError(error: unknown, fallback: string): SigningError {\n const detail = errorDetail(error, fallback)\n return new SigningError(detail, signingErrorReason(detail))\n}\n\n/** How often, and how long apart, a prepare is retried while the PDF is still being rendered. */\nexport const PREPARE_RETRIES = 3\nconst PREPARE_RETRY_DELAY_MS = 1500\n\nconst wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\n\nexport interface SignDocumentVars {\n documentId: string\n /**\n * The PDF bytes the viewer is showing (`GET /view?version=`, never the original's download): the\n * signer signs exactly these.\n */\n pdfBlob: Blob\n /**\n * The version `pdfBlob` is of. The server signs only the current version and refuses\n * (`SigningError` `stale`) when this one has been superseded. Omitted = the current version.\n */\n version?: number\n email: string\n password: string\n signer: SignerDetails\n /** Where the signature goes; omitted = the backend default (bottom of the last page). */\n appearance?: SignatureAppearance\n /** Draw the signing date under the signature. Default off: only the signature is drawn. */\n includeDate?: boolean\n}\n\n/**\n * Sign a document: the server prepares the statement, the browser checks that it covers the PDF\n * on screen under the wording the signer read, re-derives the user's Ed25519 key from their\n * password and signs it, and the server seals the signed copy as a new version.\n *\n * What is drawn on the page is only the signature (the signer's name as the signature mark) and,\n * with `includeDate`, the date; anyone can click it to open its certificate. A role, a firm or a\n * place go on the page as ordinary annotation text, which is not part of the signature.\n */\nexport async function signDocument(\n client: DocumentToolsClient,\n deploymentDomain: string,\n {\n documentId,\n pdfBlob,\n email,\n password,\n signer,\n appearance,\n includeDate = false,\n version,\n }: SignDocumentVars\n): Promise<SignDocumentResponse> {\n const path = { document_ext_id: documentId }\n // One body for both calls: the server refuses a /sign whose include_date (or placement) differs\n // from what was prepared, since what the signature shows is part of what is signed.\n const body = {\n signer: { name: signer.name },\n ...(appearance ? { appearance } : {}),\n include_date: includeDate,\n ...(version ? { version } : {}),\n }\n\n // A Word or text document's PDF is rendered after upload: while it is, prepare says so, and a\n // short wait usually sees it ready.\n const prepare = () =>\n client.POST('/v1/document/{document_ext_id}/sign/prepare', { params: { path }, body })\n let prepared = await prepare()\n for (let attempt = 0; !prepared.data && attempt < PREPARE_RETRIES; attempt++) {\n if (signingError(prepared.error, '').reason !== 'preparing') break\n await wait(PREPARE_RETRY_DELAY_MS)\n prepared = await prepare()\n }\n if (!prepared.data) throw signingError(prepared.error, 'Could not prepare signing')\n const { statement, intent, source_sha256, timestamp } = prepared.data\n // Sign only what was on screen, under the wording the signer read.\n if ((await sha256Hex(pdfBlob)) !== source_sha256) {\n throw new Error('The document changed since it was opened. Reopen it and sign again.')\n }\n if (intent !== intentText(signer)) throw new Error('Signing statement mismatch; not signed.')\n\n // The re-typed password must open the session's identity, which is the key the server verifies.\n const identity = await unlockIdentityWithPassword(email, password, deploymentDomain)\n const signed = await client.POST('/v1/document/{document_ext_id}/sign', {\n params: { path },\n body: { ...body, timestamp, signature: signMessage(statement, identity) },\n })\n if (!signed.data) throw signingError(signed.error, 'Signing failed')\n return signed.data\n}\n\n/** The signing mutation. On success the host hears the document changed (`'signed'`). */\nexport function useSignDocument() {\n const env = useDocumentTools()\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (vars: SignDocumentVars) => {\n if (!env.deploymentDomain) throw new Error('Signing is not set up: no deployment domain')\n return signDocument(env.client, env.deploymentDomain, vars)\n },\n onSuccess: async (result) => {\n // The signed copy is the document's new current version: the host refreshes its row,\n // versions and rendered PDF, and the signature badge reads again.\n await env.onDocumentsChanged?.([result.doc_ext_id], 'signed')\n await queryClient.invalidateQueries({ queryKey: arbiQueryKeys.documentSignatures() })\n },\n })\n}\n","/**\n * Checking a signature from its reference, without signing in: the public certificate behind the\n * link on a signed PDF's signature (`GET /v1/sign/verify/{reference}`). It names who signed and\n * when, says whether the signed document is unchanged since, and carries the SHA-256 of the signed\n * PDF and of each signed revision, so anyone can check their own copy in the browser (the file is\n * never uploaded). No email addresses and no document content.\n */\n\nimport type { components } from '@arbidocs/client'\nimport { useQuery } from '@tanstack/react-query'\nimport { useDocumentTools, type DocumentToolsClient } from './environment'\nimport { sha256Hex } from './signing'\nimport { arbiQueryKeys } from '../query-keys'\n\nexport const VERIFY_PATH = '/v1/sign/verify/{reference}'\n\nexport type SignatureVerification = components['schemas']['SignatureVerification']\nexport type VerifiedSignature = components['schemas']['VerifiedSignature']\n\n/** A signature reference as the backend issues them: `sig-` and 128 random bits in hex. */\nconst REFERENCE = /^sig-[0-9a-f]{32}$/\n\nexport function isSignatureReference(reference: string | null | undefined): boolean {\n return !!reference && REFERENCE.test(reference)\n}\n\nexport class SignatureVerificationError extends Error {\n constructor(\n message: string,\n readonly status?: number\n ) {\n super(message)\n this.name = 'SignatureVerificationError'\n }\n}\n\nconst VERIFY_ERRORS: Record<number, string> = {\n 404: 'No signature has this reference.',\n 429: 'Too many checks, try again in a minute.',\n}\n\nexport async function fetchSignatureVerification(\n client: DocumentToolsClient,\n reference: string\n): Promise<SignatureVerification> {\n if (!isSignatureReference(reference)) {\n throw new SignatureVerificationError('This is not a signature reference.')\n }\n const { data, response } = await client.GET(VERIFY_PATH, {\n params: { path: { reference } },\n })\n if (!response.ok || !data) {\n throw new SignatureVerificationError(\n VERIFY_ERRORS[response.status] ?? 'The signature could not be checked right now.',\n response.status\n )\n }\n return data\n}\n\n/** The certificate of a signature reference. Needs a `<DocumentToolsProvider>` (no user). */\nexport function useSignatureVerification(reference: string | null | undefined) {\n const { client } = useDocumentTools()\n return useQuery({\n queryKey: arbiQueryKeys.signatureVerification(reference ?? ''),\n queryFn: () => fetchSignatureVerification(client, reference!),\n enabled: !!reference,\n retry: false,\n })\n}\n\n/**\n * What a copy is: the signed document as it stands (`current`), the document as it was when an\n * earlier signer signed it (`earlier`, a counter-signed PDF's earlier revision), or neither.\n */\nexport type CopyMatch =\n { kind: 'current' } | { kind: 'earlier'; signature: VerifiedSignature } | { kind: 'none' }\n\n/** Compare a file with the signed PDF and its signed revisions. Hashed here; nothing is uploaded. */\nexport async function matchSignedCopy(\n file: Blob,\n verification: Pick<SignatureVerification, 'document_sha256' | 'signatures'>\n): Promise<CopyMatch> {\n const hash = await sha256Hex(file)\n if (hash === verification.document_sha256.toLowerCase()) return { kind: 'current' }\n const signature = verification.signatures.find((s) => s.sha256.toLowerCase() === hash)\n return signature ? { kind: 'earlier', signature } : { kind: 'none' }\n}\n","/**\n * Signature requests: an author places fields (signature, initials, date, name) on the PDF of one\n * exact document version and assigns each to a signer: a workspace member (a guest too), or anyone\n * by email, who is invited to the workspace and signs once they join. A Word document's own\n * signature fields (Insert › Signature field) come back from `suggest` placed exactly, with their\n * signer (`source: 'anchor'`). Each signer is then walked\n * through their fields, adopts a signature once and applies it at each. They sign ONCE for all of\n * their fields: the server's statement binds the PDF they were shown, every field they applied and\n * what they adopted. The last signature draws every field and seals the signed copy as the\n * document's next version (see `src/core/signature_requests.py` in ARBI).\n */\n\nimport { signMessage, unlockIdentityWithPassword, type components } from '@arbidocs/client'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport { workspaces } from '@arbidocs/sdk/browser'\nimport { useDocumentTools, type DocumentToolsClient } from './environment'\nimport { intentText, sha256Hex, SigningError } from './signing'\nimport { arbiQueryKeys } from '../query-keys'\nimport { useArbiHost } from '../host/config'\n\n/**\n * The open workspace, when the host has an `Arbi` with one, and a guard that keeps a read made for\n * it only if that workspace stayed open on the server meanwhile (these lists are the open\n * workspace's there): a read that crosses a switch is dropped, never cached as another's.\n */\nfunction useOpenWorkspaceRead() {\n const arbi = useArbiHost().arbi\n const workspaceId = arbi?.hasWorkspace ? arbi.getWorkspaceId() : undefined\n const read = <T>(run: () => Promise<T>): Promise<T> =>\n arbi && workspaceId ? arbi.readInWorkspace(workspaceId, run) : run()\n return { workspaceId, read }\n}\n\nexport type SignatureField = components['schemas']['SignatureField']\nexport type SignatureFieldType = SignatureField['type']\nexport type SignatureRequest = components['schemas']['SignatureRequestResponse']\nexport type SignatureRequestSigner = components['schemas']['SignatureRequestSigner']\nexport type SignerProgress = components['schemas']['SignerProgress']\nexport type SuggestedSignatureField = components['schemas']['SuggestedSignatureField']\nexport type AdoptedSignature = components['schemas']['AdoptedSignature']\nexport type SignRequestSignResponse = components['schemas']['SignRequestSignResponse']\n\n/** Field types in the order the editor offers them. */\nexport const SIGNATURE_FIELD_TYPES: readonly SignatureFieldType[] = [\n 'signature',\n 'initials',\n 'date',\n 'name',\n]\n\nexport const FIELD_TYPE_LABELS: Record<SignatureFieldType, string> = {\n signature: 'Signature',\n initials: 'Initials',\n date: 'Date signed',\n name: 'Name',\n}\n\n/**\n * Default size of a new field, as fractions of the page (the backend draws to fit the box). The\n * same sizes the server's suggester places fields in (`esign_suggest._SIZE`).\n */\nexport const DEFAULT_FIELD_SIZE: Record<SignatureFieldType, { width: number; height: number }> = {\n signature: { width: 0.28, height: 0.05 },\n initials: { width: 0.1, height: 0.04 },\n date: { width: 0.22, height: 0.028 },\n name: { width: 0.28, height: 0.028 },\n}\n\n/** How far each signer has got, as the request's sender sees it. */\nexport const SIGNER_PROGRESS_LABELS: Record<SignerProgress, string> = {\n invited: 'Invited',\n registered: 'Not opened yet',\n viewed: 'Viewed',\n signed: 'Signed',\n declined: 'Declined',\n}\n\nconst EMAIL = /^[^@\\s<>,;]{1,64}@[^@\\s<>,;]{1,255}\\.[^@\\s<>,;]{1,63}$/\n\n/** Whether a field's signer is an email (someone to invite) rather than a member or request signer. */\nexport const isEmailSigner = (signer: string) => EMAIL.test(signer.trim())\n\n/** The fields carrying a signer's mark: every signer needs at least one to be sent the request. */\nexport const MARK_FIELD_TYPES: readonly SignatureFieldType[] = ['signature', 'initials']\n\nfunction detail(error: unknown, fallback: string): string {\n const d = (error as { detail?: unknown } | undefined)?.detail\n if (typeof d === 'string') return d\n if (Array.isArray(d) && d[0] && typeof d[0] === 'object' && 'msg' in d[0]) {\n return String((d[0] as { msg: unknown }).msg)\n }\n return fallback\n}\n\n/** A short unique id for a new field (the server only needs it unique within the request). */\nexport function newFieldId(): string {\n return `f${Math.random().toString(36).slice(2, 10)}`\n}\n\n/** Initials from a name: \"Olive M. Owner\" -> \"OMO\". */\nexport function initialsOf(name: string): string {\n return name\n .split(/\\s+/)\n .filter(Boolean)\n .map((part) => part[0]!.toUpperCase())\n .join('')\n .slice(0, 4)\n}\n\n/** The fields a signer completes, in the order they are walked through: page, then top to bottom. */\nexport function fieldsInSigningOrder(fields: SignatureField[], signer: string): SignatureField[] {\n return fields\n .filter((f) => f.signer === signer)\n .sort((a, b) => a.page - b.page || a.y - b.y || a.x - b.x)\n}\n\n/** Why a draft cannot be sent yet, or null when it can. Mirrors the server's checks. */\nexport function sendBlocker(fields: SignatureField[]): string | null {\n if (fields.length === 0) return 'Place at least one field.'\n const signers = [...new Set(fields.map((f) => f.signer))]\n for (const signer of signers) {\n if (!fields.some((f) => f.signer === signer && MARK_FIELD_TYPES.includes(f.type))) {\n return 'Every signer needs a signature or initials field.'\n }\n }\n return null\n}\n\n/**\n * Suggested fields grouped by signature block; `assign` maps a block (`group`) to the signer its\n * fields go to. A field placed in the Word document that names its signer goes to them: the\n * member with that email (`members`, by lowercased email), else the email itself (an invitee).\n * Unassigned blocks are left out.\n */\nexport function fieldsFromSuggestions(\n suggestions: SuggestedSignatureField[],\n assign: Record<number, string | undefined>,\n members: ReadonlyMap<string, string> = new Map()\n): SignatureField[] {\n return suggestions.flatMap((s) => {\n const email = s.signer_email?.toLowerCase()\n const signer = email ? (members.get(email) ?? email) : assign[s.group]\n if (!signer) return []\n return [\n {\n id: newFieldId(),\n type: s.type,\n page: s.page,\n x: s.x,\n y: s.y,\n width: s.width,\n height: s.height,\n signer,\n required: s.required ?? true,\n },\n ]\n })\n}\n\n/** The Word document's own fields (found by their anchors) and the optional layout suggestions. */\nexport function splitSuggestions(suggestions: SuggestedSignatureField[]) {\n return {\n placed: suggestions.filter((s) => s.source === 'anchor'),\n extras: suggestions.filter((s) => s.source !== 'anchor'),\n }\n}\n\n// ── Reads ───────────────────────────────────────────────────────────────────────────────────\n\nexport async function fetchDocumentSignatureRequests(\n client: DocumentToolsClient,\n documentId: string\n): Promise<SignatureRequest[]> {\n const { data, error } = await client.GET('/v1/document/{document_ext_id}/signature-requests', {\n params: { path: { document_ext_id: documentId } },\n })\n if (!data) throw new Error(detail(error, 'The signature requests could not be read'))\n return data\n}\n\n/** A document's signature requests, newest first. */\nexport function useDocumentSignatureRequests(\n documentId: string | null | undefined,\n enabled = true\n) {\n const { client } = useDocumentTools()\n return useQuery({\n queryKey: arbiQueryKeys.signatureRequestsForDocument(documentId ?? ''),\n queryFn: () => fetchDocumentSignatureRequests(client, documentId!),\n enabled: enabled && !!documentId,\n staleTime: 15_000,\n })\n}\n\n/** Requests in the active workspace still waiting for the current user's signature. */\nexport function useSignatureRequestsAwaitingMe(enabled = true) {\n const { client } = useDocumentTools()\n const { workspaceId, read } = useOpenWorkspaceRead()\n return useQuery({\n queryKey: arbiQueryKeys.signatureRequestsAwaitingMe(workspaceId),\n queryFn: () =>\n read(async () => {\n const { data, error } = await client.GET('/v1/signature-requests', {\n params: { query: { awaiting_me: true } },\n })\n if (!data) throw new Error(detail(error, 'The signature requests could not be read'))\n return data\n }),\n enabled,\n staleTime: 15_000,\n })\n}\n\nexport function useSignatureRequest(requestId: string | null | undefined) {\n const { client } = useDocumentTools()\n return useQuery({\n queryKey: arbiQueryKeys.signatureRequest(requestId ?? ''),\n queryFn: async () => {\n const { data, error } = await client.GET('/v1/signature-requests/{request_ext_id}', {\n params: { path: { request_ext_id: requestId! } },\n })\n if (!data) throw new Error(detail(error, 'The signature request could not be read'))\n return data\n },\n enabled: !!requestId,\n })\n}\n\n/** A signer the Word document's placed fields name, with the name they give. */\nexport interface NamedSigner {\n email: string\n name: string\n}\n\n/** What a document asks to be signed: the fields found, and the signers its Word fields name. */\nexport interface SignatureFieldSuggestions {\n fields: SuggestedSignatureField[]\n /**\n * Named even when the PDF shows none of the Word fields' anchors (the fields are then placed by\n * hand): who each email belongs to. Empty from a server that does not report them.\n */\n signers: NamedSigner[]\n}\n\nexport async function signatureFieldSuggestions(\n client: DocumentToolsClient,\n documentId: string,\n version?: number\n): Promise<SignatureFieldSuggestions> {\n const { data, error } = await client.GET(\n '/v1/document/{document_ext_id}/signature-fields/suggest',\n {\n params: { path: { document_ext_id: documentId }, ...(version ? { query: { version } } : {}) },\n }\n )\n if (!data) throw new Error(detail(error, 'Signature blocks could not be read'))\n return { fields: data.fields, signers: (data as { signers?: NamedSigner[] }).signers ?? [] }\n}\n\nexport async function suggestSignatureFields(\n client: DocumentToolsClient,\n documentId: string,\n version?: number\n): Promise<SuggestedSignatureField[]> {\n return (await signatureFieldSuggestions(client, documentId, version)).fields\n}\n\n// ── Prepare ─────────────────────────────────────────────────────────────────────────────────\n\nexport interface SaveSignatureRequestVars {\n documentId: string\n /** The version the fields were placed on (the PDF shown). Omitted = current. */\n version?: number\n fields: SignatureField[]\n message?: string\n /** Existing draft to update instead of creating a new request. */\n requestId?: string\n /** Send it to the signers (else it is saved as a draft). */\n send: boolean\n}\n\nexport async function saveSignatureRequest(\n client: DocumentToolsClient,\n { documentId, version, fields, message, requestId, send }: SaveSignatureRequestVars\n): Promise<SignatureRequest> {\n if (!requestId) {\n const { data, error } = await client.POST('/v1/document/{document_ext_id}/signature-requests', {\n params: { path: { document_ext_id: documentId } },\n body: { fields, message: message || null, send, ...(version ? { version } : {}) },\n })\n if (!data) throw new Error(detail(error, 'The signature request could not be saved'))\n return data\n }\n const path = { request_ext_id: requestId }\n const updated = await client.PATCH('/v1/signature-requests/{request_ext_id}', {\n params: { path },\n body: { fields, message: message ?? null },\n })\n if (!updated.data) throw new Error(detail(updated.error, 'The draft could not be saved'))\n if (!send) return updated.data\n const sent = await client.POST('/v1/signature-requests/{request_ext_id}/send', {\n params: { path },\n })\n if (!sent.data) throw new Error(detail(sent.error, 'The request could not be sent'))\n return sent.data\n}\n\nfunction useInvalidateRequests() {\n const queryClient = useQueryClient()\n return () => queryClient.invalidateQueries({ queryKey: arbiQueryKeys.signatureRequests() })\n}\n\nexport function useSaveSignatureRequest() {\n const { client } = useDocumentTools()\n const invalidate = useInvalidateRequests()\n return useMutation({\n mutationFn: (vars: SaveSignatureRequestVars) => saveSignatureRequest(client, vars),\n onSuccess: invalidate,\n })\n}\n\nexport function useVoidSignatureRequest() {\n const { client } = useDocumentTools()\n const invalidate = useInvalidateRequests()\n return useMutation({\n mutationFn: async (requestId: string) => {\n const { data, error } = await client.POST('/v1/signature-requests/{request_ext_id}/void', {\n params: { path: { request_ext_id: requestId } },\n })\n if (!data) throw new Error(detail(error, 'The request could not be voided'))\n return data\n },\n onSuccess: invalidate,\n })\n}\n\nexport function useDeclineSignatureRequest() {\n const { client } = useDocumentTools()\n const invalidate = useInvalidateRequests()\n return useMutation({\n mutationFn: async ({ requestId, reason }: { requestId: string; reason?: string }) => {\n const { data, error } = await client.POST('/v1/signature-requests/{request_ext_id}/decline', {\n params: { path: { request_ext_id: requestId } },\n body: { reason: reason || null },\n })\n if (!data) throw new Error(detail(error, 'Could not decline'))\n return data\n },\n onSuccess: invalidate,\n })\n}\n\n// ── Sign ────────────────────────────────────────────────────────────────────────────────────\n\nexport interface SignRequestVars {\n request: SignatureRequest\n /** The PDF the signer was walked through (`GET /view?version=` of the request's version). */\n pdfBlob: Blob\n email: string\n password: string\n adopted: AdoptedSignature\n /** The ids of the fields the signer applied: every required one of theirs. */\n fields: string[]\n}\n\n/**\n * Sign all of the signer's fields at once: the server prepares the statement, the browser checks\n * it covers the PDF on screen under the wording the signer read, re-derives the Ed25519 key from\n * the password and signs. Resolves with `completed` when this was the last signature.\n */\nexport async function signSignatureRequest(\n client: DocumentToolsClient,\n deploymentDomain: string,\n { request, pdfBlob, email, password, adopted, fields }: SignRequestVars\n): Promise<SignRequestSignResponse> {\n const path = { request_ext_id: request.external_id }\n const body = { adopted, fields }\n const prepared = await client.POST('/v1/signature-requests/{request_ext_id}/sign/prepare', {\n params: { path },\n body,\n })\n if (!prepared.data) {\n throw new SigningError(detail(prepared.error, 'Could not prepare signing'), 'failed')\n }\n const { statement, intent, source_sha256, timestamp } = prepared.data\n if (source_sha256 !== request.source_sha256 || (await sha256Hex(pdfBlob)) !== source_sha256) {\n throw new SigningError('The document changed since it was sent. Ask for it again.', 'stale')\n }\n if (intent !== intentText({ name: adopted.name })) {\n throw new Error('Signing statement mismatch; not signed.')\n }\n const identity = await unlockIdentityWithPassword(email, password, deploymentDomain)\n const signed = await client.POST('/v1/signature-requests/{request_ext_id}/sign', {\n params: { path },\n body: { ...body, timestamp, signature: signMessage(statement, identity) },\n })\n if (!signed.data) throw new SigningError(detail(signed.error, 'Signing failed'), 'failed')\n return signed.data\n}\n\nexport function useSignSignatureRequest() {\n const env = useDocumentTools()\n const invalidate = useInvalidateRequests()\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (vars: SignRequestVars) => {\n if (!env.deploymentDomain) throw new Error('Signing is not set up: no deployment domain')\n return signSignatureRequest(env.client, env.deploymentDomain, vars)\n },\n onSuccess: async (result) => {\n await invalidate()\n if (result.completed && result.request.doc_ext_id) {\n await env.onDocumentsChanged?.([result.request.doc_ext_id], 'signed')\n await queryClient.invalidateQueries({ queryKey: arbiQueryKeys.documentSignatures() })\n }\n },\n })\n}\n\n// ── Who can sign ────────────────────────────────────────────────────────────────────────────\n\nexport interface SignerCandidate {\n externalId: string\n name: string\n email: string\n role: string\n}\n\n/**\n * The people in the active workspace who may sign: owners, collaborators and guests (an agent never\n * does). The first one listed is the current user when they are a member.\n */\nexport function useSignerCandidates(enabled = true) {\n const { client, user } = useDocumentTools()\n const { workspaceId, read } = useOpenWorkspaceRead()\n return useQuery({\n queryKey: arbiQueryKeys.signatureCandidates(workspaceId ?? ''),\n queryFn: async (): Promise<SignerCandidate[]> => {\n const { data, error } = await read(() => client.GET('/v1/workspace/users'))\n if (!data) throw new Error(detail(error, 'The workspace members could not be read'))\n const people = data\n .filter((m) => m.user.external_id.startsWith('usr-'))\n .map((m) => ({\n externalId: m.user.external_id,\n name: [m.user.given_name, m.user.family_name].filter(Boolean).join(' ') || m.user.email,\n email: m.user.email,\n role: String(m.role),\n }))\n const me = user?.email?.toLowerCase()\n return [...people].sort(\n (a, b) => Number(b.email.toLowerCase() === me) - Number(a.email.toLowerCase() === me)\n )\n },\n enabled,\n staleTime: 60_000,\n })\n}\n\n// ── Invite ──────────────────────────────────────────────────────────────────────────────────\n\n/**\n * Invite signers who are not in the workspace yet, as guests, through the workspace's own invite\n * (`POST /v1/workspace/users` with `confirm_invite`): a registered person is added at once, anyone\n * else is emailed an invitation that lands on the document. Each is asked to sign when they join.\n * Only a workspace owner can invite.\n */\nexport async function inviteSigners(\n client: DocumentToolsClient,\n documentId: string,\n emails: string[]\n): Promise<void> {\n if (!emails.length) return\n const { error, response } = await client.POST('/v1/workspace/users', {\n body: workspaces.addWorkspaceMembersBody({\n emails,\n role: 'guest',\n confirm_invite: true,\n resource_type: 'document',\n resource_ext_id: documentId,\n }),\n })\n if (response.status === 409) {\n throw new Error('Share the document with the workspace before asking others to sign it.')\n }\n // 404 \"No users found to add\": everyone is a member already (nothing to do).\n if (error && response.status !== 404) {\n throw new Error(detail(error, 'The signers could not be invited'))\n }\n}\n\nexport function useInviteSigners() {\n const { client } = useDocumentTools()\n const invalidate = useInvalidateRequests()\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: ({ documentId, emails }: { documentId: string; emails: string[] }) =>\n inviteSigners(client, documentId, emails),\n onSuccess: async () => {\n await invalidate()\n await queryClient.invalidateQueries({ queryKey: arbiQueryKeys.signatureCandidates() })\n },\n })\n}\n","/**\n * A signature saved to one's account, for informal use: inserted into a Word document as a picture,\n * or placed on a PDF as a stamp, and offered again the next time one adopts a signature to sign.\n *\n * It is sealed HERE, in the browser, to the user's own X25519 key (a SealedBox to the public half of\n * the keypair their signing key derives): the server keeps the sealed bytes (`/v1/user/signature`)\n * and can never read them. Only with the user's explicit consent (\"Save to my account for future\n * use\"); Delete removes it from the account completely. A typed mark is saved as its picture too,\n * so every use has an image to place.\n */\n\nimport {\n getUserEncryptionKeypair,\n initSodium,\n sealedBoxDecrypt,\n sealedBoxEncrypt,\n type KeyPair,\n} from '@arbidocs/client'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useDocumentTools, type DocumentToolsClient } from './environment'\nimport { arbiQueryKeys } from '../query-keys'\n\nexport interface SavedSignature {\n name: string\n initials: string\n /** How the signature was adopted (a typed one is saved as its picture as well). */\n style: 'typed' | 'drawn' | 'uploaded'\n initials_style: 'typed' | 'drawn'\n /** Base64 PNGs, transparent around the ink. */\n signature_png: string\n initials_png: string\n}\n\n/** The one line shown wherever a saved signature is placed by hand. */\nexport const INFORMAL_SIGNATURE_NOTE =\n 'Your saved signature or initials are placed as an image on the document.'\n\n/** The user's own keypair (the session's); a host or a test may pass another. */\nexport type KeypairSource = () => Promise<KeyPair | null>\n\nasync function keypair(source: KeypairSource = getUserEncryptionKeypair): Promise<KeyPair> {\n await initSodium()\n const pair = await source()\n if (!pair) throw new Error('Sign in again to use your saved signature.')\n return pair\n}\n\nfunction detail(error: unknown, fallback: string): string {\n const d = (error as { detail?: unknown } | undefined)?.detail\n return typeof d === 'string' ? d : fallback\n}\n\n/** The saved signature, opened with the user's own key; null when none is saved. */\nexport async function fetchSavedSignature(\n client: DocumentToolsClient,\n source?: KeypairSource\n): Promise<SavedSignature | null> {\n const { data, error } = await client.GET('/v1/user/signature')\n if (!data) throw new Error(detail(error, 'Your saved signature could not be read'))\n if (!data.sealed) return null\n const pair = await keypair(source)\n const json = new TextDecoder().decode(sealedBoxDecrypt(data.sealed, pair.secretKey))\n return JSON.parse(json) as SavedSignature\n}\n\n/** Seal it to the user's own key and save it (replacing any saved before). */\nexport async function storeSavedSignature(\n client: DocumentToolsClient,\n signature: SavedSignature,\n source?: KeypairSource\n): Promise<void> {\n const pair = await keypair(source)\n const sealed = sealedBoxEncrypt(\n Uint8Array.from(new TextEncoder().encode(JSON.stringify(signature))),\n pair.publicKey\n )\n const { error, response } = await client.PUT('/v1/user/signature', { body: { sealed } })\n if (!response.ok) throw new Error(detail(error, 'Your signature could not be saved'))\n}\n\n/** Remove it from the account completely. */\nexport async function deleteSavedSignature(client: DocumentToolsClient): Promise<void> {\n const { error, response } = await client.DELETE('/v1/user/signature')\n if (!response.ok) throw new Error(detail(error, 'Your saved signature could not be deleted'))\n}\n\nexport function useSavedSignature(enabled = true) {\n const { client } = useDocumentTools()\n return useQuery({\n queryKey: arbiQueryKeys.savedSignature(),\n queryFn: () => fetchSavedSignature(client),\n enabled,\n staleTime: 60_000,\n retry: false,\n })\n}\n\nexport function useStoreSavedSignature() {\n const { client } = useDocumentTools()\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (signature: SavedSignature) => storeSavedSignature(client, signature),\n onSuccess: (_, signature) =>\n queryClient.setQueryData(arbiQueryKeys.savedSignature(), signature),\n })\n}\n\nexport function useDeleteSavedSignature() {\n const { client } = useDocumentTools()\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: () => deleteSavedSignature(client),\n onSuccess: () => queryClient.setQueryData(arbiQueryKeys.savedSignature(), null),\n })\n}\n\n/** Base64 PNG bytes, decoded (for an inline picture or an upload). */\nexport function pngBytes(base64: string): Uint8Array {\n const raw = atob(base64)\n const out = new Uint8Array(raw.length)\n for (let i = 0; i < raw.length; i++) out[i] = raw.charCodeAt(i)\n return out\n}\n\n/** A PNG's pixel size, read from its header (IHDR). */\nexport function pngSize(base64: string): { width: number; height: number } {\n const bytes = pngBytes(base64.slice(0, 64))\n const view = new DataView(bytes.buffer)\n return { width: view.getUint32(16), height: view.getUint32(20) }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { arbiQueryKeys } from '../query-keys'\n/** Share one immutable file version with named recipients, independently of workspace membership. */\nimport { signMessage, unlockIdentityWithPassword, type components } from '@arbidocs/client'\nimport type { DocumentToolsClient } from './environment'\nimport { intentText, sha256Hex } from './signing'\nimport type {\n SignatureRequest,\n SignRequestVars,\n SignRequestSignResponse,\n} from './signature-requests'\n\nexport type FileShare = components['schemas']['FileShareResponse']\nexport type CreateFileShare = components['schemas']['CreateFileShare']\n\nfunction failure(error: unknown): Error {\n const detail = (error as { detail?: unknown } | undefined)?.detail\n return new Error(typeof detail === 'string' ? detail : 'The shared file request failed')\n}\n\nexport async function createFileShare(\n client: DocumentToolsClient,\n documentId: string,\n body: CreateFileShare\n) {\n const result = await client.POST('/v1/document/{document_ext_id}/file-shares', {\n params: { path: { document_ext_id: documentId } },\n body,\n })\n if (!result.data) throw failure(result.error)\n return result.data\n}\n\nexport async function getFileShare(client: DocumentToolsClient, id: string): Promise<FileShare> {\n const result = await client.GET('/v1/file-shares/{share_id}', {\n params: { path: { share_id: id } },\n })\n if (!result.data) throw failure(result.error)\n return result.data\n}\n\nexport async function fileShareBytes(\n client: DocumentToolsClient,\n id: string,\n kind: 'view' | 'original' | 'signed'\n) {\n const result = await client.GET('/v1/file-shares/{share_id}/file', {\n params: { path: { share_id: id }, query: { kind } },\n parseAs: 'blob',\n })\n if (!result.data) throw failure(result.error)\n return result.data\n}\n\n/** Adapt only the guided viewer's presentation data; sharing uses its own authorization endpoints. */\nexport function fileShareSigningRequest(share: FileShare): SignatureRequest {\n return {\n external_id: share.external_id,\n doc_ext_id: share.document_ext_id,\n version: share.version,\n source_sha256: share.source_sha256,\n fields: share.fields,\n message: share.message,\n status:\n share.status === 'signing' ? 'sent' : share.status === 'completed' ? 'completed' : 'voided',\n signers: share.recipients\n .filter((r) => r.permission === 'sign')\n .map((r) => ({\n external_id: r.email,\n email: r.email,\n name: r.email,\n status: r.status === 'signed' ? 'signed' : 'pending',\n progress: r.status === 'signed' ? 'signed' : 'registered',\n fields: share.fields.filter((f) => f.signer === r.email).length,\n })),\n created_at: new Date(0).toISOString(),\n stale: false,\n }\n}\n\nexport async function signFileShare(\n client: DocumentToolsClient,\n domain: string,\n vars: SignRequestVars\n): Promise<SignRequestSignResponse> {\n const path = { share_id: vars.request.external_id }\n const body = { adopted: vars.adopted, fields: vars.fields }\n const prepared = await client.POST('/v1/file-shares/{share_id}/sign/prepare', {\n params: { path },\n body,\n })\n if (!prepared.data) throw failure(prepared.error)\n const { statement, timestamp, source_sha256, intent } = prepared.data\n if (\n source_sha256 !== vars.request.source_sha256 ||\n (await sha256Hex(vars.pdfBlob)) !== source_sha256\n )\n throw new Error('The shared file changed. Ask the sender for a new request.')\n if (intent !== intentText({ name: vars.adopted.name }))\n throw new Error('Signing statement mismatch')\n const identity = await unlockIdentityWithPassword(vars.email, vars.password, domain)\n const result = await client.POST('/v1/file-shares/{share_id}/sign', {\n params: { path },\n body: { ...body, timestamp, signature: signMessage(statement, identity) },\n })\n if (!result.data) throw failure(result.error)\n return {\n request: fileShareSigningRequest(result.data),\n completed: result.data.status === 'completed',\n }\n}\n\nexport function useFileShare(client: DocumentToolsClient, shareId: string, signing: boolean) {\n return useQuery({\n queryKey: arbiQueryKeys.fileShare(shareId),\n queryFn: () => getFileShare(client, shareId),\n refetchInterval: signing ? false : 5000,\n })\n}\n\nexport function useFileSharePdf(client: DocumentToolsClient, shareId: string, share?: FileShare) {\n return useQuery({\n queryKey: arbiQueryKeys.fileSharePdf(shareId, share?.status),\n queryFn: () =>\n fileShareBytes(client, shareId, share?.status === 'completed' ? 'signed' : 'view'),\n enabled: !!share?.can_preview,\n staleTime: Infinity,\n })\n}\n\nexport function useFileShares(client: DocumentToolsClient) {\n return useQuery({\n queryKey: arbiQueryKeys.fileShares(),\n queryFn: async () => {\n const result = await client.GET('/v1/file-shares')\n if (!result.data) throw new Error('Could not load shared files')\n return result.data\n },\n })\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/document-tools/markup-store.ts","../src/document-tools/markup-transfer.ts","../src/document-tools/useDocumentMarkup.ts","../src/document-tools/frozen-copy.ts","../src/document-tools/can-annotate.ts","../src/document-tools/useIsOnline.ts","../src/document-tools/useDocumentBytes.ts","../src/document-tools/signing.ts","../src/document-tools/verification.ts","../src/document-tools/signature-requests.ts","../src/document-tools/saved-signature.ts","../src/document-tools/file-shares.ts"],"names":["detail","AnnotationStoreOfflineError","parseLayer","LAYER_SCHEMA_VERSION","mergeLayers","emptyLayer","useDocumentTools","useMemo","useState","useCallback","useEffect","SIGNED_LOCKED_REASON","fetchMarkupPdf","useSyncExternalStore","onlineManager","useQuery","documentBytesKey","fetchDocumentFile","fetchDocumentPdf","parseVersionRef","arbiQueryKeys","client","unlockIdentityWithPassword","signMessage","useQueryClient","useMutation","useArbiHost","workspaces","getUserEncryptionKeypair","initSodium","sealedBoxDecrypt","sealedBoxEncrypt"],"mappings":"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","file":"chunk-GOJHU7RZ.cjs","sourcesContent":["/**\n * The annotation store for a document version's MARKUP on the server: `GET`/`PUT\n * /v1/document/{id}/markup`. The server keeps the marks as native PDF annotations in an encrypted\n * `{doc}-markup.pdf` next to the version (same document id, the document's own privacy); this store\n * only moves the layer and its revision.\n *\n * Optimistic concurrency: every save names the revision it started from. When someone else saved\n * first the server answers 409; the store then re-reads the latest layer, merges it with ours by\n * annotation id (`mergeLayers`: union, last edit wins per mark, replies unioned, our deletions\n * stay deleted) and saves again. The merged layer is returned so the viewer shows their marks too.\n *\n * Deletions are tracked as tombstones for the session: an id this session has seen that is no\n * longer in the layer it saves was deleted here, and a concurrent edit elsewhere cannot bring it\n * back.\n */\n\nimport {\n AnnotationStoreOfflineError,\n LAYER_SCHEMA_VERSION,\n mergeLayers,\n parseLayer,\n type AnnotationLayer,\n type AnnotationStore,\n} from '../annotations'\nimport type { DocumentToolsClient } from './environment'\n\n/** How many times a save re-reads and merges after a 409 before giving up (each is a real race). */\nexport const MAX_MERGE_ATTEMPTS = 5\n/** Below this many bytes a save uses `keepalive`, so it completes even if the page unloads. */\nconst KEEPALIVE_LIMIT = 60_000\n\nexport interface MarkupSnapshot {\n revision: number\n count: number\n canEdit: boolean\n}\n\nexport interface MarkupStoreOptions {\n /** The version the markup belongs to; omitted = the document's current version. */\n version?: number\n /** The ARBI API client (see `DocumentToolsEnvironment.client`). */\n client: DocumentToolsClient\n /** After every successful save: the new revision and how many marks the markup holds. */\n onSaved?: (snapshot: MarkupSnapshot) => void\n}\n\nexport interface MarkupStore extends AnnotationStore {\n snapshot(): MarkupSnapshot\n}\n\ninterface ServerLayer {\n revision: number\n layer: AnnotationLayer\n canEdit: boolean\n}\n\nexport class MarkupStoreError extends Error {\n constructor(\n message: string,\n readonly status?: number\n ) {\n super(message)\n this.name = 'MarkupStoreError'\n }\n}\n\nconst detailOf = (error: unknown, fallback: string) => {\n const detail = (error as { detail?: unknown } | undefined)?.detail\n return typeof detail === 'string' ? detail : fallback\n}\n\n/** A request that never reached the server (no network, DNS, CORS) is \"offline\", not a failure. */\nasync function call<T>(request: () => Promise<T>): Promise<T> {\n try {\n return await request()\n } catch (e) {\n if (e instanceof TypeError || (typeof navigator !== 'undefined' && !navigator.onLine)) {\n throw new AnnotationStoreOfflineError()\n }\n throw e\n }\n}\n\nexport function createMarkupStore({ version, client, onSaved }: MarkupStoreOptions): MarkupStore {\n let revision = 0\n let count = 0\n let canEdit = false\n /** The layer as last read from or written to the server: the base of a merge. */\n let base: AnnotationLayer | null = null\n /** Every mark id this session has held: one missing from a save was deleted here. */\n const seen = new Set<string>()\n const remember = (layer: AnnotationLayer) => {\n for (const a of layer.annotations) seen.add(a.id)\n }\n const query = version ? { version } : {}\n\n async function read(documentId: string, ifNoneMatch?: number): Promise<ServerLayer | null> {\n const { data, error, response } = await call(() =>\n client.GET('/v1/document/{document_ext_id}/markup', {\n params: { path: { document_ext_id: documentId }, query },\n headers: ifNoneMatch === undefined ? undefined : { 'If-None-Match': `\"${ifNoneMatch}\"` },\n })\n )\n if (response.status === 304) return null\n if (error || !data) {\n throw new MarkupStoreError(\n detailOf(error, `The markup could not be loaded (${response.status})`),\n response.status\n )\n }\n const layer = parseLayer({\n schema: LAYER_SCHEMA_VERSION,\n documentId,\n annotations: data.annotations ?? [],\n updatedAt: data.updated_at ?? new Date().toISOString(),\n })\n return { revision: data.revision ?? 0, layer, canEdit: !!data.can_edit }\n }\n\n function adopt(server: ServerLayer) {\n revision = server.revision\n canEdit = server.canEdit\n base = server.layer\n count = server.layer.annotations.length\n remember(server.layer)\n }\n\n async function put(layer: AnnotationLayer, from: number) {\n return call(() =>\n client.PUT('/v1/document/{document_ext_id}/markup', {\n params: { path: { document_ext_id: layer.documentId }, query },\n headers: { 'If-Match': `\"${from}\"` },\n body: { annotations: layer.annotations as never, base_revision: from },\n // A save started as the page closes must outlive it; browsers cap such bodies at 64 KB.\n keepalive: JSON.stringify(layer.annotations).length < KEEPALIVE_LIMIT,\n })\n )\n }\n\n return {\n snapshot: () => ({ revision, count, canEdit }),\n canEdit: () => canEdit,\n\n async load(documentId) {\n const server = await read(documentId)\n if (!server) throw new MarkupStoreError('The markup could not be loaded')\n adopt(server)\n return server.layer\n },\n\n async save(layer) {\n remember(layer)\n let mine = layer\n for (let attempt = 0; attempt < MAX_MERGE_ATTEMPTS; attempt++) {\n const { data, error, response } = await put(mine, revision)\n if (response.ok && data) {\n revision = data.revision\n count = data.count\n base = mine\n remember(mine)\n onSaved?.({ revision, count, canEdit })\n return mine\n }\n if (response.status === 409) {\n // Someone saved first: their layer, merged with ours, is what we save next.\n const latest = await read(layer.documentId)\n if (!latest) throw new MarkupStoreError('The markup could not be re-read')\n const deleted = new Set(\n [...seen].filter((id) => !mine.annotations.some((a) => a.id === id))\n )\n const merged = mergeLayers({ base, mine, theirs: latest.layer, deleted })\n revision = latest.revision\n canEdit = latest.canEdit\n base = latest.layer\n remember(latest.layer)\n mine = merged\n continue\n }\n if (response.status === 403) canEdit = false\n throw new MarkupStoreError(\n detailOf(error, `The markup could not be saved (${response.status})`),\n response.status\n )\n }\n throw new MarkupStoreError('The markup keeps changing; it will be saved on the next edit')\n },\n\n async pull(documentId) {\n const server = await read(documentId, revision)\n if (!server || server.revision === revision) return null\n adopt(server)\n return server.layer\n },\n }\n}\n","/**\n * Moving marks INTO a version's markup without the viewer: the one-time migration of layers kept in\n * this browser before markup lived on the server, and \"copy open comments\" from an older version's\n * markup onto the current one (a new version — signed, synced from Drive, saved from Word — starts\n * with an empty markup; redactions never carry over).\n *\n * Both are unions by annotation id, so running them twice adds nothing twice.\n */\n\nimport {\n LAYER_SCHEMA_VERSION,\n emptyLayer,\n mergeLayers,\n parseLayer,\n type Annotation,\n type AnnotationLayer,\n} from '../annotations'\nimport type { DocumentToolsClient } from './environment'\nimport { createMarkupStore } from './markup-store'\n\nexport const LEGACY_LAYER_PREFIX = 'arbi:annotations:'\n\nexport interface VersionInfo {\n n: number\n created_at?: string | null\n markup_count?: number | null\n}\n\nfunction storage(): Storage | undefined {\n try {\n return typeof localStorage === 'undefined' ? undefined : localStorage\n } catch {\n return undefined\n }\n}\n\n/** The layer this browser kept for a document before markup moved to the server, if any. */\nexport function readLegacyLayer(documentId: string): AnnotationLayer | null {\n try {\n const raw = storage()?.getItem(LEGACY_LAYER_PREFIX + documentId)\n if (!raw) return null\n return parseLayer(JSON.parse(raw))\n } catch {\n return null // unreadable: nothing worth migrating\n }\n}\n\nexport function forgetLegacyLayer(documentId: string): void {\n try {\n storage()?.removeItem(LEGACY_LAYER_PREFIX + documentId)\n } catch {\n // storage blocked: nothing to forget\n }\n}\n\n/**\n * Which version each legacy mark belongs to: the version that was current when it was made. A\n * document's id is the id of its first version (older layers were made on it); a layer made after\n * the versions moved inside the document was made on whatever version was then current.\n */\nexport function marksByVersion(\n layer: AnnotationLayer,\n versions: VersionInfo[]\n): Map<number, Annotation[]> {\n const sorted = [...versions].sort((a, b) => a.n - b.n)\n const out = new Map<number, Annotation[]>()\n for (const mark of layer.annotations) {\n const at = Date.parse(mark.createdAt)\n let target = sorted[0]?.n ?? 1\n for (const v of sorted) {\n const created = v.created_at ? Date.parse(v.created_at) : Number.NaN\n if (!Number.isNaN(created) && !Number.isNaN(at) && created <= at) target = v.n\n }\n out.set(target, [...(out.get(target) ?? []), mark])\n }\n return out\n}\n\n/** Add marks to one version's markup (union by id); returns how many were new. */\nexport async function addToMarkup(\n documentId: string,\n version: number | undefined,\n marks: Annotation[],\n client: DocumentToolsClient\n): Promise<number> {\n const store = createMarkupStore({ version, client })\n const current = await store.load(documentId)\n const incoming: AnnotationLayer = {\n ...emptyLayer(documentId, new Date().toISOString()),\n annotations: marks,\n }\n // Theirs (the server) wins any tie: a mark already in the markup is never overwritten by an\n // older browser copy of it.\n const merged = mergeLayers({ base: null, mine: current, theirs: incoming })\n const added = merged.annotations.length - current.annotations.length\n if (added > 0) await store.save(parseLayer({ ...merged, schema: LAYER_SCHEMA_VERSION }))\n return added\n}\n\n/**\n * Migrate this browser's layer for a document into its markup, version by version, then forget\n * the browser copy. Throws (and keeps the browser copy) if any version could not be saved.\n */\nexport async function migrateLegacyLayer(\n documentId: string,\n layer: AnnotationLayer,\n versions: VersionInfo[],\n currentVersion: number,\n client: DocumentToolsClient\n): Promise<number> {\n let added = 0\n for (const [n, marks] of marksByVersion(layer, versions.length ? versions : [{ n: 1 }])) {\n added += await addToMarkup(documentId, n === currentVersion ? undefined : n, marks, client)\n }\n forgetLegacyLayer(documentId)\n return added\n}\n\n/** The unresolved comment threads (with replies) of a version's markup. */\nexport async function openThreadsOf(\n documentId: string,\n version: number,\n client: DocumentToolsClient\n): Promise<Annotation[]> {\n const layer = await createMarkupStore({ version, client }).load(documentId)\n return layer.annotations.filter((a) => a.kind === 'comment' && !a.resolved)\n}\n\n/** Copy the open comment threads of an older version onto the current version's markup. */\nexport async function copyOpenThreads(\n documentId: string,\n fromVersion: number,\n client: DocumentToolsClient\n): Promise<number> {\n const threads = await openThreadsOf(documentId, fromVersion, client)\n if (!threads.length) return 0\n return addToMarkup(documentId, undefined, threads, client)\n}\n\n/** Version entries of a document as the API returns them (`DocResponse.versions`). */\nexport function versionsWithMarkup(versions: VersionInfo[] | null | undefined): VersionInfo[] {\n return (versions ?? []).filter((v) => (v.markup_count ?? 0) > 0)\n}\n","/**\n * Markup state for the document page: whether the version on screen has markup (so the viewer\n * opens on it, the default view), the \"Show original\" toggle, \"Download with markup\", the one-time\n * migration of this browser's old annotation layer, and the note shown when the markup is on an\n * older version (with \"copy open comments\").\n *\n * Whether a version has markup comes from the document's version entries (`markup_count`), kept\n * current by the viewer's own saves (`onMarkupChange`) until the document is refetched.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useDocumentTools } from './environment'\nimport type { MarkupSnapshot } from './markup-store'\nimport { SIGNED_LOCKED_REASON, fetchMarkupPdf } from './markup-download'\nimport {\n copyOpenThreads,\n forgetLegacyLayer,\n migrateLegacyLayer,\n readLegacyLayer,\n versionsWithMarkup,\n type VersionInfo,\n} from './markup-transfer'\n\nexport const SIGNED_UNCHANGED =\n 'The signed PDF is unchanged: the comments are kept beside it as markup.'\n\nexport interface MarkupDocument {\n external_id: string\n shared?: boolean | null\n current_version?: number | null\n versions?: VersionInfo[] | null\n}\n\nexport interface LegacyPrompt {\n count: number\n busy: boolean\n add: () => void\n discard: () => void\n}\n\nexport interface OlderMarkupNote {\n version: number\n busy: boolean\n /** The current version is a signed copy: say that copying leaves its signed PDF as it is. */\n signed: boolean\n copy: () => void\n}\n\nexport function useDocumentMarkup(\n documentData: MarkupDocument | null | undefined,\n /** The version on screen when it is an older one (a read-only snapshot). */\n snapshotVersion: number | undefined,\n /**\n * Whether the version on screen is a signed, sealed copy: locked, so no \"Download with markup\"\n * (and, for the current version, copied comments leave its signed PDF as it is).\n */\n currentSigned = false\n) {\n const { client, notify, saveFile, onDocumentsChanged } = useDocumentTools()\n const documentId = documentData?.external_id\n const currentVersion = documentData?.current_version ?? 1\n const shownVersion = snapshotVersion ?? currentVersion\n const versions = useMemo(() => documentData?.versions ?? [], [documentData?.versions])\n\n // Counts from this session's saves win over the (possibly stale) document record.\n const [localCounts, setLocalCounts] = useState<Record<string, number>>({})\n const countOf = useCallback(\n (n: number) =>\n localCounts[`${documentId}@${n}`] ?? versions.find((v) => v.n === n)?.markup_count ?? 0,\n [localCounts, documentId, versions]\n )\n const hasMarkup = countOf(shownVersion) > 0\n\n const [showOriginal, setShowOriginal] = useState(false)\n useEffect(() => setShowOriginal(false), [documentId, snapshotVersion])\n\n const refresh = useCallback(() => {\n if (!documentId || !onDocumentsChanged) return\n Promise.resolve(onDocumentsChanged([documentId], 'markup')).catch((e: unknown) =>\n console.warn('Could not refresh the document after a markup change', e)\n )\n }, [documentId, onDocumentsChanged])\n\n const onMarkupChange = useCallback(\n (snapshot: MarkupSnapshot) => {\n if (!documentId) return\n const key = `${documentId}@${shownVersion}`\n // The list's \"Download with markup\" and the version entries follow the first/last mark.\n if (countOf(shownVersion) > 0 !== snapshot.count > 0) refresh()\n setLocalCounts((counts) => ({ ...counts, [key]: snapshot.count }))\n },\n [documentId, shownVersion, countOf, refresh]\n )\n\n const downloadMarkup = useCallback(async () => {\n if (!documentId) return\n // A signed version is locked: its markup is never written into its PDF.\n if (currentSigned) {\n notify(SIGNED_LOCKED_REASON, 'info')\n return\n }\n try {\n const { blob, fileName } = await fetchMarkupPdf(\n client,\n documentId,\n snapshotVersion ? snapshotVersion : undefined\n )\n saveFile(blob, fileName)\n } catch (e) {\n notify(e instanceof Error ? e.message : 'The markup could not be downloaded', 'error')\n }\n }, [client, documentId, snapshotVersion, saveFile, notify, currentSigned])\n\n // --- Migration of this browser's layer (arbi:annotations:<docId>) ---\n const [legacyCount, setLegacyCount] = useState(0)\n const [migrating, setMigrating] = useState(false)\n const shared = documentData?.shared\n const loaded = !!documentData\n\n const migrate = useCallback(async () => {\n if (!documentId) return\n const layer = readLegacyLayer(documentId)\n if (!layer) return\n setMigrating(true)\n try {\n const added = await migrateLegacyLayer(documentId, layer, versions, currentVersion, client)\n setLegacyCount(0)\n setLocalCounts({})\n refresh()\n if (added > 0) {\n notify(\n `${added} annotation${added === 1 ? '' : 's'} from this browser saved to the document`,\n 'success',\n {\n description: shared\n ? 'They are now part of the shared markup.'\n : 'They are saved with the document, visible only to you.',\n }\n )\n }\n } catch (e) {\n notify(\n e instanceof Error ? e.message : 'The annotations from this browser could not be saved',\n 'error',\n { description: 'They are still kept in this browser; open the document again to retry.' }\n )\n } finally {\n setMigrating(false)\n }\n }, [client, documentId, versions, currentVersion, refresh, shared, notify])\n\n useEffect(() => {\n if (!documentId || !loaded) return\n const layer = readLegacyLayer(documentId)\n if (!layer) {\n setLegacyCount(0)\n return\n }\n if (layer.annotations.length === 0) {\n forgetLegacyLayer(documentId)\n setLegacyCount(0)\n return\n }\n // A private document is the user's own: its old layer simply becomes its markup. A shared one\n // would show the marks to everyone, so the user decides.\n if (shared) setLegacyCount(layer.annotations.length)\n else void migrate()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [documentId, loaded, shared])\n\n const legacyPrompt: LegacyPrompt | null =\n legacyCount > 0 && !snapshotVersion\n ? {\n count: legacyCount,\n busy: migrating,\n add: () => void migrate(),\n discard: () => {\n if (documentId) forgetLegacyLayer(documentId)\n setLegacyCount(0)\n },\n }\n : null\n\n // --- Markup on an older version (a newer version starts with none) ---\n const [copying, setCopying] = useState(false)\n const olderWithMarkup = versionsWithMarkup(versions)\n .filter((v) => v.n !== currentVersion)\n .sort((a, b) => b.n - a.n)[0]\n const olderNote: OlderMarkupNote | null =\n !snapshotVersion && !hasMarkup && olderWithMarkup\n ? {\n version: olderWithMarkup.n,\n busy: copying,\n signed: currentSigned,\n copy: () => {\n if (!documentId) return\n setCopying(true)\n copyOpenThreads(documentId, olderWithMarkup.n, client)\n .then((n) => {\n if (n > 0) {\n setLocalCounts((c) => ({ ...c, [`${documentId}@${currentVersion}`]: n }))\n refresh()\n }\n notify(\n n > 0\n ? `${n} open comment thread${n === 1 ? '' : 's'} copied to version ${currentVersion}`\n : `Version ${olderWithMarkup.n} has no open comments`,\n n > 0 ? 'success' : 'info',\n // The markup is stored beside the version, so the sealed bytes do not change.\n n > 0 && currentSigned ? { description: SIGNED_UNCHANGED } : undefined\n )\n })\n .catch((e: unknown) =>\n notify(e instanceof Error ? e.message : 'The comments could not be copied', 'error')\n )\n .finally(() => setCopying(false))\n },\n }\n : null\n\n return {\n hasMarkup,\n showOriginal,\n setShowOriginal,\n onMarkupChange,\n downloadMarkup,\n legacyPrompt,\n olderNote,\n }\n}\n","/**\n * Saving a frozen copy: a SEPARATE document derived from the version it was frozen from\n * (`derived_from`, role `redaction` or `annotated`), never a new version of it. The original keeps\n * its place in every list and stays the current version; the copy sits beside it, in the same\n * folder and with the same workspace sharing.\n */\n\nimport type { DocumentToolsEnvironment, DocumentUploadQuery } from './environment'\n\nexport interface FrozenCopySource {\n /** The version on screen, which the copy is derived from. */\n documentId: string\n fileName: string | null | undefined\n shared: boolean\n folder?: string | null\n /**\n * The original's workspace, where the copy goes: named on the upload, so it never lands in\n * whichever workspace the session has open (the server refuses one whose key it lacks).\n */\n workspaceId?: string | null\n}\n\nconst baseName = (fileName: string | null | undefined) =>\n (fileName || 'document').replace(/\\.pdf$/i, '')\n\n/** \"Contract.pdf\" becomes \"Contract (redacted).pdf\"; a .txt or .docx keeps its extension inside. */\nexport function frozenCopyName(fileName: string | null | undefined, redacted: boolean): string {\n return `${baseName(fileName)} (${redacted ? 'redacted' : 'annotated'}).pdf`\n}\n\nexport function redactionLogName(fileName: string | null | undefined): string {\n return `${baseName(fileName)} (redaction log).csv`\n}\n\n/** Upload the frozen bytes as a new document derived from `source`; returns its id, if any. */\nexport async function uploadFrozenCopy(\n upload: NonNullable<DocumentToolsEnvironment['uploadDocument']>,\n bytes: Uint8Array,\n source: FrozenCopySource,\n redacted: boolean\n): Promise<string | undefined> {\n const file = new File([bytes as BlobPart], frozenCopyName(source.fileName, redacted), {\n type: 'application/pdf',\n })\n const query: DocumentUploadQuery = {\n derived_from: [source.documentId],\n derived_role: redacted ? 'redaction' : 'annotated',\n shared: source.shared,\n }\n if (source.folder) query.folder = source.folder\n if (source.workspaceId) query.workspace_ext_id = source.workspaceId\n const response = await upload({ file, query })\n return response?.doc_ext_ids?.[0]\n}\n","/**\n * Whether the document on screen can be annotated: only a PDF the viewer is actually showing.\n * Text and Word files are shown as a PDF too, so they qualify; images, audio, video, files that\n * cannot be previewed, drafts and streaming output do not, and neither does a read-only snapshot\n * or a comparison.\n */\n\nexport interface AnnotatableState {\n activeTab: string\n /** The PDF bytes have been fetched. */\n hasPdf: boolean\n isImage: boolean\n isVideo: boolean\n isAudio: boolean\n isDownloadOnly: boolean\n isDraft: boolean\n isStreaming: boolean\n isSnapshot: boolean\n isComparing: boolean\n}\n\nexport function canAnnotate(s: AnnotatableState): boolean {\n return (\n s.activeTab === 'pdf' &&\n s.hasPdf &&\n !s.isImage &&\n !s.isVideo &&\n !s.isAudio &&\n !s.isDownloadOnly &&\n !s.isDraft &&\n !s.isStreaming &&\n !s.isSnapshot &&\n !s.isComparing\n )\n}\n","/**\n * Reactive connectivity from React Query's `onlineManager` (the browser's online events, plus\n * whatever the host feeds it, e.g. a WebSocket). The markup autosave waits while it is false.\n */\n\nimport { useSyncExternalStore } from 'react'\nimport { onlineManager } from '@tanstack/react-query'\n\nexport function useIsOnline(): boolean {\n return useSyncExternalStore(\n (onChange) => onlineManager.subscribe(onChange),\n () => onlineManager.isOnline(),\n () => true\n )\n}\n","/**\n * The bytes a document viewer shows: the PDF of a document version (`/view`), or for media the\n * stored file itself (`/download`), through the host's API client. Keyed on the version, since a\n * document keeps its id across versions: a new version (a save, a signed copy) must never show the\n * previous one's file.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport { useDocumentTools } from './environment'\nimport { fetchDocumentFile, fetchDocumentPdf } from './document-pdf'\n\nimport type { DocumentBytesKind } from '../query-keys'\nexport type { DocumentBytesKind }\n\nexport { documentBytesKey } from '../query-keys'\nimport { documentBytesKey } from '../query-keys'\n\nexport interface UseDocumentBytesOptions {\n /** The document's current version, so a new one reads afresh. */\n version: number | null | undefined\n kind: DocumentBytesKind\n enabled?: boolean\n /**\n * Bytes to use when the network cannot give them (a copy kept on this device): asked first when\n * offline, and again when the request fails.\n */\n fallback?: () => Promise<Blob | undefined>\n}\n\n/** A document's (or version reference's) bytes; see {@link UseDocumentBytesOptions}. */\nexport function useDocumentBytes(documentRef: string, options: UseDocumentBytesOptions) {\n const { client } = useDocumentTools()\n const { version, kind, enabled = true, fallback } = options\n return useQuery({\n queryKey: documentBytesKey(documentRef, version ?? null, kind),\n queryFn: async ({ signal }) => {\n if (fallback && typeof navigator !== 'undefined' && navigator.onLine === false) {\n const offline = await fallback()\n if (offline) return offline\n }\n try {\n return await (kind === 'original' ? fetchDocumentFile : fetchDocumentPdf)(\n client,\n documentRef,\n { signal }\n )\n } catch (error) {\n const offline = await fallback?.()\n if (offline) return offline\n throw error\n }\n },\n enabled: enabled && !!documentRef,\n // 'always' so it still runs offline: the fallback serves a copy kept on this device.\n networkMode: 'always',\n staleTime: Infinity,\n })\n}\n","/**\n * Electronic signing. The backend (`src/core/esign.py` in ARBI) defines what a signature binds;\n * the helpers mirror the two pieces the browser must reproduce exactly: the statement of intent\n * shown to the signer, and the SHA-256 of the PDF the viewer displayed.\n */\n\nimport { signMessage, unlockIdentityWithPassword, type components } from '@arbidocs/client'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport { parseVersionRef } from '../artifacts/versions'\nimport { useDocumentTools, type DocumentToolsClient } from './environment'\nimport { arbiQueryKeys } from '../query-keys'\n\n/**\n * Who signs: the name only. A role, a firm or a place go on the page as ordinary annotation text,\n * which is not part of the signature.\n */\nexport type SignerDetails = components['schemas']['SignerDetails']\n\n/** Same sentence as `esign.intent_text`; the dialog refuses to sign if the server's differs. */\nexport function intentText(signer: SignerDetails): string {\n return `I, ${signer.name.trim()}, sign this document electronically. I intend this electronic signature to have the same effect as my handwritten signature.`\n}\n\nexport async function sha256Hex(blob: Blob): Promise<string> {\n const digest = await crypto.subtle.digest('SHA-256', new Uint8Array(await blob.arrayBuffer()))\n return Array.from(new Uint8Array(digest), (b) => b.toString(16).padStart(2, '0')).join('')\n}\n\n/** A signature box drawn on the annotation overlay, as the signing API's placement. */\nexport function toAppearance(box: {\n page: number\n rect: { x: number; y: number; w: number; h: number }\n}): { page: number; x: number; y: number; width: number; height: number } {\n // The layer counts pages from 1, the signing API from 0. Both use fractions of the page as\n // displayed, origin top-left.\n return { page: box.page - 1, x: box.rect.x, y: box.rect.y, width: box.rect.w, height: box.rect.h }\n}\n\n/**\n * The smallest box the backend can draw a legible signature in: the signer's name and the\n * details line shrink to fit, so a box under these fractions of the page is shrunk to near\n * unreadable size. The backend's own default box is 0.40 x 0.10.\n */\nconst MIN_SIGNATURE_BOX = { width: 0.3, height: 0.07 }\n\nexport function isLegibleSignatureBox(rect: { w: number; h: number }): boolean {\n return rect.w >= MIN_SIGNATURE_BOX.width && rect.h >= MIN_SIGNATURE_BOX.height\n}\n\n// ── Signing through the API ─────────────────────────────────────────────────────────────────\n\nexport type SignatureAppearance = components['schemas']['SignatureAppearance']\nexport type SignatureStatusResponse = components['schemas']['SignatureStatusResponse']\nexport type SignatureRecord = components['schemas']['SignatureRecord']\nexport type SignDocumentResponse = components['schemas']['SignDocumentResponse']\n\nconst SIGNATURES_PATH = '/v1/document/{document_ext_id}/signatures'\n/**\n * The same key openapi-react-query gives this request (`['get', path, init]`), so a host that\n * reads or persists the API cache by path treats it like its own queries.\n */\n\nfunction errorDetail(error: unknown, fallback: string): string {\n const detail = (error as { detail?: unknown } | undefined)?.detail\n return typeof detail === 'string' ? detail : fallback\n}\n\n/** Whether a document version is a signed copy, and its signatures. */\nexport async function fetchDocumentSignatures(\n client: DocumentToolsClient,\n documentRef: string\n): Promise<SignatureStatusResponse> {\n const { docId, version } = parseVersionRef(documentRef)\n const { data, error } = await client.GET(SIGNATURES_PATH, {\n params: { path: { document_ext_id: docId }, ...(version ? { query: { version } } : {}) },\n })\n if (!data) throw new Error(errorDetail(error, 'The signatures could not be read'))\n return data\n}\n\n/**\n * Is a document version a signed copy? `documentId` is a document id (its current version) or a\n * version reference `doc-…@v{n}`. Needs a React Query `QueryClientProvider`.\n */\nexport function useDocumentSignatures(documentId: string | null | undefined, enabled = true) {\n const { client } = useDocumentTools()\n const { docId, version } = parseVersionRef(documentId)\n return useQuery({\n queryKey: arbiQueryKeys.documentSignatures(docId ?? '', version),\n queryFn: () => fetchDocumentSignatures(client, documentId!),\n enabled: enabled && !!docId,\n staleTime: 60_000,\n })\n}\n\n/**\n * Why the server would not sign: the PDF of a Word or text document is still being rendered\n * (`preparing`, worth another try in a moment), or the version on screen is no longer the current\n * one (`stale`: only the current version can be signed, so the signer reopens it).\n */\nexport type SigningErrorReason = 'preparing' | 'stale' | 'failed'\n\nexport class SigningError extends Error {\n readonly reason: SigningErrorReason\n constructor(message: string, reason: SigningErrorReason) {\n super(message)\n this.name = 'SigningError'\n this.reason = reason\n }\n}\n\n/** The 409s the backend's signing router raises, told apart by their wording. */\nfunction signingErrorReason(detail: string): SigningErrorReason {\n if (/still being prepared/i.test(detail)) return 'preparing'\n if (/no longer the current version/i.test(detail)) return 'stale'\n return 'failed'\n}\n\nfunction signingError(error: unknown, fallback: string): SigningError {\n const detail = errorDetail(error, fallback)\n return new SigningError(detail, signingErrorReason(detail))\n}\n\n/** How often, and how long apart, a prepare is retried while the PDF is still being rendered. */\nexport const PREPARE_RETRIES = 3\nconst PREPARE_RETRY_DELAY_MS = 1500\n\nconst wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\n\nexport interface SignDocumentVars {\n documentId: string\n /**\n * The PDF bytes the viewer is showing (`GET /view?version=`, never the original's download): the\n * signer signs exactly these.\n */\n pdfBlob: Blob\n /**\n * The version `pdfBlob` is of. The server signs only the current version and refuses\n * (`SigningError` `stale`) when this one has been superseded. Omitted = the current version.\n */\n version?: number\n email: string\n password: string\n signer: SignerDetails\n /** Where the signature goes; omitted = the backend default (bottom of the last page). */\n appearance?: SignatureAppearance\n /** Draw the signing date under the signature. Default off: only the signature is drawn. */\n includeDate?: boolean\n}\n\n/**\n * Sign a document: the server prepares the statement, the browser checks that it covers the PDF\n * on screen under the wording the signer read, re-derives the user's Ed25519 key from their\n * password and signs it, and the server seals the signed copy as a new version.\n *\n * What is drawn on the page is only the signature (the signer's name as the signature mark) and,\n * with `includeDate`, the date; anyone can click it to open its certificate. A role, a firm or a\n * place go on the page as ordinary annotation text, which is not part of the signature.\n */\nexport async function signDocument(\n client: DocumentToolsClient,\n deploymentDomain: string,\n {\n documentId,\n pdfBlob,\n email,\n password,\n signer,\n appearance,\n includeDate = false,\n version,\n }: SignDocumentVars\n): Promise<SignDocumentResponse> {\n const path = { document_ext_id: documentId }\n // One body for both calls: the server refuses a /sign whose include_date (or placement) differs\n // from what was prepared, since what the signature shows is part of what is signed.\n const body = {\n signer: { name: signer.name },\n ...(appearance ? { appearance } : {}),\n include_date: includeDate,\n ...(version ? { version } : {}),\n }\n\n // A Word or text document's PDF is rendered after upload: while it is, prepare says so, and a\n // short wait usually sees it ready.\n const prepare = () =>\n client.POST('/v1/document/{document_ext_id}/sign/prepare', { params: { path }, body })\n let prepared = await prepare()\n for (let attempt = 0; !prepared.data && attempt < PREPARE_RETRIES; attempt++) {\n if (signingError(prepared.error, '').reason !== 'preparing') break\n await wait(PREPARE_RETRY_DELAY_MS)\n prepared = await prepare()\n }\n if (!prepared.data) throw signingError(prepared.error, 'Could not prepare signing')\n const { statement, intent, source_sha256, timestamp } = prepared.data\n // Sign only what was on screen, under the wording the signer read.\n if ((await sha256Hex(pdfBlob)) !== source_sha256) {\n throw new Error('The document changed since it was opened. Reopen it and sign again.')\n }\n if (intent !== intentText(signer)) throw new Error('Signing statement mismatch; not signed.')\n\n // The re-typed password must open the session's identity, which is the key the server verifies.\n const identity = await unlockIdentityWithPassword(email, password, deploymentDomain)\n const signed = await client.POST('/v1/document/{document_ext_id}/sign', {\n params: { path },\n body: { ...body, timestamp, signature: signMessage(statement, identity) },\n })\n if (!signed.data) throw signingError(signed.error, 'Signing failed')\n return signed.data\n}\n\n/** The signing mutation. On success the host hears the document changed (`'signed'`). */\nexport function useSignDocument() {\n const env = useDocumentTools()\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (vars: SignDocumentVars) => {\n if (!env.deploymentDomain) throw new Error('Signing is not set up: no deployment domain')\n return signDocument(env.client, env.deploymentDomain, vars)\n },\n onSuccess: async (result) => {\n // The signed copy is the document's new current version: the host refreshes its row,\n // versions and rendered PDF, and the signature badge reads again.\n await env.onDocumentsChanged?.([result.doc_ext_id], 'signed')\n await queryClient.invalidateQueries({ queryKey: arbiQueryKeys.documentSignatures() })\n },\n })\n}\n","/**\n * Checking a signature from its reference, without signing in: the public certificate behind the\n * link on a signed PDF's signature (`GET /v1/sign/verify/{reference}`). It names who signed and\n * when, says whether the signed document is unchanged since, and carries the SHA-256 of the signed\n * PDF and of each signed revision, so anyone can check their own copy in the browser (the file is\n * never uploaded). No email addresses and no document content.\n */\n\nimport type { components } from '@arbidocs/client'\nimport { useQuery } from '@tanstack/react-query'\nimport { useDocumentTools, type DocumentToolsClient } from './environment'\nimport { sha256Hex } from './signing'\nimport { arbiQueryKeys } from '../query-keys'\n\nexport const VERIFY_PATH = '/v1/sign/verify/{reference}'\n\nexport type SignatureVerification = components['schemas']['SignatureVerification']\nexport type VerifiedSignature = components['schemas']['VerifiedSignature']\n\n/** A signature reference as the backend issues them: `sig-` and 128 random bits in hex. */\nconst REFERENCE = /^sig-[0-9a-f]{32}$/\n\nexport function isSignatureReference(reference: string | null | undefined): boolean {\n return !!reference && REFERENCE.test(reference)\n}\n\nexport class SignatureVerificationError extends Error {\n constructor(\n message: string,\n readonly status?: number\n ) {\n super(message)\n this.name = 'SignatureVerificationError'\n }\n}\n\nconst VERIFY_ERRORS: Record<number, string> = {\n 404: 'No signature has this reference.',\n 429: 'Too many checks, try again in a minute.',\n}\n\nexport async function fetchSignatureVerification(\n client: DocumentToolsClient,\n reference: string\n): Promise<SignatureVerification> {\n if (!isSignatureReference(reference)) {\n throw new SignatureVerificationError('This is not a signature reference.')\n }\n const { data, response } = await client.GET(VERIFY_PATH, {\n params: { path: { reference } },\n })\n if (!response.ok || !data) {\n throw new SignatureVerificationError(\n VERIFY_ERRORS[response.status] ?? 'The signature could not be checked right now.',\n response.status\n )\n }\n return data\n}\n\n/** The certificate of a signature reference. Needs a `<DocumentToolsProvider>` (no user). */\nexport function useSignatureVerification(reference: string | null | undefined) {\n const { client } = useDocumentTools()\n return useQuery({\n queryKey: arbiQueryKeys.signatureVerification(reference ?? ''),\n queryFn: () => fetchSignatureVerification(client, reference!),\n enabled: !!reference,\n retry: false,\n })\n}\n\n/**\n * What a copy is: the signed document as it stands (`current`), the document as it was when an\n * earlier signer signed it (`earlier`, a counter-signed PDF's earlier revision), or neither.\n */\nexport type CopyMatch =\n { kind: 'current' } | { kind: 'earlier'; signature: VerifiedSignature } | { kind: 'none' }\n\n/** Compare a file with the signed PDF and its signed revisions. Hashed here; nothing is uploaded. */\nexport async function matchSignedCopy(\n file: Blob,\n verification: Pick<SignatureVerification, 'document_sha256' | 'signatures'>\n): Promise<CopyMatch> {\n const hash = await sha256Hex(file)\n if (hash === verification.document_sha256.toLowerCase()) return { kind: 'current' }\n const signature = verification.signatures.find((s) => s.sha256.toLowerCase() === hash)\n return signature ? { kind: 'earlier', signature } : { kind: 'none' }\n}\n","/**\n * Signature requests: an author places fields (signature, initials, date, name) on the PDF of one\n * exact document version and assigns each to a signer: a workspace member (a guest too), or anyone\n * by email, who is invited to the workspace and signs once they join. A Word document's own\n * signature fields (Insert › Signature field) come back from `suggest` placed exactly, with their\n * signer (`source: 'anchor'`). Each signer is then walked\n * through their fields, adopts a signature once and applies it at each. They sign ONCE for all of\n * their fields: the server's statement binds the PDF they were shown, every field they applied and\n * what they adopted. The last signature draws every field and seals the signed copy as the\n * document's next version (see `src/core/signature_requests.py` in ARBI).\n */\n\nimport { signMessage, unlockIdentityWithPassword, type components } from '@arbidocs/client'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport { workspaces } from '@arbidocs/sdk/browser'\nimport { useDocumentTools, type DocumentToolsClient } from './environment'\nimport { intentText, sha256Hex, SigningError } from './signing'\nimport { arbiQueryKeys } from '../query-keys'\nimport { useArbiHost } from '../host/config'\n\n/**\n * The open workspace, when the host has an `Arbi` with one, and a guard that keeps a read made for\n * it only if that workspace stayed open on the server meanwhile (these lists are the open\n * workspace's there): a read that crosses a switch is dropped, never cached as another's.\n */\nfunction useOpenWorkspaceRead() {\n const arbi = useArbiHost().arbi\n const workspaceId = arbi?.hasWorkspace ? arbi.getWorkspaceId() : undefined\n const read = <T>(run: () => Promise<T>): Promise<T> =>\n arbi && workspaceId ? arbi.readInWorkspace(workspaceId, run) : run()\n return { workspaceId, read }\n}\n\nexport type SignatureField = components['schemas']['SignatureField']\nexport type SignatureFieldType = SignatureField['type']\nexport type SignatureRequest = components['schemas']['SignatureRequestResponse']\nexport type SignatureRequestSigner = components['schemas']['SignatureRequestSigner']\nexport type SignerProgress = components['schemas']['SignerProgress']\nexport type SuggestedSignatureField = components['schemas']['SuggestedSignatureField']\nexport type AdoptedSignature = components['schemas']['AdoptedSignature']\nexport type SignRequestSignResponse = components['schemas']['SignRequestSignResponse']\n\n/** Field types in the order the editor offers them. */\nexport const SIGNATURE_FIELD_TYPES: readonly SignatureFieldType[] = [\n 'signature',\n 'initials',\n 'date',\n 'name',\n]\n\nexport const FIELD_TYPE_LABELS: Record<SignatureFieldType, string> = {\n signature: 'Signature',\n initials: 'Initials',\n date: 'Date signed',\n name: 'Name',\n}\n\n/**\n * Default size of a new field, as fractions of the page (the backend draws to fit the box). The\n * same sizes the server's suggester places fields in (`esign_suggest._SIZE`).\n */\nexport const DEFAULT_FIELD_SIZE: Record<SignatureFieldType, { width: number; height: number }> = {\n signature: { width: 0.28, height: 0.05 },\n initials: { width: 0.1, height: 0.04 },\n date: { width: 0.22, height: 0.028 },\n name: { width: 0.28, height: 0.028 },\n}\n\n/** How far each signer has got, as the request's sender sees it. */\nexport const SIGNER_PROGRESS_LABELS: Record<SignerProgress, string> = {\n invited: 'Invited',\n registered: 'Not opened yet',\n viewed: 'Viewed',\n signed: 'Signed',\n declined: 'Declined',\n}\n\nconst EMAIL = /^[^@\\s<>,;]{1,64}@[^@\\s<>,;]{1,255}\\.[^@\\s<>,;]{1,63}$/\n\n/** Whether a field's signer is an email (someone to invite) rather than a member or request signer. */\nexport const isEmailSigner = (signer: string) => EMAIL.test(signer.trim())\n\n/** The fields carrying a signer's mark: every signer needs at least one to be sent the request. */\nexport const MARK_FIELD_TYPES: readonly SignatureFieldType[] = ['signature', 'initials']\n\nfunction detail(error: unknown, fallback: string): string {\n const d = (error as { detail?: unknown } | undefined)?.detail\n if (typeof d === 'string') return d\n if (Array.isArray(d) && d[0] && typeof d[0] === 'object' && 'msg' in d[0]) {\n return String((d[0] as { msg: unknown }).msg)\n }\n return fallback\n}\n\n/** A short unique id for a new field (the server only needs it unique within the request). */\nexport function newFieldId(): string {\n return `f${Math.random().toString(36).slice(2, 10)}`\n}\n\n/** Initials from a name: \"Olive M. Owner\" -> \"OMO\". */\nexport function initialsOf(name: string): string {\n return name\n .split(/\\s+/)\n .filter(Boolean)\n .map((part) => part[0]!.toUpperCase())\n .join('')\n .slice(0, 4)\n}\n\n/** The fields a signer completes, in the order they are walked through: page, then top to bottom. */\nexport function fieldsInSigningOrder(fields: SignatureField[], signer: string): SignatureField[] {\n return fields\n .filter((f) => f.signer === signer)\n .sort((a, b) => a.page - b.page || a.y - b.y || a.x - b.x)\n}\n\n/** Why a draft cannot be sent yet, or null when it can. Mirrors the server's checks. */\nexport function sendBlocker(fields: SignatureField[]): string | null {\n if (fields.length === 0) return 'Place at least one field.'\n const signers = [...new Set(fields.map((f) => f.signer))]\n for (const signer of signers) {\n if (!fields.some((f) => f.signer === signer && MARK_FIELD_TYPES.includes(f.type))) {\n return 'Every signer needs a signature or initials field.'\n }\n }\n return null\n}\n\n/**\n * Suggested fields grouped by signature block; `assign` maps a block (`group`) to the signer its\n * fields go to. A field placed in the Word document that names its signer goes to them: the\n * member with that email (`members`, by lowercased email), else the email itself (an invitee).\n * Unassigned blocks are left out.\n */\nexport function fieldsFromSuggestions(\n suggestions: SuggestedSignatureField[],\n assign: Record<number, string | undefined>,\n members: ReadonlyMap<string, string> = new Map()\n): SignatureField[] {\n return suggestions.flatMap((s) => {\n const email = s.signer_email?.toLowerCase()\n const signer = email ? (members.get(email) ?? email) : assign[s.group]\n if (!signer) return []\n return [\n {\n id: newFieldId(),\n type: s.type,\n page: s.page,\n x: s.x,\n y: s.y,\n width: s.width,\n height: s.height,\n signer,\n required: s.required ?? true,\n },\n ]\n })\n}\n\n/** The Word document's own fields (found by their anchors) and the optional layout suggestions. */\nexport function splitSuggestions(suggestions: SuggestedSignatureField[]) {\n return {\n placed: suggestions.filter((s) => s.source === 'anchor'),\n extras: suggestions.filter((s) => s.source !== 'anchor'),\n }\n}\n\n// ── Reads ───────────────────────────────────────────────────────────────────────────────────\n\nexport async function fetchDocumentSignatureRequests(\n client: DocumentToolsClient,\n documentId: string\n): Promise<SignatureRequest[]> {\n const { data, error } = await client.GET('/v1/document/{document_ext_id}/signature-requests', {\n params: { path: { document_ext_id: documentId } },\n })\n if (!data) throw new Error(detail(error, 'The signature requests could not be read'))\n return data\n}\n\n/** A document's signature requests, newest first. */\nexport function useDocumentSignatureRequests(\n documentId: string | null | undefined,\n enabled = true\n) {\n const { client } = useDocumentTools()\n return useQuery({\n queryKey: arbiQueryKeys.signatureRequestsForDocument(documentId ?? ''),\n queryFn: () => fetchDocumentSignatureRequests(client, documentId!),\n enabled: enabled && !!documentId,\n staleTime: 15_000,\n })\n}\n\n/** Requests in the active workspace still waiting for the current user's signature. */\nexport function useSignatureRequestsAwaitingMe(enabled = true) {\n const { client } = useDocumentTools()\n const { workspaceId, read } = useOpenWorkspaceRead()\n return useQuery({\n queryKey: arbiQueryKeys.signatureRequestsAwaitingMe(workspaceId),\n queryFn: () =>\n read(async () => {\n const { data, error } = await client.GET('/v1/signature-requests', {\n params: { query: { awaiting_me: true } },\n })\n if (!data) throw new Error(detail(error, 'The signature requests could not be read'))\n return data\n }),\n enabled,\n staleTime: 15_000,\n })\n}\n\nexport function useSignatureRequest(requestId: string | null | undefined) {\n const { client } = useDocumentTools()\n return useQuery({\n queryKey: arbiQueryKeys.signatureRequest(requestId ?? ''),\n queryFn: async () => {\n const { data, error } = await client.GET('/v1/signature-requests/{request_ext_id}', {\n params: { path: { request_ext_id: requestId! } },\n })\n if (!data) throw new Error(detail(error, 'The signature request could not be read'))\n return data\n },\n enabled: !!requestId,\n })\n}\n\n/** A signer the Word document's placed fields name, with the name they give. */\nexport interface NamedSigner {\n email: string\n name: string\n}\n\n/** What a document asks to be signed: the fields found, and the signers its Word fields name. */\nexport interface SignatureFieldSuggestions {\n fields: SuggestedSignatureField[]\n /**\n * Named even when the PDF shows none of the Word fields' anchors (the fields are then placed by\n * hand): who each email belongs to. Empty from a server that does not report them.\n */\n signers: NamedSigner[]\n}\n\nexport async function signatureFieldSuggestions(\n client: DocumentToolsClient,\n documentId: string,\n version?: number\n): Promise<SignatureFieldSuggestions> {\n const { data, error } = await client.GET(\n '/v1/document/{document_ext_id}/signature-fields/suggest',\n {\n params: { path: { document_ext_id: documentId }, ...(version ? { query: { version } } : {}) },\n }\n )\n if (!data) throw new Error(detail(error, 'Signature blocks could not be read'))\n return { fields: data.fields, signers: (data as { signers?: NamedSigner[] }).signers ?? [] }\n}\n\nexport async function suggestSignatureFields(\n client: DocumentToolsClient,\n documentId: string,\n version?: number\n): Promise<SuggestedSignatureField[]> {\n return (await signatureFieldSuggestions(client, documentId, version)).fields\n}\n\n// ── Prepare ─────────────────────────────────────────────────────────────────────────────────\n\nexport interface SaveSignatureRequestVars {\n documentId: string\n /** The version the fields were placed on (the PDF shown). Omitted = current. */\n version?: number\n fields: SignatureField[]\n message?: string\n /** Existing draft to update instead of creating a new request. */\n requestId?: string\n /** Send it to the signers (else it is saved as a draft). */\n send: boolean\n}\n\nexport async function saveSignatureRequest(\n client: DocumentToolsClient,\n { documentId, version, fields, message, requestId, send }: SaveSignatureRequestVars\n): Promise<SignatureRequest> {\n if (!requestId) {\n const { data, error } = await client.POST('/v1/document/{document_ext_id}/signature-requests', {\n params: { path: { document_ext_id: documentId } },\n body: { fields, message: message || null, send, ...(version ? { version } : {}) },\n })\n if (!data) throw new Error(detail(error, 'The signature request could not be saved'))\n return data\n }\n const path = { request_ext_id: requestId }\n const updated = await client.PATCH('/v1/signature-requests/{request_ext_id}', {\n params: { path },\n body: { fields, message: message ?? null },\n })\n if (!updated.data) throw new Error(detail(updated.error, 'The draft could not be saved'))\n if (!send) return updated.data\n const sent = await client.POST('/v1/signature-requests/{request_ext_id}/send', {\n params: { path },\n })\n if (!sent.data) throw new Error(detail(sent.error, 'The request could not be sent'))\n return sent.data\n}\n\nfunction useInvalidateRequests() {\n const queryClient = useQueryClient()\n return () => queryClient.invalidateQueries({ queryKey: arbiQueryKeys.signatureRequests() })\n}\n\nexport function useSaveSignatureRequest() {\n const { client } = useDocumentTools()\n const invalidate = useInvalidateRequests()\n return useMutation({\n mutationFn: (vars: SaveSignatureRequestVars) => saveSignatureRequest(client, vars),\n onSuccess: invalidate,\n })\n}\n\nexport function useVoidSignatureRequest() {\n const { client } = useDocumentTools()\n const invalidate = useInvalidateRequests()\n return useMutation({\n mutationFn: async (requestId: string) => {\n const { data, error } = await client.POST('/v1/signature-requests/{request_ext_id}/void', {\n params: { path: { request_ext_id: requestId } },\n })\n if (!data) throw new Error(detail(error, 'The request could not be voided'))\n return data\n },\n onSuccess: invalidate,\n })\n}\n\nexport function useDeclineSignatureRequest() {\n const { client } = useDocumentTools()\n const invalidate = useInvalidateRequests()\n return useMutation({\n mutationFn: async ({ requestId, reason }: { requestId: string; reason?: string }) => {\n const { data, error } = await client.POST('/v1/signature-requests/{request_ext_id}/decline', {\n params: { path: { request_ext_id: requestId } },\n body: { reason: reason || null },\n })\n if (!data) throw new Error(detail(error, 'Could not decline'))\n return data\n },\n onSuccess: invalidate,\n })\n}\n\n// ── Sign ────────────────────────────────────────────────────────────────────────────────────\n\nexport interface SignRequestVars {\n request: SignatureRequest\n /** The PDF the signer was walked through (`GET /view?version=` of the request's version). */\n pdfBlob: Blob\n email: string\n password: string\n adopted: AdoptedSignature\n /** The ids of the fields the signer applied: every required one of theirs. */\n fields: string[]\n}\n\n/**\n * Sign all of the signer's fields at once: the server prepares the statement, the browser checks\n * it covers the PDF on screen under the wording the signer read, re-derives the Ed25519 key from\n * the password and signs. Resolves with `completed` when this was the last signature.\n */\nexport async function signSignatureRequest(\n client: DocumentToolsClient,\n deploymentDomain: string,\n { request, pdfBlob, email, password, adopted, fields }: SignRequestVars\n): Promise<SignRequestSignResponse> {\n const path = { request_ext_id: request.external_id }\n const body = { adopted, fields }\n const prepared = await client.POST('/v1/signature-requests/{request_ext_id}/sign/prepare', {\n params: { path },\n body,\n })\n if (!prepared.data) {\n throw new SigningError(detail(prepared.error, 'Could not prepare signing'), 'failed')\n }\n const { statement, intent, source_sha256, timestamp } = prepared.data\n if (source_sha256 !== request.source_sha256 || (await sha256Hex(pdfBlob)) !== source_sha256) {\n throw new SigningError('The document changed since it was sent. Ask for it again.', 'stale')\n }\n if (intent !== intentText({ name: adopted.name })) {\n throw new Error('Signing statement mismatch; not signed.')\n }\n const identity = await unlockIdentityWithPassword(email, password, deploymentDomain)\n const signed = await client.POST('/v1/signature-requests/{request_ext_id}/sign', {\n params: { path },\n body: { ...body, timestamp, signature: signMessage(statement, identity) },\n })\n if (!signed.data) throw new SigningError(detail(signed.error, 'Signing failed'), 'failed')\n return signed.data\n}\n\nexport function useSignSignatureRequest() {\n const env = useDocumentTools()\n const invalidate = useInvalidateRequests()\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (vars: SignRequestVars) => {\n if (!env.deploymentDomain) throw new Error('Signing is not set up: no deployment domain')\n return signSignatureRequest(env.client, env.deploymentDomain, vars)\n },\n onSuccess: async (result) => {\n await invalidate()\n if (result.completed && result.request.doc_ext_id) {\n await env.onDocumentsChanged?.([result.request.doc_ext_id], 'signed')\n await queryClient.invalidateQueries({ queryKey: arbiQueryKeys.documentSignatures() })\n }\n },\n })\n}\n\n// ── Who can sign ────────────────────────────────────────────────────────────────────────────\n\nexport interface SignerCandidate {\n externalId: string\n name: string\n email: string\n role: string\n}\n\n/**\n * The people in the active workspace who may sign: owners, collaborators and guests (an agent never\n * does). The first one listed is the current user when they are a member.\n */\nexport function useSignerCandidates(enabled = true) {\n const { client, user } = useDocumentTools()\n const { workspaceId, read } = useOpenWorkspaceRead()\n return useQuery({\n queryKey: arbiQueryKeys.signatureCandidates(workspaceId ?? ''),\n queryFn: async (): Promise<SignerCandidate[]> => {\n const { data, error } = await read(() => client.GET('/v1/workspace/users'))\n if (!data) throw new Error(detail(error, 'The workspace members could not be read'))\n const people = data\n .filter((m) => m.user.external_id.startsWith('usr-'))\n .map((m) => ({\n externalId: m.user.external_id,\n name: [m.user.given_name, m.user.family_name].filter(Boolean).join(' ') || m.user.email,\n email: m.user.email,\n role: String(m.role),\n }))\n const me = user?.email?.toLowerCase()\n return [...people].sort(\n (a, b) => Number(b.email.toLowerCase() === me) - Number(a.email.toLowerCase() === me)\n )\n },\n enabled,\n staleTime: 60_000,\n })\n}\n\n// ── Invite ──────────────────────────────────────────────────────────────────────────────────\n\n/**\n * Invite signers who are not in the workspace yet, as guests, through the workspace's own invite\n * (`POST /v1/workspace/users` with `confirm_invite`): a registered person is added at once, anyone\n * else is emailed an invitation that lands on the document. Each is asked to sign when they join.\n * Only a workspace owner can invite.\n */\nexport async function inviteSigners(\n client: DocumentToolsClient,\n documentId: string,\n emails: string[]\n): Promise<void> {\n if (!emails.length) return\n const { error, response } = await client.POST('/v1/workspace/users', {\n body: workspaces.addWorkspaceMembersBody({\n emails,\n role: 'guest',\n confirm_invite: true,\n resource_type: 'document',\n resource_ext_id: documentId,\n }),\n })\n if (response.status === 409) {\n throw new Error('Share the document with the workspace before asking others to sign it.')\n }\n // 404 \"No users found to add\": everyone is a member already (nothing to do).\n if (error && response.status !== 404) {\n throw new Error(detail(error, 'The signers could not be invited'))\n }\n}\n\nexport function useInviteSigners() {\n const { client } = useDocumentTools()\n const invalidate = useInvalidateRequests()\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: ({ documentId, emails }: { documentId: string; emails: string[] }) =>\n inviteSigners(client, documentId, emails),\n onSuccess: async () => {\n await invalidate()\n await queryClient.invalidateQueries({ queryKey: arbiQueryKeys.signatureCandidates() })\n },\n })\n}\n","/**\n * A signature saved to one's account, for informal use: inserted into a Word document as a picture,\n * or placed on a PDF as a stamp, and offered again the next time one adopts a signature to sign.\n *\n * It is sealed HERE, in the browser, to the user's own X25519 key (a SealedBox to the public half of\n * the keypair their signing key derives): the server keeps the sealed bytes (`/v1/user/signature`)\n * and can never read them. Only with the user's explicit consent (\"Save to my account for future\n * use\"); Delete removes it from the account completely. A typed mark is saved as its picture too,\n * so every use has an image to place.\n */\n\nimport {\n getUserEncryptionKeypair,\n initSodium,\n sealedBoxDecrypt,\n sealedBoxEncrypt,\n type KeyPair,\n} from '@arbidocs/client'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useDocumentTools, type DocumentToolsClient } from './environment'\nimport { arbiQueryKeys } from '../query-keys'\n\nexport interface SavedSignature {\n name: string\n initials: string\n /** How the signature was adopted (a typed one is saved as its picture as well). */\n style: 'typed' | 'drawn' | 'uploaded'\n initials_style: 'typed' | 'drawn'\n /** Base64 PNGs, transparent around the ink. */\n signature_png: string\n initials_png: string\n}\n\n/** The one line shown wherever a saved signature is placed by hand. */\nexport const INFORMAL_SIGNATURE_NOTE =\n 'Your saved signature or initials are placed as an image on the document.'\n\n/** The user's own keypair (the session's); a host or a test may pass another. */\nexport type KeypairSource = () => Promise<KeyPair | null>\n\nasync function keypair(source: KeypairSource = getUserEncryptionKeypair): Promise<KeyPair> {\n await initSodium()\n const pair = await source()\n if (!pair) throw new Error('Sign in again to use your saved signature.')\n return pair\n}\n\nfunction detail(error: unknown, fallback: string): string {\n const d = (error as { detail?: unknown } | undefined)?.detail\n return typeof d === 'string' ? d : fallback\n}\n\n/** The saved signature, opened with the user's own key; null when none is saved. */\nexport async function fetchSavedSignature(\n client: DocumentToolsClient,\n source?: KeypairSource\n): Promise<SavedSignature | null> {\n const { data, error } = await client.GET('/v1/user/signature')\n if (!data) throw new Error(detail(error, 'Your saved signature could not be read'))\n if (!data.sealed) return null\n const pair = await keypair(source)\n const json = new TextDecoder().decode(sealedBoxDecrypt(data.sealed, pair.secretKey))\n return JSON.parse(json) as SavedSignature\n}\n\n/** Seal it to the user's own key and save it (replacing any saved before). */\nexport async function storeSavedSignature(\n client: DocumentToolsClient,\n signature: SavedSignature,\n source?: KeypairSource\n): Promise<void> {\n const pair = await keypair(source)\n const sealed = sealedBoxEncrypt(\n Uint8Array.from(new TextEncoder().encode(JSON.stringify(signature))),\n pair.publicKey\n )\n const { error, response } = await client.PUT('/v1/user/signature', { body: { sealed } })\n if (!response.ok) throw new Error(detail(error, 'Your signature could not be saved'))\n}\n\n/** Remove it from the account completely. */\nexport async function deleteSavedSignature(client: DocumentToolsClient): Promise<void> {\n const { error, response } = await client.DELETE('/v1/user/signature')\n if (!response.ok) throw new Error(detail(error, 'Your saved signature could not be deleted'))\n}\n\nexport function useSavedSignature(enabled = true) {\n const { client } = useDocumentTools()\n return useQuery({\n queryKey: arbiQueryKeys.savedSignature(),\n queryFn: () => fetchSavedSignature(client),\n enabled,\n staleTime: 60_000,\n retry: false,\n })\n}\n\nexport function useStoreSavedSignature() {\n const { client } = useDocumentTools()\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: (signature: SavedSignature) => storeSavedSignature(client, signature),\n onSuccess: (_, signature) =>\n queryClient.setQueryData(arbiQueryKeys.savedSignature(), signature),\n })\n}\n\nexport function useDeleteSavedSignature() {\n const { client } = useDocumentTools()\n const queryClient = useQueryClient()\n return useMutation({\n mutationFn: () => deleteSavedSignature(client),\n onSuccess: () => queryClient.setQueryData(arbiQueryKeys.savedSignature(), null),\n })\n}\n\n/** Base64 PNG bytes, decoded (for an inline picture or an upload). */\nexport function pngBytes(base64: string): Uint8Array {\n const raw = atob(base64)\n const out = new Uint8Array(raw.length)\n for (let i = 0; i < raw.length; i++) out[i] = raw.charCodeAt(i)\n return out\n}\n\n/** A PNG's pixel size, read from its header (IHDR). */\nexport function pngSize(base64: string): { width: number; height: number } {\n const bytes = pngBytes(base64.slice(0, 64))\n const view = new DataView(bytes.buffer)\n return { width: view.getUint32(16), height: view.getUint32(20) }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { arbiQueryKeys } from '../query-keys'\n/** Share one immutable file version with named recipients, independently of workspace membership. */\nimport { signMessage, unlockIdentityWithPassword, type components } from '@arbidocs/client'\nimport type { DocumentToolsClient } from './environment'\nimport { intentText, sha256Hex } from './signing'\nimport type {\n SignatureRequest,\n SignRequestVars,\n SignRequestSignResponse,\n} from './signature-requests'\n\nexport type FileShare = components['schemas']['FileShareResponse']\nexport type CreateFileShare = components['schemas']['CreateFileShare']\n\nfunction failure(error: unknown): Error {\n const detail = (error as { detail?: unknown } | undefined)?.detail\n return new Error(typeof detail === 'string' ? detail : 'The shared file request failed')\n}\n\nexport async function createFileShare(\n client: DocumentToolsClient,\n documentId: string,\n body: CreateFileShare\n) {\n const result = await client.POST('/v1/document/{document_ext_id}/file-shares', {\n params: { path: { document_ext_id: documentId } },\n body,\n })\n if (!result.data) throw failure(result.error)\n return result.data\n}\n\nexport async function getFileShare(client: DocumentToolsClient, id: string): Promise<FileShare> {\n const result = await client.GET('/v1/file-shares/{share_id}', {\n params: { path: { share_id: id } },\n })\n if (!result.data) throw failure(result.error)\n return result.data\n}\n\nexport async function fileShareBytes(\n client: DocumentToolsClient,\n id: string,\n kind: 'view' | 'original' | 'signed'\n) {\n const result = await client.GET('/v1/file-shares/{share_id}/file', {\n params: { path: { share_id: id }, query: { kind } },\n parseAs: 'blob',\n })\n if (!result.data) throw failure(result.error)\n return result.data\n}\n\n/** Adapt only the guided viewer's presentation data; sharing uses its own authorization endpoints. */\nexport function fileShareSigningRequest(share: FileShare): SignatureRequest {\n return {\n external_id: share.external_id,\n doc_ext_id: share.document_ext_id,\n version: share.version,\n source_sha256: share.source_sha256,\n fields: share.fields,\n message: share.message,\n status:\n share.status === 'signing' ? 'sent' : share.status === 'completed' ? 'completed' : 'voided',\n signers: share.recipients\n .filter((r) => r.permission === 'sign')\n .map((r) => ({\n external_id: r.email,\n email: r.email,\n name: r.email,\n status: r.status === 'signed' ? 'signed' : 'pending',\n progress: r.status === 'signed' ? 'signed' : 'registered',\n fields: share.fields.filter((f) => f.signer === r.email).length,\n })),\n created_at: new Date(0).toISOString(),\n stale: false,\n }\n}\n\nexport async function signFileShare(\n client: DocumentToolsClient,\n domain: string,\n vars: SignRequestVars\n): Promise<SignRequestSignResponse> {\n const path = { share_id: vars.request.external_id }\n const body = { adopted: vars.adopted, fields: vars.fields }\n const prepared = await client.POST('/v1/file-shares/{share_id}/sign/prepare', {\n params: { path },\n body,\n })\n if (!prepared.data) throw failure(prepared.error)\n const { statement, timestamp, source_sha256, intent } = prepared.data\n if (\n source_sha256 !== vars.request.source_sha256 ||\n (await sha256Hex(vars.pdfBlob)) !== source_sha256\n )\n throw new Error('The shared file changed. Ask the sender for a new request.')\n if (intent !== intentText({ name: vars.adopted.name }))\n throw new Error('Signing statement mismatch')\n const identity = await unlockIdentityWithPassword(vars.email, vars.password, domain)\n const result = await client.POST('/v1/file-shares/{share_id}/sign', {\n params: { path },\n body: { ...body, timestamp, signature: signMessage(statement, identity) },\n })\n if (!result.data) throw failure(result.error)\n return {\n request: fileShareSigningRequest(result.data),\n completed: result.data.status === 'completed',\n }\n}\n\nexport function useFileShare(client: DocumentToolsClient, shareId: string, signing: boolean) {\n return useQuery({\n queryKey: arbiQueryKeys.fileShare(shareId),\n queryFn: () => getFileShare(client, shareId),\n refetchInterval: signing ? false : 5000,\n })\n}\n\nexport function useFileSharePdf(client: DocumentToolsClient, shareId: string, share?: FileShare) {\n return useQuery({\n queryKey: arbiQueryKeys.fileSharePdf(shareId, share?.status),\n queryFn: () =>\n fileShareBytes(client, shareId, share?.status === 'completed' ? 'signed' : 'view'),\n enabled: !!share?.can_preview,\n staleTime: Infinity,\n })\n}\n\nexport function useFileShares(client: DocumentToolsClient) {\n return useQuery({\n queryKey: arbiQueryKeys.fileShares(),\n queryFn: async () => {\n const result = await client.GET('/v1/file-shares')\n if (!result.data) throw new Error('Could not load shared files')\n return result.data\n },\n })\n}\n"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunkDZUBZ45Y_cjs = require('./chunk-DZUBZ45Y.cjs');
|
|
4
|
+
var chunkN73IMVFF_cjs = require('./chunk-N73IMVFF.cjs');
|
|
5
|
+
var chunkZWFMFOGP_cjs = require('./chunk-ZWFMFOGP.cjs');
|
|
4
6
|
var chunkKC474WVG_cjs = require('./chunk-KC474WVG.cjs');
|
|
5
7
|
var chunkHJDR5HEO_cjs = require('./chunk-HJDR5HEO.cjs');
|
|
6
|
-
var chunkN73IMVFF_cjs = require('./chunk-N73IMVFF.cjs');
|
|
7
|
-
var chunkWEJHHBA2_cjs = require('./chunk-WEJHHBA2.cjs');
|
|
8
|
-
var chunkS6A6FSG7_cjs = require('./chunk-S6A6FSG7.cjs');
|
|
9
8
|
var chunkRCKA7BEF_cjs = require('./chunk-RCKA7BEF.cjs');
|
|
9
|
+
var chunkS6A6FSG7_cjs = require('./chunk-S6A6FSG7.cjs');
|
|
10
10
|
var vanilla = require('zustand/vanilla');
|
|
11
11
|
var sonner = require('sonner');
|
|
12
12
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -457,7 +457,7 @@ function takeDocumentForTurn(input) {
|
|
|
457
457
|
const { documentId, entry } = picked;
|
|
458
458
|
if (entry) {
|
|
459
459
|
const { shownId, showLive } = entry.current();
|
|
460
|
-
if (shownId && shownId !== documentId &&
|
|
460
|
+
if (shownId && shownId !== documentId && chunkZWFMFOGP_cjs.parseVersionRef(shownId).docId === documentId)
|
|
461
461
|
showLive?.();
|
|
462
462
|
}
|
|
463
463
|
return documentId;
|
|
@@ -540,5 +540,5 @@ exports.toMessageMentions = toMessageMentions;
|
|
|
540
540
|
exports.useOpenDocumentId = useOpenDocumentId;
|
|
541
541
|
exports.useRegisterOpenDocument = useRegisterOpenDocument;
|
|
542
542
|
exports.useTurnDocumentId = useTurnDocumentId;
|
|
543
|
-
//# sourceMappingURL=chunk-
|
|
544
|
-
//# sourceMappingURL=chunk-
|
|
543
|
+
//# sourceMappingURL=chunk-LMW46NBD.cjs.map
|
|
544
|
+
//# sourceMappingURL=chunk-LMW46NBD.cjs.map
|