@tecsinapse/cortex-react 1.12.2 → 1.13.0-beta.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.
@@ -20,10 +20,8 @@ const Carousel = ({ images }) => {
20
20
  {
21
21
  type: "button",
22
22
  "data-testid": "button-carousel-prev",
23
- variants: {
24
- size: "square",
25
- className: "z-absolute absolute left-deca top-[50%] transform -translate-y-[50%] p-centi hidden lg:flex"
26
- },
23
+ className: "z-absolute absolute left-deca top-[50%] transform -translate-y-[50%] p-centi hidden lg:flex",
24
+ size: "square",
27
25
  onClick: slideToPrevItem
28
26
  },
29
27
  /* @__PURE__ */ React.createElement(io.IoIosArrowBack, null)
@@ -32,10 +30,8 @@ const Carousel = ({ images }) => {
32
30
  {
33
31
  type: "button",
34
32
  "data-testid": "button-carousel-next",
35
- variants: {
36
- size: "square",
37
- className: "z-absolute absolute right-deca top-[50%] transform -translate-y-[50%] p-centi hidden lg:flex"
38
- },
33
+ size: "square",
34
+ className: "z-absolute absolute right-deca top-[50%] transform -translate-y-[50%] p-centi hidden lg:flex",
39
35
  onClick: slideToNextItem
40
36
  },
41
37
  /* @__PURE__ */ React.createElement(io.IoIosArrowForward, null)
@@ -53,9 +53,7 @@ const CarouselItem = ({ item }) => {
53
53
  {
54
54
  type: "button",
55
55
  "data-testid": "button-link-carousel",
56
- variants: {
57
- className: "z-absolute absolute bottom-deca left-[10%]"
58
- }
56
+ className: "z-absolute absolute bottom-deca left-[10%]"
59
57
  },
60
58
  item.button.title
61
59
  )
@@ -8,11 +8,14 @@ var types = require('../components/Uploader/types.js');
8
8
  const useFileUpload = ({
9
9
  accept = {},
10
10
  onAccept,
11
+ onFileRejected,
11
12
  maxSize,
12
13
  allowMultiple = true,
13
- onFileRejected
14
+ preventDuplicates = false,
15
+ onDuplicate
14
16
  }) => {
15
17
  const [files, setFiles] = React.useState([]);
18
+ const [duplicates, setDuplicates] = React.useState([]);
16
19
  const [isOpen, setIsOpen] = React.useState(false);
17
20
  const onOpen = React.useCallback(() => setIsOpen(true), []);
18
21
  const onClose = React.useCallback(() => setIsOpen(false), []);
@@ -25,7 +28,21 @@ const useFileUpload = ({
25
28
  []
26
29
  );
27
30
  const onDrop = async (acceptedFiles) => {
28
- const newFiles = acceptedFiles.map((file) => ({
31
+ let toProcess = acceptedFiles;
32
+ if (preventDuplicates) {
33
+ const found = acceptedFiles.filter(
34
+ (file) => files.some((existing) => existing.file.name === file.name)
35
+ );
36
+ if (found.length > 0) {
37
+ setDuplicates(found);
38
+ onDuplicate?.(found);
39
+ }
40
+ toProcess = acceptedFiles.filter(
41
+ (file) => !found.some((dup) => dup.name === file.name)
42
+ );
43
+ if (toProcess.length === 0) return;
44
+ }
45
+ const newFiles = toProcess.map((file) => ({
29
46
  file,
30
47
  status: onAccept ? types.FileStatus.UPLOADING : types.FileStatus.SUCCESS,
31
48
  uid: uuid.v4()
@@ -86,6 +103,7 @@ const useFileUpload = ({
86
103
  },
87
104
  open: isOpen,
88
105
  files,
106
+ duplicates,
89
107
  onClearFiles: handleClearFiles
90
108
  };
91
109
  };
@@ -18,10 +18,8 @@ const Carousel = ({ images }) => {
18
18
  {
19
19
  type: "button",
20
20
  "data-testid": "button-carousel-prev",
21
- variants: {
22
- size: "square",
23
- className: "z-absolute absolute left-deca top-[50%] transform -translate-y-[50%] p-centi hidden lg:flex"
24
- },
21
+ className: "z-absolute absolute left-deca top-[50%] transform -translate-y-[50%] p-centi hidden lg:flex",
22
+ size: "square",
25
23
  onClick: slideToPrevItem
26
24
  },
27
25
  /* @__PURE__ */ React__default.createElement(IoIosArrowBack, null)
@@ -30,10 +28,8 @@ const Carousel = ({ images }) => {
30
28
  {
31
29
  type: "button",
32
30
  "data-testid": "button-carousel-next",
33
- variants: {
34
- size: "square",
35
- className: "z-absolute absolute right-deca top-[50%] transform -translate-y-[50%] p-centi hidden lg:flex"
36
- },
31
+ size: "square",
32
+ className: "z-absolute absolute right-deca top-[50%] transform -translate-y-[50%] p-centi hidden lg:flex",
37
33
  onClick: slideToNextItem
38
34
  },
39
35
  /* @__PURE__ */ React__default.createElement(IoIosArrowForward, null)
@@ -51,9 +51,7 @@ const CarouselItem = ({ item }) => {
51
51
  {
52
52
  type: "button",
53
53
  "data-testid": "button-link-carousel",
54
- variants: {
55
- className: "z-absolute absolute bottom-deca left-[10%]"
56
- }
54
+ className: "z-absolute absolute bottom-deca left-[10%]"
57
55
  },
58
56
  item.button.title
59
57
  )
@@ -6,11 +6,14 @@ import { FileStatus, AcceptSpecificMap } from '../components/Uploader/types.js';
6
6
  const useFileUpload = ({
7
7
  accept = {},
8
8
  onAccept,
9
+ onFileRejected,
9
10
  maxSize,
10
11
  allowMultiple = true,
11
- onFileRejected
12
+ preventDuplicates = false,
13
+ onDuplicate
12
14
  }) => {
13
15
  const [files, setFiles] = useState([]);
16
+ const [duplicates, setDuplicates] = useState([]);
14
17
  const [isOpen, setIsOpen] = useState(false);
15
18
  const onOpen = useCallback(() => setIsOpen(true), []);
16
19
  const onClose = useCallback(() => setIsOpen(false), []);
@@ -23,7 +26,21 @@ const useFileUpload = ({
23
26
  []
24
27
  );
25
28
  const onDrop = async (acceptedFiles) => {
26
- const newFiles = acceptedFiles.map((file) => ({
29
+ let toProcess = acceptedFiles;
30
+ if (preventDuplicates) {
31
+ const found = acceptedFiles.filter(
32
+ (file) => files.some((existing) => existing.file.name === file.name)
33
+ );
34
+ if (found.length > 0) {
35
+ setDuplicates(found);
36
+ onDuplicate?.(found);
37
+ }
38
+ toProcess = acceptedFiles.filter(
39
+ (file) => !found.some((dup) => dup.name === file.name)
40
+ );
41
+ if (toProcess.length === 0) return;
42
+ }
43
+ const newFiles = toProcess.map((file) => ({
27
44
  file,
28
45
  status: onAccept ? FileStatus.UPLOADING : FileStatus.SUCCESS,
29
46
  uid: v4()
@@ -84,6 +101,7 @@ const useFileUpload = ({
84
101
  },
85
102
  open: isOpen,
86
103
  files,
104
+ duplicates,
87
105
  onClearFiles: handleClearFiles
88
106
  };
89
107
  };
@@ -9,18 +9,20 @@ interface UseFileUploadOptions<T> {
9
9
  TEXT?: (typeof AcceptSpecificMap.TEXT)[number][];
10
10
  };
11
11
  onAccept?: (files: FileUpload<T>[]) => Promise<FileUpload<T>[]>;
12
+ onFileRejected?: (fileRejections: FileRejection[], event: DropEvent) => void;
12
13
  maxSize?: number;
13
14
  allowMultiple?: boolean;
14
- onDelete?: (file: FileUpload<T>) => Promise<void>;
15
- onFileRejected?: (fileRejections: FileRejection[], event: DropEvent) => void;
15
+ preventDuplicates?: boolean;
16
+ onDuplicate?: (duplicates: File[]) => void;
16
17
  }
17
- export declare const useFileUpload: <T>({ accept, onAccept, maxSize, allowMultiple, onFileRejected, }: UseFileUploadOptions<T>) => {
18
+ export declare const useFileUpload: <T>({ accept, onAccept, onFileRejected, maxSize, allowMultiple, preventDuplicates, onDuplicate, }: UseFileUploadOptions<T>) => {
18
19
  onOpen: () => void;
19
20
  onClose: () => void;
20
21
  onDelete: (index: number) => void;
21
22
  dropzoneProps: UseDropzoneProps;
22
23
  open: boolean;
23
24
  files: FileUpload<T>[];
25
+ duplicates: File[];
24
26
  onClearFiles: () => void;
25
27
  };
26
28
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tecsinapse/cortex-react",
3
- "version": "1.12.2",
3
+ "version": "1.13.0-beta.0",
4
4
  "description": "React components based in @tecsinapse/cortex-core",
5
5
  "license": "MIT",
6
6
  "main": "dist/esm/index.js",
@@ -47,5 +47,5 @@
47
47
  "react-icons": ">=5.2.0",
48
48
  "tailwind": ">=3.3.0"
49
49
  },
50
- "gitHead": "509f8fed5849a7a5e3cf6bfa23eba2ef63b45c27"
50
+ "gitHead": "4c78af21cd3462adefd432f41e940d06968eed45"
51
51
  }