@astral/ui 4.55.1 → 4.55.3

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 (124) hide show
  1. package/components/ConfigProvider/ConfigProvider.d.ts +3 -2
  2. package/components/ConfigProvider/ConfigProvider.js +10 -4
  3. package/components/ErrorBoundary/ErrorBoundary.d.ts +2 -5
  4. package/components/ErrorBoundary/ErrorBoundary.js +9 -10
  5. package/components/ProductSwitcher/useLogic/useLogic.js +5 -4
  6. package/components/fileUploading/FileUploaderFile/Actions/useLogic/useLogic.js +6 -7
  7. package/components/fileUploading/PreviewFileUploader/PreviewFileUploader.d.ts +8 -1
  8. package/components/fileUploading/PreviewFileUploaderFile/FilePreview/useLogic/useLogic.js +8 -9
  9. package/components/fileUploading/hooks/useFileUploader/hooks/index.d.ts +1 -0
  10. package/components/fileUploading/hooks/useFileUploader/hooks/index.js +1 -0
  11. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/index.d.ts +1 -0
  12. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/index.js +1 -0
  13. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/usePrepareAccept.d.ts +2 -0
  14. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/usePrepareAccept.js +14 -0
  15. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/getAcceptMeta/getAcceptMeta.d.ts +5 -0
  16. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/getAcceptMeta/getAcceptMeta.js +23 -0
  17. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/getAcceptMeta/index.d.ts +1 -0
  18. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/getAcceptMeta/index.js +1 -0
  19. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/index.d.ts +2 -0
  20. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/index.js +2 -0
  21. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/validateAcceptMeta/index.d.ts +1 -0
  22. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/validateAcceptMeta/index.js +1 -0
  23. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/validateAcceptMeta/validateAcceptMeta.d.ts +2 -0
  24. package/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/validateAcceptMeta/validateAcceptMeta.js +10 -0
  25. package/components/fileUploading/hooks/useFileUploader/useFileUploader.js +3 -1
  26. package/components/fileUploading/hooks/usePreviewFileUploader/usePreviewFileUploader.d.ts +34 -120
  27. package/components/fileUploading/hooks/usePreviewFileUploader/usePreviewFileUploader.js +10 -137
  28. package/components/fileUploading/restrictions/restrictFileType/constants.d.ts +4 -0
  29. package/components/fileUploading/restrictions/restrictFileType/constants.js +4 -0
  30. package/components/fileUploading/restrictions/restrictFileType/restrictFileType.d.ts +2 -2
  31. package/components/fileUploading/restrictions/restrictFileType/restrictFileType.js +31 -55
  32. package/components/fileUploading/restrictions/restrictFileType/utils/getFileMeta/getFileMeta.d.ts +5 -0
  33. package/components/fileUploading/restrictions/restrictFileType/utils/getFileMeta/getFileMeta.js +21 -0
  34. package/components/fileUploading/restrictions/restrictFileType/utils/getFileMeta/index.d.ts +1 -0
  35. package/components/fileUploading/restrictions/restrictFileType/utils/getFileMeta/index.js +1 -0
  36. package/components/fileUploading/restrictions/restrictFileType/utils/index.d.ts +1 -2
  37. package/components/fileUploading/restrictions/restrictFileType/utils/index.js +1 -2
  38. package/components/fileUploading/services/MimeTypeRegistry/MimeTypeRegistry.d.ts +9 -0
  39. package/components/fileUploading/services/MimeTypeRegistry/MimeTypeRegistry.js +27 -0
  40. package/components/fileUploading/services/MimeTypeRegistry/constants.d.ts +1 -0
  41. package/components/fileUploading/services/MimeTypeRegistry/constants.js +343 -0
  42. package/components/fileUploading/services/MimeTypeRegistry/index.d.ts +1 -0
  43. package/components/fileUploading/services/MimeTypeRegistry/index.js +1 -0
  44. package/components/fileUploading/types.d.ts +10 -0
  45. package/components/fileUploading/utils/index.d.ts +1 -1
  46. package/components/fileUploading/utils/index.js +1 -1
  47. package/components/services/ErrorService/ErrorService.d.ts +29 -0
  48. package/components/services/ErrorService/ErrorService.js +36 -0
  49. package/components/services/ErrorService/index.d.ts +1 -0
  50. package/components/services/ErrorService/index.js +1 -0
  51. package/hook-form/useFormWizard/useFormWizard.js +7 -4
  52. package/node/components/ConfigProvider/ConfigProvider.d.ts +3 -2
  53. package/node/components/ConfigProvider/ConfigProvider.js +9 -3
  54. package/node/components/ErrorBoundary/ErrorBoundary.d.ts +2 -5
  55. package/node/components/ErrorBoundary/ErrorBoundary.js +9 -10
  56. package/node/components/ProductSwitcher/useLogic/useLogic.js +4 -3
  57. package/node/components/fileUploading/FileUploaderFile/Actions/useLogic/useLogic.js +6 -7
  58. package/node/components/fileUploading/PreviewFileUploader/PreviewFileUploader.d.ts +8 -1
  59. package/node/components/fileUploading/PreviewFileUploaderFile/FilePreview/useLogic/useLogic.js +8 -9
  60. package/node/components/fileUploading/hooks/useFileUploader/hooks/index.d.ts +1 -0
  61. package/node/components/fileUploading/{restrictions/restrictFileType/utils/getFileTypeFromName → hooks/useFileUploader/hooks}/index.js +1 -1
  62. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/index.d.ts +1 -0
  63. package/node/components/fileUploading/{restrictions/restrictFileType/utils/getFileTypeFromFile → hooks/useFileUploader/hooks/usePrepareAccept}/index.js +1 -1
  64. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/usePrepareAccept.d.ts +2 -0
  65. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/usePrepareAccept.js +18 -0
  66. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/getAcceptMeta/getAcceptMeta.d.ts +5 -0
  67. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/getAcceptMeta/getAcceptMeta.js +27 -0
  68. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/getAcceptMeta/index.d.ts +1 -0
  69. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/getAcceptMeta/index.js +17 -0
  70. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/index.d.ts +2 -0
  71. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/index.js +18 -0
  72. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/validateAcceptMeta/index.d.ts +1 -0
  73. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/validateAcceptMeta/index.js +17 -0
  74. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/validateAcceptMeta/validateAcceptMeta.d.ts +2 -0
  75. package/node/components/fileUploading/hooks/useFileUploader/hooks/usePrepareAccept/utils/validateAcceptMeta/validateAcceptMeta.js +14 -0
  76. package/node/components/fileUploading/hooks/useFileUploader/useFileUploader.js +3 -1
  77. package/node/components/fileUploading/hooks/usePreviewFileUploader/usePreviewFileUploader.d.ts +34 -120
  78. package/node/components/fileUploading/hooks/usePreviewFileUploader/usePreviewFileUploader.js +9 -136
  79. package/node/components/fileUploading/restrictions/restrictFileType/constants.d.ts +4 -0
  80. package/node/components/fileUploading/restrictions/restrictFileType/constants.js +5 -1
  81. package/node/components/fileUploading/restrictions/restrictFileType/restrictFileType.d.ts +2 -2
  82. package/node/components/fileUploading/restrictions/restrictFileType/restrictFileType.js +29 -53
  83. package/node/components/fileUploading/restrictions/restrictFileType/utils/getFileMeta/getFileMeta.d.ts +5 -0
  84. package/node/components/fileUploading/restrictions/restrictFileType/utils/getFileMeta/getFileMeta.js +25 -0
  85. package/node/components/fileUploading/restrictions/restrictFileType/utils/getFileMeta/index.d.ts +1 -0
  86. package/node/components/fileUploading/restrictions/restrictFileType/utils/{prepareType → getFileMeta}/index.js +1 -1
  87. package/node/components/fileUploading/restrictions/restrictFileType/utils/index.d.ts +1 -2
  88. package/node/components/fileUploading/restrictions/restrictFileType/utils/index.js +1 -2
  89. package/node/components/fileUploading/services/MimeTypeRegistry/MimeTypeRegistry.d.ts +9 -0
  90. package/node/components/fileUploading/services/MimeTypeRegistry/MimeTypeRegistry.js +31 -0
  91. package/node/components/fileUploading/services/MimeTypeRegistry/constants.d.ts +1 -0
  92. package/node/components/fileUploading/services/MimeTypeRegistry/constants.js +347 -0
  93. package/node/components/fileUploading/services/MimeTypeRegistry/index.d.ts +1 -0
  94. package/node/components/fileUploading/services/MimeTypeRegistry/index.js +17 -0
  95. package/node/components/fileUploading/types.d.ts +10 -0
  96. package/node/components/fileUploading/utils/index.d.ts +1 -1
  97. package/node/components/fileUploading/utils/index.js +16 -3
  98. package/node/components/services/ErrorService/ErrorService.d.ts +29 -0
  99. package/node/components/services/ErrorService/ErrorService.js +40 -0
  100. package/node/components/services/ErrorService/index.d.ts +1 -0
  101. package/node/components/services/ErrorService/index.js +17 -0
  102. package/node/hook-form/useFormWizard/useFormWizard.js +6 -3
  103. package/package.json +1 -1
  104. package/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromFile/getFileTypeFromFile.d.ts +0 -4
  105. package/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromFile/getFileTypeFromFile.js +0 -10
  106. package/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromFile/index.d.ts +0 -1
  107. package/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromFile/index.js +0 -1
  108. package/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromName/getFileTypeFromName.d.ts +0 -4
  109. package/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromName/getFileTypeFromName.js +0 -13
  110. package/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromName/index.d.ts +0 -1
  111. package/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromName/index.js +0 -1
  112. package/components/fileUploading/restrictions/restrictFileType/utils/prepareType/index.d.ts +0 -1
  113. package/components/fileUploading/restrictions/restrictFileType/utils/prepareType/index.js +0 -1
  114. package/components/fileUploading/restrictions/restrictFileType/utils/prepareType/prepareType.d.ts +0 -5
  115. package/components/fileUploading/restrictions/restrictFileType/utils/prepareType/prepareType.js +0 -5
  116. package/node/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromFile/getFileTypeFromFile.d.ts +0 -4
  117. package/node/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromFile/getFileTypeFromFile.js +0 -14
  118. package/node/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromFile/index.d.ts +0 -1
  119. package/node/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromName/getFileTypeFromName.d.ts +0 -4
  120. package/node/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromName/getFileTypeFromName.js +0 -17
  121. package/node/components/fileUploading/restrictions/restrictFileType/utils/getFileTypeFromName/index.d.ts +0 -1
  122. package/node/components/fileUploading/restrictions/restrictFileType/utils/prepareType/index.d.ts +0 -1
  123. package/node/components/fileUploading/restrictions/restrictFileType/utils/prepareType/prepareType.d.ts +0 -5
  124. package/node/components/fileUploading/restrictions/restrictFileType/utils/prepareType/prepareType.js +0 -9
@@ -1,6 +1,7 @@
1
1
  import { type ReactElement, type ReactNode } from 'react';
2
2
  import { type LanguageMap } from '../DatePicker/types';
3
3
  import { type PlaceholderImageProps } from '../placeholders/Placeholder/Image';
4
+ import { type CaptureException } from '../services/ErrorService';
4
5
  import { type NextFeatureFlagsContextProps } from './NextFeatureFlagsContext';
5
6
  type Language = 'ru';
6
7
  type ImagesMap = {
@@ -45,7 +46,7 @@ export type ConfigContextProps = {
45
46
  * @default russianMap
46
47
  */
47
48
  datePickerLanguageMap: LanguageMap;
48
- captureException: (error: any) => void;
49
+ captureException: CaptureException;
49
50
  /**
50
51
  * Карта для типовых изображений.
51
52
  * Используется в компонентах ui-kit, где требуется отображение декоративных
@@ -139,5 +140,5 @@ export type ConfigProviderProps = Partial<ConfigContextProps> & {
139
140
  nextFeatureFlags?: NextFeatureFlagsContextProps;
140
141
  };
141
142
  export declare const ConfigContext: import("react").Context<ConfigContextProps>;
142
- export declare const ConfigProvider: ({ children, language, datePickerLanguageMap, captureException, emptySymbol, imagesMap, techSup, hidePersonalData, hidePersonalDataClassname, hidePersonalInputDataClassname, components: propsComponents, nextFeatureFlags, }: Partial<ConfigProviderProps>) => import("react/jsx-runtime").JSX.Element;
143
+ export declare const ConfigProvider: ({ children, language, datePickerLanguageMap, captureException: captureExceptionProp, emptySymbol, imagesMap, techSup, hidePersonalData, hidePersonalDataClassname, hidePersonalInputDataClassname, components: propsComponents, nextFeatureFlags, }: Partial<ConfigProviderProps>) => import("react/jsx-runtime").JSX.Element;
143
144
  export {};
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { createContext, useEffect, } from 'react';
2
+ import { createContext, useEffect, useMemo, } from 'react';
3
3
  import { russianMap } from '../DatePicker/constants';
4
+ import { ErrorService } from '../services/ErrorService';
4
5
  import { NextFeatureFlagsContext, } from './NextFeatureFlagsContext';
5
6
  const imagesMapDefault = {
6
7
  noDataImgSrc: '',
@@ -26,7 +27,13 @@ export const ConfigContext = createContext({
26
27
  hidePersonalInputDataClassname: defaultHidePersonalInputDataClassname,
27
28
  hidePersonalData: true,
28
29
  });
29
- export const ConfigProvider = ({ children, language = 'ru', datePickerLanguageMap = russianMap, captureException, emptySymbol = '—', imagesMap = imagesMapDefault, techSup = techSupDefault, hidePersonalData = true, hidePersonalDataClassname = defaultHidePersonalDataClassname, hidePersonalInputDataClassname = defaultHidePersonalInputDataClassname, components: propsComponents, nextFeatureFlags = {}, }) => {
30
+ export const ConfigProvider = ({ children, language = 'ru', datePickerLanguageMap = russianMap, captureException: captureExceptionProp, emptySymbol = '—', imagesMap = imagesMapDefault, techSup = techSupDefault, hidePersonalData = true, hidePersonalDataClassname = defaultHidePersonalDataClassname, hidePersonalInputDataClassname = defaultHidePersonalInputDataClassname, components: propsComponents, nextFeatureFlags = {}, }) => {
31
+ const captureException =
32
+ // biome-ignore lint/suspicious/noConsole: Ошибка для интеграторов
33
+ captureExceptionProp || ((error) => console.error(error));
34
+ useMemo(() => {
35
+ ErrorService.getInstance().init(captureException);
36
+ }, [captureException]);
30
37
  useEffect(() => {
31
38
  if (!captureException) {
32
39
  // biome-ignore lint/suspicious/noConsole: Ошибка для интеграторов
@@ -55,8 +62,7 @@ export const ConfigProvider = ({ children, language = 'ru', datePickerLanguageMa
55
62
  return (_jsx(ConfigContext.Provider, { value: {
56
63
  language,
57
64
  datePickerLanguageMap,
58
- // biome-ignore lint/suspicious/noConsole: Ошибка для интеграторов
59
- captureException: captureException || ((error) => console.error(error)),
65
+ captureException,
60
66
  emptySymbol,
61
67
  imagesMap,
62
68
  techSup,
@@ -1,5 +1,4 @@
1
1
  import React, { type ReactNode } from 'react';
2
- import { ConfigContext } from '../ConfigProvider';
3
2
  import { ErrorBoundaryTypeError } from './enums';
4
3
  export type State = {
5
4
  /**
@@ -23,14 +22,12 @@ type Props = {
23
22
  * @example <ErrorBoundary><InsecureComponent/></ErrorBoundary>
24
23
  */
25
24
  declare class ErrorBoundary extends React.Component<Props, State> {
26
- static contextType: React.Context<import("../ConfigProvider").ConfigContextProps>;
27
- context: React.ContextType<typeof ConfigContext>;
28
25
  state: State;
26
+ componentDidCatch(error: Error): void;
27
+ render(): React.ReactNode;
29
28
  static getDerivedStateFromError(error: Error): {
30
29
  hasError: boolean;
31
30
  typeError: ErrorBoundaryTypeError;
32
31
  };
33
- componentDidCatch(error: Error): void;
34
- render(): React.ReactNode;
35
32
  }
36
33
  export { ErrorBoundary };
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import React from 'react';
3
- import { ConfigContext } from '../ConfigProvider';
4
3
  import { InternalErrorPlaceholder } from '../placeholders/InternalErrorPlaceholder';
5
4
  import { OutdatedReleasePlaceholder } from '../placeholders/OutdatedReleasePlaceholder';
5
+ import { ErrorService } from '../services/ErrorService';
6
6
  import { CONDITION_TYPE_ERROR } from './constants';
7
7
  import { ErrorBoundaryTypeError } from './enums';
8
8
  /**
@@ -25,15 +25,8 @@ class ErrorBoundary extends React.Component {
25
25
  typeError: ErrorBoundaryTypeError.Default,
26
26
  };
27
27
  }
28
- static getDerivedStateFromError(error) {
29
- return {
30
- hasError: true,
31
- typeError: CONDITION_TYPE_ERROR.find(({ condition }) => condition(error))?.type ??
32
- ErrorBoundaryTypeError.Default,
33
- };
34
- }
35
28
  componentDidCatch(error) {
36
- this.context.captureException(error);
29
+ ErrorService.getInstance().captureException(error);
37
30
  }
38
31
  render() {
39
32
  if (this.state.hasError) {
@@ -41,6 +34,12 @@ class ErrorBoundary extends React.Component {
41
34
  }
42
35
  return this.props.children;
43
36
  }
37
+ static getDerivedStateFromError(error) {
38
+ return {
39
+ hasError: true,
40
+ typeError: CONDITION_TYPE_ERROR.find(({ condition }) => condition(error))?.type ??
41
+ ErrorBoundaryTypeError.Default,
42
+ };
43
+ }
44
44
  }
45
- ErrorBoundary.contextType = ConfigContext;
46
45
  export { ErrorBoundary };
@@ -1,11 +1,10 @@
1
- import { useContext, useState } from 'react';
2
- import { ConfigContext } from '../../ConfigProvider';
1
+ import { useState } from 'react';
2
+ import { ErrorService } from '../../services/ErrorService';
3
3
  import { useMenu } from '../../useMenu';
4
4
  export const useLogic = ({ getProducts, filter }) => {
5
5
  const [products, setProducts] = useState([]);
6
6
  const [isLoading, setIsLoading] = useState(false);
7
7
  const [isError, setIsError] = useState(false);
8
- const { captureException } = useContext(ConfigContext);
9
8
  const { open, anchorRef, handleOpenMenu, handleCloseMenu } = useMenu();
10
9
  const filterProductList = (productList) => {
11
10
  const { hostname } = new URL(window.origin);
@@ -32,7 +31,9 @@ export const useLogic = ({ getProducts, filter }) => {
32
31
  }
33
32
  catch (error) {
34
33
  setIsError(true);
35
- captureException(error);
34
+ ErrorService.getInstance().captureException(error, {
35
+ place: 'ProductSwitcher',
36
+ });
36
37
  }
37
38
  finally {
38
39
  setIsLoading(false);
@@ -1,11 +1,9 @@
1
- import { getFileExtension } from '@astral/utils/file/getFileExtension';
2
- import { useContext } from 'react';
3
- import { ConfigContext } from '../../../../ConfigProvider';
1
+ import { ErrorService } from '../../../../services/ErrorService';
4
2
  import { ABORT_ERROR_MESSAGE, EXTENSIONS_IN_NEW_TAB, VIEW_NEW_TAB_ERROR_MESSAGE, } from '../../../constants';
5
3
  import { useGenerateLocalFileURL } from '../../../hooks/useGenerateLocalFileURL';
4
+ import { MimeTypeRegistry } from '../../../services/MimeTypeRegistry';
6
5
  import { generateAttrLinkNewTab } from '../../../utils/generateAttrLinkNewTab';
7
6
  export const useLogic = ({ fileId, file, fileUrl, isUploadError, generateDownloadLink, onDelete, onRetry, onView, setErrorStatusFile, selfFiles, isLoading, isError, isDeletingFile, fileName, }) => {
8
- const { captureException } = useContext(ConfigContext);
9
7
  const { generateUrl } = useGenerateLocalFileURL();
10
8
  const { controller } = selfFiles[fileId] || {};
11
9
  const isVisibleAbortButton = Boolean(controller);
@@ -42,8 +40,9 @@ export const useLogic = ({ fileId, file, fileUrl, isUploadError, generateDownloa
42
40
  if (onView) {
43
41
  return { isShowViewButton: true, onClick: handleView };
44
42
  }
45
- const extension = file && getFileExtension(file?.type);
46
- if (checkIsAcceptedExtension(extension)) {
43
+ const extensions = file &&
44
+ MimeTypeRegistry.getInstance().getExtensionsByMimeType(file?.type);
45
+ if (checkIsAcceptedExtension(extensions)) {
47
46
  return {
48
47
  isShowViewButton: true,
49
48
  ...generateAttrLinkNewTab(downloadLink),
@@ -54,7 +53,7 @@ export const useLogic = ({ fileId, file, fileUrl, isUploadError, generateDownloa
54
53
  onClick: () => {
55
54
  // biome-ignore lint/suspicious/noConsole: Ошибка для интеграторов
56
55
  console.warn(VIEW_NEW_TAB_ERROR_MESSAGE);
57
- captureException(`FileId: ${fileId}: ${VIEW_NEW_TAB_ERROR_MESSAGE}`);
56
+ ErrorService.getInstance().captureCustomError('FileUploader', `FileId: ${fileId}: ${VIEW_NEW_TAB_ERROR_MESSAGE}`);
58
57
  },
59
58
  };
60
59
  };
@@ -1,4 +1,11 @@
1
1
  /// <reference types="react" />
2
2
  import { type UsePreviewFileUploaderParams } from '../hooks/usePreviewFileUploader';
3
3
  export type PreviewFileUploaderProps = UsePreviewFileUploaderParams;
4
- export declare const PreviewFileUploader: import("react").ForwardRefExoticComponent<UsePreviewFileUploaderParams & import("react").RefAttributes<HTMLDivElement>>;
4
+ export declare const PreviewFileUploader: import("react").ForwardRefExoticComponent<Pick<import("../types").FileUploaderProps, "className" | "label" | "name" | "placeholder" | "isDisabled" | "isError" | "inputRef" | "helperText" | "maxFileSize" | "onUploadFile" | "getErrorMessage" | "restrictions" | "notify" | "onDeleteFile" | "onView" | "generateDownloadLink"> & {
5
+ value: import("../types").UploadFile | null | undefined;
6
+ accept?: string[] | undefined;
7
+ placeholderImgSrc?: string | undefined;
8
+ isHidePersonalData?: boolean | undefined;
9
+ PdfViewer?: import("react").LazyExoticComponent<(props: import("../../PdfViewer").PdfViewerProps) => import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>> | ((props: import("../../PdfViewer").PdfViewerProps) => import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>) | undefined;
10
+ onChange: (value: import("../types").UploadFile | null) => void;
11
+ } & import("react").RefAttributes<HTMLDivElement>>;
@@ -1,14 +1,13 @@
1
- import { getFileExtension } from '@astral/utils/file/getFileExtension';
2
- import { useContext } from 'react';
3
- import { ConfigContext } from '../../../../ConfigProvider';
1
+ import { ErrorService } from '../../../../services/ErrorService';
4
2
  import { EXTENSIONS_IN_NEW_TAB, VIEW_NEW_TAB_ERROR_MESSAGE, } from '../../../constants';
5
3
  import { useGenerateLocalFileURL } from '../../../hooks/useGenerateLocalFileURL';
4
+ import { MimeTypeRegistry } from '../../../services/MimeTypeRegistry';
6
5
  import { generateAttrLinkNewTab } from '../../../utils/generateAttrLinkNewTab';
7
6
  export const useLogic = ({ fileId, file, fileUrl, generateDownloadLink, onDelete, onView, fileType, }) => {
8
- const { captureException } = useContext(ConfigContext);
9
7
  const { generateUrl } = useGenerateLocalFileURL();
10
- const extensionFile = getFileExtension((file?.type || fileType));
11
- const isPdfFile = Object.is(extensionFile, 'pdf');
8
+ const isPdfFile = MimeTypeRegistry.getInstance()
9
+ .getExtensionsByMimeType((file?.type || fileType))
10
+ ?.includes('pdf') || false;
12
11
  const isImageFile = fileType.includes('image/');
13
12
  const isOtherFile = !isImageFile && !isPdfFile;
14
13
  const getDownloadLink = () => {
@@ -39,15 +38,15 @@ export const useLogic = ({ fileId, file, fileUrl, generateDownloadLink, onDelete
39
38
  if (onView) {
40
39
  return { onClick: handleView };
41
40
  }
42
- const extension = getFileExtension((file?.type || fileType));
43
- if (checkIsAcceptedExtension(extension)) {
41
+ const extensions = MimeTypeRegistry.getInstance().getExtensionsByMimeType((file?.type || fileType));
42
+ if (checkIsAcceptedExtension(extensions)) {
44
43
  return generateAttrLinkNewTab(downloadLink);
45
44
  }
46
45
  return {
47
46
  onClick: () => {
48
47
  // biome-ignore lint/suspicious/noConsole: Ошибка для интеграторов
49
48
  console.warn(VIEW_NEW_TAB_ERROR_MESSAGE);
50
- captureException(`FileId: ${fileId}: ${VIEW_NEW_TAB_ERROR_MESSAGE}`);
49
+ ErrorService.getInstance().captureCustomError('PreviewFileUploader', `FileId: ${fileId}: ${VIEW_NEW_TAB_ERROR_MESSAGE}`);
51
50
  },
52
51
  };
53
52
  };
@@ -0,0 +1 @@
1
+ export * from './usePrepareAccept';
@@ -0,0 +1 @@
1
+ export * from './usePrepareAccept';
@@ -0,0 +1 @@
1
+ export * from './usePrepareAccept';
@@ -0,0 +1 @@
1
+ export * from './usePrepareAccept';
@@ -0,0 +1,2 @@
1
+ import type { AcceptMeta } from '../../../../types';
2
+ export declare const usePrepareAccept: (accept: string[]) => AcceptMeta;
@@ -0,0 +1,14 @@
1
+ import { useEffect, useMemo } from 'react';
2
+ import { ErrorService } from '../../../../../services/ErrorService';
3
+ import { getAcceptMeta, validateAcceptMeta } from './utils';
4
+ export const usePrepareAccept = (accept) => {
5
+ const meta = useMemo(() => getAcceptMeta(accept), [accept]);
6
+ useEffect(() => {
7
+ const error = validateAcceptMeta(meta);
8
+ if (error) {
9
+ const errorService = ErrorService.getInstance();
10
+ errorService.logError('FileUploader', error);
11
+ }
12
+ }, [meta]);
13
+ return meta;
14
+ };
@@ -0,0 +1,5 @@
1
+ import type { AcceptMeta } from '../../../../../../types';
2
+ /**
3
+ * Парсит массив accept строк и возвращает мета-информацию о разрешенных типах файлов.
4
+ */
5
+ export declare const getAcceptMeta: (accept: string[]) => AcceptMeta;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Парсит массив accept строк и возвращает мета-информацию о разрешенных типах файлов.
3
+ */
4
+ export const getAcceptMeta = (accept) => accept.reduce((result, acceptString) => {
5
+ if (acceptString.includes('/')) {
6
+ result.isOnlyExtensions = false;
7
+ if (acceptString.endsWith('/*')) {
8
+ result.generalMimeTypes.push(acceptString);
9
+ }
10
+ else {
11
+ result.mimeTypes.push(acceptString);
12
+ }
13
+ }
14
+ if (!acceptString.includes('/') && acceptString.includes('.')) {
15
+ result.extensions.push(acceptString.replace('.', ''));
16
+ }
17
+ return result;
18
+ }, {
19
+ extensions: [],
20
+ mimeTypes: [],
21
+ generalMimeTypes: [],
22
+ isOnlyExtensions: true,
23
+ });
@@ -0,0 +1,2 @@
1
+ export * from './getAcceptMeta';
2
+ export * from './validateAcceptMeta';
@@ -0,0 +1,2 @@
1
+ export * from './getAcceptMeta';
2
+ export * from './validateAcceptMeta';
@@ -0,0 +1,2 @@
1
+ import { type AcceptMeta } from '../../../../../../types';
2
+ export declare const validateAcceptMeta: (meta: AcceptMeta) => null | string;
@@ -0,0 +1,10 @@
1
+ import { MimeTypeRegistry } from '../../../../../../services/MimeTypeRegistry';
2
+ export const validateAcceptMeta = (meta) => {
3
+ let result = null;
4
+ const mimeTypeRegistry = MimeTypeRegistry.getInstance();
5
+ const unsupportedExtensions = meta.extensions.filter((extension) => !mimeTypeRegistry.getMimeTypeByExtension(extension));
6
+ if (unsupportedExtensions.length) {
7
+ result = `В accept переданы неподдерживаемые расширения: ${unsupportedExtensions.join(', ')}`;
8
+ }
9
+ return result;
10
+ };
@@ -10,11 +10,13 @@ import { rulePipe } from '../../utils/rulePipe';
10
10
  import { toArray } from '../../utils/toArray';
11
11
  import { useDnD } from '../useDnD';
12
12
  import { useUploadFiles } from '../useUploadFiles';
13
+ import { usePrepareAccept } from './hooks';
13
14
  export const useFileUploader = ({ value, isDisabled, isMultiple, accept, restrictions = [], maxFileSize, maxFileCount = 1, // для случая, когда isMultiple=false
14
15
  inputRef, notify, onChange, onUploadFile, onDeleteFile, name, isError, onView, generateDownloadLink, placeholder, helperText, label, className, getErrorMessage, }) => {
15
16
  const inputId = useId();
16
17
  const [deletingFileId, setDeletingFileId] = useState(null);
17
18
  const { generateId } = useGenerateLocalId();
19
+ const acceptMeta = usePrepareAccept(accept);
18
20
  // Преобразуем value к массиву
19
21
  const files = useMemo(() => toArray(value), [value]);
20
22
  // true, если достигли лимита по кол-ву файлов при isMultiple=true
@@ -22,7 +24,7 @@ inputRef, notify, onChange, onUploadFile, onDeleteFile, name, isError, onView, g
22
24
  const isVisibleAddFile = isMultiple ? !isLimitMaxFileCount : !files.length;
23
25
  const isVisibleFileList = Boolean(files.length);
24
26
  const restrict = (file) => {
25
- return rulePipe(restrictFileMaxSize(formatFileSizeToView, maxFileSize), restrictFileType(accept), ...restrictions)(file);
27
+ return rulePipe(restrictFileMaxSize(formatFileSizeToView, maxFileSize), restrictFileType(acceptMeta), ...restrictions)(file);
26
28
  };
27
29
  const declensionFile = declensionOfWords(['файл', 'файла', 'файлов']);
28
30
  const declensionAdded = declensionOfWords([
@@ -1,20 +1,11 @@
1
- import { type ChangeEvent, type LazyExoticComponent, type ReactElement, type ReactNode, type RefObject } from 'react';
1
+ import { type LazyExoticComponent, type ReactElement } from 'react';
2
2
  import { type PdfViewerProps } from '../../../PdfViewer';
3
- import { type FileId, type FileUploaderNotify, type RestrictionFn, type UploadedFileData, type UploadFile } from '../../FileUploader';
4
- export type UsePreviewFileUploaderParams = {
5
- value: UploadFile | null | undefined;
6
- /**
7
- * Название класса, применяется к корневому компоненту
8
- */
9
- className?: string;
10
- /**
11
- * Название поля
12
- */
13
- name?: string;
3
+ import { type FileUploaderProps, type UploadFile } from '../../FileUploader';
4
+ export type UsePreviewFileUploaderParams = Pick<FileUploaderProps, 'className' | 'name' | 'label' | 'maxFileSize' | 'isDisabled' | 'isError' | 'helperText' | 'restrictions' | 'placeholder' | 'inputRef' | 'notify' | 'generateDownloadLink' | 'onUploadFile' | 'onDeleteFile' | 'onView' | 'getErrorMessage'> & {
14
5
  /**
15
- * Название поля
6
+ * Значение
16
7
  */
17
- label?: string;
8
+ value: UploadFile | null | undefined;
18
9
  /**
19
10
  * Массив разрешенных расширений файлов и MIME-типов
20
11
  *
@@ -29,87 +20,18 @@ export type UsePreviewFileUploaderParams = {
29
20
  * accept={['.jpg', 'image/png', 'application/pdf']}
30
21
  */
31
22
  accept?: string[];
32
- /**
33
- * Максимальный размер файла в байтах
34
- */
35
- maxFileSize: number;
36
- /**
37
- * Если true, компонент будет недоступен для взаимодействия
38
- */
39
- isDisabled?: boolean;
40
- /**
41
- * Флаг состояния ошибки
42
- */
43
- isError?: boolean;
44
- /**
45
- * Вспомогательный текст
46
- */
47
- helperText?: ReactNode;
48
- /**
49
- * Массив функций для дополнительной валидации файлов, применяется к каждому файлу
50
- */
51
- restrictions?: RestrictionFn[];
52
- /**
53
- * Вспомогательный текст
54
- */
55
- placeholder?: string;
56
23
  /**
57
24
  * Кастомное изображение для placeholder. Дефолтное берется из configProvider, если было прокинуто
58
25
  */
59
26
  placeholderImgSrc?: string;
60
27
  /**
61
- * Реф для доступа к input элементу
62
- */
63
- inputRef?: RefObject<HTMLInputElement>;
64
- /**
65
- * Объект с методами для отображения уведомлений
66
- * @remarks
67
- * Используется для показа системных уведомлений при загрузке файлов
68
- */
69
- notify: FileUploaderNotify;
70
- /**
71
- * Функция для генерации ссылки на скачивание/просмотр файла
72
- * @param fileId - Идентификатор файла
73
- * @param file - Объект файла
74
- * @param fileUrl - URL файла, если он уже загружен
75
- * @returns Строка с URL для скачивания/просмотра файла
76
- * @example
77
- * generateDownloadLink: (fileId, file, fileUrl) => {
78
- * return fileUrl || `/api/files/${fileId}`;
79
- * }
80
- */
81
- generateDownloadLink?: (fileId: FileId, file?: File, fileUrl?: string) => string;
82
- /**
83
- * Функция загрузки файлов на сервер
84
- * @param fileId - Идентификатор файла
85
- * @param file - Объект файла для загрузки
86
- * @param options - Опции для управления загрузкой
87
- * @param options.signal - AbortSignal для отмены загрузки файла
88
- * @param options.setProgress - Функция для обновления прогресса загрузки
89
- * @returns Promise с данными загруженного файла
90
- */
91
- onUploadFile?: (fileId: FileId, file: File, options: {
92
- signal: AbortSignal;
93
- setProgress: (progressFileId: FileId, progressEvent: ProgressEvent) => void;
94
- }) => Promise<UploadedFileData>;
95
- /**
96
- * Обработчик просмотра файла
97
- * @param fileId - Идентификатор файла
98
- * @param file - Объект файла
99
- * @param fileUrl - URL файла, если он уже загружен
100
- * @remarks
101
- * Если указан generateDownloadLink, то onView не нужен.
102
- * Используется если необходимо переопределить стандартное поведение с просмотром в новой вкладке
103
- * @example
104
- * onView: (fileId, file, fileUrl) => {
105
- * openFileInModal({ fileId, file fileUrl });
106
- * }
28
+ * Скрытие персональных данных от инструментов мониторинга
107
29
  */
108
- onView?: (fileId: FileId, file?: File, fileUrl?: string) => void;
30
+ isHidePersonalData?: boolean;
109
31
  /**
110
- * Функция, позволяющая задавать кастомный текст ошибки
32
+ * Компонент для отображения превью pdf-файлов
111
33
  */
112
- getErrorMessage?: (fileId: FileId, error: Error) => string;
34
+ PdfViewer?: ((props: PdfViewerProps) => ReactElement) | LazyExoticComponent<(props: PdfViewerProps) => ReactElement>;
113
35
  /**
114
36
  * Функция, вызываемая при изменении списка файлов (добавление/удаление)
115
37
  * @param value - Объект загруженного файла или null при удалении
@@ -121,41 +43,32 @@ export type UsePreviewFileUploaderParams = {
121
43
  * - При обновлении информации о файле после успешной загрузки
122
44
  */
123
45
  onChange: (value: UploadFile | null) => void;
124
- /**
125
- * Функция, вызываемая при удалении файла.
126
- * Используется для сбора идентификаторов файлов, помеченных на удаление.
127
- * Фактическое удаление файлов с сервера должно выполняться только при подтверждении формы,
128
- * чтобы избежать потери данных при отмене действия или перезагрузке страницы.
129
- */
130
- onDeleteFile?: (fileId: FileId) => Promise<void>;
131
- /**
132
- * Скрытие персональных данных от инструментов мониторинга
133
- */
134
- isHidePersonalData?: boolean;
135
- /**
136
- * Компонент для отображения превью pdf-файлов
137
- */
138
- PdfViewer?: ((props: PdfViewerProps) => ReactElement) | LazyExoticComponent<(props: PdfViewerProps) => ReactElement>;
139
46
  };
140
- export declare const usePreviewFileUploader: ({ value, isDisabled, accept, restrictions, maxFileSize, inputRef, notify, onChange, onUploadFile, onDeleteFile, label, isError, generateDownloadLink, onView, getErrorMessage, name, helperText, className, placeholder, placeholderImgSrc, isHidePersonalData, PdfViewer, }: UsePreviewFileUploaderParams) => {
47
+ export declare const usePreviewFileUploader: ({ placeholderImgSrc, isHidePersonalData, PdfViewer, accept, ...props }: UsePreviewFileUploaderParams) => {
141
48
  dropZoneProps: {
49
+ className: string;
50
+ hintPlaceholderProps: {
51
+ placeholderImgSrc: string | undefined;
52
+ isMultiple: boolean | undefined;
53
+ accept: string[];
54
+ maxFileCount: number;
55
+ maxFileSize: number;
56
+ placeholder: string | undefined;
57
+ };
58
+ isLimitMaxFileCount: boolean;
59
+ maxFileCount: number;
142
60
  isVisibleAddFile: boolean;
143
61
  isVisibleFileList: boolean;
144
62
  fileInputProps: {
145
63
  id: string | undefined;
146
64
  accept: string;
147
- ref: RefObject<HTMLInputElement> | undefined;
65
+ ref: import("react").RefObject<HTMLInputElement> | undefined;
148
66
  value: string;
149
- onChange: (event: ChangeEvent<HTMLInputElement>) => void;
67
+ onChange: (event: import("react").ChangeEvent<HTMLInputElement, Element>) => void;
150
68
  name: string | undefined;
69
+ isMultiple: boolean | undefined;
151
70
  isDisabled: boolean | undefined;
152
71
  };
153
- hintPlaceholderProps: {
154
- accept: string[] | undefined;
155
- placeholder: string | undefined;
156
- placeholderImgSrc: string | undefined;
157
- maxFileSize: number;
158
- };
159
72
  uploadButtonProps: {
160
73
  isDisabled: boolean | undefined;
161
74
  htmlFor: string | undefined;
@@ -164,27 +77,28 @@ export declare const usePreviewFileUploader: ({ value, isDisabled, accept, restr
164
77
  className: string | undefined;
165
78
  label: string | undefined;
166
79
  isError: boolean | undefined;
167
- helperText: ReactNode;
80
+ helperText: import("react").ReactNode;
168
81
  };
169
82
  onDragLeave: (event: import("react").DragEvent<HTMLElement>) => void;
170
83
  onDragOver: (event: import("react").DragEvent<HTMLElement>) => void;
171
84
  onDrop: (event: import("react").DragEvent<HTMLElement>) => void;
172
85
  isActive: boolean;
173
86
  htmlFor: string | undefined;
174
- className: string;
175
87
  isDisabled: boolean | undefined;
176
88
  isError: boolean | undefined;
177
89
  };
178
90
  fileListProps: {
179
- onDelete: (fileId: FileId) => void;
180
- onRetry: ((fileId: FileId, file: File) => void) | undefined;
181
- setErrorStatusFile: (fileId: string, errorMsg: string) => void;
182
- selfFiles: Record<string, UploadFile & import("../../types").SpecificSelfFileParams>;
183
- generateDownloadLink: ((fileId: FileId, file?: File, fileUrl?: string) => string) | undefined;
184
- onView: ((fileId: FileId, file?: File, fileUrl?: string) => void) | undefined;
185
- files: UploadFile[];
186
91
  isHidePersonalData: boolean | undefined;
187
92
  PdfViewer: LazyExoticComponent<(props: PdfViewerProps) => ReactElement> | ((props: PdfViewerProps) => ReactElement) | undefined;
93
+ onDelete: (fileId: string) => void;
94
+ onRetry: ((fileId: string, file: File) => void) | undefined;
95
+ onView: ((fileId: string, file?: File | undefined, fileUrl?: string | undefined) => void) | undefined;
96
+ generateDownloadLink: ((fileId: string, file?: File | undefined, fileUrl?: string | undefined) => string) | undefined;
97
+ isMultiple: boolean | undefined;
98
+ files: UploadFile[];
99
+ selfFiles: Record<string, UploadFile & import("../../types").SpecificSelfFileParams>;
100
+ setErrorStatusFile: (fileId: string, errorMsg: string) => void;
101
+ getErrorMessage: ((fileId: string, error: Error) => string) | undefined;
188
102
  deletingFileId: string | null;
189
103
  };
190
104
  };