@aws-amplify/ui-react-storage 3.10.3 → 3.12.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 (88) hide show
  1. package/dist/browser.js +1 -1
  2. package/dist/{createStorageBrowser-B75dAYRb.js → createStorageBrowser-D5xaObbd.js} +439 -251
  3. package/dist/esm/components/StorageBrowser/actions/configs/defaults.mjs +12 -3
  4. package/dist/esm/components/StorageBrowser/actions/handlers/listLocationItems.mjs +1 -1
  5. package/dist/esm/components/StorageBrowser/actions/handlers/listLocations.mjs +1 -1
  6. package/dist/esm/components/StorageBrowser/createStorageBrowser/StorageBrowserDefault.mjs +2 -1
  7. package/dist/esm/components/StorageBrowser/createStorageBrowser/createProvider.mjs +6 -3
  8. package/dist/esm/components/StorageBrowser/createStorageBrowser/createStorageBrowser.mjs +3 -1
  9. package/dist/esm/components/StorageBrowser/displayText/context.mjs +5 -1
  10. package/dist/esm/components/StorageBrowser/displayText/libraries/en/default.mjs +2 -0
  11. package/dist/esm/components/StorageBrowser/displayText/libraries/en/downloadView.mjs +23 -0
  12. package/dist/esm/components/StorageBrowser/displayText/libraries/en/locationDetailView.mjs +2 -0
  13. package/dist/esm/components/StorageBrowser/displayText/libraries/en/uploadView.mjs +3 -6
  14. package/dist/esm/components/StorageBrowser/displayText/utils.mjs +3 -1
  15. package/dist/esm/components/StorageBrowser/fileItems/constants.mjs +11 -0
  16. package/dist/esm/components/StorageBrowser/fileItems/context.mjs +42 -0
  17. package/dist/esm/components/StorageBrowser/fileItems/fileItemsReducer.mjs +33 -0
  18. package/dist/esm/components/StorageBrowser/fileItems/utils.mjs +55 -0
  19. package/dist/esm/components/StorageBrowser/useAction/utils.mjs +2 -2
  20. package/dist/esm/components/StorageBrowser/views/LocationActionView/CopyView/CopyViewProvider.mjs +3 -2
  21. package/dist/esm/components/StorageBrowser/views/LocationActionView/CreateFolderView/CreateFolderViewProvider.mjs +0 -1
  22. package/dist/esm/components/StorageBrowser/views/LocationActionView/DeleteView/DeleteViewProvider.mjs +4 -3
  23. package/dist/esm/components/StorageBrowser/views/LocationActionView/DownloadView/DownloadView.mjs +47 -0
  24. package/dist/esm/components/StorageBrowser/views/LocationActionView/DownloadView/DownloadViewProvider.mjs +38 -0
  25. package/dist/esm/components/StorageBrowser/views/LocationActionView/DownloadView/useDownloadView.mjs +66 -0
  26. package/dist/esm/components/StorageBrowser/views/LocationActionView/UploadView/UploadView.mjs +3 -0
  27. package/dist/esm/components/StorageBrowser/views/LocationActionView/UploadView/UploadViewProvider.mjs +7 -2
  28. package/dist/esm/components/StorageBrowser/views/LocationActionView/UploadView/useUploadView.mjs +23 -35
  29. package/dist/esm/components/StorageBrowser/views/LocationDetailView/LocationDetailViewProvider.mjs +0 -1
  30. package/dist/esm/components/StorageBrowser/views/LocationDetailView/useLocationDetailView.mjs +3 -3
  31. package/dist/esm/components/StorageBrowser/views/context/actionViews.mjs +3 -1
  32. package/dist/esm/components/StorageBrowser/views/context/primaryViews.mjs +2 -1
  33. package/dist/esm/components/StorageBrowser/views/hooks/usePaginate.mjs +1 -1
  34. package/dist/esm/components/StorageBrowser/views/useView.mjs +3 -0
  35. package/dist/esm/components/StorageBrowser/views/utils/tableResolvers/constants.mjs +9 -1
  36. package/dist/esm/components/StorageBrowser/views/utils/tableResolvers/copyResolvers.mjs +4 -42
  37. package/dist/esm/components/StorageBrowser/views/utils/tableResolvers/deleteResolvers.mjs +4 -42
  38. package/dist/esm/components/StorageBrowser/views/utils/tableResolvers/downloadResolvers.mjs +36 -0
  39. package/dist/esm/components/StorageBrowser/views/utils/tableResolvers/utils.mjs +45 -5
  40. package/dist/esm/version.mjs +1 -1
  41. package/dist/index.js +1 -1
  42. package/dist/styles.css +17 -2
  43. package/dist/types/components/StorageBrowser/actions/configs/defaults.d.ts +4 -3
  44. package/dist/types/components/StorageBrowser/actions/configs/types.d.ts +3 -1
  45. package/dist/types/components/StorageBrowser/actions/handlers/download.d.ts +2 -2
  46. package/dist/types/components/StorageBrowser/actions/index.d.ts +1 -1
  47. package/dist/types/components/StorageBrowser/createStorageBrowser/createProvider.d.ts +1 -1
  48. package/dist/types/components/StorageBrowser/createStorageBrowser/types.d.ts +23 -4
  49. package/dist/types/components/StorageBrowser/displayText/index.d.ts +2 -2
  50. package/dist/types/components/StorageBrowser/displayText/libraries/en/downloadView.d.ts +2 -0
  51. package/dist/types/components/StorageBrowser/displayText/types.d.ts +8 -2
  52. package/dist/types/components/StorageBrowser/displayText/utils.d.ts +2 -1
  53. package/dist/types/components/StorageBrowser/fileItems/constants.d.ts +4 -0
  54. package/dist/types/components/StorageBrowser/fileItems/context.d.ts +6 -0
  55. package/dist/types/components/StorageBrowser/fileItems/fileItemsReducer.d.ts +6 -0
  56. package/dist/types/components/StorageBrowser/fileItems/index.d.ts +3 -0
  57. package/dist/types/components/StorageBrowser/fileItems/types.d.ts +44 -0
  58. package/dist/types/components/StorageBrowser/fileItems/utils.d.ts +5 -0
  59. package/dist/types/components/StorageBrowser/validators/index.d.ts +1 -2
  60. package/dist/types/components/StorageBrowser/views/LocationActionView/DownloadView/DownloadView.d.ts +2 -0
  61. package/dist/types/components/StorageBrowser/views/LocationActionView/DownloadView/DownloadViewProvider.d.ts +3 -0
  62. package/dist/types/components/StorageBrowser/views/LocationActionView/DownloadView/index.d.ts +3 -0
  63. package/dist/types/components/StorageBrowser/views/LocationActionView/DownloadView/types.d.ts +22 -0
  64. package/dist/types/components/StorageBrowser/views/LocationActionView/DownloadView/useDownloadView.d.ts +2 -0
  65. package/dist/types/components/StorageBrowser/views/LocationActionView/UploadView/types.d.ts +6 -1
  66. package/dist/types/components/StorageBrowser/views/LocationActionView/index.d.ts +2 -0
  67. package/dist/types/components/StorageBrowser/views/index.d.ts +2 -2
  68. package/dist/types/components/StorageBrowser/views/types.d.ts +5 -3
  69. package/dist/types/components/StorageBrowser/views/useView.d.ts +2 -1
  70. package/dist/types/components/StorageBrowser/views/utils/index.d.ts +1 -1
  71. package/dist/types/components/StorageBrowser/views/utils/tableResolvers/__testUtils__/tasks.d.ts +6 -11
  72. package/dist/types/components/StorageBrowser/views/utils/tableResolvers/constants.d.ts +1 -0
  73. package/dist/types/components/StorageBrowser/views/utils/tableResolvers/copyResolvers.d.ts +2 -3
  74. package/dist/types/components/StorageBrowser/views/utils/tableResolvers/deleteResolvers.d.ts +2 -3
  75. package/dist/types/components/StorageBrowser/views/utils/tableResolvers/downloadResolvers.d.ts +2 -0
  76. package/dist/types/components/StorageBrowser/views/utils/tableResolvers/index.d.ts +4 -2
  77. package/dist/types/components/StorageBrowser/views/utils/tableResolvers/types.d.ts +15 -11
  78. package/dist/types/components/StorageBrowser/views/utils/tableResolvers/utils.d.ts +15 -7
  79. package/dist/types/version.d.ts +1 -1
  80. package/package.json +3 -3
  81. package/dist/esm/components/StorageBrowser/files/context.mjs +0 -31
  82. package/dist/esm/components/StorageBrowser/files/utils.mjs +0 -52
  83. package/dist/esm/components/StorageBrowser/validators/isFileTooBig.mjs +0 -4
  84. package/dist/types/components/StorageBrowser/files/context.d.ts +0 -6
  85. package/dist/types/components/StorageBrowser/files/index.d.ts +0 -2
  86. package/dist/types/components/StorageBrowser/files/types.d.ts +0 -28
  87. package/dist/types/components/StorageBrowser/files/utils.d.ts +0 -7
  88. package/dist/types/components/StorageBrowser/validators/isFileTooBig.d.ts +0 -2
@@ -6,7 +6,7 @@ import type { StorageBrowserDisplayText } from '../displayText';
6
6
  import type { ErrorBoundaryType } from '../ErrorBoundary';
7
7
  import type { StorageBrowserEventValue, StorageBrowserValue, StoreProviderProps } from '../store';
8
8
  import type { DerivedActionHandlers, UseAction } from '../useAction';
9
- import type { CopyViewType, CreateFolderViewType, DeleteViewType, UploadViewType, LocationActionViewType, LocationDetailViewType, LocationsViewType, UseView, StorageBrowserViews } from '../views';
9
+ import type { CopyViewType, CreateFolderViewType, DeleteViewType, DownloadViewType, UploadViewType, LocationActionViewType, LocationDetailViewType, LocationsViewType, UseView, StorageBrowserViews } from '../views';
10
10
  /**
11
11
  * @description configuration properties
12
12
  */
@@ -86,6 +86,20 @@ export interface StorageBrowserActions {
86
86
  default?: DefaultActionConfigs;
87
87
  custom?: CustomActionConfigs;
88
88
  }
89
+ export interface StorageBrowserOptions {
90
+ /**
91
+ * @description Overrides default file validation called when selecting files to be uploaded
92
+ * @param {File} file — The file to validate
93
+ * @returns {boolean} — Returns true if `file` is valid, false otherwise
94
+ * @example
95
+ * ```tsx
96
+ * const MAX_FILE_SIZE = 10 * 1000 * 1000 * 1000; // 10 GB in bytes
97
+ *
98
+ * const myValidateFile = (file: File) => file.size < MAX_FILE_SIZE;
99
+ * ```
100
+ */
101
+ validateFile?: (file: File) => boolean;
102
+ }
89
103
  /**
90
104
  * @description configuration and options for `createStorageBrowser`
91
105
  */
@@ -107,6 +121,10 @@ export interface CreateStorageBrowserInput {
107
121
  * @description Overrides default `components` used within `StorageBrowser`
108
122
  */
109
123
  components?: StorageBrowserComponents;
124
+ /**
125
+ * @description Additional options and overrides for `StorageBrowser`
126
+ */
127
+ options?: StorageBrowserOptions;
110
128
  }
111
129
  /**
112
130
  * `StorageBrowser` component properties
@@ -162,17 +180,17 @@ export interface StorageBrowserProviderProps<TViews = {}> extends StoreProviderP
162
180
  */
163
181
  views?: TViews;
164
182
  /**
165
- * @deprecated will be removed in a future major verison. Prefer `value` for controlled behavior or `defaultValue` for initializng `actionType`
183
+ * @deprecated will be removed in a future major version. Prefer `value` for controlled behavior or `defaultValue` for initializing `actionType`
166
184
  * @description initial `actionType`, does not update
167
185
  */
168
186
  actionType?: string;
169
187
  /**
170
- * @deprecated will be removed in a future major verison. Prefer `value` for controlled behavior or `defaultValue` for initializng `actionType`
188
+ * @deprecated will be removed in a future major version. Prefer `value` for controlled behavior or `defaultValue` for initializing `actionType`
171
189
  * @description initial `location` data, does not update
172
190
  */
173
191
  location?: LocationData;
174
192
  /**
175
- * @deprecated will be removed in a future major verison. Prefer `value` for controlled behavior or `defaultValue` for initializng `actionType`
193
+ * @deprecated will be removed in a future major version. Prefer `value` for controlled behavior or `defaultValue` for initializing `actionType`
176
194
  * @description initial `location` subpath to establish navigation state, does not update
177
195
  */
178
196
  path?: string;
@@ -217,6 +235,7 @@ export interface StorageBrowserType<TActionType = string, TViews = {}> {
217
235
  CopyView: CopyViewType;
218
236
  CreateFolderView: CreateFolderViewType;
219
237
  DeleteView: DeleteViewType;
238
+ DownloadView: DownloadViewType;
220
239
  UploadView: UploadViewType;
221
240
  }
222
241
  type NonDefaultActionType<T = string> = Exclude<T, keyof DefaultActionConfigs>;
@@ -1,4 +1,4 @@
1
1
  export { DisplayTextProvider, useDisplayText } from './context';
2
2
  export { DEFAULT_STORAGE_BROWSER_DISPLAY_TEXT as DefaultStorageBrowserDisplayText } from './libraries';
3
- export type { LocationDetailViewDisplayText, LocationsViewDisplayText, CreateFolderViewDisplayText, CopyViewDisplayText, UploadViewDisplayText, DeleteViewDisplayText, StorageBrowserDisplayText, } from './types';
4
- export { isCopyViewDisplayTextKey, isDeleteViewDisplayTextKey } from './utils';
3
+ export type { LocationDetailViewDisplayText, LocationsViewDisplayText, CreateFolderViewDisplayText, CopyViewDisplayText, UploadViewDisplayText, DeleteViewDisplayText, DownloadViewDisplayText, StorageBrowserDisplayText, } from './types';
4
+ export { isCopyViewDisplayTextKey, isDeleteViewDisplayTextKey, isDownloadViewDisplayTextKey, } from './utils';
@@ -0,0 +1,2 @@
1
+ import type { DefaultDownloadViewDisplayText } from '../../types';
2
+ export declare const DEFAULT_DOWNLOAD_VIEW_DISPLAY_TEXT: DefaultDownloadViewDisplayText;
@@ -1,7 +1,7 @@
1
1
  import type { StatusCounts, Task } from '../tasks';
2
- import type { CopyHandlerData, CreateFolderHandlerData, DeleteHandlerData, FolderData, LocationData, LocationItemData, TaskData, UploadHandlerData, LocationPermissions } from '../actions';
2
+ import type { CopyHandlerData, CreateFolderHandlerData, DeleteHandlerData, FolderData, LocationData, LocationItemData, TaskData, UploadHandlerData, LocationPermissions, DownloadHandlerData } from '../actions';
3
3
  import type { MessageType } from '../components';
4
- import type { FileItems } from '../files';
4
+ import type { FileItems } from '../fileItems';
5
5
  import type { LocationState } from '../store';
6
6
  /**
7
7
  * Common list view display text values
@@ -115,6 +115,8 @@ export interface DefaultDeleteViewDisplayText extends DefaultActionViewDisplayTe
115
115
  */
116
116
  tableColumnProgressHeader?: string;
117
117
  }
118
+ export interface DefaultDownloadViewDisplayText extends DefaultActionViewDisplayText<DownloadHandlerData> {
119
+ }
118
120
  export interface DefaultUploadViewDisplayText extends DefaultActionViewDisplayText<UploadHandlerData> {
119
121
  addFilesLabel: string;
120
122
  addFolderLabel: string;
@@ -132,6 +134,7 @@ export interface DefaultStorageBrowserDisplayText {
132
134
  CopyView: DefaultCopyViewDisplayText;
133
135
  CreateFolderView: DefaultCreateFolderViewDisplayText;
134
136
  DeleteView: DefaultDeleteViewDisplayText;
137
+ DownloadView: DefaultDownloadViewDisplayText;
135
138
  LocationsView: DefaultLocationsViewDisplayText;
136
139
  LocationDetailView: DefaultLocationDetailViewDisplayText;
137
140
  UploadView: DefaultUploadViewDisplayText;
@@ -142,6 +145,8 @@ export interface CopyViewDisplayText extends Partial<DefaultCopyViewDisplayText>
142
145
  }
143
146
  export interface DeleteViewDisplayText extends Partial<DefaultDeleteViewDisplayText> {
144
147
  }
148
+ export interface DownloadViewDisplayText extends Partial<DefaultDownloadViewDisplayText> {
149
+ }
145
150
  export interface LocationsViewDisplayText extends Partial<DefaultLocationsViewDisplayText> {
146
151
  }
147
152
  export interface LocationDetailViewDisplayText extends Partial<DefaultLocationDetailViewDisplayText> {
@@ -156,6 +161,7 @@ export interface StorageBrowserDisplayText {
156
161
  LocationDetailView?: LocationDetailViewDisplayText;
157
162
  UploadView?: UploadViewDisplayText;
158
163
  DeleteView?: DeleteViewDisplayText;
164
+ DownloadView?: DownloadViewDisplayText;
159
165
  CopyView?: CopyViewDisplayText;
160
166
  CreateFolderView?: CreateFolderViewDisplayText;
161
167
  }
@@ -1,3 +1,4 @@
1
- import type { CopyViewDisplayText, DeleteViewDisplayText } from './types';
1
+ import type { CopyViewDisplayText, DeleteViewDisplayText, DownloadViewDisplayText } from './types';
2
2
  export declare const isCopyViewDisplayTextKey: (value: string) => value is keyof CopyViewDisplayText;
3
3
  export declare const isDeleteViewDisplayTextKey: (value: string) => value is keyof DeleteViewDisplayText;
4
+ export declare const isDownloadViewDisplayTextKey: (value: string) => value is keyof DownloadViewDisplayText;
@@ -0,0 +1,4 @@
1
+ import type { FileItemsState, ResolvedFiles } from './types';
2
+ export declare const DEFAULT_STATE: FileItemsState;
3
+ export declare const DEFAULT_RESOLVED_FILES: ResolvedFiles;
4
+ export declare const UPLOAD_FILE_SIZE_LIMIT: number;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import type { FileItemsContextType, FileItemsProviderProps } from './types';
3
+ export declare const FileItemsContext: React.Context<FileItemsContextType>, useFileItems: (params?: {
4
+ errorMessage?: string | undefined;
5
+ } | undefined) => FileItemsContextType;
6
+ export declare function FileItemsProvider({ children, validateFile, }: FileItemsProviderProps): React.JSX.Element;
@@ -0,0 +1,6 @@
1
+ import type { FileItemsState, FileItemsActionType } from './types';
2
+ export declare const fileItemsReducer: React.Reducer<FileItemsState, Exclude<FileItemsActionType, {
3
+ type: 'SELECT_FILES';
4
+ } | {
5
+ type: 'ADD_FILES';
6
+ }>>;
@@ -0,0 +1,3 @@
1
+ export { FileItemsContext, FileItemsProvider, useFileItems } from './context';
2
+ export * from './types';
3
+ export { defaultValidateFile } from './utils';
@@ -0,0 +1,44 @@
1
+ import type { FileItem, LocationItemType } from '../actions';
2
+ /**
3
+ * native OS file picker type. to restrict selectable file types, define the picker types
4
+ * followed by accepted file types as strings
5
+ * @example
6
+ * ```ts
7
+ * type JPEGOnly = ['FOLDER', '.jpeg'];
8
+ * ```
9
+ */
10
+ export type SelectionType = LocationItemType | [LocationItemType, ...string[]];
11
+ export type FileItemsActionType = {
12
+ type: 'ADD_FILES';
13
+ files?: File[];
14
+ } | {
15
+ type: 'ADD_FILE_ITEMS';
16
+ validFiles?: File[];
17
+ invalidFiles?: File[];
18
+ } | {
19
+ type: 'REMOVE_FILE_ITEM';
20
+ id: string;
21
+ } | {
22
+ type: 'SELECT_FILES';
23
+ selectionType?: SelectionType;
24
+ } | {
25
+ type: 'RESET_FILE_ITEMS';
26
+ };
27
+ export type FileItemsActionDispatchType = Exclude<FileItemsActionType, {
28
+ type: 'ADD_FILE_ITEMS';
29
+ }>;
30
+ export type HandleFileItemsAction = (input: FileItemsActionDispatchType) => void;
31
+ export interface ResolvedFiles {
32
+ validFiles: File[] | undefined;
33
+ invalidFiles: File[] | undefined;
34
+ }
35
+ export type FileItems = FileItem[];
36
+ export interface FileItemsState {
37
+ validItems: FileItems | undefined;
38
+ invalidItems: FileItems | undefined;
39
+ }
40
+ export type FileItemsContextType = [FileItemsState, HandleFileItemsAction];
41
+ export interface FileItemsProviderProps {
42
+ children?: React.ReactNode;
43
+ validateFile?: (file: File) => boolean;
44
+ }
@@ -0,0 +1,5 @@
1
+ import type { FileItems, ResolvedFiles, SelectionType } from './types';
2
+ export declare const defaultValidateFile: (file: File) => boolean;
3
+ export declare const resolveFiles: (files: File[] | undefined, validateFile?: ((file: File) => boolean) | undefined) => ResolvedFiles;
4
+ export declare const processFileItems: (prevItems: FileItems | undefined, files: File[] | undefined) => FileItems | undefined;
5
+ export declare const parseFileSelectParams: (value?: SelectionType) => [selectType: import("@aws-amplify/ui-react/dist/types/components/FileSelect/FileSelect").SelectType, options?: import("@aws-amplify/ui-react/internal").FileSelectOptions | undefined];
@@ -1,4 +1,3 @@
1
+ export { assertAccountId } from './assertAccountId';
1
2
  export { assertLocationData, assertPrefix } from './assertLocationData';
2
3
  export { assertRegisterAuthListener } from './assertRegisterAuthListener';
3
- export { assertAccountId } from './assertAccountId';
4
- export { isFileTooBig } from './isFileTooBig';
@@ -0,0 +1,2 @@
1
+ import type { DownloadViewType } from './types';
2
+ export declare const DownloadView: DownloadViewType;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import type { DownloadViewProviderProps } from './types';
3
+ export declare function DownloadViewProvider({ children, ...props }: DownloadViewProviderProps): React.JSX.Element;
@@ -0,0 +1,3 @@
1
+ export { DownloadView } from './DownloadView';
2
+ export { useDownloadView } from './useDownloadView';
3
+ export * from './types';
@@ -0,0 +1,22 @@
1
+ import type { DownloadHandlerData, LocationData } from '../../../actions';
2
+ import type { ActionViewProps, ActionViewState, ActionViewType } from '../types';
3
+ export interface DownloadViewState extends ActionViewState<DownloadHandlerData> {
4
+ }
5
+ export interface DownloadViewProps extends ActionViewProps {
6
+ }
7
+ export interface UseDownloadViewOptions {
8
+ onExit?: (location?: LocationData) => void;
9
+ }
10
+ export interface DownloadViewProviderProps extends DownloadViewState {
11
+ children?: React.ReactNode;
12
+ }
13
+ export interface DownloadViewType extends ActionViewType<DownloadHandlerData, DownloadViewProps> {
14
+ Provider: (props: DownloadViewProviderProps) => React.JSX.Element;
15
+ Cancel: () => React.JSX.Element | null;
16
+ Exit: () => React.JSX.Element | null;
17
+ Message: () => React.JSX.Element | null;
18
+ Start: () => React.JSX.Element | null;
19
+ Statuses: () => React.JSX.Element | null;
20
+ TasksTable: () => React.JSX.Element | null;
21
+ Title: () => React.JSX.Element | null;
22
+ }
@@ -0,0 +1,2 @@
1
+ import type { DownloadViewState, UseDownloadViewOptions } from './types';
2
+ export declare const useDownloadView: (options?: UseDownloadViewOptions) => DownloadViewState;
@@ -1,11 +1,15 @@
1
1
  import type { LocationData, UploadHandlerData } from '../../../actions';
2
- import type { FileItems } from '../../../files';
2
+ import type { FileItems } from '../../../fileItems';
3
3
  import type { ActionViewType, ActionViewProps, ActionViewState } from '../types';
4
4
  export interface UploadViewState extends ActionViewState<UploadHandlerData> {
5
+ hasNextPage: boolean;
6
+ highestPageVisited: number;
5
7
  isOverwritingEnabled: boolean;
6
8
  onDropFiles: (files: File[]) => void;
7
9
  onSelectFiles: (type: 'FILE' | 'FOLDER') => void;
8
10
  onToggleOverwrite: () => void;
11
+ onPaginate: (page: number) => void;
12
+ page: number;
9
13
  invalidFiles: FileItems | undefined;
10
14
  }
11
15
  export interface UploadViewProps extends ActionViewProps, Partial<UploadViewState> {
@@ -29,6 +33,7 @@ export interface UploadViewType extends ActionViewType<UploadHandlerData, Upload
29
33
  Statuses: () => React.JSX.Element | null;
30
34
  TasksTable: () => React.JSX.Element | null;
31
35
  Title: () => React.JSX.Element | null;
36
+ Pagination: () => React.JSX.Element | null;
32
37
  }
33
38
  export interface UseUploadViewOptions {
34
39
  onExit?: (location?: LocationData) => void;
@@ -4,6 +4,8 @@ export type { CreateFolderViewProps, CreateFolderViewType, CreateFolderViewState
4
4
  export { CreateFolderView, useCreateFolderView } from './CreateFolderView';
5
5
  export type { DeleteViewProps, DeleteViewType, DeleteViewState, } from './DeleteView';
6
6
  export { DeleteView, useDeleteView } from './DeleteView';
7
+ export type { DownloadViewProps, DownloadViewType, DownloadViewState, } from './DownloadView';
8
+ export { DownloadView, useDownloadView } from './DownloadView';
7
9
  export { LocationActionView } from './LocationActionView';
8
10
  export type { UploadViewProps, UploadViewType, UploadViewState, } from './UploadView';
9
11
  export { UploadView, useUploadView } from './UploadView';
@@ -1,6 +1,6 @@
1
1
  export { ViewsProvider, useViews } from './context';
2
- export type { CopyViewType, CreateFolderViewType, DeleteViewType, LocationActionViewProps, LocationActionViewType, UploadViewType, } from './LocationActionView';
3
- export { CopyView, CreateFolderView, DeleteView, LocationActionView, UploadView, } from './LocationActionView';
2
+ export type { CopyViewType, CreateFolderViewType, DeleteViewType, DownloadViewType, LocationActionViewProps, LocationActionViewType, UploadViewType, } from './LocationActionView';
3
+ export { CopyView, CreateFolderView, DownloadView, DeleteView, LocationActionView, UploadView, } from './LocationActionView';
4
4
  export type { LocationDetailViewProps, LocationDetailViewType, } from './LocationDetailView';
5
5
  export { LocationDetailView } from './LocationDetailView';
6
6
  export type { LocationsViewProps, LocationsViewType } from './LocationsView';
@@ -1,6 +1,6 @@
1
1
  import type React from 'react';
2
2
  import type { LocationData } from '../actions';
3
- import type { LocationActionViewProps, UploadViewProps, CreateFolderViewProps, CopyViewProps, DeleteViewProps } from './LocationActionView';
3
+ import type { CopyViewProps, CreateFolderViewProps, DeleteViewProps, DownloadViewProps, LocationActionViewProps, UploadViewProps } from './LocationActionView';
4
4
  import type { LocationDetailViewProps } from './LocationDetailView';
5
5
  import type { LocationsViewProps } from './LocationsView';
6
6
  export interface ActionViewProps {
@@ -21,14 +21,16 @@ export interface PrimaryViews<T = string> {
21
21
  LocationsView: (props: LocationsViewProps) => React.JSX.Element | null;
22
22
  }
23
23
  export interface DefaultActionViews {
24
- CreateFolderView: (props: CreateFolderViewProps) => React.JSX.Element | null;
25
24
  CopyView: (props: CopyViewProps) => React.JSX.Element | null;
25
+ CreateFolderView: (props: CreateFolderViewProps) => React.JSX.Element | null;
26
26
  DeleteView: (props: DeleteViewProps) => React.JSX.Element | null;
27
+ DownloadView: (props: DownloadViewProps) => React.JSX.Element | null;
27
28
  UploadView: (props: UploadViewProps) => React.JSX.Element | null;
28
29
  }
29
30
  export interface DefaultActionViewsByActionName {
30
- createFolder: (props: CreateFolderViewProps) => React.JSX.Element | null;
31
31
  copy: (props: CopyViewProps) => React.JSX.Element | null;
32
+ createFolder: (props: CreateFolderViewProps) => React.JSX.Element | null;
32
33
  delete: (props: DeleteViewProps) => React.JSX.Element | null;
34
+ download: (props: DownloadViewProps) => React.JSX.Element | null;
33
35
  upload: (props: UploadViewProps) => React.JSX.Element | null;
34
36
  }
@@ -1,9 +1,10 @@
1
- import type { UploadViewState, CreateFolderViewState, DeleteViewState, CopyViewState } from './LocationActionView';
1
+ import type { CopyViewState, CreateFolderViewState, DeleteViewState, DownloadViewState, UploadViewState } from './LocationActionView';
2
2
  import type { LocationDetailViewState } from './LocationDetailView';
3
3
  import type { LocationsViewState } from './LocationsView';
4
4
  interface DefaultUseViewStates {
5
5
  Copy: CopyViewState;
6
6
  CreateFolder: CreateFolderViewState;
7
+ Download: DownloadViewState;
7
8
  Delete: DeleteViewState;
8
9
  LocationDetail: LocationDetailViewState;
9
10
  Locations: LocationsViewState;
@@ -1 +1 @@
1
- export { COPY_TABLE_KEYS, COPY_TABLE_RESOLVERS, DELETE_TABLE_KEYS, DELETE_TABLE_RESOLVERS, UPLOAD_TABLE_KEYS, UPLOAD_TABLE_RESOLVERS, } from './tableResolvers';
1
+ export { COPY_TABLE_RESOLVERS, FILE_DATA_ITEM_TABLE_KEYS, DELETE_TABLE_RESOLVERS, UPLOAD_TABLE_KEYS, UPLOAD_TABLE_RESOLVERS, DOWNLOAD_TABLE_RESOLVERS, } from './tableResolvers';
@@ -1,13 +1,8 @@
1
1
  import type { TaskStatus } from '../../../../tasks';
2
- import type { CopyActionTask, DeleteActionTask, UploadActionTask } from '../types';
3
- type MockCopyOrDeleteTaskStatus = Exclude<TaskStatus, 'OVERWRITE_PREVENTED'>;
4
- type MockCopyTasks = {
5
- [K in MockCopyOrDeleteTaskStatus]: Omit<CopyActionTask, 'status'> & {
6
- status: K;
7
- };
8
- };
9
- type MockDeleteTasks = {
10
- [K in MockCopyOrDeleteTaskStatus]: Omit<DeleteActionTask, 'status'> & {
2
+ import type { FileDataTask, UploadActionTask } from '../types';
3
+ type MockFileDataTaskStatus = Exclude<TaskStatus, 'OVERWRITE_PREVENTED'>;
4
+ type MockFileDataTasks = {
5
+ [K in MockFileDataTaskStatus]: Omit<FileDataTask, 'status'> & {
11
6
  status: K;
12
7
  };
13
8
  };
@@ -16,8 +11,8 @@ type MockUploadTasks = {
16
11
  status: K;
17
12
  };
18
13
  };
19
- export declare const MOCK_COPY_TASKS: MockCopyTasks;
20
- export declare const MOCK_DELETE_TASKS: MockDeleteTasks;
14
+ export declare const MOCK_COPY_TASKS: MockFileDataTasks;
15
+ export declare const MOCK_FILE_DATA_TASKS: MockFileDataTasks;
21
16
  export declare const MOCK_UPLOAD_TASKS_SINGLE_PART: MockUploadTasks;
22
17
  export declare const MOCK_UPLOAD_TASKS_MULTIPART: MockUploadTasks;
23
18
  export {};
@@ -14,3 +14,4 @@ export declare const STATUS_ICONS: {
14
14
  readonly CANCELED: "action-canceled";
15
15
  readonly QUEUED: "action-queued";
16
16
  };
17
+ export declare const FILE_DATA_ITEM_TABLE_KEYS: readonly ["name", "folder", "type", "size", "status", "cancel"];
@@ -1,3 +1,2 @@
1
- import type { CopyTaskTableResolvers } from './types';
2
- export declare const COPY_TABLE_KEYS: readonly ["name", "folder", "type", "size", "status", "cancel"];
3
- export declare const COPY_TABLE_RESOLVERS: CopyTaskTableResolvers;
1
+ import type { FileDataTaskTableResolvers } from './types';
2
+ export declare const COPY_TABLE_RESOLVERS: FileDataTaskTableResolvers;
@@ -1,3 +1,2 @@
1
- import type { DeleteTableResolvers } from './types';
2
- export declare const DELETE_TABLE_KEYS: readonly ["name", "folder", "type", "size", "status", "cancel"];
3
- export declare const DELETE_TABLE_RESOLVERS: DeleteTableResolvers;
1
+ import type { FileDataTaskTableResolvers } from './types';
2
+ export declare const DELETE_TABLE_RESOLVERS: FileDataTaskTableResolvers;
@@ -0,0 +1,2 @@
1
+ import type { FileDataTaskTableResolvers } from './types';
2
+ export declare const DOWNLOAD_TABLE_RESOLVERS: FileDataTaskTableResolvers;
@@ -1,3 +1,5 @@
1
- export { COPY_TABLE_KEYS, COPY_TABLE_RESOLVERS } from './copyResolvers';
1
+ export { COPY_TABLE_RESOLVERS } from './copyResolvers';
2
+ export { DELETE_TABLE_RESOLVERS } from './deleteResolvers';
3
+ export { DOWNLOAD_TABLE_RESOLVERS } from './downloadResolvers';
2
4
  export { UPLOAD_TABLE_KEYS, UPLOAD_TABLE_RESOLVERS } from './uploadResolvers';
3
- export { DELETE_TABLE_KEYS, DELETE_TABLE_RESOLVERS } from './deleteResolvers';
5
+ export { FILE_DATA_ITEM_TABLE_KEYS } from './constants';
@@ -1,13 +1,19 @@
1
- import type { CopyHandlerData, DeleteHandlerData, UploadHandlerData } from '../../../actions';
2
- import type { CopyViewDisplayText, DeleteViewDisplayText, UploadViewDisplayText } from '../../../displayText';
1
+ import type { CopyHandlerData, DeleteHandlerData, DownloadHandlerData, OptionalFileData, TaskData, UploadHandlerData } from '../../../actions';
2
+ import type { CopyViewDisplayText, DeleteViewDisplayText, DownloadViewDisplayText, UploadViewDisplayText } from '../../../displayText';
3
3
  import type { Task } from '../../../tasks';
4
4
  import type { DataTableResolvers } from '../../hooks/useResolveTableData';
5
5
  export interface CopyActionTask extends Task<CopyHandlerData> {
6
6
  }
7
7
  export interface DeleteActionTask extends Task<DeleteHandlerData> {
8
8
  }
9
+ export interface DownloadActionTask extends Task<DownloadHandlerData> {
10
+ }
9
11
  export interface UploadActionTask extends Task<UploadHandlerData> {
10
12
  }
13
+ export interface FileDataTask extends Task<TaskData & OptionalFileData & {
14
+ fileKey: string;
15
+ }> {
16
+ }
11
17
  interface ActionTableResolverProps<TDisplayText, TTask> {
12
18
  displayText: TDisplayText;
13
19
  isProcessing: boolean;
@@ -17,20 +23,18 @@ export interface CopyTableResolverProps extends ActionTableResolverProps<CopyVie
17
23
  }
18
24
  export interface DeleteTableResolverProps extends ActionTableResolverProps<DeleteViewDisplayText, DeleteActionTask> {
19
25
  }
26
+ export interface DownloadTableResolverProps extends ActionTableResolverProps<DownloadViewDisplayText, DownloadActionTask> {
27
+ }
20
28
  export interface UploadTableResolverProps extends ActionTableResolverProps<UploadViewDisplayText, UploadActionTask> {
21
29
  isMultipartUpload: (file: File) => boolean;
22
30
  }
23
- type ActionTableKey = 'name' | 'folder' | 'type' | 'size' | 'status' | 'progress' | 'cancel';
24
- export type CopyTableKey = Exclude<ActionTableKey, 'progress'>;
25
- export type DeleteTableKey = Exclude<ActionTableKey, 'progress'>;
26
- export type UploadTableKey = ActionTableKey;
27
- export interface CopyTaskTableResolvers extends DataTableResolvers<CopyTableKey, CopyTableResolverProps, CopyActionTask> {
28
- }
29
- export interface DeleteTableResolvers extends DataTableResolvers<DeleteTableKey, DeleteTableResolverProps, DeleteActionTask> {
31
+ export type FileDataTaskTableResolverProps = CopyTableResolverProps | DeleteTableResolverProps;
32
+ export type ActionTableKey = 'name' | 'folder' | 'type' | 'size' | 'status' | 'cancel';
33
+ export type UploadTableKey = ActionTableKey | 'progress';
34
+ export interface FileDataTaskTableResolvers extends DataTableResolvers<ActionTableKey, FileDataTaskTableResolverProps, FileDataTask> {
30
35
  }
31
36
  export interface UploadTableResolvers extends DataTableResolvers<UploadTableKey, UploadTableResolverProps, UploadActionTask> {
32
37
  }
33
- export type GetCopyCell = CopyTaskTableResolvers['getCell'];
34
- export type GetDeleteCell = DeleteTableResolvers['getCell'];
38
+ export type GetFileDataCell = FileDataTaskTableResolvers['getCell'];
35
39
  export type GetUploadCell = UploadTableResolvers['getCell'];
36
40
  export {};
@@ -1,12 +1,20 @@
1
- import type { DataTableButtonDataCell, DataTableNumberDataCell } from '../../../components';
2
- import type { CopyActionTask, DeleteActionTask, GetCopyCell, GetDeleteCell, UploadActionTask } from './types';
1
+ import type { DataTableButtonDataCell, DataTableNumberDataCell, WithKey } from '../../../components';
2
+ import type { FileDataTask, GetFileDataCell, UploadActionTask, ActionTableKey } from './types';
3
3
  export declare const getFileType: (value: string, fallback?: string) => string;
4
4
  export declare const getCellName: (value: string) => string;
5
5
  export declare const getUploadCellFolder: ({ data: { file: { webkitRelativePath }, }, }: UploadActionTask, fallback?: string) => string;
6
- export declare const getCopyCellFolder: ({ data: { fileKey, sourceKey }, }: CopyActionTask) => string;
7
- export declare const getDeleteCellFolder: ({ data: { fileKey, key }, }: DeleteActionTask) => string;
6
+ export declare const getFileDataCellFolder: (task: FileDataTask) => string;
8
7
  export declare const getUploadCellProgress: ({ progress, status, }: UploadActionTask) => DataTableNumberDataCell['content'];
9
8
  export declare const getFileSize: (value: number | undefined, fallback?: string) => string;
10
- type CellInput = Parameters<GetCopyCell>[0] | Parameters<GetDeleteCell>[0];
11
- export declare const getCopyOrDeleteCancelCellContent: <TInput extends CellInput, TCallback extends TInput["props"]["onTaskRemove"] extends (item: infer TItem) => void ? (item: TItem) => void : never>(data: TInput) => DataTableButtonDataCell['content'];
12
- export {};
9
+ export declare const getFileDataCancelCellContent: <TInput extends WithKey<import("../../hooks/useResolveTableData/types").CellData<import("./types").FileDataTaskTableResolverProps, FileDataTask>, ActionTableKey>, TCallback extends TInput["props"]["onTaskRemove"] extends (item: infer TItem) => void ? (item: TItem) => void : never>(data: TInput) => DataTableButtonDataCell['content'];
10
+ /**
11
+ * Generates a unique key for a table cell based on the key and item id
12
+ */
13
+ export declare const getFileDataCellKey: ({ key, item, }: WithKey<{
14
+ item: FileDataTask;
15
+ }, ActionTableKey>) => string;
16
+ export declare const name: GetFileDataCell;
17
+ export declare const folder: GetFileDataCell;
18
+ export declare const type: GetFileDataCell;
19
+ export declare const size: GetFileDataCell;
20
+ export declare const cancel: GetFileDataCell;
@@ -1 +1 @@
1
- export declare const VERSION = "3.10.3";
1
+ export declare const VERSION = "3.12.0";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws-amplify/ui-react-storage",
3
- "version": "3.10.3",
3
+ "version": "3.12.0",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/esm/index.mjs",
6
6
  "exports": {
@@ -66,7 +66,7 @@
66
66
  "name": "createStorageBrowser",
67
67
  "path": "dist/esm/browser.mjs",
68
68
  "import": "{ createStorageBrowser }",
69
- "limit": "64.5 kB",
69
+ "limit": "64.6 kB",
70
70
  "ignore": [
71
71
  "@aws-amplify/storage"
72
72
  ]
@@ -75,7 +75,7 @@
75
75
  "name": "StorageBrowser",
76
76
  "path": "dist/esm/index.mjs",
77
77
  "import": "{ StorageBrowser }",
78
- "limit": "87 kB"
78
+ "limit": "88 kB"
79
79
  },
80
80
  {
81
81
  "name": "FileUploader",
@@ -1,31 +0,0 @@
1
- import React__default from 'react';
2
- import { noop } from '@aws-amplify/ui';
3
- import { createContextUtilities } from '@aws-amplify/ui-react-core';
4
- import { useFileSelect } from '@aws-amplify/ui-react/internal';
5
- import { filesReducer, parseFileSelectParams } from './utils.mjs';
6
-
7
- const defaultValue = [undefined, noop];
8
- const { FilesContext, useFiles } = createContextUtilities({
9
- contextName: 'Files',
10
- defaultValue,
11
- });
12
- function FilesProvider({ children, }) {
13
- const [items, dispatch] = React__default.useReducer(filesReducer, []);
14
- const [fileInput, handleFileSelect] = useFileSelect((nextFiles) => {
15
- dispatch({ type: 'ADD_FILE_ITEMS', files: nextFiles });
16
- });
17
- const handleFilesAction = React__default.useCallback((action) => {
18
- if (action.type === 'SELECT_FILES') {
19
- handleFileSelect(...parseFileSelectParams(action.selectionType));
20
- }
21
- else {
22
- dispatch(action);
23
- }
24
- }, [handleFileSelect]);
25
- const value = React__default.useMemo(() => [items, handleFilesAction], [items, handleFilesAction]);
26
- return (React__default.createElement(FilesContext.Provider, { value: value },
27
- fileInput,
28
- children));
29
- }
30
-
31
- export { FilesContext, FilesProvider, useFiles };
@@ -1,52 +0,0 @@
1
- import { isUndefined, isString, isEmpty } from '@aws-amplify/ui';
2
-
3
- const compareFileItems = (prev, next) => prev.key.localeCompare(next.key);
4
- const resolveFiles = (prevItems, files) => {
5
- if (!files?.length)
6
- return prevItems;
7
- // construct `nextItems` and filter out existing `file` entries
8
- const nextItems = files.reduce((items, file) => {
9
- const { name, webkitRelativePath } = file;
10
- return prevItems.some(({ file: existing }) => existing.name === name &&
11
- existing.webkitRelativePath === webkitRelativePath)
12
- ? items
13
- : items.concat({
14
- key: isEmpty(webkitRelativePath) ? name : webkitRelativePath,
15
- id: crypto.randomUUID(),
16
- file,
17
- });
18
- }, []);
19
- if (!nextItems.length)
20
- return prevItems;
21
- if (!prevItems.length) {
22
- return nextItems.sort(compareFileItems);
23
- }
24
- return prevItems.concat(nextItems).sort(compareFileItems);
25
- };
26
- const filesReducer = (prevItems, input) => {
27
- switch (input.type) {
28
- case 'ADD_FILE_ITEMS': {
29
- return resolveFiles(prevItems, input.files);
30
- }
31
- case 'REMOVE_FILE_ITEM': {
32
- const filteredItems = prevItems.filter(({ id }) => id !== input.id);
33
- return filteredItems.length === prevItems.length
34
- ? prevItems
35
- : filteredItems;
36
- }
37
- case 'RESET_FILE_ITEMS': {
38
- return [];
39
- }
40
- // TODO: clear message
41
- }
42
- };
43
- const parseFileSelectParams = (value) => {
44
- if (isUndefined(value))
45
- return ['FILE', undefined];
46
- if (isString(value))
47
- return [value, undefined];
48
- const [selectType, ...rest] = value;
49
- return [selectType, !rest?.length ? undefined : { accept: rest.join() }];
50
- };
51
-
52
- export { filesReducer, parseFileSelectParams, resolveFiles };
@@ -1,4 +0,0 @@
1
- const UPLOAD_FILE_SIZE_LIMIT = 160 * 1000 * 1000 * 1000;
2
- const isFileTooBig = (file) => file.size > UPLOAD_FILE_SIZE_LIMIT;
3
-
4
- export { UPLOAD_FILE_SIZE_LIMIT, isFileTooBig };
@@ -1,6 +0,0 @@
1
- import React from 'react';
2
- import type { FilesContextType, FilesProviderProps } from './types';
3
- export declare const FilesContext: React.Context<FilesContextType>, useFiles: (params?: {
4
- errorMessage?: string | undefined;
5
- } | undefined) => FilesContextType;
6
- export declare function FilesProvider({ children, }: FilesProviderProps): React.JSX.Element;