@drivenets/design-system 0.0.3 → 0.0.5
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/CHANGELOG.md +13 -0
- package/README.md +51 -0
- package/dist/components/ds-alert-banner/ds-alert-banner.cjs +157 -52
- package/dist/components/ds-alert-banner/ds-alert-banner.d.cts +5 -5
- package/dist/components/ds-alert-banner/ds-alert-banner.d.cts.map +1 -1
- package/dist/components/ds-alert-banner/ds-alert-banner.js +157 -52
- package/dist/components/ds-alert-banner/ds-alert-banner.js.map +1 -1
- package/dist/components/ds-alert-banner/ds-alert-banner.types.d.cts.map +1 -1
- package/dist/components/ds-alert-banner/ds-alert-banner.types.js.map +1 -1
- package/dist/components/ds-breadcrumb/ds-breadcrumb.cjs +59 -16
- package/dist/components/ds-breadcrumb/ds-breadcrumb.js +59 -16
- package/dist/components/ds-breadcrumb/ds-breadcrumb.js.map +1 -1
- package/dist/components/ds-button/ds-button.cjs +18 -2
- package/dist/components/ds-button/ds-button.d.cts +2 -2
- package/dist/components/ds-button/ds-button.d.cts.map +1 -1
- package/dist/components/ds-button/ds-button.d.ts +2 -2
- package/dist/components/ds-button/ds-button.js +18 -2
- package/dist/components/ds-button/ds-button.js.map +1 -1
- package/dist/components/ds-button/versions/ds-button-legacy/ds-button-legacy.cjs +79 -10
- package/dist/components/ds-button/versions/ds-button-legacy/ds-button-legacy.js +79 -10
- package/dist/components/ds-button/versions/ds-button-legacy/ds-button-legacy.js.map +1 -1
- package/dist/components/ds-button/versions/ds-button-new/ds-button-new.cjs +78 -10
- package/dist/components/ds-button/versions/ds-button-new/ds-button-new.js +78 -10
- package/dist/components/ds-button/versions/ds-button-new/ds-button-new.js.map +1 -1
- package/dist/components/ds-checkbox/ds-checkbox.cjs +89 -18
- package/dist/components/ds-checkbox/ds-checkbox.js +89 -18
- package/dist/components/ds-checkbox/ds-checkbox.js.map +1 -1
- package/dist/components/ds-chip/ds-chip.cjs +100 -30
- package/dist/components/ds-chip/ds-chip.js +100 -30
- package/dist/components/ds-chip/ds-chip.js.map +1 -1
- package/dist/components/ds-chip-group/ds-chip-group.cjs +6 -6
- package/dist/components/ds-chip-group/ds-chip-group.js +6 -6
- package/dist/components/ds-chip-group/ds-chip-group.js.map +1 -1
- package/dist/components/ds-chip-group/hooks/use-chip-row-calculation.js.map +1 -1
- package/dist/components/ds-confirmation/ds-confirmation.cjs +210 -56
- package/dist/components/ds-confirmation/ds-confirmation.d.cts +8 -8
- package/dist/components/ds-confirmation/ds-confirmation.d.ts +8 -8
- package/dist/components/ds-confirmation/ds-confirmation.js +210 -56
- package/dist/components/ds-confirmation/ds-confirmation.js.map +1 -1
- package/dist/components/ds-dialog/ds-dialog.js.map +1 -1
- package/dist/components/ds-drawer/ds-drawer.cjs +261 -61
- package/dist/components/ds-drawer/ds-drawer.d.cts +9 -9
- package/dist/components/ds-drawer/ds-drawer.d.ts +9 -9
- package/dist/components/ds-drawer/ds-drawer.js +261 -61
- package/dist/components/ds-drawer/ds-drawer.js.map +1 -1
- package/dist/components/ds-dropdown-menu/ds-dropdown-menu.cjs +481 -135
- package/dist/components/ds-dropdown-menu/ds-dropdown-menu.js +481 -135
- package/dist/components/ds-dropdown-menu/ds-dropdown-menu.js.map +1 -1
- package/dist/components/ds-expandable-text-input/ds-expandable-text-input.cjs +146 -56
- package/dist/components/ds-expandable-text-input/ds-expandable-text-input.d.cts +2 -2
- package/dist/components/ds-expandable-text-input/ds-expandable-text-input.d.ts +2 -2
- package/dist/components/ds-expandable-text-input/ds-expandable-text-input.js +146 -56
- package/dist/components/ds-expandable-text-input/ds-expandable-text-input.js.map +1 -1
- package/dist/components/ds-file-upload/components/file-upload/file-upload.cjs +190 -69
- package/dist/components/ds-file-upload/components/file-upload/file-upload.js +190 -69
- package/dist/components/ds-file-upload/components/file-upload/file-upload.js.map +1 -1
- package/dist/components/ds-file-upload/components/file-upload-item/file-upload-item.cjs +273 -132
- package/dist/components/ds-file-upload/components/file-upload-item/file-upload-item.js +273 -132
- package/dist/components/ds-file-upload/components/file-upload-item/file-upload-item.js.map +1 -1
- package/dist/components/ds-file-upload/ds-file-upload.cjs +96 -16
- package/dist/components/ds-file-upload/ds-file-upload.js +96 -16
- package/dist/components/ds-file-upload/ds-file-upload.js.map +1 -1
- package/dist/components/ds-file-upload/errors/file-upload-errors.js.map +1 -1
- package/dist/components/ds-file-upload/hooks/use-file-upload.cjs +93 -93
- package/dist/components/ds-file-upload/hooks/use-file-upload.js +93 -93
- package/dist/components/ds-file-upload/hooks/use-file-upload.js.map +1 -1
- package/dist/components/ds-file-upload/types/accept-types.js.map +1 -1
- package/dist/components/ds-file-upload/utils/accept-utils.js.map +1 -1
- package/dist/components/ds-file-upload/utils/constants.js.map +1 -1
- package/dist/components/ds-file-upload/utils/file-factory.js.map +1 -1
- package/dist/components/ds-file-upload/utils/format-file-size.js.map +1 -1
- package/dist/components/ds-file-upload/utils/generate-helper-text.js.map +1 -1
- package/dist/components/ds-file-upload/utils/get-error-message.js.map +1 -1
- package/dist/components/ds-file-upload/utils/is-file-equal.js.map +1 -1
- package/dist/components/ds-form-control/ds-form-control.cjs +119 -34
- package/dist/components/ds-form-control/ds-form-control.d.cts +7 -7
- package/dist/components/ds-form-control/ds-form-control.d.ts +7 -7
- package/dist/components/ds-form-control/ds-form-control.d.ts.map +1 -1
- package/dist/components/ds-form-control/ds-form-control.js +119 -34
- package/dist/components/ds-form-control/ds-form-control.js.map +1 -1
- package/dist/components/ds-form-control/ds-form-control.types.js.map +1 -1
- package/dist/components/ds-grid/ds-grid.js.map +1 -1
- package/dist/components/ds-icon/ds-icon.cjs +84 -13
- package/dist/components/ds-icon/ds-icon.js +84 -13
- package/dist/components/ds-icon/ds-icon.js.map +1 -1
- package/dist/components/ds-icon/ds-icon.types.d.cts.map +1 -1
- package/dist/components/ds-icon/ds-icon.types.js.map +1 -1
- package/dist/components/ds-modal/ds-modal.cjs +222 -55
- package/dist/components/ds-modal/ds-modal.d.cts +8 -8
- package/dist/components/ds-modal/ds-modal.d.ts +8 -8
- package/dist/components/ds-modal/ds-modal.d.ts.map +1 -1
- package/dist/components/ds-modal/ds-modal.js +222 -55
- package/dist/components/ds-modal/ds-modal.js.map +1 -1
- package/dist/components/ds-number-input/ds-number-input.cjs +136 -49
- package/dist/components/ds-number-input/ds-number-input.js +136 -49
- package/dist/components/ds-number-input/ds-number-input.js.map +1 -1
- package/dist/components/ds-panel/ds-panel.cjs +111 -19
- package/dist/components/ds-panel/ds-panel.d.cts +2 -2
- package/dist/components/ds-panel/ds-panel.d.cts.map +1 -1
- package/dist/components/ds-panel/ds-panel.d.ts +2 -2
- package/dist/components/ds-panel/ds-panel.js +111 -19
- package/dist/components/ds-panel/ds-panel.js.map +1 -1
- package/dist/components/ds-password-input/ds-password-input.cjs +108 -41
- package/dist/components/ds-password-input/ds-password-input.js +108 -41
- package/dist/components/ds-password-input/ds-password-input.js.map +1 -1
- package/dist/components/ds-popover/ds-popover.cjs +50 -12
- package/dist/components/ds-popover/ds-popover.js +50 -12
- package/dist/components/ds-popover/ds-popover.js.map +1 -1
- package/dist/components/ds-radio-group/ds-radio-group.cjs +209 -53
- package/dist/components/ds-radio-group/ds-radio-group.js +209 -53
- package/dist/components/ds-radio-group/ds-radio-group.js.map +1 -1
- package/dist/components/ds-segment-group/ds-segment-group.cjs +215 -0
- package/dist/components/ds-segment-group/ds-segment-group.d.cts +26 -0
- package/dist/components/ds-segment-group/ds-segment-group.d.cts.map +1 -0
- package/dist/components/ds-segment-group/ds-segment-group.d.ts +26 -0
- package/dist/components/ds-segment-group/ds-segment-group.d.ts.map +1 -0
- package/dist/components/ds-segment-group/ds-segment-group.js +214 -0
- package/dist/components/ds-segment-group/ds-segment-group.js.map +1 -0
- package/dist/components/ds-segment-group/ds-segment-group.module.cjs +12 -0
- package/dist/components/ds-segment-group/ds-segment-group.module.js +12 -0
- package/dist/components/ds-segment-group/ds-segment-group.module.js.map +1 -0
- package/dist/components/ds-segment-group/ds-segment-group.types.cjs +2 -0
- package/dist/components/ds-segment-group/ds-segment-group.types.d.cts +52 -0
- package/dist/components/ds-segment-group/ds-segment-group.types.d.cts.map +1 -0
- package/dist/components/ds-segment-group/ds-segment-group.types.d.ts +52 -0
- package/dist/components/ds-segment-group/ds-segment-group.types.d.ts.map +1 -0
- package/dist/components/ds-segment-group/ds-segment-group.types.js +2 -0
- package/dist/components/ds-segment-group/index.cjs +2 -0
- package/dist/components/ds-segment-group/index.d.ts +2 -0
- package/dist/components/ds-segment-group/index.js +2 -0
- package/dist/components/ds-select/ds-select.cjs +198 -89
- package/dist/components/ds-select/ds-select.d.cts +2 -2
- package/dist/components/ds-select/ds-select.d.cts.map +1 -1
- package/dist/components/ds-select/ds-select.d.ts +2 -2
- package/dist/components/ds-select/ds-select.js +198 -89
- package/dist/components/ds-select/ds-select.js.map +1 -1
- package/dist/components/ds-select/select-items-chips.cjs +73 -22
- package/dist/components/ds-select/select-items-chips.js +73 -22
- package/dist/components/ds-select/select-items-chips.js.map +1 -1
- package/dist/components/ds-smart-tabs/ds-smart-tabs.cjs +208 -46
- package/dist/components/ds-smart-tabs/ds-smart-tabs.d.cts +2 -2
- package/dist/components/ds-smart-tabs/ds-smart-tabs.d.cts.map +1 -1
- package/dist/components/ds-smart-tabs/ds-smart-tabs.d.ts +2 -2
- package/dist/components/ds-smart-tabs/ds-smart-tabs.d.ts.map +1 -1
- package/dist/components/ds-smart-tabs/ds-smart-tabs.js +208 -46
- package/dist/components/ds-smart-tabs/ds-smart-tabs.js.map +1 -1
- package/dist/components/ds-smart-tabs/ds-smart-tabs.types.js.map +1 -1
- package/dist/components/ds-spinner/ds-spinner.cjs +90 -20
- package/dist/components/ds-spinner/ds-spinner.js +90 -20
- package/dist/components/ds-spinner/ds-spinner.js.map +1 -1
- package/dist/components/ds-spinner/ds-spinner.types.js.map +1 -1
- package/dist/components/ds-status-badge/ds-status-badge.cjs +54 -11
- package/dist/components/ds-status-badge/ds-status-badge.js +54 -11
- package/dist/components/ds-status-badge/ds-status-badge.js.map +1 -1
- package/dist/components/ds-stepper/components/ds-step-content.cjs +59 -13
- package/dist/components/ds-stepper/components/ds-step-content.d.cts +2 -2
- package/dist/components/ds-stepper/components/ds-step-content.js +59 -13
- package/dist/components/ds-stepper/components/ds-step-content.js.map +1 -1
- package/dist/components/ds-stepper/components/ds-step-description.cjs +14 -5
- package/dist/components/ds-stepper/components/ds-step-description.js +14 -5
- package/dist/components/ds-stepper/components/ds-step-description.js.map +1 -1
- package/dist/components/ds-stepper/components/ds-step-label.cjs +14 -5
- package/dist/components/ds-stepper/components/ds-step-label.js +14 -5
- package/dist/components/ds-stepper/components/ds-step-label.js.map +1 -1
- package/dist/components/ds-stepper/components/ds-step-next-button.cjs +23 -6
- package/dist/components/ds-stepper/components/ds-step-next-button.d.cts +2 -2
- package/dist/components/ds-stepper/components/ds-step-next-button.js +23 -6
- package/dist/components/ds-stepper/components/ds-step-next-button.js.map +1 -1
- package/dist/components/ds-stepper/components/ds-step.cjs +106 -25
- package/dist/components/ds-stepper/components/ds-step.d.cts +2 -2
- package/dist/components/ds-stepper/components/ds-step.js +106 -25
- package/dist/components/ds-stepper/components/ds-step.js.map +1 -1
- package/dist/components/ds-stepper/ds-stepper.cjs +62 -15
- package/dist/components/ds-stepper/ds-stepper.d.cts +2 -2
- package/dist/components/ds-stepper/ds-stepper.d.cts.map +1 -1
- package/dist/components/ds-stepper/ds-stepper.js +62 -15
- package/dist/components/ds-stepper/ds-stepper.js.map +1 -1
- package/dist/components/ds-stepper/hooks/use-stepper.js.map +1 -1
- package/dist/components/ds-stepper/hooks/use-steps.cjs +29 -9
- package/dist/components/ds-stepper/hooks/use-steps.js +29 -9
- package/dist/components/ds-stepper/hooks/use-steps.js.map +1 -1
- package/dist/components/ds-system-status/ds-system-status.cjs +37 -7
- package/dist/components/ds-system-status/ds-system-status.js +37 -7
- package/dist/components/ds-system-status/ds-system-status.js.map +1 -1
- package/dist/components/ds-system-status/ds-system-status.types.js.map +1 -1
- package/dist/components/ds-table/components/core-table/core-table.cjs +281 -48
- package/dist/components/ds-table/components/core-table/core-table.js +281 -48
- package/dist/components/ds-table/components/core-table/core-table.js.map +1 -1
- package/dist/components/ds-table/components/ds-table-bulk-actions/ds-table-bulk-actions.cjs +134 -50
- package/dist/components/ds-table/components/ds-table-bulk-actions/ds-table-bulk-actions.js +134 -50
- package/dist/components/ds-table/components/ds-table-bulk-actions/ds-table-bulk-actions.js.map +1 -1
- package/dist/components/ds-table/components/ds-table-cell/ds-table-cell.cjs +140 -43
- package/dist/components/ds-table/components/ds-table-cell/ds-table-cell.js +140 -43
- package/dist/components/ds-table/components/ds-table-cell/ds-table-cell.js.map +1 -1
- package/dist/components/ds-table/components/ds-table-header/ds-table-header.cjs +37 -6
- package/dist/components/ds-table/components/ds-table-header/ds-table-header.js +37 -6
- package/dist/components/ds-table/components/ds-table-header/ds-table-header.js.map +1 -1
- package/dist/components/ds-table/components/ds-table-row/ds-table-row.cjs +272 -100
- package/dist/components/ds-table/components/ds-table-row/ds-table-row.js +272 -100
- package/dist/components/ds-table/components/ds-table-row/ds-table-row.js.map +1 -1
- package/dist/components/ds-table/context/ds-table-context.js.map +1 -1
- package/dist/components/ds-table/ds-table.cjs +15 -15
- package/dist/components/ds-table/ds-table.d.cts +2 -2
- package/dist/components/ds-table/ds-table.js +15 -15
- package/dist/components/ds-table/ds-table.js.map +1 -1
- package/dist/components/ds-table/hooks/use-drag-and-drop.cjs +126 -38
- package/dist/components/ds-table/hooks/use-drag-and-drop.js +126 -38
- package/dist/components/ds-table/hooks/use-drag-and-drop.js.map +1 -1
- package/dist/components/ds-table/utils/column-styling.js.map +1 -1
- package/dist/components/ds-table/utils/create-columns-grid-template.js.map +1 -1
- package/dist/components/ds-table/utils/merge-refs.js.map +1 -1
- package/dist/components/ds-text-input/ds-text-input.cjs +128 -43
- package/dist/components/ds-text-input/ds-text-input.js +128 -43
- package/dist/components/ds-text-input/ds-text-input.js.map +1 -1
- package/dist/components/ds-text-input/ds-text-input.types.js.map +1 -1
- package/dist/components/ds-textarea/ds-textarea.cjs +66 -22
- package/dist/components/ds-textarea/ds-textarea.js +66 -22
- package/dist/components/ds-textarea/ds-textarea.js.map +1 -1
- package/dist/components/ds-toast/ds-toast-context.cjs +62 -17
- package/dist/components/ds-toast/ds-toast-context.js +62 -17
- package/dist/components/ds-toast/ds-toast-context.js.map +1 -1
- package/dist/components/ds-toast/ds-toast.cjs +90 -26
- package/dist/components/ds-toast/ds-toast.js +90 -26
- package/dist/components/ds-toast/ds-toast.js.map +1 -1
- package/dist/components/ds-tooltip/ds-tooltip.cjs +51 -13
- package/dist/components/ds-tooltip/ds-tooltip.js +51 -13
- package/dist/components/ds-tooltip/ds-tooltip.js.map +1 -1
- package/dist/components/ds-typography/ds-typography.cjs +51 -7
- package/dist/components/ds-typography/ds-typography.config.js.map +1 -1
- package/dist/components/ds-typography/ds-typography.js +51 -7
- package/dist/components/ds-typography/ds-typography.js.map +1 -1
- package/dist/components/ds-vertical-tabs/ds-vertical-tabs.cjs +91 -30
- package/dist/components/ds-vertical-tabs/ds-vertical-tabs.d.cts +5 -5
- package/dist/components/ds-vertical-tabs/ds-vertical-tabs.d.ts +5 -5
- package/dist/components/ds-vertical-tabs/ds-vertical-tabs.js +91 -30
- package/dist/components/ds-vertical-tabs/ds-vertical-tabs.js.map +1 -1
- package/dist/index.cjs +3 -0
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +3 -1
- package/dist/index.min.css +1 -1
- package/package.json +8 -2
- package/src/components/ds-segment-group/ds-segment-group.module.scss +99 -0
- package/src/components/ds-segment-group/ds-segment-group.tsx +76 -0
- package/src/components/ds-segment-group/ds-segment-group.types.tsx +64 -0
- package/src/components/ds-segment-group/index.tsx +2 -0
- package/src/index.ts +1 -0
|
@@ -12,130 +12,130 @@ function useFileUpload({ adapter, autoUpload = true, maxConcurrent = 3, maxFiles
|
|
|
12
12
|
const [files, setFiles] = useState([]);
|
|
13
13
|
const acceptedFiles = files.filter((file) => file.status !== "error");
|
|
14
14
|
if (files.length && !files.some((f) => f.status === "uploading")) onAllFileUploadsComplete?.();
|
|
15
|
-
const getAddedFiles = (newFiles) => newFiles.filter((
|
|
16
|
-
const getDuplicatedFiles = (
|
|
17
|
-
if (
|
|
18
|
-
const found = files.filter((
|
|
19
|
-
if (found.length) return !found.some((
|
|
15
|
+
const getAddedFiles = (newFiles) => newFiles.filter((file_0) => !acceptedFiles.some((existing) => isFileEqual(existing, file_0)));
|
|
16
|
+
const getDuplicatedFiles = (newFiles_0) => newFiles_0.filter((file_1) => {
|
|
17
|
+
if (file_1.id) return false;
|
|
18
|
+
const found = files.filter((existing_0) => isFileEqual(existing_0, file_1));
|
|
19
|
+
if (found.length) return !found.some((existing_1) => existing_1.errors?.includes("FILE_EXISTS"));
|
|
20
20
|
return false;
|
|
21
21
|
});
|
|
22
22
|
const markDuplicates = (duplicates) => {
|
|
23
|
-
const duplicateFilesWithErrors = duplicates.map((
|
|
24
|
-
file,
|
|
23
|
+
const duplicateFilesWithErrors = duplicates.map((file_2) => ({
|
|
24
|
+
file: file_2,
|
|
25
25
|
errors: ["FILE_EXISTS"]
|
|
26
26
|
}));
|
|
27
27
|
if (duplicateFilesWithErrors.length) addRejectedFiles(duplicateFilesWithErrors);
|
|
28
28
|
};
|
|
29
|
-
const markMaxFiles = (
|
|
30
|
-
if (maxFiles === void 0) return
|
|
29
|
+
const markMaxFiles = (files_0) => {
|
|
30
|
+
if (maxFiles === void 0) return files_0;
|
|
31
31
|
const availableSlots = maxFiles - acceptedFiles.length;
|
|
32
32
|
let filesToAdd;
|
|
33
33
|
let rejectedFiles;
|
|
34
34
|
if (availableSlots <= 0) {
|
|
35
35
|
filesToAdd = [];
|
|
36
|
-
rejectedFiles =
|
|
37
|
-
} else if (
|
|
38
|
-
filesToAdd =
|
|
39
|
-
rejectedFiles =
|
|
40
|
-
} else return
|
|
41
|
-
addRejectedFiles(rejectedFiles.map((
|
|
42
|
-
file,
|
|
36
|
+
rejectedFiles = files_0;
|
|
37
|
+
} else if (files_0.length > availableSlots) {
|
|
38
|
+
filesToAdd = files_0.slice(0, availableSlots);
|
|
39
|
+
rejectedFiles = files_0.slice(availableSlots);
|
|
40
|
+
} else return files_0;
|
|
41
|
+
addRejectedFiles(rejectedFiles.map((file_3) => ({
|
|
42
|
+
file: file_3,
|
|
43
43
|
errors: ["TOO_MANY_FILES"]
|
|
44
44
|
})));
|
|
45
45
|
return filesToAdd;
|
|
46
46
|
};
|
|
47
47
|
const addNewFiles = (filesToUpload) => {
|
|
48
|
-
const uploadedFiles = filesToUpload.map((
|
|
48
|
+
const uploadedFiles = filesToUpload.map((file_4) => createUploadedFile(file_4, "pending"));
|
|
49
49
|
setFiles((prev) => [...prev, ...uploadedFiles]);
|
|
50
50
|
return uploadedFiles;
|
|
51
51
|
};
|
|
52
|
-
const uploadNewFiles = (
|
|
53
|
-
if (autoUpload)
|
|
54
|
-
uploadSingleFile(
|
|
52
|
+
const uploadNewFiles = (uploadedFiles_0) => {
|
|
53
|
+
if (autoUpload) uploadedFiles_0.forEach((file_5) => {
|
|
54
|
+
uploadSingleFile(file_5);
|
|
55
55
|
});
|
|
56
56
|
};
|
|
57
|
-
const addFiles = (
|
|
58
|
-
const addedFiles = getAddedFiles(
|
|
59
|
-
markDuplicates(getDuplicatedFiles(
|
|
60
|
-
const
|
|
61
|
-
uploadNewFiles(
|
|
62
|
-
return
|
|
57
|
+
const addFiles = (newFiles_1) => {
|
|
58
|
+
const addedFiles = getAddedFiles(newFiles_1);
|
|
59
|
+
markDuplicates(getDuplicatedFiles(newFiles_1));
|
|
60
|
+
const uploadedFiles_1 = addNewFiles(markMaxFiles(addedFiles));
|
|
61
|
+
uploadNewFiles(uploadedFiles_1);
|
|
62
|
+
return uploadedFiles_1;
|
|
63
63
|
};
|
|
64
64
|
const addRejectedFiles = (filesWithErrors) => {
|
|
65
|
-
const newFileStates = filesWithErrors.map(({ file, errors }) => createUploadedFile(
|
|
66
|
-
setFiles((
|
|
65
|
+
const newFileStates = filesWithErrors.map(({ file: file_6, errors }) => createUploadedFile(file_6, "error", errors));
|
|
66
|
+
setFiles((prev_0) => [...prev_0, ...newFileStates]);
|
|
67
67
|
};
|
|
68
68
|
const updateFileProgress = (fileId, progress) => {
|
|
69
|
-
setFiles((
|
|
70
|
-
...
|
|
69
|
+
setFiles((prev_1) => prev_1.map((file_7) => file_7.id === fileId ? {
|
|
70
|
+
...file_7,
|
|
71
71
|
progress
|
|
72
|
-
} :
|
|
72
|
+
} : file_7));
|
|
73
73
|
};
|
|
74
|
-
const updateFileStatus = (
|
|
75
|
-
setFiles((
|
|
76
|
-
...
|
|
74
|
+
const updateFileStatus = (fileId_0, status, error) => {
|
|
75
|
+
setFiles((prev_2) => prev_2.map((file_8) => file_8.id === fileId_0 ? {
|
|
76
|
+
...file_8,
|
|
77
77
|
status,
|
|
78
|
-
errors: error ? [...
|
|
79
|
-
} :
|
|
78
|
+
errors: error ? [...file_8.errors || [], error] : file_8.errors
|
|
79
|
+
} : file_8));
|
|
80
80
|
};
|
|
81
|
-
const uploadFile = async (
|
|
82
|
-
const
|
|
83
|
-
if (
|
|
81
|
+
const uploadFile = async (fileId_1) => {
|
|
82
|
+
const file_9 = acceptedFiles.find((f_0) => f_0.id === fileId_1);
|
|
83
|
+
if (file_9) await uploadSingleFile(file_9);
|
|
84
84
|
};
|
|
85
|
-
const uploadSingleFile = async (
|
|
86
|
-
const
|
|
85
|
+
const uploadSingleFile = async (file_10) => {
|
|
86
|
+
const fileId_2 = file_10.id;
|
|
87
87
|
const abortController = new AbortController();
|
|
88
|
-
abortControllers.set(
|
|
89
|
-
updateFileStatus(
|
|
88
|
+
abortControllers.set(fileId_2, abortController);
|
|
89
|
+
updateFileStatus(file_10.id, "uploading");
|
|
90
90
|
try {
|
|
91
91
|
const result = await adapter.upload({
|
|
92
|
-
file,
|
|
93
|
-
fileId,
|
|
92
|
+
file: file_10,
|
|
93
|
+
fileId: fileId_2,
|
|
94
94
|
metadata,
|
|
95
95
|
signal: abortController.signal,
|
|
96
|
-
onProgress: (
|
|
97
|
-
updateFileProgress(
|
|
96
|
+
onProgress: (progress_0) => {
|
|
97
|
+
updateFileProgress(fileId_2, progress_0);
|
|
98
98
|
}
|
|
99
99
|
});
|
|
100
|
-
updateFileStatus(
|
|
101
|
-
updateFileProgress(
|
|
102
|
-
onFileUploadComplete?.(
|
|
103
|
-
} catch (
|
|
104
|
-
const errorMessage =
|
|
105
|
-
let
|
|
106
|
-
if (
|
|
107
|
-
updateFileStatus(
|
|
108
|
-
onFileUploadError?.(
|
|
100
|
+
updateFileStatus(fileId_2, "completed");
|
|
101
|
+
updateFileProgress(fileId_2, 100);
|
|
102
|
+
onFileUploadComplete?.(fileId_2, result);
|
|
103
|
+
} catch (error_0) {
|
|
104
|
+
const errorMessage = error_0 instanceof Error ? error_0.message : "Upload failed";
|
|
105
|
+
let status_0 = "interrupted";
|
|
106
|
+
if (error_0 instanceof FileUploadError) status_0 = error_0.isRetryable ? "interrupted" : "error";
|
|
107
|
+
updateFileStatus(fileId_2, status_0, errorMessage);
|
|
108
|
+
onFileUploadError?.(fileId_2, errorMessage);
|
|
109
109
|
} finally {
|
|
110
|
-
abortControllers.delete(
|
|
110
|
+
abortControllers.delete(fileId_2);
|
|
111
111
|
}
|
|
112
112
|
};
|
|
113
113
|
const uploadAll = async () => {
|
|
114
|
-
const pendingFiles = files.filter((
|
|
114
|
+
const pendingFiles = files.filter((f_1) => f_1.status === "pending");
|
|
115
115
|
for (let i = 0; i < pendingFiles.length; i += maxConcurrent) {
|
|
116
116
|
const batch = pendingFiles.slice(i, i + maxConcurrent);
|
|
117
|
-
await Promise.allSettled(batch.map((
|
|
117
|
+
await Promise.allSettled(batch.map((f_2) => uploadFile(f_2.id)));
|
|
118
118
|
}
|
|
119
119
|
};
|
|
120
|
-
const cancelUpload = async (
|
|
121
|
-
abortControllers.get(
|
|
122
|
-
abortControllers.delete(
|
|
123
|
-
if (adapter.cancel) await adapter.cancel(
|
|
124
|
-
updateFileStatus(
|
|
120
|
+
const cancelUpload = async (fileId_3) => {
|
|
121
|
+
abortControllers.get(fileId_3)?.abort();
|
|
122
|
+
abortControllers.delete(fileId_3);
|
|
123
|
+
if (adapter.cancel) await adapter.cancel(fileId_3);
|
|
124
|
+
updateFileStatus(fileId_3, "cancelled");
|
|
125
125
|
};
|
|
126
|
-
const retryUpload = async (
|
|
127
|
-
updateFileStatus(
|
|
128
|
-
updateFileProgress(
|
|
129
|
-
await uploadFile(
|
|
126
|
+
const retryUpload = async (fileId_4) => {
|
|
127
|
+
updateFileStatus(fileId_4, "pending");
|
|
128
|
+
updateFileProgress(fileId_4, 0);
|
|
129
|
+
await uploadFile(fileId_4);
|
|
130
130
|
};
|
|
131
|
-
const removeFile = (
|
|
132
|
-
abortControllers.get(
|
|
133
|
-
abortControllers.delete(
|
|
134
|
-
setFiles((
|
|
131
|
+
const removeFile = (fileId_5) => {
|
|
132
|
+
abortControllers.get(fileId_5)?.abort();
|
|
133
|
+
abortControllers.delete(fileId_5);
|
|
134
|
+
setFiles((prev_3) => prev_3.filter((file_11) => file_11.id !== fileId_5));
|
|
135
135
|
};
|
|
136
|
-
const deleteFile = async (
|
|
137
|
-
if (adapter.delete) await adapter.delete(
|
|
138
|
-
removeFile(
|
|
136
|
+
const deleteFile = async (fileId_6) => {
|
|
137
|
+
if (adapter.delete) await adapter.delete(fileId_6);
|
|
138
|
+
removeFile(fileId_6);
|
|
139
139
|
};
|
|
140
140
|
const clearFiles = () => {
|
|
141
141
|
abortControllers.forEach((controller) => controller.abort());
|
|
@@ -144,30 +144,30 @@ function useFileUpload({ adapter, autoUpload = true, maxConcurrent = 3, maxFiles
|
|
|
144
144
|
};
|
|
145
145
|
const getProps = (userCallbacks) => {
|
|
146
146
|
const handleFileAccept = (details) => {
|
|
147
|
-
const
|
|
148
|
-
userCallbacks?.onFilesAdded?.(
|
|
147
|
+
const addedFiles_0 = addFiles(details.files);
|
|
148
|
+
userCallbacks?.onFilesAdded?.(addedFiles_0);
|
|
149
149
|
};
|
|
150
|
-
const handleFileReject = (
|
|
151
|
-
addRejectedFiles(
|
|
152
|
-
file:
|
|
153
|
-
errors:
|
|
150
|
+
const handleFileReject = (details_0) => {
|
|
151
|
+
addRejectedFiles(details_0.files.map((f_3) => ({
|
|
152
|
+
file: f_3.file,
|
|
153
|
+
errors: f_3.errors
|
|
154
154
|
})));
|
|
155
155
|
};
|
|
156
|
-
const handleFileRemove = (
|
|
157
|
-
removeFile(
|
|
158
|
-
userCallbacks?.onFileRemoved?.(
|
|
156
|
+
const handleFileRemove = (fileId_7) => {
|
|
157
|
+
removeFile(fileId_7);
|
|
158
|
+
userCallbacks?.onFileRemoved?.(fileId_7);
|
|
159
159
|
};
|
|
160
|
-
const handleFileDelete = async (
|
|
161
|
-
await deleteFile(
|
|
162
|
-
userCallbacks?.onFileDeleted?.(
|
|
160
|
+
const handleFileDelete = async (fileId_8) => {
|
|
161
|
+
await deleteFile(fileId_8);
|
|
162
|
+
userCallbacks?.onFileDeleted?.(fileId_8);
|
|
163
163
|
};
|
|
164
|
-
const handleFileUploadCanceled = async (
|
|
165
|
-
await cancelUpload(
|
|
166
|
-
userCallbacks?.onFileUploadCanceled?.(
|
|
164
|
+
const handleFileUploadCanceled = async (fileId_9) => {
|
|
165
|
+
await cancelUpload(fileId_9);
|
|
166
|
+
userCallbacks?.onFileUploadCanceled?.(fileId_9);
|
|
167
167
|
};
|
|
168
|
-
const handleFileUploadRetried = async (
|
|
169
|
-
await retryUpload(
|
|
170
|
-
userCallbacks?.onFileUploadRetried?.(
|
|
168
|
+
const handleFileUploadRetried = async (fileId_10) => {
|
|
169
|
+
await retryUpload(fileId_10);
|
|
170
|
+
userCallbacks?.onFileUploadRetried?.(fileId_10);
|
|
171
171
|
};
|
|
172
172
|
return {
|
|
173
173
|
files,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-file-upload.js","names":["files","filesToAdd: File[]","rejectedFiles: File[]","status: UploadFileStatus"],"sources":["../../../../src/components/ds-file-upload/hooks/use-file-upload.ts"],"sourcesContent":["import { useState } from 'react';\nimport type {\n\tFileUploadFileAcceptDetails,\n\tFileUploadFileRejectDetails,\n\tFileUploadFileRejection,\n} from '@ark-ui/react';\nimport { createUploadedFile } from '../utils/file-factory';\nimport { isFileEqual } from '../utils/is-file-equal';\nimport type {\n\tFileError,\n\tFileMetadata,\n\tFileUploadAdapter,\n\tFileUploadResult,\n\tUploadedFile,\n\tUploadFileStatus,\n} from '../ds-file-upload-api.types';\nimport { FileUploadError } from '../errors/file-upload-errors';\nimport type { FileUploadProps } from '../components/file-upload';\n\nexport interface UseFileUploadConfig {\n\tadapter: FileUploadAdapter;\n\tautoUpload?: boolean;\n\tmaxConcurrent?: number;\n\tmaxFiles?: number;\n\tmetadata?: FileMetadata;\n\tonFileUploadComplete?: (fileId: string, result: FileUploadResult) => void;\n\tonFileUploadError?: (fileId: string, error: string) => void;\n\tonAllFileUploadsComplete?: () => void;\n}\n\nexport interface UseFileUploadUserCallbacks {\n\tonFilesAdded?: (files: File[]) => void;\n\tonFileRemoved?: (fileId: string) => void;\n\tonFileDeleted?: (fileId: string) => void;\n\tonFileUploadCanceled?: (fileId: string) => void;\n\tonFileUploadRetried?: (fileId: string) => void;\n}\n\nexport interface UseFileUploadReturn {\n\tfiles: UploadedFile[];\n\tacceptedFiles: UploadedFile[];\n\taddFiles: (newFiles: File[]) => UploadedFile[];\n\taddRejectedFiles: (filesWithErrors: { file: File; errors: FileError[] }[]) => void;\n\tremoveFile: (fileId: string) => void;\n\tdeleteFile: (fileId: string) => Promise<void>;\n\tuploadFile: (fileId: string) => Promise<void>;\n\tuploadAll: () => Promise<void>;\n\tcancelUpload: (fileId: string) => Promise<void>;\n\tretryUpload: (fileId: string) => Promise<void>;\n\tclearFiles: () => void;\n\t/**\n\t * Get props for FileUpload component with callback composition\n\t * @param userCallbacks Optional user callbacks to compose with internal logic\n\t * @returns Props ready to spread onto FileUpload component\n\t */\n\tgetProps: (\n\t\tuserCallbacks?: UseFileUploadUserCallbacks,\n\t) => Pick<\n\t\tFileUploadProps,\n\t\t| 'files'\n\t\t| 'acceptedFiles'\n\t\t| 'onFileAccept'\n\t\t| 'onFileReject'\n\t\t| 'onFileRemove'\n\t\t| 'onFileDelete'\n\t\t| 'onFileCancel'\n\t\t| 'onFileRetry'\n\t>;\n}\n\n/**\n * File upload state management hook\n */\nexport function useFileUpload({\n\tadapter,\n\tautoUpload = true,\n\tmaxConcurrent = 3,\n\tmaxFiles,\n\tmetadata,\n\tonFileUploadComplete,\n\tonFileUploadError,\n\tonAllFileUploadsComplete,\n}: UseFileUploadConfig): UseFileUploadReturn {\n\tconst [abortControllers] = useState(() => new Map<string, AbortController>());\n\tconst [files, setFiles] = useState<UploadedFile[]>([]);\n\tconst acceptedFiles = files.filter((file) => file.status !== 'error');\n\n\tif (files.length && !files.some((f) => f.status === 'uploading')) {\n\t\tonAllFileUploadsComplete?.();\n\t}\n\n\tconst getAddedFiles = (newFiles: File[]) =>\n\t\tnewFiles.filter((file) => !acceptedFiles.some((existing) => isFileEqual(existing, file)));\n\n\tconst getDuplicatedFiles = (newFiles: File[]) =>\n\t\tnewFiles.filter((file) => {\n\t\t\tconst uploadedFile = file as UploadedFile;\n\t\t\tif (uploadedFile.id) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst found = files.filter((existing) => isFileEqual(existing, file));\n\t\t\tif (found.length) {\n\t\t\t\tconst alreadyAdded = found.some((existing) => existing.errors?.includes('FILE_EXISTS'));\n\t\t\t\treturn !alreadyAdded;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\tconst markDuplicates = (duplicates: File[]) => {\n\t\tconst duplicateFilesWithErrors = duplicates.map((file) => ({\n\t\t\tfile,\n\t\t\terrors: ['FILE_EXISTS'],\n\t\t}));\n\t\tif (duplicateFilesWithErrors.length) {\n\t\t\taddRejectedFiles(duplicateFilesWithErrors);\n\t\t}\n\t};\n\n\tconst markMaxFiles = (files: File[]): File[] => {\n\t\tif (maxFiles === undefined) {\n\t\t\treturn files;\n\t\t}\n\n\t\tconst currentAcceptedCount = acceptedFiles.length;\n\t\tconst availableSlots = maxFiles - currentAcceptedCount;\n\n\t\tlet filesToAdd: File[];\n\t\tlet rejectedFiles: File[];\n\n\t\tif (availableSlots <= 0) {\n\t\t\tfilesToAdd = [];\n\t\t\trejectedFiles = files;\n\t\t} else if (files.length > availableSlots) {\n\t\t\tfilesToAdd = files.slice(0, availableSlots);\n\t\t\trejectedFiles = files.slice(availableSlots);\n\t\t} else {\n\t\t\treturn files;\n\t\t}\n\n\t\tconst rejectedFilesWithErrors = rejectedFiles.map((file) => ({\n\t\t\tfile,\n\t\t\terrors: ['TOO_MANY_FILES'],\n\t\t}));\n\t\taddRejectedFiles(rejectedFilesWithErrors);\n\n\t\treturn filesToAdd;\n\t};\n\n\tconst addNewFiles = (filesToUpload: File[]): UploadedFile[] => {\n\t\tconst uploadedFiles = filesToUpload.map((file) => createUploadedFile(file, 'pending'));\n\t\tsetFiles((prev) => [...prev, ...uploadedFiles]);\n\t\treturn uploadedFiles;\n\t};\n\n\tconst uploadNewFiles = (uploadedFiles: UploadedFile[]) => {\n\t\tif (autoUpload) {\n\t\t\tuploadedFiles.forEach((file) => {\n\t\t\t\tvoid uploadSingleFile(file);\n\t\t\t});\n\t\t}\n\t};\n\n\tconst addFiles = (newFiles: File[]): UploadedFile[] => {\n\t\tconst addedFiles = getAddedFiles(newFiles);\n\t\tconst duplicateFiles = getDuplicatedFiles(newFiles);\n\t\tmarkDuplicates(duplicateFiles);\n\t\tconst filesToAdd = markMaxFiles(addedFiles);\n\t\tconst uploadedFiles = addNewFiles(filesToAdd);\n\t\tuploadNewFiles(uploadedFiles);\n\t\treturn uploadedFiles;\n\t};\n\n\tconst addRejectedFiles = (filesWithErrors: { file: File; errors: FileError[] }[]) => {\n\t\tconst newFileStates = filesWithErrors.map(({ file, errors }) =>\n\t\t\tcreateUploadedFile(file, 'error', errors),\n\t\t);\n\t\tsetFiles((prev) => [...prev, ...newFileStates]);\n\t};\n\n\tconst updateFileProgress = (fileId: string, progress: number) => {\n\t\tsetFiles((prev) => prev.map((file) => (file.id === fileId ? { ...file, progress } : file)));\n\t};\n\n\tconst updateFileStatus = (fileId: string, status: UploadFileStatus, error?: string) => {\n\t\tsetFiles((prev) =>\n\t\t\tprev.map((file) =>\n\t\t\t\tfile.id === fileId\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...file,\n\t\t\t\t\t\t\tstatus,\n\t\t\t\t\t\t\terrors: error ? [...(file.errors || []), error] : file.errors,\n\t\t\t\t\t\t}\n\t\t\t\t\t: file,\n\t\t\t),\n\t\t);\n\t};\n\n\tconst uploadFile = async (fileId: string) => {\n\t\tconst file = acceptedFiles.find((f) => f.id === fileId);\n\t\tif (file) {\n\t\t\tawait uploadSingleFile(file);\n\t\t}\n\t};\n\n\tconst uploadSingleFile = async (file: UploadedFile) => {\n\t\tconst fileId = file.id;\n\t\tconst abortController = new AbortController();\n\t\tabortControllers.set(fileId, abortController);\n\n\t\tupdateFileStatus(file.id, 'uploading');\n\n\t\ttry {\n\t\t\tconst result = await adapter.upload({\n\t\t\t\tfile,\n\t\t\t\tfileId,\n\t\t\t\tmetadata,\n\t\t\t\tsignal: abortController.signal,\n\t\t\t\tonProgress: (progress) => {\n\t\t\t\t\tupdateFileProgress(fileId, progress);\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tupdateFileStatus(fileId, 'completed');\n\t\t\tupdateFileProgress(fileId, 100);\n\t\t\tonFileUploadComplete?.(fileId, result);\n\t\t} catch (error) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : 'Upload failed';\n\t\t\t// Determine status based on error type\n\t\t\t// Unknown errors are treated as retryable (network errors, etc.)\n\t\t\tlet status: UploadFileStatus = 'interrupted';\n\t\t\tif (error instanceof FileUploadError) {\n\t\t\t\tstatus = error.isRetryable ? 'interrupted' : 'error';\n\t\t\t}\n\t\t\tupdateFileStatus(fileId, status, errorMessage);\n\t\t\tonFileUploadError?.(fileId, errorMessage);\n\t\t} finally {\n\t\t\tabortControllers.delete(fileId);\n\t\t}\n\t};\n\n\tconst uploadAll = async () => {\n\t\tconst pendingFiles = files.filter((f) => f.status === 'pending');\n\n\t\tfor (let i = 0; i < pendingFiles.length; i += maxConcurrent) {\n\t\t\tconst batch = pendingFiles.slice(i, i + maxConcurrent);\n\t\t\tawait Promise.allSettled(batch.map((f) => uploadFile(f.id)));\n\t\t}\n\t};\n\n\tconst cancelUpload = async (fileId: string) => {\n\t\tabortControllers.get(fileId)?.abort();\n\t\tabortControllers.delete(fileId);\n\n\t\tif (adapter.cancel) {\n\t\t\tawait adapter.cancel(fileId);\n\t\t}\n\n\t\tupdateFileStatus(fileId, 'cancelled');\n\t};\n\n\tconst retryUpload = async (fileId: string) => {\n\t\tupdateFileStatus(fileId, 'pending');\n\t\tupdateFileProgress(fileId, 0);\n\t\tawait uploadFile(fileId);\n\t};\n\n\tconst removeFile = (fileId: string) => {\n\t\tabortControllers.get(fileId)?.abort();\n\t\tabortControllers.delete(fileId);\n\n\t\tsetFiles((prev) => prev.filter((file) => file.id !== fileId));\n\t};\n\n\tconst deleteFile = async (fileId: string) => {\n\t\tif (adapter.delete) {\n\t\t\tawait adapter.delete(fileId);\n\t\t}\n\n\t\tremoveFile(fileId);\n\t};\n\n\tconst clearFiles = () => {\n\t\tabortControllers.forEach((controller) => controller.abort());\n\t\tabortControllers.clear();\n\n\t\tsetFiles([]);\n\t};\n\n\tconst getProps = (userCallbacks?: UseFileUploadUserCallbacks) => {\n\t\tconst handleFileAccept = (details: FileUploadFileAcceptDetails) => {\n\t\t\tconst addedFiles = addFiles(details.files);\n\t\t\tuserCallbacks?.onFilesAdded?.(addedFiles);\n\t\t};\n\n\t\tconst handleFileReject = (details: FileUploadFileRejectDetails) => {\n\t\t\taddRejectedFiles(\n\t\t\t\tdetails.files.map((f: FileUploadFileRejection) => ({\n\t\t\t\t\tfile: f.file,\n\t\t\t\t\terrors: f.errors,\n\t\t\t\t})),\n\t\t\t);\n\t\t};\n\n\t\tconst handleFileRemove = (fileId: string) => {\n\t\t\tremoveFile(fileId);\n\t\t\tuserCallbacks?.onFileRemoved?.(fileId);\n\t\t};\n\n\t\tconst handleFileDelete = async (fileId: string) => {\n\t\t\tawait deleteFile(fileId);\n\t\t\tuserCallbacks?.onFileDeleted?.(fileId);\n\t\t};\n\n\t\tconst handleFileUploadCanceled = async (fileId: string) => {\n\t\t\tawait cancelUpload(fileId);\n\t\t\tuserCallbacks?.onFileUploadCanceled?.(fileId);\n\t\t};\n\n\t\tconst handleFileUploadRetried = async (fileId: string) => {\n\t\t\tawait retryUpload(fileId);\n\t\t\tuserCallbacks?.onFileUploadRetried?.(fileId);\n\t\t};\n\n\t\treturn {\n\t\t\tfiles,\n\t\t\tacceptedFiles,\n\t\t\tonFileAccept: handleFileAccept,\n\t\t\tonFileReject: handleFileReject,\n\t\t\tonFileRemove: handleFileRemove,\n\t\t\tonFileDelete: handleFileDelete,\n\t\t\tonFileCancel: handleFileUploadCanceled,\n\t\t\tonFileRetry: handleFileUploadRetried,\n\t\t};\n\t};\n\n\treturn {\n\t\tfiles,\n\t\tacceptedFiles,\n\t\taddFiles,\n\t\taddRejectedFiles,\n\t\tremoveFile,\n\t\tdeleteFile,\n\t\tuploadFile,\n\t\tuploadAll,\n\t\tcancelUpload,\n\t\tretryUpload,\n\t\tclearFiles,\n\t\tgetProps,\n\t};\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-file-upload.js","names":["useState","FileUploadFileAcceptDetails","FileUploadFileRejectDetails","FileUploadFileRejection","createUploadedFile","isFileEqual","FileError","FileMetadata","FileUploadAdapter","FileUploadResult","UploadedFile","UploadFileStatus","FileUploadError","FileUploadProps","UseFileUploadConfig","adapter","autoUpload","maxConcurrent","maxFiles","metadata","onFileUploadComplete","fileId","result","onFileUploadError","error","onAllFileUploadsComplete","UseFileUploadUserCallbacks","onFilesAdded","files","File","onFileRemoved","onFileDeleted","onFileUploadCanceled","onFileUploadRetried","UseFileUploadReturn","acceptedFiles","addFiles","newFiles","addRejectedFiles","filesWithErrors","file","errors","removeFile","deleteFile","Promise","uploadFile","uploadAll","cancelUpload","retryUpload","clearFiles","getProps","userCallbacks","Pick","useFileUpload","abortControllers","Map","AbortController","setFiles","filter","status","length","some","f","getAddedFiles","existing","getDuplicatedFiles","uploadedFile","id","found","alreadyAdded","includes","markDuplicates","duplicates","duplicateFilesWithErrors","map","markMaxFiles","undefined","currentAcceptedCount","availableSlots","filesToAdd","rejectedFiles","slice","rejectedFilesWithErrors","addNewFiles","filesToUpload","uploadedFiles","prev","uploadNewFiles","forEach","uploadSingleFile","addedFiles","duplicateFiles","newFileStates","updateFileProgress","progress","updateFileStatus","find","abortController","set","upload","signal","onProgress","errorMessage","Error","message","isRetryable","delete","pendingFiles","i","batch","allSettled","get","abort","cancel","controller","clear","handleFileAccept","details","handleFileReject","handleFileRemove","handleFileDelete","handleFileUploadCanceled","handleFileUploadRetried","onFileAccept","onFileReject","onFileRemove","onFileDelete","onFileCancel","onFileRetry"],"sources":["../../../../src/components/ds-file-upload/hooks/use-file-upload.ts"],"sourcesContent":["import { useState } from 'react';\nimport type {\n\tFileUploadFileAcceptDetails,\n\tFileUploadFileRejectDetails,\n\tFileUploadFileRejection,\n} from '@ark-ui/react';\nimport { createUploadedFile } from '../utils/file-factory';\nimport { isFileEqual } from '../utils/is-file-equal';\nimport type {\n\tFileError,\n\tFileMetadata,\n\tFileUploadAdapter,\n\tFileUploadResult,\n\tUploadedFile,\n\tUploadFileStatus,\n} from '../ds-file-upload-api.types';\nimport { FileUploadError } from '../errors/file-upload-errors';\nimport type { FileUploadProps } from '../components/file-upload';\n\nexport interface UseFileUploadConfig {\n\tadapter: FileUploadAdapter;\n\tautoUpload?: boolean;\n\tmaxConcurrent?: number;\n\tmaxFiles?: number;\n\tmetadata?: FileMetadata;\n\tonFileUploadComplete?: (fileId: string, result: FileUploadResult) => void;\n\tonFileUploadError?: (fileId: string, error: string) => void;\n\tonAllFileUploadsComplete?: () => void;\n}\n\nexport interface UseFileUploadUserCallbacks {\n\tonFilesAdded?: (files: File[]) => void;\n\tonFileRemoved?: (fileId: string) => void;\n\tonFileDeleted?: (fileId: string) => void;\n\tonFileUploadCanceled?: (fileId: string) => void;\n\tonFileUploadRetried?: (fileId: string) => void;\n}\n\nexport interface UseFileUploadReturn {\n\tfiles: UploadedFile[];\n\tacceptedFiles: UploadedFile[];\n\taddFiles: (newFiles: File[]) => UploadedFile[];\n\taddRejectedFiles: (filesWithErrors: { file: File; errors: FileError[] }[]) => void;\n\tremoveFile: (fileId: string) => void;\n\tdeleteFile: (fileId: string) => Promise<void>;\n\tuploadFile: (fileId: string) => Promise<void>;\n\tuploadAll: () => Promise<void>;\n\tcancelUpload: (fileId: string) => Promise<void>;\n\tretryUpload: (fileId: string) => Promise<void>;\n\tclearFiles: () => void;\n\t/**\n\t * Get props for FileUpload component with callback composition\n\t * @param userCallbacks Optional user callbacks to compose with internal logic\n\t * @returns Props ready to spread onto FileUpload component\n\t */\n\tgetProps: (\n\t\tuserCallbacks?: UseFileUploadUserCallbacks,\n\t) => Pick<\n\t\tFileUploadProps,\n\t\t| 'files'\n\t\t| 'acceptedFiles'\n\t\t| 'onFileAccept'\n\t\t| 'onFileReject'\n\t\t| 'onFileRemove'\n\t\t| 'onFileDelete'\n\t\t| 'onFileCancel'\n\t\t| 'onFileRetry'\n\t>;\n}\n\n/**\n * File upload state management hook\n */\nexport function useFileUpload({\n\tadapter,\n\tautoUpload = true,\n\tmaxConcurrent = 3,\n\tmaxFiles,\n\tmetadata,\n\tonFileUploadComplete,\n\tonFileUploadError,\n\tonAllFileUploadsComplete,\n}: UseFileUploadConfig): UseFileUploadReturn {\n\tconst [abortControllers] = useState(() => new Map<string, AbortController>());\n\tconst [files, setFiles] = useState<UploadedFile[]>([]);\n\tconst acceptedFiles = files.filter((file) => file.status !== 'error');\n\n\tif (files.length && !files.some((f) => f.status === 'uploading')) {\n\t\tonAllFileUploadsComplete?.();\n\t}\n\n\tconst getAddedFiles = (newFiles: File[]) =>\n\t\tnewFiles.filter((file) => !acceptedFiles.some((existing) => isFileEqual(existing, file)));\n\n\tconst getDuplicatedFiles = (newFiles: File[]) =>\n\t\tnewFiles.filter((file) => {\n\t\t\tconst uploadedFile = file as UploadedFile;\n\t\t\tif (uploadedFile.id) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst found = files.filter((existing) => isFileEqual(existing, file));\n\t\t\tif (found.length) {\n\t\t\t\tconst alreadyAdded = found.some((existing) => existing.errors?.includes('FILE_EXISTS'));\n\t\t\t\treturn !alreadyAdded;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\tconst markDuplicates = (duplicates: File[]) => {\n\t\tconst duplicateFilesWithErrors = duplicates.map((file) => ({\n\t\t\tfile,\n\t\t\terrors: ['FILE_EXISTS'],\n\t\t}));\n\t\tif (duplicateFilesWithErrors.length) {\n\t\t\taddRejectedFiles(duplicateFilesWithErrors);\n\t\t}\n\t};\n\n\tconst markMaxFiles = (files: File[]): File[] => {\n\t\tif (maxFiles === undefined) {\n\t\t\treturn files;\n\t\t}\n\n\t\tconst currentAcceptedCount = acceptedFiles.length;\n\t\tconst availableSlots = maxFiles - currentAcceptedCount;\n\n\t\tlet filesToAdd: File[];\n\t\tlet rejectedFiles: File[];\n\n\t\tif (availableSlots <= 0) {\n\t\t\tfilesToAdd = [];\n\t\t\trejectedFiles = files;\n\t\t} else if (files.length > availableSlots) {\n\t\t\tfilesToAdd = files.slice(0, availableSlots);\n\t\t\trejectedFiles = files.slice(availableSlots);\n\t\t} else {\n\t\t\treturn files;\n\t\t}\n\n\t\tconst rejectedFilesWithErrors = rejectedFiles.map((file) => ({\n\t\t\tfile,\n\t\t\terrors: ['TOO_MANY_FILES'],\n\t\t}));\n\t\taddRejectedFiles(rejectedFilesWithErrors);\n\n\t\treturn filesToAdd;\n\t};\n\n\tconst addNewFiles = (filesToUpload: File[]): UploadedFile[] => {\n\t\tconst uploadedFiles = filesToUpload.map((file) => createUploadedFile(file, 'pending'));\n\t\tsetFiles((prev) => [...prev, ...uploadedFiles]);\n\t\treturn uploadedFiles;\n\t};\n\n\tconst uploadNewFiles = (uploadedFiles: UploadedFile[]) => {\n\t\tif (autoUpload) {\n\t\t\tuploadedFiles.forEach((file) => {\n\t\t\t\tvoid uploadSingleFile(file);\n\t\t\t});\n\t\t}\n\t};\n\n\tconst addFiles = (newFiles: File[]): UploadedFile[] => {\n\t\tconst addedFiles = getAddedFiles(newFiles);\n\t\tconst duplicateFiles = getDuplicatedFiles(newFiles);\n\t\tmarkDuplicates(duplicateFiles);\n\t\tconst filesToAdd = markMaxFiles(addedFiles);\n\t\tconst uploadedFiles = addNewFiles(filesToAdd);\n\t\tuploadNewFiles(uploadedFiles);\n\t\treturn uploadedFiles;\n\t};\n\n\tconst addRejectedFiles = (filesWithErrors: { file: File; errors: FileError[] }[]) => {\n\t\tconst newFileStates = filesWithErrors.map(({ file, errors }) =>\n\t\t\tcreateUploadedFile(file, 'error', errors),\n\t\t);\n\t\tsetFiles((prev) => [...prev, ...newFileStates]);\n\t};\n\n\tconst updateFileProgress = (fileId: string, progress: number) => {\n\t\tsetFiles((prev) => prev.map((file) => (file.id === fileId ? { ...file, progress } : file)));\n\t};\n\n\tconst updateFileStatus = (fileId: string, status: UploadFileStatus, error?: string) => {\n\t\tsetFiles((prev) =>\n\t\t\tprev.map((file) =>\n\t\t\t\tfile.id === fileId\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...file,\n\t\t\t\t\t\t\tstatus,\n\t\t\t\t\t\t\terrors: error ? [...(file.errors || []), error] : file.errors,\n\t\t\t\t\t\t}\n\t\t\t\t\t: file,\n\t\t\t),\n\t\t);\n\t};\n\n\tconst uploadFile = async (fileId: string) => {\n\t\tconst file = acceptedFiles.find((f) => f.id === fileId);\n\t\tif (file) {\n\t\t\tawait uploadSingleFile(file);\n\t\t}\n\t};\n\n\tconst uploadSingleFile = async (file: UploadedFile) => {\n\t\tconst fileId = file.id;\n\t\tconst abortController = new AbortController();\n\t\tabortControllers.set(fileId, abortController);\n\n\t\tupdateFileStatus(file.id, 'uploading');\n\n\t\ttry {\n\t\t\tconst result = await adapter.upload({\n\t\t\t\tfile,\n\t\t\t\tfileId,\n\t\t\t\tmetadata,\n\t\t\t\tsignal: abortController.signal,\n\t\t\t\tonProgress: (progress) => {\n\t\t\t\t\tupdateFileProgress(fileId, progress);\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tupdateFileStatus(fileId, 'completed');\n\t\t\tupdateFileProgress(fileId, 100);\n\t\t\tonFileUploadComplete?.(fileId, result);\n\t\t} catch (error) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : 'Upload failed';\n\t\t\t// Determine status based on error type\n\t\t\t// Unknown errors are treated as retryable (network errors, etc.)\n\t\t\tlet status: UploadFileStatus = 'interrupted';\n\t\t\tif (error instanceof FileUploadError) {\n\t\t\t\tstatus = error.isRetryable ? 'interrupted' : 'error';\n\t\t\t}\n\t\t\tupdateFileStatus(fileId, status, errorMessage);\n\t\t\tonFileUploadError?.(fileId, errorMessage);\n\t\t} finally {\n\t\t\tabortControllers.delete(fileId);\n\t\t}\n\t};\n\n\tconst uploadAll = async () => {\n\t\tconst pendingFiles = files.filter((f) => f.status === 'pending');\n\n\t\tfor (let i = 0; i < pendingFiles.length; i += maxConcurrent) {\n\t\t\tconst batch = pendingFiles.slice(i, i + maxConcurrent);\n\t\t\tawait Promise.allSettled(batch.map((f) => uploadFile(f.id)));\n\t\t}\n\t};\n\n\tconst cancelUpload = async (fileId: string) => {\n\t\tabortControllers.get(fileId)?.abort();\n\t\tabortControllers.delete(fileId);\n\n\t\tif (adapter.cancel) {\n\t\t\tawait adapter.cancel(fileId);\n\t\t}\n\n\t\tupdateFileStatus(fileId, 'cancelled');\n\t};\n\n\tconst retryUpload = async (fileId: string) => {\n\t\tupdateFileStatus(fileId, 'pending');\n\t\tupdateFileProgress(fileId, 0);\n\t\tawait uploadFile(fileId);\n\t};\n\n\tconst removeFile = (fileId: string) => {\n\t\tabortControllers.get(fileId)?.abort();\n\t\tabortControllers.delete(fileId);\n\n\t\tsetFiles((prev) => prev.filter((file) => file.id !== fileId));\n\t};\n\n\tconst deleteFile = async (fileId: string) => {\n\t\tif (adapter.delete) {\n\t\t\tawait adapter.delete(fileId);\n\t\t}\n\n\t\tremoveFile(fileId);\n\t};\n\n\tconst clearFiles = () => {\n\t\tabortControllers.forEach((controller) => controller.abort());\n\t\tabortControllers.clear();\n\n\t\tsetFiles([]);\n\t};\n\n\tconst getProps = (userCallbacks?: UseFileUploadUserCallbacks) => {\n\t\tconst handleFileAccept = (details: FileUploadFileAcceptDetails) => {\n\t\t\tconst addedFiles = addFiles(details.files);\n\t\t\tuserCallbacks?.onFilesAdded?.(addedFiles);\n\t\t};\n\n\t\tconst handleFileReject = (details: FileUploadFileRejectDetails) => {\n\t\t\taddRejectedFiles(\n\t\t\t\tdetails.files.map((f: FileUploadFileRejection) => ({\n\t\t\t\t\tfile: f.file,\n\t\t\t\t\terrors: f.errors,\n\t\t\t\t})),\n\t\t\t);\n\t\t};\n\n\t\tconst handleFileRemove = (fileId: string) => {\n\t\t\tremoveFile(fileId);\n\t\t\tuserCallbacks?.onFileRemoved?.(fileId);\n\t\t};\n\n\t\tconst handleFileDelete = async (fileId: string) => {\n\t\t\tawait deleteFile(fileId);\n\t\t\tuserCallbacks?.onFileDeleted?.(fileId);\n\t\t};\n\n\t\tconst handleFileUploadCanceled = async (fileId: string) => {\n\t\t\tawait cancelUpload(fileId);\n\t\t\tuserCallbacks?.onFileUploadCanceled?.(fileId);\n\t\t};\n\n\t\tconst handleFileUploadRetried = async (fileId: string) => {\n\t\t\tawait retryUpload(fileId);\n\t\t\tuserCallbacks?.onFileUploadRetried?.(fileId);\n\t\t};\n\n\t\treturn {\n\t\t\tfiles,\n\t\t\tacceptedFiles,\n\t\t\tonFileAccept: handleFileAccept,\n\t\t\tonFileReject: handleFileReject,\n\t\t\tonFileRemove: handleFileRemove,\n\t\t\tonFileDelete: handleFileDelete,\n\t\t\tonFileCancel: handleFileUploadCanceled,\n\t\t\tonFileRetry: handleFileUploadRetried,\n\t\t};\n\t};\n\n\treturn {\n\t\tfiles,\n\t\tacceptedFiles,\n\t\taddFiles,\n\t\taddRejectedFiles,\n\t\tremoveFile,\n\t\tdeleteFile,\n\t\tuploadFile,\n\t\tuploadAll,\n\t\tcancelUpload,\n\t\tretryUpload,\n\t\tclearFiles,\n\t\tgetProps,\n\t};\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accept-types.js","names":["
|
|
1
|
+
{"version":3,"file":"accept-types.js","names":["FileUploadFileMimeType","FileExtension","AcceptedFileType","mimeType","extensions","EXTENSIONS_MAP","Record","const"],"sources":["../../../../src/components/ds-file-upload/types/accept-types.ts"],"sourcesContent":["/* cspell:disable */\nimport type { FileUploadFileMimeType } from '@ark-ui/react';\n\n/**\n * File extension with leading dot\n * @example '.pdf', '.jpg', '.csv'\n */\nexport type FileExtension = `.${string}`;\n\n/**\n * Accepted file type configuration\n * - Use string shorthand for common MIME types (uses built-in extensions map)\n * - Use object form to override or provide custom extensions\n */\nexport type AcceptedFileType =\n\t| FileUploadFileMimeType\n\t| {\n\t\t\tmimeType: FileUploadFileMimeType;\n\t\t\textensions: [FileExtension, ...FileExtension[]];\n\t };\n\n/**\n * Built-in extensions map for common MIME types\n */\nexport const EXTENSIONS_MAP: Record<FileUploadFileMimeType, FileExtension[]> = {\n\t// Images - specific types\n\t'image/png': ['.png'],\n\t'image/gif': ['.gif'],\n\t'image/jpeg': ['.jpg', '.jpeg'],\n\t'image/svg+xml': ['.svg'],\n\t'image/webp': ['.webp'],\n\t'image/avif': ['.avif'],\n\t'image/heic': ['.heic', '.heif'],\n\t'image/bmp': ['.bmp'],\n\n\t// Applications\n\t'application/pdf': ['.pdf'],\n\t'application/zip': ['.zip'],\n\t'application/json': ['.json'],\n\t'application/xml': ['.xml'],\n\t'application/msword': ['.doc'],\n\t'application/vnd.openxmlformats-officedocument.wordprocessingml.document': ['.docx'],\n\t'application/vnd.ms-excel': ['.xls'],\n\t'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': ['.xlsx'],\n\t'application/vnd.ms-powerpoint': ['.ppt'],\n\t'application/vnd.openxmlformats-officedocument.presentationml.presentation': ['.pptx'],\n\t'application/rtf': ['.rtf'],\n\t'application/x-rar': ['.rar'],\n\t'application/x-7z-compressed': ['.7z'],\n\t'application/x-tar': ['.tar'],\n\t'application/vnd.microsoft.portable-executable': ['.exe', '.dll'],\n\n\t// Text\n\t'text/css': ['.css'],\n\t'text/csv': ['.csv'],\n\t'text/html': ['.html', '.htm'],\n\t'text/markdown': ['.md', '.markdown'],\n\t'text/plain': ['.txt'],\n\n\t// Fonts\n\t'font/ttf': ['.ttf'],\n\t'font/otf': ['.otf'],\n\t'font/woff': ['.woff'],\n\t'font/woff2': ['.woff2'],\n\t'font/eot': ['.eot'],\n\t'font/svg': ['.svg'],\n\n\t// Video\n\t'video/mp4': ['.mp4'],\n\t'video/webm': ['.webm'],\n\t'video/ogg': ['.ogv'],\n\t'video/quicktime': ['.mov'],\n\t'video/x-msvideo': ['.avi'],\n\n\t// Audio\n\t'audio/mpeg': ['.mp3'],\n\t'audio/ogg': ['.ogg', '.oga'],\n\t'audio/wav': ['.wav'],\n\t'audio/webm': ['.weba'],\n\t'audio/aac': ['.aac'],\n\t'audio/flac': ['.flac'],\n\t'audio/x-m4a': ['.m4a'],\n\n\t// Wildcards\n\t'image/*': ['.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg', '.bmp', '.avif', '.heic', '.heif'],\n\t'audio/*': ['.mp3', '.wav', '.ogg', '.oga', '.m4a', '.flac', '.aac', '.weba'],\n\t'video/*': ['.mp4', '.webm', '.ogv', '.mov', '.avi'],\n\t'text/*': ['.txt', '.html', '.htm', '.css', '.csv', '.md', '.markdown'],\n\t'application/*': [\n\t\t'.pdf',\n\t\t'.zip',\n\t\t'.json',\n\t\t'.xml',\n\t\t'.doc',\n\t\t'.docx',\n\t\t'.xls',\n\t\t'.xlsx',\n\t\t'.ppt',\n\t\t'.pptx',\n\t\t'.rtf',\n\t\t'.rar',\n\t\t'.7z',\n\t\t'.tar',\n\t],\n\t'font/*': ['.ttf', '.otf', '.woff', '.woff2', '.eot'],\n} as const;\n"],"mappings":";;;;AAwBA,MAAaK,iBAAkE;CAE9E,aAAa,CAAC,OAAO;CACrB,aAAa,CAAC,OAAO;CACrB,cAAc,CAAC,QAAQ,QAAQ;CAC/B,iBAAiB,CAAC,OAAO;CACzB,cAAc,CAAC,QAAQ;CACvB,cAAc,CAAC,QAAQ;CACvB,cAAc,CAAC,SAAS,QAAQ;CAChC,aAAa,CAAC,OAAO;CAGrB,mBAAmB,CAAC,OAAO;CAC3B,mBAAmB,CAAC,OAAO;CAC3B,oBAAoB,CAAC,QAAQ;CAC7B,mBAAmB,CAAC,OAAO;CAC3B,sBAAsB,CAAC,OAAO;CAC9B,2EAA2E,CAAC,QAAQ;CACpF,4BAA4B,CAAC,OAAO;CACpC,qEAAqE,CAAC,QAAQ;CAC9E,iCAAiC,CAAC,OAAO;CACzC,6EAA6E,CAAC,QAAQ;CACtF,mBAAmB,CAAC,OAAO;CAC3B,qBAAqB,CAAC,OAAO;CAC7B,+BAA+B,CAAC,MAAM;CACtC,qBAAqB,CAAC,OAAO;CAC7B,iDAAiD,CAAC,QAAQ,OAAO;CAGjE,YAAY,CAAC,OAAO;CACpB,YAAY,CAAC,OAAO;CACpB,aAAa,CAAC,SAAS,OAAO;CAC9B,iBAAiB,CAAC,OAAO,YAAY;CACrC,cAAc,CAAC,OAAO;CAGtB,YAAY,CAAC,OAAO;CACpB,YAAY,CAAC,OAAO;CACpB,aAAa,CAAC,QAAQ;CACtB,cAAc,CAAC,SAAS;CACxB,YAAY,CAAC,OAAO;CACpB,YAAY,CAAC,OAAO;CAGpB,aAAa,CAAC,OAAO;CACrB,cAAc,CAAC,QAAQ;CACvB,aAAa,CAAC,OAAO;CACrB,mBAAmB,CAAC,OAAO;CAC3B,mBAAmB,CAAC,OAAO;CAG3B,cAAc,CAAC,OAAO;CACtB,aAAa,CAAC,QAAQ,OAAO;CAC7B,aAAa,CAAC,OAAO;CACrB,cAAc,CAAC,QAAQ;CACvB,aAAa,CAAC,OAAO;CACrB,cAAc,CAAC,QAAQ;CACvB,eAAe,CAAC,OAAO;CAGvB,WAAW;EAAC;EAAQ;EAAQ;EAAS;EAAQ;EAAS;EAAQ;EAAQ;EAAS;EAAS;EAAQ;CAChG,WAAW;EAAC;EAAQ;EAAQ;EAAQ;EAAQ;EAAQ;EAAS;EAAQ;EAAQ;CAC7E,WAAW;EAAC;EAAQ;EAAS;EAAQ;EAAQ;EAAO;CACpD,UAAU;EAAC;EAAQ;EAAS;EAAQ;EAAQ;EAAQ;EAAO;EAAY;CACvE,iBAAiB;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD,UAAU;EAAC;EAAQ;EAAQ;EAAS;EAAU;EAAM;CACpD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accept-utils.js","names":[],"sources":["../../../../src/components/ds-file-upload/utils/accept-utils.ts"],"sourcesContent":["import type { FileUploadFileMimeType } from '@ark-ui/react';\nimport { type AcceptedFileType, type FileExtension, EXTENSIONS_MAP } from '../types/accept-types';\n\n/**\n * Extract file extensions from accept configuration\n * @param accept Array of accepted file types\n * @returns Array of file extensions\n */\nexport function getFileExtensions(accept: AcceptedFileType[]): FileExtension[] {\n\treturn accept.flatMap((item) => {\n\t\tif (typeof item === 'string') {\n\t\t\treturn EXTENSIONS_MAP[item] ?? [];\n\t\t}\n\t\treturn item.extensions;\n\t});\n}\n\n/**\n * Extract MIME types from accept configuration\n * @param accept Array of accepted file types\n * @returns Array of MIME types\n */\nexport function getMimeTypes(accept: AcceptedFileType[]): FileUploadFileMimeType[] {\n\treturn accept.map((item) => (typeof item === 'string' ? item : item.mimeType));\n}\n"],"mappings":";;;;;;;;AAQA,
|
|
1
|
+
{"version":3,"file":"accept-utils.js","names":["FileUploadFileMimeType","AcceptedFileType","FileExtension","EXTENSIONS_MAP","getFileExtensions","accept","flatMap","item","extensions","getMimeTypes","map","mimeType"],"sources":["../../../../src/components/ds-file-upload/utils/accept-utils.ts"],"sourcesContent":["import type { FileUploadFileMimeType } from '@ark-ui/react';\nimport { type AcceptedFileType, type FileExtension, EXTENSIONS_MAP } from '../types/accept-types';\n\n/**\n * Extract file extensions from accept configuration\n * @param accept Array of accepted file types\n * @returns Array of file extensions\n */\nexport function getFileExtensions(accept: AcceptedFileType[]): FileExtension[] {\n\treturn accept.flatMap((item) => {\n\t\tif (typeof item === 'string') {\n\t\t\treturn EXTENSIONS_MAP[item] ?? [];\n\t\t}\n\t\treturn item.extensions;\n\t});\n}\n\n/**\n * Extract MIME types from accept configuration\n * @param accept Array of accepted file types\n * @returns Array of MIME types\n */\nexport function getMimeTypes(accept: AcceptedFileType[]): FileUploadFileMimeType[] {\n\treturn accept.map((item) => (typeof item === 'string' ? item : item.mimeType));\n}\n"],"mappings":";;;;;;;;AAQA,SAAgBI,kBAAkBC,QAA6C;AAC9E,QAAOA,OAAOC,SAASC,SAAS;AAC/B,MAAI,OAAOA,SAAS,SACnB,QAAOJ,eAAeI,SAAS,EAAE;AAElC,SAAOA,KAAKC;GACX;;;;;;;AAQH,SAAgBC,aAAaJ,QAAsD;AAClF,QAAOA,OAAOK,KAAKH,SAAU,OAAOA,SAAS,WAAWA,OAAOA,KAAKI,SAAU"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","names":["
|
|
1
|
+
{"version":3,"file":"constants.js","names":["AcceptedFileType","DEFAULT_ALLOWED_FILE_TYPES","DEFAULT_MAX_FILE_SIZE","DEFAULT_MAX_FILES"],"sources":["../../../../src/components/ds-file-upload/utils/constants.ts"],"sourcesContent":["import type { AcceptedFileType } from '../types/accept-types';\n\n/**\n * Default allowed file types for the file upload component\n */\nexport const DEFAULT_ALLOWED_FILE_TYPES: AcceptedFileType[] = [\n\t'application/pdf',\n\t'text/csv',\n\t'application/zip',\n\t'application/x-zip-compressed',\n];\n\n/**\n * Default maximum file size in bytes (25MB)\n */\nexport const DEFAULT_MAX_FILE_SIZE = 25_000_000;\n\n/**\n * Default maximum number of files allowed\n */\nexport const DEFAULT_MAX_FILES = 5;\n"],"mappings":";;;;AAKA,MAAaC,6BAAiD;CAC7D;CACA;CACA;CACA;CACA;;;;AAKD,MAAaC,wBAAwB;;;;AAKrC,MAAaC,oBAAoB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-factory.js","names":[],"sources":["../../../../src/components/ds-file-upload/utils/file-factory.ts"],"sourcesContent":["import type { FileError, UploadedFile, UploadFileStatus } from '../ds-file-upload-api.types';\n\n/**\n * Creates an UploadedFile object from a File with additional metadata\n */\nexport function createUploadedFile(file: File, status: UploadFileStatus, errors?: FileError[]): UploadedFile {\n\treturn {\n\t\t// eslint-disable-next-line @typescript-eslint/no-misused-spread -- We're fine with losing the prototype here\n\t\t...file,\n\t\tid: `${file.name}-${String(Date.now())}-${String(Math.random())}`,\n\t\tname: file.name,\n\t\tsize: file.size,\n\t\ttype: file.type,\n\t\tprogress: 0,\n\t\tstatus,\n\t\terrors,\n\t} satisfies UploadedFile;\n}\n"],"mappings":";;;;AAKA,
|
|
1
|
+
{"version":3,"file":"file-factory.js","names":["FileError","UploadedFile","UploadFileStatus","createUploadedFile","file","File","status","errors","id","name","String","Date","now","Math","random","size","type","progress"],"sources":["../../../../src/components/ds-file-upload/utils/file-factory.ts"],"sourcesContent":["import type { FileError, UploadedFile, UploadFileStatus } from '../ds-file-upload-api.types';\n\n/**\n * Creates an UploadedFile object from a File with additional metadata\n */\nexport function createUploadedFile(file: File, status: UploadFileStatus, errors?: FileError[]): UploadedFile {\n\treturn {\n\t\t// eslint-disable-next-line @typescript-eslint/no-misused-spread -- We're fine with losing the prototype here\n\t\t...file,\n\t\tid: `${file.name}-${String(Date.now())}-${String(Math.random())}`,\n\t\tname: file.name,\n\t\tsize: file.size,\n\t\ttype: file.type,\n\t\tprogress: 0,\n\t\tstatus,\n\t\terrors,\n\t} satisfies UploadedFile;\n}\n"],"mappings":";;;;AAKA,SAAgBG,mBAAmBC,MAAYE,QAA0BC,QAAoC;AAC5G,QAAO;EAEN,GAAGH;EACHI,IAAI,GAAGJ,KAAKK,KAAI,GAAIC,OAAOC,KAAKC,KAAK,CAAC,CAAA,GAAIF,OAAOG,KAAKC,QAAQ,CAAC;EAC/DL,MAAML,KAAKK;EACXM,MAAMX,KAAKW;EACXC,MAAMZ,KAAKY;EACXC,UAAU;EACVX;EACAC;EACA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-file-size.js","names":[],"sources":["../../../../src/components/ds-file-upload/utils/format-file-size.ts"],"sourcesContent":["/**\n * Format file size to human-readable format using SI units (decimal base)\n */\nexport function formatFileSize(bytes: number): string {\n\tif (bytes === 0) {\n\t\treturn '0 B';\n\t}\n\n\tconst k = 1000; // Decimal base (SI standard)\n\tconst sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k));\n\tconst size = bytes / Math.pow(k, i);\n\n\treturn `${size.toFixed(2)} ${sizes[i]}`;\n}\n"],"mappings":";;;;AAGA,
|
|
1
|
+
{"version":3,"file":"format-file-size.js","names":["formatFileSize","bytes","k","sizes","i","Math","floor","log","size","pow","toFixed"],"sources":["../../../../src/components/ds-file-upload/utils/format-file-size.ts"],"sourcesContent":["/**\n * Format file size to human-readable format using SI units (decimal base)\n */\nexport function formatFileSize(bytes: number): string {\n\tif (bytes === 0) {\n\t\treturn '0 B';\n\t}\n\n\tconst k = 1000; // Decimal base (SI standard)\n\tconst sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k));\n\tconst size = bytes / Math.pow(k, i);\n\n\treturn `${size.toFixed(2)} ${sizes[i]}`;\n}\n"],"mappings":";;;;AAGA,SAAgBA,eAAeC,OAAuB;AACrD,KAAIA,UAAU,EACb,QAAO;CAGR,MAAMC,IAAI;CACV,MAAMC,QAAQ;EAAC;EAAK;EAAM;EAAM;EAAM;EAAM;EAAK;CACjD,MAAMC,IAAIC,KAAKC,MAAMD,KAAKE,IAAIN,MAAM,GAAGI,KAAKE,IAAIL,EAAE,CAAC;AAGnD,QAAO,IAFMD,QAAQI,KAAKI,IAAIP,GAAGE,EAAE,EAEpBM,QAAQ,EAAE,CAAA,GAAIP,MAAMC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-helper-text.js","names":["parts
|
|
1
|
+
{"version":3,"file":"generate-helper-text.js","names":["AcceptedFileType","getFileExtensions","formatFileSize","generateHelperText","accept","maxFileSize","maxFiles","extensions","uniqueExtensions","Set","fileTypes","map","ext","toUpperCase","join","maxSizeText","parts","push","Infinity","String"],"sources":["../../../../src/components/ds-file-upload/utils/generate-helper-text.ts"],"sourcesContent":["import type { AcceptedFileType } from '../types/accept-types';\nimport { getFileExtensions } from './accept-utils';\nimport { formatFileSize } from './format-file-size';\n\n/**\n * Generate helper text based on validation props\n */\nexport function generateHelperText(\n\taccept: AcceptedFileType[],\n\tmaxFileSize: number,\n\tmaxFiles: number,\n): string {\n\t// Extract file extensions from accept configuration\n\tconst extensions = getFileExtensions(accept);\n\tconst uniqueExtensions = [...new Set(extensions)];\n\tconst fileTypes = uniqueExtensions.map((ext) => ext.toUpperCase()).join(', ');\n\n\t// Format file size\n\tconst maxSizeText = formatFileSize(maxFileSize);\n\n\t// Build helper text\n\tconst parts: string[] = [];\n\n\tif (fileTypes) {\n\t\tparts.push(`Only ${fileTypes} files`);\n\t}\n\n\tif (maxFileSize < Infinity) {\n\t\tparts.push(`File size ${maxSizeText} max`);\n\t}\n\n\tif (maxFiles === 1) {\n\t\tparts.push('Only 1 file');\n\t} else if (maxFiles > 1) {\n\t\tparts.push(`Up to ${String(maxFiles)} files`);\n\t}\n\n\treturn parts.join('. ') + '.';\n}\n"],"mappings":";;;;;;;AAOA,SAAgBG,mBACfC,QACAC,aACAC,UACS;CAET,MAAMC,aAAaN,kBAAkBG,OAAO;CAE5C,MAAMM,YADmB,CAAC,GAAG,IAAID,IAAIF,WAAW,CAAC,CACdI,KAAKC,QAAQA,IAAIC,aAAa,CAAC,CAACC,KAAK,KAAK;CAG7E,MAAMC,cAAcb,eAAeG,YAAY;CAG/C,MAAMW,QAAkB,EAAE;AAE1B,KAAIN,UACHM,OAAMC,KAAK,QAAQP,UAAS,QAAS;AAGtC,KAAIL,cAAca,SACjBF,OAAMC,KAAK,aAAaF,YAAW,MAAO;AAG3C,KAAIT,aAAa,EAChBU,OAAMC,KAAK,cAAc;UACfX,WAAW,EACrBU,OAAMC,KAAK,SAASE,OAAOb,SAAS,CAAA,QAAS;AAG9C,QAAOU,MAAMF,KAAK,KAAK,GAAG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-error-message.js","names":["FILE_ERROR_MESSAGES
|
|
1
|
+
{"version":3,"file":"get-error-message.js","names":["FileError","FILE_ERROR_MESSAGES","Record","FILE_TOO_LARGE","FILE_INVALID_TYPE","TOO_MANY_FILES","FILE_TOO_SMALL","FILE_INVALID","FILE_EXISTS","getErrorMessage","error"],"sources":["../../../../src/components/ds-file-upload/utils/get-error-message.ts"],"sourcesContent":["import type { FileError } from '../ds-file-upload-api.types';\n\nconst FILE_ERROR_MESSAGES: Record<FileError, string> = {\n\tFILE_TOO_LARGE: 'File size exceeds the maximum limit',\n\tFILE_INVALID_TYPE: 'File type is not allowed',\n\tTOO_MANY_FILES: 'Too many files selected',\n\tFILE_TOO_SMALL: 'File size is too small',\n\tFILE_INVALID: 'File is invalid',\n\tFILE_EXISTS: 'File already exists',\n};\n\n/**\n * Map FileUploadFileError to user-friendly error message\n */\nexport function getErrorMessage(error: FileError): string {\n\treturn FILE_ERROR_MESSAGES[error] || error || 'File validation failed';\n}\n"],"mappings":";AAEA,MAAMC,sBAAiD;CACtDE,gBAAgB;CAChBC,mBAAmB;CACnBC,gBAAgB;CAChBC,gBAAgB;CAChBC,cAAc;CACdC,aAAa;CACb;;;;AAKD,SAAgBC,gBAAgBC,OAA0B;AACzD,QAAOT,oBAAoBS,UAAUA,SAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-file-equal.js","names":[],"sources":["../../../../src/components/ds-file-upload/utils/is-file-equal.ts"],"sourcesContent":["/**\n * Check if two files are equal based on name, size, and type\n *\n * @see https://github.com/chakra-ui/zag/blob/698fff1d2/packages/utilities/file-utils/src/is-file-equal.ts\n */\nexport function isFileEqual(file1: File, file2: File): boolean {\n\treturn file1.name === file2.name && file1.size === file2.size && file1.type === file2.type;\n}\n"],"mappings":";;;;;;AAKA,
|
|
1
|
+
{"version":3,"file":"is-file-equal.js","names":["isFileEqual","file1","File","file2","name","size","type"],"sources":["../../../../src/components/ds-file-upload/utils/is-file-equal.ts"],"sourcesContent":["/**\n * Check if two files are equal based on name, size, and type\n *\n * @see https://github.com/chakra-ui/zag/blob/698fff1d2/packages/utilities/file-utils/src/is-file-equal.ts\n */\nexport function isFileEqual(file1: File, file2: File): boolean {\n\treturn file1.name === file2.name && file1.size === file2.size && file1.type === file2.type;\n}\n"],"mappings":";;;;;;AAKA,SAAgBA,YAAYC,OAAaE,OAAsB;AAC9D,QAAOF,MAAMG,SAASD,MAAMC,QAAQH,MAAMI,SAASF,MAAME,QAAQJ,MAAMK,SAASH,MAAMG"}
|
|
@@ -12,6 +12,7 @@ require('../ds-number-input/index.cjs');
|
|
|
12
12
|
const require_ds_password_input = require('../ds-password-input/ds-password-input.cjs');
|
|
13
13
|
require('../ds-password-input/index.cjs');
|
|
14
14
|
const require_ds_form_control_module = require('./ds-form-control.module.cjs');
|
|
15
|
+
let react_compiler_runtime = require("react/compiler-runtime");
|
|
15
16
|
let classnames = require("classnames");
|
|
16
17
|
classnames = require_rolldown_runtime.__toESM(classnames);
|
|
17
18
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
@@ -40,47 +41,131 @@ const controlify = (Component) => {
|
|
|
40
41
|
});
|
|
41
42
|
};
|
|
42
43
|
};
|
|
43
|
-
const DsFormControlDescription = (
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
const DsFormControlDescription = (t0) => {
|
|
45
|
+
const $ = (0, react_compiler_runtime.c)(5);
|
|
46
|
+
const { children, className } = t0;
|
|
47
|
+
let t1;
|
|
48
|
+
if ($[0] !== className) {
|
|
49
|
+
t1 = (0, classnames.default)(require_ds_form_control_module.default.description, className);
|
|
50
|
+
$[0] = className;
|
|
51
|
+
$[1] = t1;
|
|
52
|
+
} else t1 = $[1];
|
|
53
|
+
let t2;
|
|
54
|
+
if ($[2] !== children || $[3] !== t1) {
|
|
55
|
+
t2 = /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
56
|
+
className: t1,
|
|
57
|
+
children
|
|
58
|
+
});
|
|
59
|
+
$[2] = children;
|
|
60
|
+
$[3] = t1;
|
|
61
|
+
$[4] = t2;
|
|
62
|
+
} else t2 = $[4];
|
|
63
|
+
return t2;
|
|
48
64
|
};
|
|
49
|
-
const DsFormControl = (
|
|
65
|
+
const DsFormControl = (t0) => {
|
|
66
|
+
const $ = (0, react_compiler_runtime.c)(28);
|
|
67
|
+
const { id, status, label, required: t1, slots, message, messageIcon: t2, className, style, children } = t0;
|
|
68
|
+
const required = t1 === void 0 ? false : t1;
|
|
69
|
+
const messageIcon = t2 === void 0 ? "info" : t2;
|
|
50
70
|
const generatedId = (0, react.useId)();
|
|
51
71
|
const controlId = id || generatedId;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
72
|
+
let t3;
|
|
73
|
+
if ($[0] !== controlId) {
|
|
74
|
+
t3 = { controlId };
|
|
75
|
+
$[0] = controlId;
|
|
76
|
+
$[1] = t3;
|
|
77
|
+
} else t3 = $[1];
|
|
78
|
+
const t4 = status && message && require_ds_form_control_module.default[status];
|
|
79
|
+
let t5;
|
|
80
|
+
if ($[2] !== className || $[3] !== t4) {
|
|
81
|
+
t5 = (0, classnames.default)(require_ds_form_control_module.default.container, t4, className);
|
|
82
|
+
$[2] = className;
|
|
83
|
+
$[3] = t4;
|
|
84
|
+
$[4] = t5;
|
|
85
|
+
} else t5 = $[4];
|
|
86
|
+
let t6;
|
|
87
|
+
if ($[5] !== required) {
|
|
88
|
+
t6 = (0, classnames.default)(require_ds_form_control_module.default.label, { [require_ds_form_control_module.default.required]: required });
|
|
89
|
+
$[5] = required;
|
|
90
|
+
$[6] = t6;
|
|
91
|
+
} else t6 = $[6];
|
|
92
|
+
let t7;
|
|
93
|
+
if ($[7] !== controlId || $[8] !== label || $[9] !== t6) {
|
|
94
|
+
t7 = /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
95
|
+
htmlFor: controlId,
|
|
96
|
+
className: t6,
|
|
97
|
+
children: label
|
|
98
|
+
});
|
|
99
|
+
$[7] = controlId;
|
|
100
|
+
$[8] = label;
|
|
101
|
+
$[9] = t6;
|
|
102
|
+
$[10] = t7;
|
|
103
|
+
} else t7 = $[10];
|
|
104
|
+
let t8;
|
|
105
|
+
if ($[11] !== slots) {
|
|
106
|
+
t8 = slots?.endAdornment && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
107
|
+
className: require_ds_form_control_module.default.endAdornment,
|
|
108
|
+
children: slots.endAdornment
|
|
109
|
+
});
|
|
110
|
+
$[11] = slots;
|
|
111
|
+
$[12] = t8;
|
|
112
|
+
} else t8 = $[12];
|
|
113
|
+
let t9;
|
|
114
|
+
if ($[13] !== t7 || $[14] !== t8) {
|
|
115
|
+
t9 = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
116
|
+
className: require_ds_form_control_module.default.labelContainer,
|
|
117
|
+
children: [t7, t8]
|
|
118
|
+
});
|
|
119
|
+
$[13] = t7;
|
|
120
|
+
$[14] = t8;
|
|
121
|
+
$[15] = t9;
|
|
122
|
+
} else t9 = $[15];
|
|
123
|
+
let t10;
|
|
124
|
+
if ($[16] !== message || $[17] !== messageIcon) {
|
|
125
|
+
t10 = message && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
126
|
+
className: require_ds_form_control_module.default.message,
|
|
127
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ds_icon.default, {
|
|
128
|
+
icon: messageIcon,
|
|
129
|
+
size: "tiny",
|
|
130
|
+
filled: true
|
|
131
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
132
|
+
className: require_ds_form_control_module.default.messageText,
|
|
133
|
+
children: message
|
|
134
|
+
})]
|
|
135
|
+
});
|
|
136
|
+
$[16] = message;
|
|
137
|
+
$[17] = messageIcon;
|
|
138
|
+
$[18] = t10;
|
|
139
|
+
} else t10 = $[18];
|
|
140
|
+
let t11;
|
|
141
|
+
if ($[19] !== children || $[20] !== style || $[21] !== t10 || $[22] !== t5 || $[23] !== t9) {
|
|
142
|
+
t11 = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
143
|
+
className: t5,
|
|
56
144
|
style,
|
|
57
145
|
children: [
|
|
58
|
-
|
|
59
|
-
className: require_ds_form_control_module.default.labelContainer,
|
|
60
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
61
|
-
htmlFor: controlId,
|
|
62
|
-
className: (0, classnames.default)(require_ds_form_control_module.default.label, { [require_ds_form_control_module.default.required]: required }),
|
|
63
|
-
children: label
|
|
64
|
-
}), slots?.endAdornment && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
65
|
-
className: require_ds_form_control_module.default.endAdornment,
|
|
66
|
-
children: slots.endAdornment
|
|
67
|
-
})]
|
|
68
|
-
}),
|
|
146
|
+
t9,
|
|
69
147
|
children,
|
|
70
|
-
|
|
71
|
-
className: require_ds_form_control_module.default.message,
|
|
72
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ds_icon.default, {
|
|
73
|
-
icon: messageIcon,
|
|
74
|
-
size: "tiny",
|
|
75
|
-
filled: true
|
|
76
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
77
|
-
className: require_ds_form_control_module.default.messageText,
|
|
78
|
-
children: message
|
|
79
|
-
})]
|
|
80
|
-
})
|
|
148
|
+
t10
|
|
81
149
|
]
|
|
82
|
-
})
|
|
83
|
-
|
|
150
|
+
});
|
|
151
|
+
$[19] = children;
|
|
152
|
+
$[20] = style;
|
|
153
|
+
$[21] = t10;
|
|
154
|
+
$[22] = t5;
|
|
155
|
+
$[23] = t9;
|
|
156
|
+
$[24] = t11;
|
|
157
|
+
} else t11 = $[24];
|
|
158
|
+
let t12;
|
|
159
|
+
if ($[25] !== t11 || $[26] !== t3) {
|
|
160
|
+
t12 = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FormControlContext.Provider, {
|
|
161
|
+
value: t3,
|
|
162
|
+
children: t11
|
|
163
|
+
});
|
|
164
|
+
$[25] = t11;
|
|
165
|
+
$[26] = t3;
|
|
166
|
+
$[27] = t12;
|
|
167
|
+
} else t12 = $[27];
|
|
168
|
+
return t12;
|
|
84
169
|
};
|
|
85
170
|
DsFormControl.TextInput = controlify(require_ds_text_input.default);
|
|
86
171
|
DsFormControl.NumberInput = controlify(require_ds_number_input.default);
|