@aws-amplify/ui-react-storage 3.2.1 → 3.3.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 (70) hide show
  1. package/dist/esm/components/FileUploader/FileUploader.mjs +185 -0
  2. package/dist/esm/components/FileUploader/hooks/useFileUploader/actions.mjs +39 -0
  3. package/dist/esm/components/FileUploader/hooks/useFileUploader/reducer.mjs +93 -0
  4. package/dist/esm/components/FileUploader/hooks/useFileUploader/types.mjs +13 -0
  5. package/dist/esm/components/FileUploader/hooks/useFileUploader/useFileUploader.mjs +62 -0
  6. package/dist/esm/components/FileUploader/hooks/useUploadFiles/useUploadFiles.mjs +79 -0
  7. package/dist/esm/components/FileUploader/types.mjs +11 -0
  8. package/dist/esm/components/FileUploader/ui/Container/Container.mjs +8 -0
  9. package/dist/esm/components/FileUploader/ui/DropZone/DropZone.mjs +16 -0
  10. package/dist/esm/components/FileUploader/ui/FileList/FileControl.mjs +23 -0
  11. package/dist/esm/components/FileUploader/ui/FileList/FileDetails.mjs +12 -0
  12. package/dist/esm/components/FileUploader/ui/FileList/FileList.mjs +44 -0
  13. package/dist/esm/components/FileUploader/ui/FileList/FileRemoveButton.mjs +12 -0
  14. package/dist/esm/components/FileUploader/ui/FileList/FileStatusMessage.mjs +28 -0
  15. package/dist/esm/components/FileUploader/ui/FileList/FileThumbnail.mjs +12 -0
  16. package/dist/esm/components/FileUploader/ui/FileListFooter/FileListFooter.mjs +13 -0
  17. package/dist/esm/components/FileUploader/ui/FileListHeader/FileListHeader.mjs +14 -0
  18. package/dist/esm/components/FileUploader/ui/FilePicker/FilePicker.mjs +9 -0
  19. package/dist/esm/components/FileUploader/utils/checkMaxFileSize.mjs +12 -0
  20. package/dist/esm/components/FileUploader/utils/displayText.mjs +39 -0
  21. package/dist/esm/components/FileUploader/utils/filterAllowedFiles.mjs +27 -0
  22. package/dist/esm/components/FileUploader/utils/getInput.mjs +39 -0
  23. package/dist/esm/components/FileUploader/utils/resolveFile.mjs +20 -0
  24. package/dist/esm/components/FileUploader/utils/uploadFile.mjs +26 -0
  25. package/dist/esm/components/StorageManager/StorageManager.mjs +4 -0
  26. package/dist/esm/index.mjs +1 -0
  27. package/dist/esm/version.mjs +1 -1
  28. package/dist/index.js +721 -7
  29. package/dist/types/components/FileUploader/FileUploader.d.ts +15 -0
  30. package/dist/types/components/FileUploader/hooks/index.d.ts +2 -0
  31. package/dist/types/components/FileUploader/hooks/useFileUploader/actions.d.ts +22 -0
  32. package/dist/types/components/FileUploader/hooks/useFileUploader/index.d.ts +1 -0
  33. package/dist/types/components/FileUploader/hooks/useFileUploader/reducer.d.ts +2 -0
  34. package/dist/types/components/FileUploader/hooks/useFileUploader/types.d.ts +50 -0
  35. package/dist/types/components/FileUploader/hooks/useFileUploader/useFileUploader.d.ts +35 -0
  36. package/dist/types/components/FileUploader/hooks/useUploadFiles/index.d.ts +1 -0
  37. package/dist/types/components/FileUploader/hooks/useUploadFiles/useUploadFiles.d.ts +12 -0
  38. package/dist/types/components/FileUploader/index.d.ts +3 -0
  39. package/dist/types/components/FileUploader/types.d.ts +129 -0
  40. package/dist/types/components/FileUploader/ui/Container/Container.d.ts +6 -0
  41. package/dist/types/components/FileUploader/ui/Container/index.d.ts +1 -0
  42. package/dist/types/components/FileUploader/ui/DropZone/DropZone.d.ts +3 -0
  43. package/dist/types/components/FileUploader/ui/DropZone/index.d.ts +2 -0
  44. package/dist/types/components/FileUploader/ui/DropZone/types.d.ts +13 -0
  45. package/dist/types/components/FileUploader/ui/FileList/FileControl.d.ts +3 -0
  46. package/dist/types/components/FileUploader/ui/FileList/FileDetails.d.ts +3 -0
  47. package/dist/types/components/FileUploader/ui/FileList/FileList.d.ts +3 -0
  48. package/dist/types/components/FileUploader/ui/FileList/FileRemoveButton.d.ts +3 -0
  49. package/dist/types/components/FileUploader/ui/FileList/FileStatusMessage.d.ts +3 -0
  50. package/dist/types/components/FileUploader/ui/FileList/FileThumbnail.d.ts +3 -0
  51. package/dist/types/components/FileUploader/ui/FileList/index.d.ts +2 -0
  52. package/dist/types/components/FileUploader/ui/FileList/types.d.ts +51 -0
  53. package/dist/types/components/FileUploader/ui/FileListFooter/FileListFooter.d.ts +9 -0
  54. package/dist/types/components/FileUploader/ui/FileListFooter/index.d.ts +1 -0
  55. package/dist/types/components/FileUploader/ui/FileListHeader/FileListHeader.d.ts +10 -0
  56. package/dist/types/components/FileUploader/ui/FileListHeader/index.d.ts +1 -0
  57. package/dist/types/components/FileUploader/ui/FilePicker/FilePicker.d.ts +4 -0
  58. package/dist/types/components/FileUploader/ui/FilePicker/index.d.ts +1 -0
  59. package/dist/types/components/FileUploader/ui/index.d.ts +6 -0
  60. package/dist/types/components/FileUploader/utils/checkMaxFileSize.d.ts +5 -0
  61. package/dist/types/components/FileUploader/utils/displayText.d.ts +22 -0
  62. package/dist/types/components/FileUploader/utils/filterAllowedFiles.d.ts +1 -0
  63. package/dist/types/components/FileUploader/utils/getInput.d.ts +17 -0
  64. package/dist/types/components/FileUploader/utils/index.d.ts +5 -0
  65. package/dist/types/components/FileUploader/utils/resolveFile.d.ts +9 -0
  66. package/dist/types/components/FileUploader/utils/uploadFile.d.ts +32 -0
  67. package/dist/types/components/index.d.ts +1 -0
  68. package/dist/types/index.d.ts +1 -1
  69. package/dist/types/version.d.ts +1 -1
  70. package/package.json +4 -4
@@ -0,0 +1,13 @@
1
+ import React__default from 'react';
2
+ import { ComponentClassName } from '@aws-amplify/ui';
3
+ import { View, Button } from '@aws-amplify/ui-react';
4
+
5
+ function FileListFooter({ displayText, remainingFilesCount, onClearAll, onUploadAll, }) {
6
+ const { clearAllButtonText, getUploadButtonText } = displayText;
7
+ return (React__default.createElement(View, { className: ComponentClassName.FileUploaderPreviewerFooter },
8
+ React__default.createElement(View, { className: ComponentClassName.FileUploaderPreviewerActions },
9
+ React__default.createElement(Button, { size: "small", variation: "link", onClick: onClearAll }, clearAllButtonText),
10
+ React__default.createElement(Button, { size: "small", variation: "primary", onClick: onUploadAll }, getUploadButtonText(remainingFilesCount)))));
11
+ }
12
+
13
+ export { FileListFooter };
@@ -0,0 +1,14 @@
1
+ import React__default from 'react';
2
+ import { ComponentClassName } from '@aws-amplify/ui';
3
+ import { Text } from '@aws-amplify/ui-react';
4
+
5
+ function FileListHeader({ allUploadsSuccessful, displayText, fileCount, remainingFilesCount, selectedFilesCount = 0, }) {
6
+ const { getFilesUploadedText, getRemainingFilesText, getSelectedFilesText } = displayText;
7
+ return (React__default.createElement(Text, { className: ComponentClassName.FileUploaderPreviewerText }, selectedFilesCount
8
+ ? getSelectedFilesText(selectedFilesCount)
9
+ : allUploadsSuccessful
10
+ ? getFilesUploadedText(fileCount)
11
+ : getRemainingFilesText(remainingFilesCount)));
12
+ }
13
+
14
+ export { FileListHeader };
@@ -0,0 +1,9 @@
1
+ import React__default from 'react';
2
+ import { ComponentClassName } from '@aws-amplify/ui';
3
+ import { Button } from '@aws-amplify/ui-react';
4
+
5
+ function FilePicker({ children, className = ComponentClassName.FileUploaderFilePicker, size = 'small', ...props }) {
6
+ return (React__default.createElement(Button, { ...props, className: className, size: size }, children));
7
+ }
8
+
9
+ export { FilePicker };
@@ -0,0 +1,12 @@
1
+ import { humanFileSize } from '@aws-amplify/ui';
2
+
3
+ const checkMaxFileSize = ({ file, getFileSizeErrorText, maxFileSize, }) => {
4
+ if (maxFileSize === undefined)
5
+ return '';
6
+ if (file.size > maxFileSize) {
7
+ return getFileSizeErrorText(humanFileSize(maxFileSize, true));
8
+ }
9
+ return '';
10
+ };
11
+
12
+ export { checkMaxFileSize };
@@ -0,0 +1,39 @@
1
+ const defaultFileUploaderDisplayText = {
2
+ getFilesUploadedText(count) {
3
+ return `${count} ${count === 1 ? 'file uploaded' : 'files uploaded'}`;
4
+ },
5
+ getFileSizeErrorText(sizeText) {
6
+ return `File size must be below ${sizeText}`;
7
+ },
8
+ getRemainingFilesText(count) {
9
+ return `${count} ${count === 1 ? 'file' : 'files'} uploading`;
10
+ },
11
+ getSelectedFilesText(count) {
12
+ return `${count} ${count === 1 ? 'file' : 'files'} selected`;
13
+ },
14
+ getUploadingText(percentage) {
15
+ return `Uploading${percentage > 0 ? `: ${percentage}%` : ''}`;
16
+ },
17
+ getUploadButtonText(count) {
18
+ return `Upload ${count} ${count === 1 ? 'file' : 'files'}`;
19
+ },
20
+ getMaxFilesErrorText(count) {
21
+ return `Cannot choose more than ${count} ${count === 1 ? 'file' : 'files'}. Remove files before updating`;
22
+ },
23
+ getErrorText(message) {
24
+ return message;
25
+ },
26
+ doneButtonText: 'Done',
27
+ clearAllButtonText: 'Clear all',
28
+ extensionNotAllowedText: 'Extension not allowed',
29
+ browseFilesText: 'Browse files',
30
+ dropFilesText: 'Drop files here or',
31
+ pauseButtonText: 'Pause',
32
+ resumeButtonText: 'Resume',
33
+ uploadSuccessfulText: 'Uploaded',
34
+ getPausedText(percentage) {
35
+ return `Paused: ${percentage}%`;
36
+ },
37
+ };
38
+
39
+ export { defaultFileUploaderDisplayText };
@@ -0,0 +1,27 @@
1
+ const filterAllowedFiles = (files, acceptedFileTypes) => {
2
+ // Allow any files if acceptedFileTypes is undefined, empty array, or contains '*'
3
+ if (!acceptedFileTypes ||
4
+ acceptedFileTypes.length === 0 ||
5
+ acceptedFileTypes.includes('*')) {
6
+ return files;
7
+ }
8
+ // Remove any files that are not in the accepted file list
9
+ return files.filter((file) => {
10
+ const fileName = file.name || '';
11
+ const mimeType = (file.type || '').toLowerCase();
12
+ const baseMimeType = mimeType.replace(/\/.*$/, '');
13
+ return acceptedFileTypes.some((type) => {
14
+ const validType = type.trim().toLowerCase();
15
+ if (validType.charAt(0) === '.') {
16
+ return fileName.toLowerCase().endsWith(validType);
17
+ }
18
+ else if (validType.endsWith('/*')) {
19
+ // This is something like a image/* mime type
20
+ return baseMimeType === validType.replace(/\/.*$/, '');
21
+ }
22
+ return mimeType === validType;
23
+ });
24
+ });
25
+ };
26
+
27
+ export { filterAllowedFiles };
@@ -0,0 +1,39 @@
1
+ import { fetchAuthSession } from 'aws-amplify/auth';
2
+ import { isTypedFunction, isString } from '@aws-amplify/ui';
3
+ import { resolveFile } from './resolveFile.mjs';
4
+
5
+ const getInput = ({ accessLevel, file, key, onProcessFileSuccess, onProgress, path, processFile, useAccelerateEndpoint, }) => {
6
+ return async () => {
7
+ const hasCallbackPath = isTypedFunction(path);
8
+ const hasStringPath = isString(path);
9
+ const hasKeyInput = !!accessLevel && !hasCallbackPath;
10
+ const { file: data, key: processedKey, ...rest } = await resolveFile({ file, key, processFile });
11
+ const contentType = file.type || 'binary/octet-stream';
12
+ // IMPORTANT: always pass `...rest` here for backwards compatibility
13
+ const options = { contentType, onProgress, useAccelerateEndpoint, ...rest };
14
+ let inputResult;
15
+ if (hasKeyInput) {
16
+ // legacy handling of `path` is to prefix to `fileKey`
17
+ const resolvedKey = hasStringPath
18
+ ? `${path}${processedKey}`
19
+ : processedKey;
20
+ inputResult = {
21
+ data,
22
+ key: resolvedKey,
23
+ options: { ...options, accessLevel },
24
+ };
25
+ }
26
+ else {
27
+ const { identityId } = await fetchAuthSession();
28
+ const resolvedPath = `${hasCallbackPath ? path({ identityId }) : path}${processedKey}`;
29
+ inputResult = { data: file, path: resolvedPath, options };
30
+ }
31
+ if (processFile) {
32
+ // provide post-processing value of target `key`
33
+ onProcessFileSuccess({ processedKey });
34
+ }
35
+ return inputResult;
36
+ };
37
+ };
38
+
39
+ export { getInput };
@@ -0,0 +1,20 @@
1
+ import { isFunction } from '@aws-amplify/ui';
2
+
3
+ /**
4
+ * Utility function that takes the processFile prop, along with a file a key
5
+ * and returns a Promise that resolves to { file, key, ..rest }
6
+ * regardless if processFile is defined and if it is sync or async
7
+ */
8
+ const resolveFile = ({ processFile, ...input }) => {
9
+ return new Promise((resolve, reject) => {
10
+ const result = isFunction(processFile) ? processFile(input) : input;
11
+ if (result instanceof Promise) {
12
+ result.then(resolve).catch(reject);
13
+ }
14
+ else {
15
+ resolve(result);
16
+ }
17
+ });
18
+ };
19
+
20
+ export { resolveFile };
@@ -0,0 +1,26 @@
1
+ import { uploadData } from 'aws-amplify/storage';
2
+ import { isFunction } from '@aws-amplify/ui';
3
+
4
+ async function uploadFile({ input, onError, onStart, onComplete, }) {
5
+ const resolvedInput = await input();
6
+ const uploadTask = uploadData(resolvedInput);
7
+ const key = resolvedInput?.key ??
8
+ resolvedInput?.path;
9
+ if (isFunction(onStart)) {
10
+ onStart({ key, uploadTask });
11
+ }
12
+ uploadTask.result
13
+ .then((result) => {
14
+ if (isFunction(onComplete) && uploadTask.state === 'SUCCESS') {
15
+ onComplete(result);
16
+ }
17
+ })
18
+ .catch((error) => {
19
+ if (isFunction(onError)) {
20
+ onError({ key, error });
21
+ }
22
+ });
23
+ return uploadTask;
24
+ }
25
+
26
+ export { uploadFile };
@@ -24,6 +24,10 @@ const MISSING_REQUIRED_PROPS_MESSAGE = '`StorageManager` requires a `maxFileCoun
24
24
  const ACCESS_LEVEL_WITH_PATH_CALLBACK_MESSAGE = '`StorageManager` does not allow usage of a `path` callback prop with an `accessLevel` prop.';
25
25
  const ACCESS_LEVEL_DEPRECATION_MESSAGE = '`accessLevel` has been deprecated and will be removed in a future major version. See migration notes at https://ui.docs.amplify.aws/react/connected-components/storage/storagemanager';
26
26
  const StorageManagerBase = React.forwardRef(function StorageManager({ acceptedFileTypes = [], accessLevel, autoUpload = true, components, defaultFiles, displayText: overrideDisplayText, isResumable = false, maxFileCount, maxFileSize, onFileRemove, onUploadError, onUploadStart, onUploadSuccess, path, processFile, showThumbnails = true, useAccelerateEndpoint, }, ref) {
27
+ useDeprecationWarning({
28
+ message: 'The `StorageManager` component has been renamed as the `FileUploader` component.',
29
+ shouldWarn: false,
30
+ });
27
31
  if (!maxFileCount) {
28
32
  // eslint-disable-next-line no-console
29
33
  console.warn(MISSING_REQUIRED_PROPS_MESSAGE);
@@ -1,2 +1,3 @@
1
+ export { FileUploader } from './components/FileUploader/FileUploader.mjs';
1
2
  export { StorageImage } from './components/StorageImage/StorageImage.mjs';
2
3
  export { StorageManager } from './components/StorageManager/StorageManager.mjs';
@@ -1,3 +1,3 @@
1
- const VERSION = '3.2.1';
1
+ const VERSION = '3.3.0';
2
2
 
3
3
  export { VERSION };