@aws-amplify/ui-react-storage 3.12.2 → 3.13.1

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 (92) hide show
  1. package/dist/browser.js +1 -1
  2. package/dist/{createStorageBrowser-pzJe4BD8.js → createStorageBrowser-DaVWyJzC.js} +1884 -1068
  3. package/dist/esm/browser.mjs +6 -2
  4. package/dist/esm/components/StorageBrowser/ErrorBoundary/ErrorBoundary.mjs +9 -0
  5. package/dist/esm/components/StorageBrowser/components/ComponentsProvider.mjs +9 -0
  6. package/dist/esm/components/StorageBrowser/components/base/Table.mjs +1 -1
  7. package/dist/esm/components/StorageBrowser/components/base/preview/DownloadButton.mjs +39 -0
  8. package/dist/esm/components/StorageBrowser/components/base/preview/FileMetadata.mjs +40 -0
  9. package/dist/esm/components/StorageBrowser/components/base/preview/FilePreviewLayout.mjs +19 -0
  10. package/dist/esm/components/StorageBrowser/components/base/preview/ImagePreview.mjs +37 -0
  11. package/dist/esm/components/StorageBrowser/components/base/preview/PreviewFallback.mjs +34 -0
  12. package/dist/esm/components/StorageBrowser/components/base/preview/PreviewPlaceholder.mjs +13 -0
  13. package/dist/esm/components/StorageBrowser/components/base/preview/TextPreview.mjs +64 -0
  14. package/dist/esm/components/StorageBrowser/components/base/preview/VideoPreview.mjs +61 -0
  15. package/dist/esm/components/StorageBrowser/components/composables/DataTable/DataTable.mjs +2 -1
  16. package/dist/esm/components/StorageBrowser/components/composables/FilePreview.mjs +85 -0
  17. package/dist/esm/components/StorageBrowser/components/composables/defaults.mjs +2 -0
  18. package/dist/esm/components/StorageBrowser/components/elements/definitions.mjs +2 -2
  19. package/dist/esm/components/StorageBrowser/controls/DataTableControl.mjs +9 -0
  20. package/dist/esm/components/StorageBrowser/controls/FilePreviewControl.mjs +24 -0
  21. package/dist/esm/components/StorageBrowser/createStorageBrowser/StorageBrowserDefault.mjs +1 -0
  22. package/dist/esm/components/StorageBrowser/createStorageBrowser/createProvider.mjs +4 -2
  23. package/dist/esm/components/StorageBrowser/createStorageBrowser/createStorageBrowser.mjs +1 -0
  24. package/dist/esm/components/StorageBrowser/displayText/context.mjs +4 -0
  25. package/dist/esm/components/StorageBrowser/displayText/libraries/en/locationDetailView.mjs +28 -0
  26. package/dist/esm/components/StorageBrowser/filePreview/context.mjs +12 -0
  27. package/dist/esm/components/StorageBrowser/views/LocationActionView/CopyView/CopyView.mjs +9 -0
  28. package/dist/esm/components/StorageBrowser/views/LocationActionView/CopyView/CopyViewProvider.mjs +8 -0
  29. package/dist/esm/components/StorageBrowser/views/LocationActionView/CopyView/FoldersMessageControl.mjs +8 -0
  30. package/dist/esm/components/StorageBrowser/views/LocationActionView/CreateFolderView/CreateFolderView.mjs +9 -0
  31. package/dist/esm/components/StorageBrowser/views/LocationActionView/DeleteView/DeleteView.mjs +9 -0
  32. package/dist/esm/components/StorageBrowser/views/LocationActionView/DownloadView/DownloadView.mjs +9 -0
  33. package/dist/esm/components/StorageBrowser/views/LocationActionView/UploadView/UploadView.mjs +9 -0
  34. package/dist/esm/components/StorageBrowser/views/LocationDetailView/LocationDetailView.mjs +17 -4
  35. package/dist/esm/components/StorageBrowser/views/LocationDetailView/LocationDetailViewProvider.mjs +9 -2
  36. package/dist/esm/components/StorageBrowser/views/LocationDetailView/getLocationDetailViewTableData/constants.mjs +69 -1
  37. package/dist/esm/components/StorageBrowser/views/LocationDetailView/getLocationDetailViewTableData/fileIcon.mjs +11 -0
  38. package/dist/esm/components/StorageBrowser/views/LocationDetailView/getLocationDetailViewTableData/getFileRowContent.mjs +8 -5
  39. package/dist/esm/components/StorageBrowser/views/LocationDetailView/getLocationDetailViewTableData/getLocationDetailViewTableData.mjs +8 -1
  40. package/dist/esm/components/StorageBrowser/views/LocationDetailView/useLocationDetailView.mjs +76 -3
  41. package/dist/esm/components/StorageBrowser/views/LocationsView/LocationsView.mjs +9 -0
  42. package/dist/esm/components/StorageBrowser/views/LocationsView/LocationsViewProvider.mjs +8 -0
  43. package/dist/esm/components/StorageBrowser/views/context/primaryViews.mjs +1 -0
  44. package/dist/esm/components/StorageBrowser/views/hooks/useFilePreview/useFilePreview.mjs +115 -0
  45. package/dist/esm/components/StorageBrowser/views/utils/files/const.mjs +62 -0
  46. package/dist/esm/components/StorageBrowser/views/utils/files/fileName.mjs +12 -0
  47. package/dist/esm/components/StorageBrowser/views/utils/files/fileSize.mjs +23 -0
  48. package/dist/esm/components/StorageBrowser/views/utils/files/fileType.mjs +87 -0
  49. package/dist/esm/components/StorageBrowser/views/utils/files/safeGetProperties.mjs +12 -0
  50. package/dist/esm/components/StorageBrowser/views/utils/files/url.mjs +16 -0
  51. package/dist/esm/version.mjs +1 -1
  52. package/dist/index.js +1 -1
  53. package/dist/styles.css +250 -0
  54. package/dist/types/components/StorageBrowser/actions/configs/defaults.d.ts +2 -2
  55. package/dist/types/components/StorageBrowser/actions/handlers/types.d.ts +4 -0
  56. package/dist/types/components/StorageBrowser/components/base/Table.d.ts +1 -0
  57. package/dist/types/components/StorageBrowser/components/base/preview/DownloadButton.d.ts +4 -0
  58. package/dist/types/components/StorageBrowser/components/base/preview/FileMetadata.d.ts +7 -0
  59. package/dist/types/components/StorageBrowser/components/base/preview/FilePreviewLayout.d.ts +8 -0
  60. package/dist/types/components/StorageBrowser/components/base/preview/ImagePreview.d.ts +3 -0
  61. package/dist/types/components/StorageBrowser/components/base/preview/PreviewFallback.d.ts +10 -0
  62. package/dist/types/components/StorageBrowser/components/base/preview/PreviewPlaceholder.d.ts +2 -0
  63. package/dist/types/components/StorageBrowser/components/base/preview/TextPreview.d.ts +3 -0
  64. package/dist/types/components/StorageBrowser/components/base/preview/VideoPreview.d.ts +3 -0
  65. package/dist/types/components/StorageBrowser/components/base/preview/type.d.ts +6 -0
  66. package/dist/types/components/StorageBrowser/components/composables/DataTable/DataTable.d.ts +1 -0
  67. package/dist/types/components/StorageBrowser/components/composables/FilePreview.d.ts +12 -0
  68. package/dist/types/components/StorageBrowser/components/composables/types.d.ts +2 -0
  69. package/dist/types/components/StorageBrowser/controls/FilePreviewControl.d.ts +2 -0
  70. package/dist/types/components/StorageBrowser/controls/types.d.ts +11 -2
  71. package/dist/types/components/StorageBrowser/createStorageBrowser/createProvider.d.ts +2 -1
  72. package/dist/types/components/StorageBrowser/createStorageBrowser/createStorageBrowser.d.ts +4 -1
  73. package/dist/types/components/StorageBrowser/createStorageBrowser/types.d.ts +78 -2
  74. package/dist/types/components/StorageBrowser/displayText/types.d.ts +30 -1
  75. package/dist/types/components/StorageBrowser/filePreview/context.d.ts +10 -0
  76. package/dist/types/components/StorageBrowser/filePreview/index.d.ts +1 -0
  77. package/dist/types/components/StorageBrowser/views/LocationDetailView/getLocationDetailViewTableData/constants.d.ts +6 -0
  78. package/dist/types/components/StorageBrowser/views/LocationDetailView/getLocationDetailViewTableData/fileIcon.d.ts +2 -0
  79. package/dist/types/components/StorageBrowser/views/LocationDetailView/getLocationDetailViewTableData/getFileRowContent.d.ts +3 -1
  80. package/dist/types/components/StorageBrowser/views/LocationDetailView/getLocationDetailViewTableData/getLocationDetailViewTableData.d.ts +5 -2
  81. package/dist/types/components/StorageBrowser/views/LocationDetailView/types.d.ts +10 -0
  82. package/dist/types/components/StorageBrowser/views/hooks/useFilePreview/index.d.ts +2 -0
  83. package/dist/types/components/StorageBrowser/views/hooks/useFilePreview/types.d.ts +28 -0
  84. package/dist/types/components/StorageBrowser/views/hooks/useFilePreview/useFilePreview.d.ts +5 -0
  85. package/dist/types/components/StorageBrowser/views/utils/files/const.d.ts +9 -0
  86. package/dist/types/components/StorageBrowser/views/utils/files/fileName.d.ts +6 -0
  87. package/dist/types/components/StorageBrowser/views/utils/files/fileSize.d.ts +2 -0
  88. package/dist/types/components/StorageBrowser/views/utils/files/fileType.d.ts +12 -0
  89. package/dist/types/components/StorageBrowser/views/utils/files/safeGetProperties.d.ts +2 -0
  90. package/dist/types/components/StorageBrowser/views/utils/files/url.d.ts +2 -0
  91. package/dist/types/version.d.ts +1 -1
  92. package/package.json +6 -6
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ export interface PreviewFallbackProps {
3
+ fileKey: string;
4
+ message: string;
5
+ description?: string;
6
+ isError?: boolean;
7
+ onRetry?: () => void;
8
+ showRetry?: boolean;
9
+ }
10
+ export declare function PreviewFallback({ fileKey, message, description, isError, onRetry, showRetry, }: PreviewFallbackProps): React.JSX.Element;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare function PreviewPlaceholder(): React.JSX.Element;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import type { PreviewComponentProps } from './type';
3
+ export declare function TextPreview({ url, fileKey, }: PreviewComponentProps): React.JSX.Element;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import type { PreviewComponentProps } from './type';
3
+ export declare function VideoPreview({ url, fileKey, }: PreviewComponentProps): React.JSX.Element;
@@ -0,0 +1,6 @@
1
+ export interface PreviewComponentProps {
2
+ url: string;
3
+ fileKey: string;
4
+ showDownload?: boolean;
5
+ }
6
+ export type PreviewComponent = React.ComponentType<PreviewComponentProps>;
@@ -2,6 +2,7 @@ import React from 'react';
2
2
  import type { WithKey } from '../../types';
3
3
  import type { DataTableDataCell, DataTableHeader } from './types';
4
4
  export interface DataTableRow {
5
+ active?: boolean;
5
6
  content: WithKey<DataTableDataCell>[];
6
7
  }
7
8
  export interface DataTableProps {
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import type { FilePreviewState } from '../../views/hooks/useFilePreview';
3
+ import type { FileData } from '../../actions';
4
+ export type FilePreviewProps = {
5
+ activeFileHasNext?: boolean;
6
+ activeFileHasPrev?: boolean;
7
+ activeFile?: FileData;
8
+ filePreview?: FilePreviewState;
9
+ onSelectActiveFile?: (f?: FileData | 'prev' | 'next') => void;
10
+ onRetryFilePreview?: () => void;
11
+ };
12
+ export declare function FilePreview(props: FilePreviewProps): React.JSX.Element | null;
@@ -18,6 +18,7 @@ import type { PaginationProps } from './Pagination';
18
18
  import type { SearchFieldProps } from './SearchField';
19
19
  import type { SearchSubfoldersToggleProps } from './SearchSubfoldersToggle';
20
20
  import type { TitleProps } from './Title';
21
+ import type { FilePreviewProps } from './FilePreview';
21
22
  export interface Composables {
22
23
  ActionCancel: React.ComponentType<ActionCancelProps>;
23
24
  ActionDestination: React.ComponentType<ActionDestinationProps>;
@@ -39,6 +40,7 @@ export interface Composables {
39
40
  SearchSubfoldersToggle: React.ComponentType<SearchSubfoldersToggleProps>;
40
41
  StatusDisplay: React.ComponentType<StatusDisplayProps>;
41
42
  Title: React.ComponentType<TitleProps>;
43
+ FilePreview: React.ComponentType<FilePreviewProps>;
42
44
  }
43
45
  export interface ComposablesContext {
44
46
  composables?: Composables;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare function FilePreviewControl(): React.JSX.Element | null;
@@ -1,7 +1,8 @@
1
- import type { LocationData } from '../actions';
2
- import type { ActionListItem, Composables, DataTableSortHeader, DataTableProps, MessageProps } from '../components';
1
+ import type { FileData, LocationData } from '../actions';
2
+ import type { ActionListItem, Composables, DataTableProps, DataTableSortHeader, MessageProps } from '../components';
3
3
  import type { LocationState } from '../store';
4
4
  import type { StatusCounts } from '../tasks';
5
+ import type { FilePreviewState } from '../views/hooks/useFilePreview';
5
6
  export interface Controls {
6
7
  props: React.ComponentProps<Composables[keyof Composables]>;
7
8
  }
@@ -21,6 +22,9 @@ interface PaginationData {
21
22
  export interface ControlsContext {
22
23
  data: {
23
24
  actions?: ActionListItem[];
25
+ activeFile?: FileData;
26
+ activeFileHasNext?: boolean;
27
+ activeFileHasPrev?: boolean;
24
28
  actionCancelLabel?: string;
25
29
  actionDestinationLabel?: string;
26
30
  actionExitLabel?: string;
@@ -52,6 +56,7 @@ export interface ControlsContext {
52
56
  paginationData?: PaginationData;
53
57
  searchPlaceholder?: string;
54
58
  searchQuery?: string;
59
+ filePreviewState?: FilePreviewState;
55
60
  searchSubfoldersToggleLabel?: string;
56
61
  searchSubmitLabel?: string;
57
62
  searchClearLabel?: string;
@@ -76,8 +81,12 @@ export interface ControlsContext {
76
81
  onPaginate?: (page: number) => void;
77
82
  onRefresh?: () => void;
78
83
  onSearch?: () => void;
84
+ onSelectActiveFile?: (file?: FileData | 'prev' | 'next') => void;
79
85
  onSearchClear?: () => void;
80
86
  onSearchQueryChange?: (value: string) => void;
87
+ onOpenFilePreview?: (f: FileData) => void;
88
+ onCloseFilePreview?: () => void;
89
+ onRetryFilePreview?: () => void;
81
90
  onSelectDestination?: (location: LocationData, path?: string) => void;
82
91
  onToggleOverwrite?: () => void;
83
92
  onToggleSearchSubfolders?: () => void;
@@ -1,3 +1,4 @@
1
1
  import React from 'react';
2
+ import type { FileData } from '../actions';
2
3
  import type { CreateStorageBrowserInput, StorageBrowserProviderProps } from './types';
3
- export default function createProvider({ actions, components, config, options, }: CreateStorageBrowserInput): (props: StorageBrowserProviderProps) => React.JSX.Element;
4
+ export default function createProvider<TResolver extends ((properties: FileData) => unknown) | undefined>({ actions, components, config, options, filePreview, }: CreateStorageBrowserInput<TResolver>): (props: StorageBrowserProviderProps) => React.JSX.Element;
@@ -1,8 +1,11 @@
1
1
  import type { CreateStorageBrowserInput, CreateStorageBrowserOutput } from './types';
2
+ import type { FileData } from '../actions/handlers';
2
3
  /**
3
4
  * Creates a `StorageBrowser` component and utility hooks from provided configuration `input`.
4
5
  *
5
6
  * @param input - `StorageBrowser` auth, actions and ui configuration values
6
7
  * @returns `StorageBrowser` component, `useAction` and `useView` hooks
7
8
  */
8
- export default function createStorageBrowser<TInput extends CreateStorageBrowserInput, TActions extends NonNullable<TInput['actions']>>(input: TInput): CreateStorageBrowserOutput<TActions>;
9
+ export default function createStorageBrowser<TResolver extends ((properties: FileData) => unknown) | undefined, TInput extends CreateStorageBrowserInput<TResolver>, TActions extends NonNullable<TInput['actions']>>(input: CreateStorageBrowserInput<TResolver> & {
10
+ actions?: TActions;
11
+ }): CreateStorageBrowserOutput<TActions>;
@@ -1,5 +1,5 @@
1
1
  import type React from 'react';
2
- import type { CustomActionConfigs, DefaultActionConfigs, ExtendedActionConfigs, ListLocations, LocationData } from '../actions';
2
+ import type { CustomActionConfigs, DefaultActionConfigs, ExtendedActionConfigs, FileData, ListLocations, LocationData } from '../actions';
3
3
  import type { StorageBrowserComponents } from '../components';
4
4
  import type { GetLocationCredentials, RegisterAuthListener } from '../credentials';
5
5
  import type { StorageBrowserDisplayText } from '../displayText';
@@ -100,10 +100,82 @@ export interface StorageBrowserOptions {
100
100
  */
101
101
  validateFile?: (file: File) => boolean;
102
102
  }
103
+ declare const BUILT_IN_FILE_TYPES: readonly ["text", "video", "image"];
104
+ export type BuiltInFileType = (typeof BUILT_IN_FILE_TYPES)[number];
105
+ type CustomFileType<T> = T extends (properties: FileData) => infer R ? R extends string | undefined ? Exclude<NonNullable<R>, BuiltInFileType> : never : never;
106
+ export type AllFileTypes<T extends undefined | any = undefined> = T extends undefined ? BuiltInFileType : BuiltInFileType | CustomFileType<T>;
107
+ export type FileSizeResolver<T extends string = BuiltInFileType> = (fileType: T) => number | undefined;
108
+ export type UrlOptionsResolver<T extends string = BuiltInFileType> = (fileType: T) => FilePreviewUrlOptions | undefined;
109
+ export type FilePreview<TResolver extends ((properties: FileData) => unknown) | undefined = undefined> = {
110
+ /**
111
+ * @description Function to determine file type from file properties
112
+ * @param properties - File metadata and properties
113
+ * @returns FileType or undefined that will fallback to the built-in file type detection
114
+ */
115
+ fileTypeResolver?: TResolver;
116
+ /**
117
+ * @description Function that dynamically returns a custom React component for rendering specific file types based on file type
118
+ * @param fileType - The resolved file type
119
+ * @returns React component or undefined to use built-in renderer
120
+ * @example fileType => fileType === 'image' ? CustomImagePreview : undefined
121
+ * @example fileType => {
122
+ * if (fileType === 'text') return CodeRenderer;
123
+ * if (fileType === 'pdf') return CustomPDFViewer;
124
+ * return undefined; // Use built-in renderer
125
+ * }
126
+ */
127
+ rendererResolver?: (fileType: AllFileTypes<TResolver>) => React.ComponentType<FilePreviewProps> | undefined;
128
+ /**
129
+ * @description Options for generating preview URLs.
130
+ * Can be:
131
+ * - A static configuration object
132
+ * - A function that dynamically returns URL options based on file type
133
+ * @example { expiresIn: 1800, validateObjectExistence: true }
134
+ * @example fileType => fileType === 'video' ? { expiresIn: 3600, validateObjectExistence: true } : undefined
135
+ */
136
+ urlOptions?: FilePreviewUrlOptions | UrlOptionsResolver<AllFileTypes<TResolver>>;
137
+ /**
138
+ * @description Maximum file sizes allowed for preview in kilobytes (KB).
139
+ * Can be:
140
+ * - A single limit for all file types
141
+ * - A function that dynamically calculates the limit based on file type
142
+ * @example 10240 // 10MB limit for all files
143
+ * @example fileType => fileType === 'image' ? 5120 : undefined
144
+ */
145
+ maxFileSize?: number | FileSizeResolver<AllFileTypes<TResolver>>;
146
+ };
147
+ /**
148
+ * @description Options for generating file preview URLs
149
+ */
150
+ export interface FilePreviewUrlOptions {
151
+ /**
152
+ * @description Whether to validate that the object exists before generating the URL
153
+ * @default false
154
+ */
155
+ validateObjectExistence?: boolean;
156
+ /**
157
+ * @description Time in seconds until the generated URL expires
158
+ * @default 900 (15 minutes)
159
+ */
160
+ expiresIn?: number;
161
+ }
162
+ /**
163
+ * @description Props provided to custom file preview renderer components
164
+ */
165
+ export interface FilePreviewProps {
166
+ /**
167
+ * @description File metadata including content type and other properties
168
+ */
169
+ fileData: FileData;
170
+ /**
171
+ * @description Pre-signed URL for the file.
172
+ */
173
+ url: string;
174
+ }
103
175
  /**
104
176
  * @description configuration and options for `createStorageBrowser`
105
177
  */
106
- export interface CreateStorageBrowserInput {
178
+ export interface CreateStorageBrowserInput<TResolver extends ((properties: FileData) => unknown) | undefined = undefined> {
107
179
  /**
108
180
  * @description override and default `StorageBrowser` actions and action view configs
109
181
  */
@@ -125,6 +197,10 @@ export interface CreateStorageBrowserInput {
125
197
  * @description Additional options and overrides for `StorageBrowser`
126
198
  */
127
199
  options?: StorageBrowserOptions;
200
+ /**
201
+ * @description Configuration for file preview functionality including custom renderers, file type resolution, and size limits
202
+ */
203
+ filePreview?: FilePreview<TResolver> | false;
128
204
  }
129
205
  /**
130
206
  * `StorageBrowser` component properties
@@ -39,6 +39,33 @@ export interface DefaultLocationsViewDisplayText extends DefaultListViewDisplayT
39
39
  interface ListItemsMessageData extends ListMessageData {
40
40
  items: LocationItemData[] | undefined;
41
41
  }
42
+ export interface DefaultFilePreviewDisplayText {
43
+ closeButtonLabel: string;
44
+ filePreviewTitle: string;
45
+ fileInformationTitle: string;
46
+ errorMessage: string;
47
+ sizeLimitMessage: string;
48
+ unsupportedFileMessage: string;
49
+ keyLabel: string;
50
+ sizeLabel: string;
51
+ versionIdLabel: string;
52
+ lastModifiedLabel: string;
53
+ entityTagLabel: string;
54
+ typeLabel: string;
55
+ unknownValue: string;
56
+ errorDescription: string;
57
+ unsupportedFileDescription: string;
58
+ imageLoadErrorDescription: string;
59
+ videoLoadErrorDescription: string;
60
+ textLoadErrorDescription: string;
61
+ generalPreviewErrorDescription: string;
62
+ fileSizeLimitDescription: string;
63
+ filePrefix: string;
64
+ retryButtonLabel: string;
65
+ downloadButtonLabel: string;
66
+ getTextErrorMessage: (error: string) => string;
67
+ emptyFileMessage: string;
68
+ }
42
69
  export interface DefaultLocationDetailViewDisplayText extends DefaultListViewDisplayText {
43
70
  getListItemsResultMessage: (data: ListItemsMessageData) => {
44
71
  content?: string;
@@ -53,6 +80,7 @@ export interface DefaultLocationDetailViewDisplayText extends DefaultListViewDis
53
80
  tableColumnTypeHeader: string;
54
81
  getActionListItemLabel: (key: string | undefined) => string;
55
82
  getTitle: (location: LocationState) => string;
83
+ filePreview: DefaultFilePreviewDisplayText;
56
84
  }
57
85
  /**
58
86
  * Action view display text values
@@ -149,7 +177,8 @@ export interface DownloadViewDisplayText extends Partial<DefaultDownloadViewDisp
149
177
  }
150
178
  export interface LocationsViewDisplayText extends Partial<DefaultLocationsViewDisplayText> {
151
179
  }
152
- export interface LocationDetailViewDisplayText extends Partial<DefaultLocationDetailViewDisplayText> {
180
+ export interface LocationDetailViewDisplayText extends Partial<Omit<DefaultLocationDetailViewDisplayText, 'filePreview'>> {
181
+ filePreview?: Partial<DefaultFilePreviewDisplayText>;
153
182
  }
154
183
  export interface UploadViewDisplayText extends Partial<DefaultUploadViewDisplayText> {
155
184
  }
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import type { FilePreview } from '../createStorageBrowser/types';
3
+ import type { FileData } from '../actions';
4
+ export declare const FilePreviewContext: React.Context<false | FilePreview | undefined>, useFilePreviewContext: (params?: {
5
+ errorMessage?: string | undefined;
6
+ } | undefined) => false | FilePreview | undefined;
7
+ export declare function FilePreviewProvider<TResolver extends ((properties: FileData) => unknown) | undefined>({ children, filePreview, }: {
8
+ children: React.ReactNode;
9
+ filePreview?: FilePreview<TResolver> | false;
10
+ }): React.JSX.Element;
@@ -0,0 +1 @@
1
+ export { FilePreviewProvider, useFilePreviewContext } from './context';
@@ -1,2 +1,8 @@
1
+ import type { StorageBrowserIconType } from '../../../components';
1
2
  import type { HeaderKeys } from './types';
2
3
  export declare const LOCATION_DETAIL_VIEW_HEADERS: HeaderKeys[];
4
+ export interface ThumbnailExtensionsMapping {
5
+ [key: string]: StorageBrowserIconType;
6
+ }
7
+ export declare const GENERIC_FILE_ICON = "file";
8
+ export declare const EXTENSION_THUMBNAIL_MAPPINGS: ThumbnailExtensionsMapping;
@@ -0,0 +1,2 @@
1
+ import type { StorageBrowserIconType } from '../../../components';
2
+ export declare function getFileThumbnail(fileKey?: string): StorageBrowserIconType;
@@ -1,6 +1,7 @@
1
1
  import type { LocationPermissions } from '../../../actions';
2
2
  import type { DataTableProps } from '../../../components';
3
- export declare const getFileRowContent: ({ permissions, isSelected, itemLocationKey, getDateDisplayValue, lastModified, rowId, rowKey, selectFileLabel, size, onDownload, onSelect, }: {
3
+ export declare const getFileRowContent: ({ filePreviewEnabled, permissions, isSelected, itemLocationKey, getDateDisplayValue, lastModified, rowId, rowKey, selectFileLabel, size, onDownload, onSelect, onClick, }: {
4
+ filePreviewEnabled: boolean;
4
5
  permissions: LocationPermissions;
5
6
  isSelected: boolean;
6
7
  itemLocationKey: string;
@@ -12,4 +13,5 @@ export declare const getFileRowContent: ({ permissions, isSelected, itemLocation
12
13
  size: number;
13
14
  onDownload: () => void;
14
15
  onSelect: () => void;
16
+ onClick: (() => void) | undefined;
15
17
  }) => DataTableProps['rows'][number]['content'];
@@ -1,8 +1,11 @@
1
- import type { FileData, FileDataItem, LocationItemData, LocationData } from '../../../actions';
1
+ import type { FileData, FileDataItem, LocationData, LocationItemData } from '../../../actions';
2
2
  import type { DataTableProps } from '../../../components';
3
3
  import type { DefaultLocationDetailViewDisplayText } from '../../../displayText/types';
4
4
  import type { LocationState } from '../../../store';
5
- export declare const getLocationDetailViewTableData: ({ areAllFilesSelected, displayText, location, fileDataItems, hasFiles, pageItems, selectFileLabel, selectAllFilesLabel, getDateDisplayValue, onDownload, onNavigate, onSelect, onSelectAll, }: {
5
+ export declare const getLocationDetailViewTableData: ({ filePreviewEnabled, activeFile, onSelectActiveFile, areAllFilesSelected, displayText, location, fileDataItems, hasFiles, pageItems, selectFileLabel, selectAllFilesLabel, getDateDisplayValue, onDownload, onNavigate, onSelect, onSelectAll, }: {
6
+ filePreviewEnabled: boolean;
7
+ activeFile: FileData | undefined;
8
+ onSelectActiveFile: (arg: FileData) => void;
6
9
  areAllFilesSelected: boolean;
7
10
  displayText: DefaultLocationDetailViewDisplayText;
8
11
  location: LocationState;
@@ -1,9 +1,14 @@
1
1
  import type { FileData, FileDataItem, LocationData, LocationItemData } from '../../actions';
2
2
  import type { ActionListItem } from '../../components/composables/ActionsList';
3
+ import type { FilePreviewProps } from '../../components/composables/FilePreview';
3
4
  import type { LocationState } from '../../store';
5
+ import type { FilePreviewState } from '../hooks/useFilePreview';
4
6
  import type { ListViewProps } from '../types';
5
7
  export interface LocationDetailViewState {
6
8
  actionItems: ActionListItem[];
9
+ activeFile: FileData | undefined;
10
+ activeFileHasNext: boolean;
11
+ activeFileHasPrev: boolean;
7
12
  actionType: string | undefined;
8
13
  downloadErrorMessage: string | undefined;
9
14
  fileDataItems: FileDataItem[] | undefined;
@@ -27,12 +32,16 @@ export interface LocationDetailViewState {
27
32
  onSearch: () => void;
28
33
  onSearchClear: () => void;
29
34
  onSearchQueryChange: (value: string) => void;
35
+ onRetryFilePreview: () => void;
30
36
  onSelect: (isSelected: boolean, fileItem: FileData) => void;
37
+ onSelectActiveFile: (file?: FileData | 'prev' | 'next') => void;
31
38
  onToggleSearchSubfolders: () => void;
32
39
  onToggleSelectAll: () => void;
33
40
  page: number;
34
41
  pageItems: LocationItemData[];
35
42
  searchQuery: string;
43
+ filePreviewState: FilePreviewState;
44
+ filePreviewEnabled: boolean;
36
45
  }
37
46
  export interface LocationDetailViewProps extends ListViewProps {
38
47
  onActionSelect?: (type: string) => void;
@@ -61,6 +70,7 @@ export interface LocationDetailViewType {
61
70
  Search: () => React.JSX.Element | null;
62
71
  SearchSubfoldersToggle: () => React.JSX.Element | null;
63
72
  Title: () => React.JSX.Element | null;
73
+ FilePreview: (props: FilePreviewProps) => React.JSX.Element | null;
64
74
  }
65
75
  interface InitialValues {
66
76
  pageSize?: number;
@@ -0,0 +1,2 @@
1
+ export * from './useFilePreview';
2
+ export * from './types';
@@ -0,0 +1,28 @@
1
+ import type { FileData } from '../../../actions';
2
+ export type OKFilePreviewContent = {
3
+ ok: true;
4
+ isLoading: false;
5
+ fileData: FileData;
6
+ url: string;
7
+ };
8
+ export type FailFilePreviewContent = {
9
+ isLoading: false;
10
+ ok: false;
11
+ error: string;
12
+ };
13
+ export type LoadingFilePreviewContent = {
14
+ isLoading: true;
15
+ };
16
+ export type FilePreviewContent = OKFilePreviewContent | FailFilePreviewContent | LoadingFilePreviewContent;
17
+ type DisabledFilePreviewState = {
18
+ enabled: false;
19
+ };
20
+ export type EnabledFilePreviewState = FilePreviewContent & {
21
+ enabled: true;
22
+ };
23
+ export type FilePreviewState = EnabledFilePreviewState | DisabledFilePreviewState;
24
+ export type UseFilePreviewState = FilePreviewState & {
25
+ optout: boolean;
26
+ handleRetry: () => void;
27
+ };
28
+ export {};
@@ -0,0 +1,5 @@
1
+ import type { FileData } from '../../../actions';
2
+ import type { UseFilePreviewState } from './types';
3
+ export declare function useFilePreview({ activeFile, }: {
4
+ activeFile?: FileData;
5
+ }): UseFilePreviewState;
@@ -0,0 +1,9 @@
1
+ import type { AllFileTypes, FilePreviewUrlOptions } from '../../../createStorageBrowser/types';
2
+ export interface FileTypeMapping {
3
+ [key: string]: AllFileTypes;
4
+ }
5
+ export declare const DEFAULT_URL_OPTIONS: FilePreviewUrlOptions;
6
+ export declare const DEFAULT_FILE_SIZE_LIMIT: number;
7
+ export declare const DEFAULT_FILE_SIZE_LIMITS: Record<AllFileTypes, number>;
8
+ export declare const GENERIC_CONTENT_TYPES: ReadonlySet<string>;
9
+ export declare const EXTENSION_MAPPINGS: FileTypeMapping;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Extracts the filename from a file key path
3
+ * @param fileKey - The full file key/path
4
+ * @returns The filename (last part after '/') or empty string if fileKey is null/undefined
5
+ */
6
+ export declare function getFileName(fileKey: string | null | undefined): string;
@@ -0,0 +1,2 @@
1
+ import type { AllFileTypes, FileSizeResolver } from '../../../createStorageBrowser/types';
2
+ export declare function resolveMaxFileSize(maxFileSize: number | FileSizeResolver | undefined, fileType: AllFileTypes | null): number;
@@ -0,0 +1,12 @@
1
+ import type { FileData } from '../../../actions';
2
+ import type { AllFileTypes } from '../../../createStorageBrowser/types';
3
+ export declare function isGenericContentType(contentType?: string): boolean;
4
+ export declare function getFileTypeFromContentType(contentType?: string): AllFileTypes | null;
5
+ interface DetermineFileTypeOptions {
6
+ fileTypeResolver?: (p: FileData) => AllFileTypes | undefined;
7
+ fileData: FileData;
8
+ }
9
+ export declare function getFileExtension(key?: string): string | null;
10
+ export declare function getFileTypeFromExtension(extension?: string | null): AllFileTypes | null;
11
+ export declare function determineFileType(options: DetermineFileTypeOptions): AllFileTypes | null;
12
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { GetPropertiesWithPathInput, GetPropertiesWithPathOutput } from 'aws-amplify/storage';
2
+ export declare function safeGetProperties(params: GetPropertiesWithPathInput): Promise<GetPropertiesWithPathOutput | {}>;
@@ -0,0 +1,2 @@
1
+ import type { AllFileTypes, FilePreviewUrlOptions, UrlOptionsResolver } from '../../../createStorageBrowser/types';
2
+ export declare function resolveUrlOptions(options: FilePreviewUrlOptions | UrlOptionsResolver | undefined, fileType: AllFileTypes | null): FilePreviewUrlOptions;
@@ -1 +1 @@
1
- export declare const VERSION = "3.12.2";
1
+ export declare const VERSION = "3.13.1";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws-amplify/ui-react-storage",
3
- "version": "3.12.2",
3
+ "version": "3.13.1",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/esm/index.mjs",
6
6
  "exports": {
@@ -45,9 +45,9 @@
45
45
  "typecheck": "tsc --noEmit"
46
46
  },
47
47
  "dependencies": {
48
- "@aws-amplify/ui": "6.11.0",
49
- "@aws-amplify/ui-react": "6.12.1",
50
- "@aws-amplify/ui-react-core": "3.4.4",
48
+ "@aws-amplify/ui": "6.12.1",
49
+ "@aws-amplify/ui-react": "6.13.1",
50
+ "@aws-amplify/ui-react-core": "3.4.6",
51
51
  "tslib": "^2.5.2"
52
52
  },
53
53
  "peerDependencies": {
@@ -66,7 +66,7 @@
66
66
  "name": "createStorageBrowser",
67
67
  "path": "dist/esm/browser.mjs",
68
68
  "import": "{ createStorageBrowser }",
69
- "limit": "64.6 kB",
69
+ "limit": "70 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": "88 kB"
78
+ "limit": "92 kB"
79
79
  },
80
80
  {
81
81
  "name": "FileUploader",