@cellarnode/ui 0.199.0 → 0.200.0

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.
Files changed (60) hide show
  1. package/dist/opportunities/opportunity-stacked-card.js +2 -2
  2. package/dist/opportunities/opportunity-stacked-card.js.map +1 -1
  3. package/dist/portfolio/include-in-matching-toggle.d.ts +30 -0
  4. package/dist/portfolio/include-in-matching-toggle.d.ts.map +1 -0
  5. package/dist/portfolio/include-in-matching-toggle.js +39 -0
  6. package/dist/portfolio/include-in-matching-toggle.js.map +1 -0
  7. package/dist/portfolio/index.d.ts +4 -0
  8. package/dist/portfolio/index.d.ts.map +1 -1
  9. package/dist/portfolio/index.js +2 -0
  10. package/dist/portfolio/index.js.map +1 -1
  11. package/dist/portfolio/not-matching-badge.d.ts +15 -0
  12. package/dist/portfolio/not-matching-badge.d.ts.map +1 -0
  13. package/dist/portfolio/not-matching-badge.js +13 -0
  14. package/dist/portfolio/not-matching-badge.js.map +1 -0
  15. package/dist/portfolio/product-grid-section.d.ts.map +1 -1
  16. package/dist/portfolio/product-grid-section.js +6 -4
  17. package/dist/portfolio/product-grid-section.js.map +1 -1
  18. package/dist/portfolio/product-list-section.d.ts.map +1 -1
  19. package/dist/portfolio/product-list-section.js +11 -5
  20. package/dist/portfolio/product-list-section.js.map +1 -1
  21. package/dist/portfolio/types.d.ts +6 -0
  22. package/dist/portfolio/types.d.ts.map +1 -1
  23. package/dist/product-editor/tabs/product-status-tab.d.ts.map +1 -1
  24. package/dist/product-editor/tabs/product-status-tab.js +22 -9
  25. package/dist/product-editor/tabs/product-status-tab.js.map +1 -1
  26. package/dist/product-editor/types.d.ts +14 -0
  27. package/dist/product-editor/types.d.ts.map +1 -1
  28. package/dist/upload-link/client.d.ts +21 -0
  29. package/dist/upload-link/client.d.ts.map +1 -0
  30. package/dist/upload-link/client.js +141 -0
  31. package/dist/upload-link/client.js.map +1 -0
  32. package/dist/upload-link/copy.d.ts +83 -0
  33. package/dist/upload-link/copy.d.ts.map +1 -0
  34. package/dist/upload-link/copy.js +132 -0
  35. package/dist/upload-link/copy.js.map +1 -0
  36. package/dist/upload-link/fixtures.d.ts +17 -0
  37. package/dist/upload-link/fixtures.d.ts.map +1 -0
  38. package/dist/upload-link/fixtures.js +63 -0
  39. package/dist/upload-link/fixtures.js.map +1 -0
  40. package/dist/upload-link/flow.d.ts +79 -0
  41. package/dist/upload-link/flow.d.ts.map +1 -0
  42. package/dist/upload-link/flow.js +107 -0
  43. package/dist/upload-link/flow.js.map +1 -0
  44. package/dist/upload-link/index.d.ts +10 -0
  45. package/dist/upload-link/index.d.ts.map +1 -0
  46. package/dist/upload-link/index.js +10 -0
  47. package/dist/upload-link/index.js.map +1 -0
  48. package/dist/upload-link/types.d.ts +58 -0
  49. package/dist/upload-link/types.d.ts.map +1 -0
  50. package/dist/upload-link/types.js +17 -0
  51. package/dist/upload-link/types.js.map +1 -0
  52. package/dist/upload-link/upload-link-page.d.ts +41 -0
  53. package/dist/upload-link/upload-link-page.d.ts.map +1 -0
  54. package/dist/upload-link/upload-link-page.js +184 -0
  55. package/dist/upload-link/upload-link-page.js.map +1 -0
  56. package/dist/upload-link/use-upload-link.d.ts +28 -0
  57. package/dist/upload-link/use-upload-link.d.ts.map +1 -0
  58. package/dist/upload-link/use-upload-link.js +155 -0
  59. package/dist/upload-link/use-upload-link.js.map +1 -0
  60. package/package.json +5 -1
@@ -89,6 +89,20 @@ export interface ProductEditorStatus {
89
89
  matchReadiness?: MatchReadiness;
90
90
  onApprove?(): void | Promise<void>;
91
91
  isApproving?: boolean;
92
+ /**
93
+ * The product's matching opt-in (the portfolio item's `matchingEnabled`,
94
+ * CEL-1809). Omit when the host has no portfolio item for this product
95
+ * (create mode) and the control does not render. `onChange` is expected to
96
+ * update optimistically and roll `enabled` back itself on failure; set
97
+ * `isPending` while the request is in flight and `error` to show the
98
+ * rolled-back message.
99
+ */
100
+ matching?: {
101
+ enabled: boolean;
102
+ onChange(next: boolean): void | Promise<void>;
103
+ isPending?: boolean;
104
+ error?: boolean;
105
+ };
92
106
  /**
93
107
  * Model / pipeline that extracted this product (e.g. "gemini-3.5-flash").
94
108
  * Shown in the Provenance card when present.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/product-editor/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/product-editor/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type UploadLinkClient } from "./types.js";
2
+ export interface CreateUploadLinkClientOptions {
3
+ /** The main API origin, e.g. `https://api.cellarnode.com`. */
4
+ baseUrl: string;
5
+ /**
6
+ * The host's authenticated `fetch` (it adds the signed-in session). Used for the link routes only; the content PUT uses the
7
+ * one-time credential from `redeem` and nothing else.
8
+ */
9
+ fetch?: typeof fetch;
10
+ /** Test seam / non-browser: send the bytes. Defaults to an XMLHttpRequest PUT, which reports upload progress. */
11
+ putContent?: (args: {
12
+ url: string;
13
+ authorization: string;
14
+ file: File;
15
+ onProgress: (fraction: number) => void;
16
+ signal?: AbortSignal | undefined;
17
+ }) => Promise<void>;
18
+ }
19
+ /** The HTTP implementation of {@link UploadLinkClient} over the backend's `/upload-links` routes. */
20
+ export declare function createUploadLinkClient(options: CreateUploadLinkClientOptions): UploadLinkClient;
21
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/upload-link/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,gBAAgB,EAGtB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,6BAA6B;IAC5C,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,iHAAiH;IACjH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;QAClB,GAAG,EAAE,MAAM,CAAC;QACZ,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,IAAI,CAAC;QACX,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;QACvC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;KAClC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB;AA8FD,qGAAqG;AACrG,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,6BAA6B,GAAG,gBAAgB,CAmE/F"}
@@ -0,0 +1,141 @@
1
+ import { UploadLinkApiError, } from "./types.js";
2
+ const STATUSES = [
3
+ "open",
4
+ "redeemed",
5
+ "processing",
6
+ "done",
7
+ "failed",
8
+ "expired",
9
+ "cancelled",
10
+ ];
11
+ async function readError(res) {
12
+ let code = null;
13
+ let message = `Request failed (${res.status})`;
14
+ try {
15
+ const body = (await res.json());
16
+ if (typeof body.code === "string")
17
+ code = body.code;
18
+ if (typeof body.error === "string")
19
+ message = body.error;
20
+ }
21
+ catch {
22
+ /* not JSON: keep the generic message */
23
+ }
24
+ return new UploadLinkApiError(res.status, code, message);
25
+ }
26
+ function parseStatus(body) {
27
+ const o = (body !== null && typeof body === "object" ? body : {});
28
+ const target = (o.target ?? {});
29
+ if (typeof o.linkId !== "string" ||
30
+ typeof o.status !== "string" ||
31
+ !STATUSES.includes(o.status)) {
32
+ throw new UploadLinkApiError(502, "CONTRACT_MISMATCH", "Unexpected response from the server.");
33
+ }
34
+ return {
35
+ linkId: o.linkId,
36
+ status: o.status,
37
+ step: typeof o.step === "string" ? o.step : null,
38
+ purpose: o.purpose,
39
+ target: { type: String(target.type ?? ""), id: String(target.id ?? "") },
40
+ sizeBytes: typeof o.sizeBytes === "number" ? o.sizeBytes : null,
41
+ mimeType: typeof o.mimeType === "string" ? o.mimeType : null,
42
+ result: o.result !== null && typeof o.result === "object" && !Array.isArray(o.result)
43
+ ? o.result
44
+ : null,
45
+ failureCode: typeof o.failureCode === "string" ? o.failureCode : null,
46
+ expiresAt: typeof o.expiresAt === "string" ? o.expiresAt : "",
47
+ };
48
+ }
49
+ function xhrPut(args) {
50
+ return new Promise((resolve, reject) => {
51
+ if (args.signal?.aborted)
52
+ return reject(new DOMException("Aborted", "AbortError"));
53
+ const xhr = new XMLHttpRequest();
54
+ xhr.open("PUT", args.url);
55
+ xhr.setRequestHeader("Authorization", args.authorization);
56
+ xhr.setRequestHeader("Content-Type", "application/octet-stream");
57
+ xhr.upload.onprogress = (e) => {
58
+ if (e.lengthComputable && e.total > 0)
59
+ args.onProgress(e.loaded / e.total);
60
+ };
61
+ xhr.onload = () => {
62
+ if (xhr.status >= 200 && xhr.status < 300)
63
+ return resolve();
64
+ let code = null;
65
+ let message = `Upload failed (${xhr.status})`;
66
+ try {
67
+ const body = JSON.parse(xhr.responseText);
68
+ // The decode gate answers with a machine reason; prefer it so the page can say what to fix.
69
+ if (typeof body.reason === "string")
70
+ code = body.reason;
71
+ else if (typeof body.code === "string")
72
+ code = body.code;
73
+ if (typeof body.error === "string")
74
+ message = body.error;
75
+ }
76
+ catch {
77
+ /* keep defaults */
78
+ }
79
+ reject(new UploadLinkApiError(xhr.status, code, message));
80
+ };
81
+ xhr.onerror = () => reject(new UploadLinkApiError(0, "NETWORK", "The connection failed."));
82
+ xhr.onabort = () => reject(new DOMException("Aborted", "AbortError"));
83
+ args.signal?.addEventListener("abort", () => xhr.abort(), { once: true });
84
+ xhr.send(args.file);
85
+ });
86
+ }
87
+ /** The HTTP implementation of {@link UploadLinkClient} over the backend's `/upload-links` routes. */
88
+ export function createUploadLinkClient(options) {
89
+ const base = options.baseUrl.replace(/\/+$/, "");
90
+ const doFetch = options.fetch ?? ((input, init) => fetch(input, init));
91
+ const put = options.putContent ?? xhrPut;
92
+ const json = async (path, init, parse) => {
93
+ let res;
94
+ try {
95
+ res = await doFetch(`${base}${path}`, init);
96
+ }
97
+ catch (cause) {
98
+ if (cause instanceof DOMException && cause.name === "AbortError")
99
+ throw cause;
100
+ throw new UploadLinkApiError(0, "NETWORK", "The connection failed.");
101
+ }
102
+ if (!res.ok)
103
+ throw await readError(res);
104
+ return parse(await res.json());
105
+ };
106
+ const post = (body) => ({
107
+ method: "POST",
108
+ headers: { "content-type": "application/json" },
109
+ body: JSON.stringify(body ?? {}),
110
+ });
111
+ return {
112
+ getStatus: (linkId, signal) => json(`/upload-links/${encodeURIComponent(linkId)}`, { signal }, parseStatus),
113
+ redeem: (linkId, file, signal) => json(`/upload-links/${encodeURIComponent(linkId)}/redeem`, { ...post(file), signal }, (body) => {
114
+ const o = (body ?? {});
115
+ const headers = (o.headers ?? {});
116
+ if (typeof o.sessionId !== "string" ||
117
+ typeof o.uploadUrl !== "string" ||
118
+ typeof headers.Authorization !== "string") {
119
+ throw new UploadLinkApiError(502, "CONTRACT_MISMATCH", "Unexpected response from the server.");
120
+ }
121
+ return {
122
+ sessionId: o.sessionId,
123
+ uploadUrl: o.uploadUrl,
124
+ headers: { Authorization: headers.Authorization },
125
+ maxBytes: typeof o.maxBytes === "number" ? o.maxBytes : 0,
126
+ allowedTypes: Array.isArray(o.allowedTypes)
127
+ ? o.allowedTypes.filter((t) => typeof t === "string")
128
+ : [],
129
+ };
130
+ }),
131
+ upload: (handle, file, onProgress, signal) => put({
132
+ url: handle.uploadUrl,
133
+ authorization: handle.headers.Authorization,
134
+ file,
135
+ onProgress,
136
+ signal,
137
+ }),
138
+ start: (linkId) => json(`/upload-links/${encodeURIComponent(linkId)}/start`, post(), parseStatus),
139
+ };
140
+ }
141
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/upload-link/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import type { UploadLinkPurpose } from "./types.js";
2
+ /** Every visible string, English by default and overridable per key for i18n (`copy` prop). `{name}` tokens are filled by `fmt`. */
3
+ export interface UploadLinkCopy {
4
+ title: string;
5
+ checking: string;
6
+ signInTitle: string;
7
+ signInBody: string;
8
+ signInAction: string;
9
+ wrongAccountTitle: string;
10
+ wrongAccountBody: string;
11
+ unavailableTitle: string;
12
+ unavailableBody: string;
13
+ disabledTitle: string;
14
+ disabledBody: string;
15
+ networkTitle: string;
16
+ networkBody: string;
17
+ retry: string;
18
+ expiredTitle: string;
19
+ expiredBody: string;
20
+ usedTitle: string;
21
+ usedBody: string;
22
+ readyIntro: string;
23
+ dropTitle: string;
24
+ dropOrBrowse: string;
25
+ dropActive: string;
26
+ limitsHint: string;
27
+ typesLabel: string;
28
+ sizeLabel: string;
29
+ neverNote: string;
30
+ chooseAnother: string;
31
+ uploadingTitle: string;
32
+ preparing: string;
33
+ sending: string;
34
+ progressLabel: string;
35
+ cancel: string;
36
+ processingTitle: string;
37
+ stepsLabel: string;
38
+ stepWaiting: string;
39
+ stepChecking: string;
40
+ stepSaving: string;
41
+ stepDone: string;
42
+ stepCurrent: string;
43
+ stepComplete: string;
44
+ stepPending: string;
45
+ doneTitle: string;
46
+ doneBody: string;
47
+ viewResult: string;
48
+ backToAssistant: string;
49
+ failedTitle: string;
50
+ failedNewLink: string;
51
+ errorTooBig: string;
52
+ errorWrongType: string;
53
+ errorEmpty: string;
54
+ errorTooMany: string;
55
+ errorGeneric: string;
56
+ errorTargetInvalid: string;
57
+ errorFileNotAllowed: string;
58
+ readyTitle: string;
59
+ statusPercent: string;
60
+ errorsLabel: string;
61
+ purposes: Record<UploadLinkPurpose, string>;
62
+ targets: Record<string, string>;
63
+ /** Plain-language reason per backend failure code; `default` covers the rest. */
64
+ failures: Record<string, string> & {
65
+ default: string;
66
+ };
67
+ }
68
+ export declare const DEFAULT_COPY: UploadLinkCopy;
69
+ /** Replace `{name}` tokens in a copy string. */
70
+ export declare function fmt(template: string, vars: Record<string, string | number>): string;
71
+ export declare function formatBytes(bytes: number): string;
72
+ /** Friendly names for the accepted MIME types shown next to the drop zone. */
73
+ export declare const TYPE_NAMES: Record<string, string>;
74
+ /**
75
+ * What the page tells the person BEFORE they pick a file (the backend stays the authority and re-checks everything). These
76
+ * mirror the backend's per-purpose allow-lists: documents and offer files take PDF and pictures, lab reports PDF and text,
77
+ * pictures (brand, reference) only pictures.
78
+ */
79
+ export declare const DEFAULT_CONSTRAINTS: Record<UploadLinkPurpose, {
80
+ allowedTypes: string[];
81
+ maxBytes: number;
82
+ }>;
83
+ //# sourceMappingURL=copy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../src/upload-link/copy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ export const DEFAULT_COPY = {
2
+ title: "Send a file to CellarNode",
3
+ checking: "Checking your link",
4
+ signInTitle: "Sign in to send your file",
5
+ signInBody: "This link works only for the account that asked for it. Sign in to continue.",
6
+ signInAction: "Sign in",
7
+ wrongAccountTitle: "This link belongs to a different account",
8
+ wrongAccountBody: "You are signed in as someone else. Sign in with the account you use with your assistant, or ask it for a new link.",
9
+ unavailableTitle: "This link is not available",
10
+ unavailableBody: "It may have been made for another account, or it no longer exists. Ask your assistant for a new link.",
11
+ disabledTitle: "Uploads are not switched on yet",
12
+ disabledBody: "Sending files by link is not available right now. You can upload the file in the CellarNode dashboard instead.",
13
+ networkTitle: "We could not reach CellarNode",
14
+ networkBody: "Check your connection and try again. Nothing has been sent.",
15
+ retry: "Try again",
16
+ expiredTitle: "This link has expired",
17
+ expiredBody: "Links work for about 15 minutes. Ask your assistant for a new one.",
18
+ usedTitle: "This link was already used",
19
+ usedBody: "Each link carries one file. If you still need to send something, ask your assistant for a new link.",
20
+ readyIntro: "Choose the file to send. It goes straight to CellarNode and does not pass through your assistant.",
21
+ dropTitle: "Drop your file here",
22
+ dropOrBrowse: "or choose a file",
23
+ dropActive: "Release to send this file",
24
+ limitsHint: "Accepted file types and the size limit",
25
+ typesLabel: "File types",
26
+ sizeLabel: "Up to {size}",
27
+ neverNote: "Only you and your organisation can see what you send.",
28
+ chooseAnother: "Choose a different file",
29
+ uploadingTitle: "Sending your file",
30
+ preparing: "Preparing the upload",
31
+ sending: "Sending {name}",
32
+ progressLabel: "Upload progress",
33
+ cancel: "Cancel",
34
+ processingTitle: "Checking and saving your file",
35
+ stepsLabel: "Steps",
36
+ stepWaiting: "File received",
37
+ stepChecking: "Checking the file",
38
+ stepSaving: "Saving it",
39
+ stepDone: "Done",
40
+ stepCurrent: "in progress",
41
+ stepComplete: "complete",
42
+ stepPending: "waiting",
43
+ doneTitle: "Your file was saved",
44
+ doneBody: "You can go back to your assistant. It will see the result.",
45
+ viewResult: "View it in CellarNode",
46
+ backToAssistant: "You can close this page.",
47
+ failedTitle: "We could not save your file",
48
+ failedNewLink: "Ask your assistant for a new link and try again.",
49
+ errorTooBig: "That file is larger than the limit of {size}.",
50
+ errorWrongType: "That file type is not accepted here. Choose one of: {types}.",
51
+ errorEmpty: "That file is empty.",
52
+ errorTooMany: "Too many attempts right now. Wait a moment and try again.",
53
+ errorGeneric: "That file could not be sent. Check it and try again.",
54
+ errorTargetInvalid: "What this file was meant for is no longer available to your account. Ask your assistant for a new link.",
55
+ errorFileNotAllowed: "CellarNode does not accept that file here. Choose another file.",
56
+ readyTitle: "Choose your file",
57
+ statusPercent: "Sending {name}: {percent}%",
58
+ errorsLabel: "Problem",
59
+ purposes: {
60
+ offer_attachment: "a file for an offer",
61
+ lab_report: "a lab report",
62
+ brand_asset: "a brand picture",
63
+ org_document: "an organisation document",
64
+ label_reference_image: "a reference image",
65
+ },
66
+ targets: {
67
+ offer: "Attaches to your offer",
68
+ variant: "Attaches to your product version",
69
+ brand_profile: "Goes to your brand profile",
70
+ org_document_type: "Replaces your document of this kind",
71
+ },
72
+ failures: {
73
+ UPLOAD_DECODE_FAILED: "The file could not be read. It may be damaged, password-protected or the wrong type. Export it again and try once more.",
74
+ DECODE_PDF_INVALID: "The PDF is damaged or password-protected. Export it again without a password.",
75
+ DECODE_PDF_TOO_MANY_PAGES: "The PDF has more than 100 pages. Send the pages that matter.",
76
+ DECODE_IMAGE_INVALID: "The picture is damaged. Export it again as a JPEG, PNG or WebP.",
77
+ DECODE_IMAGE_TOO_LARGE: "The picture is too big in pixels. Make it smaller and try again.",
78
+ DECODE_TEXT_INVALID: "The text file must be plain UTF-8 text.",
79
+ UPLOAD_CONTENT_MISMATCH: "The file is not the type it claims to be. Export it again.",
80
+ UPLOAD_SIZE_MISMATCH: "The file changed while it was being sent. Try again.",
81
+ UPLOAD_LINK_FILE_NOT_ALLOWED: "CellarNode does not accept that file here (type or size).",
82
+ UPLOAD_LINK_TARGET_INVALID: "What the file was meant for is no longer available to your account.",
83
+ QUOTA_EXCEEDED: "The monthly allowance for this kind of upload is used up. Nothing was saved.",
84
+ CANCELLED: "You cancelled the upload. Nothing was saved.",
85
+ UPLOAD_LINK_PROCESSING_FAILED: "Saving the file failed on our side. Nothing was kept.",
86
+ default: "The upload did not complete and nothing was saved.",
87
+ },
88
+ };
89
+ /** Replace `{name}` tokens in a copy string. */
90
+ export function fmt(template, vars) {
91
+ return template.replace(/\{(\w+)\}/g, (_, k) => String(vars[k] ?? ""));
92
+ }
93
+ export function formatBytes(bytes) {
94
+ if (bytes >= 1024 * 1024)
95
+ return `${Number((bytes / (1024 * 1024)).toFixed(1))} MB`;
96
+ if (bytes >= 1024)
97
+ return `${Math.round(bytes / 1024)} KB`;
98
+ return `${bytes} bytes`;
99
+ }
100
+ /** Friendly names for the accepted MIME types shown next to the drop zone. */
101
+ export const TYPE_NAMES = {
102
+ "application/pdf": "PDF",
103
+ "image/jpeg": "JPEG",
104
+ "image/png": "PNG",
105
+ "image/webp": "WebP",
106
+ "text/plain": "Text",
107
+ };
108
+ /**
109
+ * What the page tells the person BEFORE they pick a file (the backend stays the authority and re-checks everything). These
110
+ * mirror the backend's per-purpose allow-lists: documents and offer files take PDF and pictures, lab reports PDF and text,
111
+ * pictures (brand, reference) only pictures.
112
+ */
113
+ export const DEFAULT_CONSTRAINTS = {
114
+ offer_attachment: {
115
+ allowedTypes: ["application/pdf", "image/jpeg", "image/png", "image/webp"],
116
+ maxBytes: 10 * 1024 * 1024,
117
+ },
118
+ org_document: {
119
+ allowedTypes: ["application/pdf", "image/jpeg", "image/png", "image/webp"],
120
+ maxBytes: 10 * 1024 * 1024,
121
+ },
122
+ lab_report: { allowedTypes: ["application/pdf", "text/plain"], maxBytes: 10 * 1024 * 1024 },
123
+ brand_asset: {
124
+ allowedTypes: ["image/jpeg", "image/png", "image/webp"],
125
+ maxBytes: 10 * 1024 * 1024,
126
+ },
127
+ label_reference_image: {
128
+ allowedTypes: ["image/jpeg", "image/png", "image/webp"],
129
+ maxBytes: 10 * 1024 * 1024,
130
+ },
131
+ };
132
+ //# sourceMappingURL=copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/upload-link/copy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type UploadHandle, UploadLinkApiError, type UploadLinkClient, type UploadLinkStatus } from "./types.js";
2
+ /** In-memory client for stories and tests: every call is scripted, nothing touches the network. */
3
+ export declare const link: (over?: Partial<UploadLinkStatus>) => UploadLinkStatus;
4
+ export declare const handle: UploadHandle;
5
+ export interface FakeClientScript {
6
+ status?: UploadLinkStatus | UploadLinkApiError | (() => UploadLinkStatus | UploadLinkApiError);
7
+ redeem?: UploadHandle | UploadLinkApiError;
8
+ /** Hold the redeem answer this many ms (cancel-while-redeeming tests). */
9
+ redeemDelay?: number;
10
+ /** "never" holds the upload at 40% forever (the uploading story). */
11
+ upload?: "ok" | "never" | UploadLinkApiError;
12
+ start?: UploadLinkStatus | UploadLinkApiError;
13
+ }
14
+ export declare function fakeClient(script?: FakeClientScript): UploadLinkClient & {
15
+ calls: string[];
16
+ };
17
+ //# sourceMappingURL=fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/upload-link/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,SAAS,CAAC;AAEjB,mGAAmG;AACnG,eAAO,MAAM,IAAI,GAAI,OAAM,OAAO,CAAC,gBAAgB,CAAM,KAAG,gBAY1D,CAAC;AAEH,eAAO,MAAM,MAAM,EAAE,YAOpB,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,gBAAgB,GAAG,kBAAkB,GAAG,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,CAAC;IAC/F,MAAM,CAAC,EAAE,YAAY,GAAG,kBAAkB,CAAC;IAC3C,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,MAAM,CAAC,EAAE,IAAI,GAAG,OAAO,GAAG,kBAAkB,CAAC;IAC7C,KAAK,CAAC,EAAE,gBAAgB,GAAG,kBAAkB,CAAC;CAC/C;AAED,wBAAgB,UAAU,CAAC,MAAM,GAAE,gBAAqB,GAAG,gBAAgB,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CA0ChG"}
@@ -0,0 +1,63 @@
1
+ import { UploadLinkApiError, } from "./types.js";
2
+ /** In-memory client for stories and tests: every call is scripted, nothing touches the network. */
3
+ export const link = (over = {}) => ({
4
+ linkId: "6f0c2d3e-5b0a-4c3e-9d1a-0a8b1c2d3e4f",
5
+ status: "open",
6
+ step: null,
7
+ purpose: "offer_attachment",
8
+ target: { type: "offer", id: "11111111-1111-4111-8111-111111111111" },
9
+ sizeBytes: null,
10
+ mimeType: null,
11
+ result: null,
12
+ failureCode: null,
13
+ expiresAt: "2026-10-12T12:00:00.000Z",
14
+ ...over,
15
+ });
16
+ export const handle = {
17
+ sessionId: "22222222-2222-4222-8222-222222222222",
18
+ uploadUrl: "https://api.example.test/upload-sessions/22222222-2222-4222-8222-222222222222/content",
19
+ headers: { Authorization: "Bearer cnu_test" },
20
+ maxBytes: 10 * 1024 * 1024,
21
+ allowedTypes: ["application/pdf", "image/png"],
22
+ };
23
+ export function fakeClient(script = {}) {
24
+ const calls = [];
25
+ const settle = (v) => v instanceof UploadLinkApiError ? Promise.reject(v) : Promise.resolve(v);
26
+ return {
27
+ calls,
28
+ getStatus: () => {
29
+ calls.push("getStatus");
30
+ const s = typeof script.status === "function" ? script.status() : (script.status ?? link());
31
+ return settle(s);
32
+ },
33
+ redeem: (_id, file, signal) => {
34
+ calls.push(`redeem:${file.fileName}:${file.mimeType}:${file.sizeBytes}`);
35
+ if (script.redeemDelay) {
36
+ return new Promise((resolve, reject) => {
37
+ const t = setTimeout(() => settle(script.redeem ?? handle).then(resolve, reject), script.redeemDelay);
38
+ signal?.addEventListener("abort", () => {
39
+ clearTimeout(t);
40
+ reject(new DOMException("Aborted", "AbortError"));
41
+ });
42
+ });
43
+ }
44
+ return settle(script.redeem ?? handle);
45
+ },
46
+ upload: (_h, _f, onProgress) => {
47
+ calls.push("upload");
48
+ if (script.upload === "never") {
49
+ onProgress(0.4);
50
+ return new Promise(() => undefined);
51
+ }
52
+ if (script.upload instanceof UploadLinkApiError)
53
+ return Promise.reject(script.upload);
54
+ onProgress(1);
55
+ return Promise.resolve();
56
+ },
57
+ start: () => {
58
+ calls.push("start");
59
+ return settle(script.start ?? link({ status: "processing", step: "checking" }));
60
+ },
61
+ };
62
+ }
63
+ //# sourceMappingURL=fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../src/upload-link/fixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import { type UploadLinkApiError, type UploadLinkStatus } from "./types.js";
2
+ /**
3
+ * The page's state machine as a pure reducer, so every state is reachable and testable without a browser. The hook
4
+ * (`use-upload-link.ts`) feeds it events from the network and the person; the component only renders `phase`.
5
+ */
6
+ export type Phase = {
7
+ kind: "loading";
8
+ } | {
9
+ kind: "sign-in";
10
+ } | {
11
+ kind: "unavailable";
12
+ reason: "not-found" | "disabled" | "network";
13
+ } | {
14
+ kind: "wrong-account";
15
+ } | {
16
+ kind: "closed";
17
+ reason: "expired" | "used";
18
+ } | {
19
+ kind: "ready";
20
+ link: UploadLinkStatus;
21
+ error: string | null;
22
+ } | {
23
+ kind: "uploading";
24
+ link: UploadLinkStatus;
25
+ fileName: string;
26
+ stage: "preparing" | "sending";
27
+ progress: number;
28
+ } | {
29
+ kind: "processing";
30
+ link: UploadLinkStatus;
31
+ } | {
32
+ kind: "done";
33
+ link: UploadLinkStatus;
34
+ } | {
35
+ kind: "failed";
36
+ link: UploadLinkStatus | null;
37
+ code: string | null;
38
+ };
39
+ export type Event = {
40
+ type: "auth";
41
+ auth: "checking" | "signed-out" | "signed-in";
42
+ } | {
43
+ type: "status";
44
+ link: UploadLinkStatus;
45
+ } | {
46
+ type: "status-error";
47
+ error: UploadLinkApiError;
48
+ } | {
49
+ type: "file-invalid";
50
+ message: string;
51
+ } | {
52
+ type: "upload-start";
53
+ fileName: string;
54
+ } | {
55
+ type: "upload-progress";
56
+ progress: number;
57
+ } | {
58
+ type: "redeem-error";
59
+ error: UploadLinkApiError;
60
+ message: string;
61
+ } | {
62
+ type: "upload-error";
63
+ code: string | null;
64
+ } | {
65
+ type: "uploaded";
66
+ } | {
67
+ type: "reset";
68
+ };
69
+ export declare const initialPhase: Phase;
70
+ /** The phase a freshly read status puts the page in. */
71
+ export declare function phaseForStatus(link: UploadLinkStatus, current: Phase): Phase;
72
+ export declare function reduce(phase: Phase, event: Event): Phase;
73
+ /** The four named steps of the processing view, in order. */
74
+ export declare const STEP_ORDER: readonly ["received", "checking", "saving", "done"];
75
+ export type StepName = (typeof STEP_ORDER)[number];
76
+ /** Which step is current for a status, so the list can mark earlier ones complete and later ones waiting. */
77
+ export declare function currentStep(link: UploadLinkStatus): StepName;
78
+ export declare const isTerminal: (p: Phase) => boolean;
79
+ //# sourceMappingURL=flow.d.ts.map