@chayns-components/gallery 5.0.0-beta.104 → 5.0.0-beta.106

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.
@@ -0,0 +1,14 @@
1
+ import type { Image } from '../../types/files';
2
+ /**
3
+ * Uploads an image to the tsimg cloud service.
4
+ */
5
+ interface Post {
6
+ accessToken: string;
7
+ file: File | string;
8
+ referenceId?: string;
9
+ personId: string;
10
+ siteId?: string;
11
+ url?: string;
12
+ }
13
+ export declare const imageUpload: ({ accessToken, file, referenceId, personId, siteId, url, }: Post) => Promise<Image>;
14
+ export {};
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.imageUpload = void 0;
7
+ /**
8
+ * Uploads an image to the tsimg cloud service.
9
+ */
10
+
11
+ const imageUpload = async _ref => {
12
+ let {
13
+ accessToken,
14
+ file,
15
+ referenceId,
16
+ personId,
17
+ siteId,
18
+ url = 'https://api.tsimg.cloud/image'
19
+ } = _ref;
20
+ const headers = new Headers({
21
+ Accept: 'application/json'
22
+ });
23
+ if (referenceId) headers.set('X-Reference-Id', referenceId);
24
+ if (personId) headers.set('X-Person-Id', personId);
25
+ if (siteId) headers.set('X-Site-Id', siteId);
26
+ headers.set('Authorization', `bearer ${accessToken}`);
27
+ let body;
28
+ if (typeof file === 'string') {
29
+ headers.set('Content-Type', 'application/json');
30
+ body = JSON.stringify({
31
+ url: file
32
+ });
33
+ } else {
34
+ headers.set('Content-Type', 'image/*');
35
+ body = await getFileArrayBuffer(file);
36
+ }
37
+ const response = await fetch(url, {
38
+ method: 'POST',
39
+ body,
40
+ headers
41
+ });
42
+ if (response.ok) {
43
+ return await response.json();
44
+ }
45
+ throw Error(`Uploading the image failed with status code ${response.status}.`);
46
+ };
47
+ exports.imageUpload = imageUpload;
48
+ const getFileArrayBuffer = file => new Promise((resolve, reject) => {
49
+ const reader = new FileReader();
50
+ reader.onload = e => {
51
+ var _e$target;
52
+ if ((_e$target = e.target) !== null && _e$target !== void 0 && _e$target.result) {
53
+ resolve(e.target.result);
54
+ } else {
55
+ reject(Error('Could not get array buffer.'));
56
+ }
57
+ };
58
+ reader.onerror = reject;
59
+ reader.readAsArrayBuffer(file);
60
+ });
61
+ //# sourceMappingURL=post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post.js","names":["imageUpload","_ref","accessToken","file","referenceId","personId","siteId","url","headers","Headers","Accept","set","body","JSON","stringify","getFileArrayBuffer","response","fetch","method","ok","json","Error","status","exports","Promise","resolve","reject","reader","FileReader","onload","e","_e$target","target","result","onerror","readAsArrayBuffer"],"sources":["../../../src/api/image/post.ts"],"sourcesContent":["import type { Image } from '../../types/files';\n\n/**\n * Uploads an image to the tsimg cloud service.\n */\ninterface Post {\n accessToken: string;\n file: File | string;\n referenceId?: string;\n personId: string;\n siteId?: string;\n url?: string;\n}\n\nexport const imageUpload = async ({\n accessToken,\n file,\n referenceId,\n personId,\n siteId,\n url = 'https://api.tsimg.cloud/image',\n}: Post): Promise<Image> => {\n const headers = new Headers({ Accept: 'application/json' });\n\n if (referenceId) headers.set('X-Reference-Id', referenceId);\n if (personId) headers.set('X-Person-Id', personId);\n if (siteId) headers.set('X-Site-Id', siteId);\n\n headers.set('Authorization', `bearer ${accessToken}`);\n\n let body: string | ArrayBuffer;\n\n if (typeof file === 'string') {\n headers.set('Content-Type', 'application/json');\n body = JSON.stringify({ url: file });\n } else {\n headers.set('Content-Type', 'image/*');\n body = await getFileArrayBuffer(file);\n }\n\n const response = await fetch(url, { method: 'POST', body, headers });\n\n if (response.ok) {\n return (await response.json()) as Promise<Image>;\n }\n\n throw Error(`Uploading the image failed with status code ${response.status}.`);\n};\n\nconst getFileArrayBuffer = (file: File): Promise<string | ArrayBuffer> =>\n new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n if (e.target?.result) {\n resolve(e.target.result);\n } else {\n reject(Error('Could not get array buffer.'));\n }\n };\n reader.onerror = reject;\n reader.readAsArrayBuffer(file);\n });\n"],"mappings":";;;;;;AAEA;AACA;AACA;;AAUO,MAAMA,WAAW,GAAG,MAAAC,IAAA,IAOC;EAAA,IAPM;IAC9BC,WAAW;IACXC,IAAI;IACJC,WAAW;IACXC,QAAQ;IACRC,MAAM;IACNC,GAAG,GAAG;EACJ,CAAC,GAAAN,IAAA;EACH,MAAMO,OAAO,GAAG,IAAIC,OAAO,CAAC;IAAEC,MAAM,EAAE;EAAmB,CAAC,CAAC;EAE3D,IAAIN,WAAW,EAAEI,OAAO,CAACG,GAAG,CAAC,gBAAgB,EAAEP,WAAW,CAAC;EAC3D,IAAIC,QAAQ,EAAEG,OAAO,CAACG,GAAG,CAAC,aAAa,EAAEN,QAAQ,CAAC;EAClD,IAAIC,MAAM,EAAEE,OAAO,CAACG,GAAG,CAAC,WAAW,EAAEL,MAAM,CAAC;EAE5CE,OAAO,CAACG,GAAG,CAAC,eAAe,EAAG,UAAST,WAAY,EAAC,CAAC;EAErD,IAAIU,IAA0B;EAE9B,IAAI,OAAOT,IAAI,KAAK,QAAQ,EAAE;IAC1BK,OAAO,CAACG,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC;IAC/CC,IAAI,GAAGC,IAAI,CAACC,SAAS,CAAC;MAAEP,GAAG,EAAEJ;IAAK,CAAC,CAAC;EACxC,CAAC,MAAM;IACHK,OAAO,CAACG,GAAG,CAAC,cAAc,EAAE,SAAS,CAAC;IACtCC,IAAI,GAAG,MAAMG,kBAAkB,CAACZ,IAAI,CAAC;EACzC;EAEA,MAAMa,QAAQ,GAAG,MAAMC,KAAK,CAACV,GAAG,EAAE;IAAEW,MAAM,EAAE,MAAM;IAAEN,IAAI;IAAEJ;EAAQ,CAAC,CAAC;EAEpE,IAAIQ,QAAQ,CAACG,EAAE,EAAE;IACb,OAAQ,MAAMH,QAAQ,CAACI,IAAI,EAAE;EACjC;EAEA,MAAMC,KAAK,CAAE,+CAA8CL,QAAQ,CAACM,MAAO,GAAE,CAAC;AAClF,CAAC;AAACC,OAAA,CAAAvB,WAAA,GAAAA,WAAA;AAEF,MAAMe,kBAAkB,GAAIZ,IAAU,IAClC,IAAIqB,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;EAC7B,MAAMC,MAAM,GAAG,IAAIC,UAAU,EAAE;EAC/BD,MAAM,CAACE,MAAM,GAAIC,CAAC,IAAK;IAAA,IAAAC,SAAA;IACnB,KAAAA,SAAA,GAAID,CAAC,CAACE,MAAM,cAAAD,SAAA,eAARA,SAAA,CAAUE,MAAM,EAAE;MAClBR,OAAO,CAACK,CAAC,CAACE,MAAM,CAACC,MAAM,CAAC;IAC5B,CAAC,MAAM;MACHP,MAAM,CAACL,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAChD;EACJ,CAAC;EACDM,MAAM,CAACO,OAAO,GAAGR,MAAM;EACvBC,MAAM,CAACQ,iBAAiB,CAAChC,IAAI,CAAC;AAClC,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface PostVideoResult {
2
+ id: number;
3
+ originalVideoQuality: string;
4
+ thumbnailUrl: string;
5
+ url: string;
6
+ urlMP4: string;
7
+ }
8
+ interface PostVideoOptions {
9
+ accessToken: string;
10
+ file: File | Blob;
11
+ }
12
+ export declare const postVideo: ({ accessToken, file, }: PostVideoOptions) => Promise<PostVideoResult>;
13
+ export {};
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.postVideo = void 0;
7
+ const postVideo = async _ref => {
8
+ let {
9
+ accessToken,
10
+ file
11
+ } = _ref;
12
+ const formData = new FormData();
13
+ formData.append('files', file);
14
+ const requestInit = {
15
+ headers: {
16
+ Authorization: `Bearer ${accessToken}`
17
+ },
18
+ method: 'POST',
19
+ body: formData
20
+ };
21
+ const url = `https://streamingservice.chayns.space/video?disableIntercom=true`;
22
+ const response = await fetch(url, requestInit);
23
+
24
+ // console.log(await response.json());
25
+
26
+ if (response.status === 202) {
27
+ return await response.json();
28
+ }
29
+ throw Error(`Uploading the Video failed with status code ${response.status}.`);
30
+ };
31
+ exports.postVideo = postVideo;
32
+ //# sourceMappingURL=post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post.js","names":["postVideo","_ref","accessToken","file","formData","FormData","append","requestInit","headers","Authorization","method","body","url","response","fetch","status","json","Error","exports"],"sources":["../../../src/api/video/post.ts"],"sourcesContent":["export interface PostVideoResult {\n id: number;\n originalVideoQuality: string;\n thumbnailUrl: string;\n url: string;\n urlMP4: string;\n}\n\ninterface PostVideoOptions {\n accessToken: string;\n file: File | Blob;\n}\n\nexport const postVideo = async ({\n accessToken,\n file,\n}: PostVideoOptions): Promise<PostVideoResult> => {\n const formData = new FormData();\n\n formData.append('files', file);\n\n const requestInit: RequestInit = {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n method: 'POST',\n body: formData,\n };\n\n const url = `https://streamingservice.chayns.space/video?disableIntercom=true`;\n\n const response = await fetch(url, requestInit);\n\n // console.log(await response.json());\n\n if (response.status === 202) {\n return (await response.json()) as PostVideoResult;\n }\n\n throw Error(`Uploading the Video failed with status code ${response.status}.`);\n};\n"],"mappings":";;;;;;AAaO,MAAMA,SAAS,GAAG,MAAAC,IAAA,IAGyB;EAAA,IAHlB;IAC5BC,WAAW;IACXC;EACc,CAAC,GAAAF,IAAA;EACf,MAAMG,QAAQ,GAAG,IAAIC,QAAQ,EAAE;EAE/BD,QAAQ,CAACE,MAAM,CAAC,OAAO,EAAEH,IAAI,CAAC;EAE9B,MAAMI,WAAwB,GAAG;IAC7BC,OAAO,EAAE;MACLC,aAAa,EAAG,UAASP,WAAY;IACzC,CAAC;IACDQ,MAAM,EAAE,MAAM;IACdC,IAAI,EAAEP;EACV,CAAC;EAED,MAAMQ,GAAG,GAAI,kEAAiE;EAE9E,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CAACF,GAAG,EAAEL,WAAW,CAAC;;EAE9C;;EAEA,IAAIM,QAAQ,CAACE,MAAM,KAAK,GAAG,EAAE;IACzB,OAAQ,MAAMF,QAAQ,CAACG,IAAI,EAAE;EACjC;EAEA,MAAMC,KAAK,CAAE,+CAA8CJ,QAAQ,CAACE,MAAO,GAAE,CAAC;AAClF,CAAC;AAACG,OAAA,CAAAlB,SAAA,GAAAA,SAAA"}
@@ -1,4 +1,18 @@
1
1
  import { FC } from 'react';
2
- export type GalleryProps = unknown;
2
+ import type { UploadedFile } from '../../types/files';
3
+ export type GalleryProps = {
4
+ /**
5
+ * AccessToken of the user
6
+ */
7
+ accessToken: string;
8
+ /**
9
+ * Function to be executed when files are added or removed
10
+ */
11
+ onChange: (files: UploadedFile[]) => void;
12
+ /**
13
+ * PersonId of the user
14
+ */
15
+ personId: string;
16
+ };
3
17
  declare const Gallery: FC<GalleryProps>;
4
18
  export default Gallery;
@@ -4,10 +4,179 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _react = _interopRequireDefault(require("react"));
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _post = require("../../api/image/post");
9
+ var _post2 = require("../../api/video/post");
10
+ var _file = require("../../utils/file");
8
11
  var _Gallery = require("./Gallery.styles");
9
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
- const Gallery = () => /*#__PURE__*/_react.default.createElement(_Gallery.StyledGallery, null, "Gallery");
12
+ var _core = require("@chayns-components/core");
13
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
14
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
15
+ // Types
16
+
17
+ const Gallery = _ref => {
18
+ let {
19
+ accessToken,
20
+ onChange,
21
+ personId
22
+ } = _ref;
23
+ const [uploadedFiles, setUploadedFiles] = (0, _react.useState)();
24
+
25
+ /**
26
+ * Upload files
27
+ */
28
+ const uploadFiles = (0, _react.useCallback)(async filesToUpload => {
29
+ if (!filesToUpload) {
30
+ return;
31
+ }
32
+ const videos = filesToUpload.filter(_ref2 => {
33
+ let {
34
+ type
35
+ } = _ref2;
36
+ return type.includes('video/');
37
+ });
38
+ const images = filesToUpload.filter(_ref3 => {
39
+ let {
40
+ type
41
+ } = _ref3;
42
+ return type.includes('image/');
43
+ });
44
+ let newUploadedFiles = [];
45
+
46
+ // Upload videos
47
+ const videoResult = videos.map(video => (0, _post2.postVideo)({
48
+ accessToken,
49
+ file: video
50
+ }));
51
+ newUploadedFiles = newUploadedFiles.concat(await Promise.all(videoResult));
52
+ newUploadedFiles = newUploadedFiles.flat();
53
+
54
+ // Upload images
55
+ const imageResult = images.map(image => (0, _post.imageUpload)({
56
+ accessToken,
57
+ file: image,
58
+ personId
59
+ }));
60
+ newUploadedFiles = newUploadedFiles.concat(await Promise.all(imageResult));
61
+ if (!uploadedFiles) {
62
+ setUploadedFiles(newUploadedFiles);
63
+ return;
64
+ }
65
+ setUploadedFiles((0, _file.filterDuplicateFiles)(uploadedFiles, newUploadedFiles));
66
+ }, [accessToken, personId, uploadedFiles]);
67
+
68
+ /**
69
+ * This function adds new data to the existing data list
70
+ */
71
+ const handleAdd = (0, _react.useCallback)(filesAdd => {
72
+ if (!filesAdd) {
73
+ return;
74
+ }
75
+ void uploadFiles(filesAdd);
76
+ onChange(uploadedFiles !== null && uploadedFiles !== void 0 ? uploadedFiles : []);
77
+ }, [onChange, uploadFiles, uploadedFiles]);
78
+
79
+ /**
80
+ * Open a dialog to select files
81
+ */
82
+ const openSelectDialog = (0, _react.useCallback)(() => {
83
+ void (0, _file.selectFiles)({
84
+ multiple: true,
85
+ type: 'image/*, video/*'
86
+ }).then(selectedFiles => {
87
+ if (selectedFiles && selectedFiles.length > 0) {
88
+ const fileArray = (0, _file.convertFileListToArray)(selectedFiles);
89
+
90
+ // Filters files to use only under 64MB
91
+ const filteredFileArray = fileArray.filter(_ref4 => {
92
+ let {
93
+ size,
94
+ type
95
+ } = _ref4;
96
+ const sizeInMB = size / 1024 / 1024;
97
+ if (type.includes('video/') && sizeInMB > 500) {
98
+ return false;
99
+ }
100
+ return !(type.includes('image/') && sizeInMB > 64);
101
+ });
102
+ if (fileArray.length !== filteredFileArray.length) {
103
+ // ToDo show dialog that some files are to big
104
+ }
105
+ if (filteredFileArray.length === 0) {
106
+ // ToDo show dialog that all files are to big
107
+
108
+ return;
109
+ }
110
+ handleAdd(filteredFileArray);
111
+ }
112
+ });
113
+ }, [handleAdd]);
114
+
115
+ /**
116
+ * This function deletes a selected file from the data list
117
+ */
118
+ const handleDelete = (0, _react.useCallback)(key => {
119
+ const filteredFiles = uploadedFiles === null || uploadedFiles === void 0 ? void 0 : uploadedFiles.filter(file => {
120
+ if ('thumbnailUrl' in file) {
121
+ return file.id !== key;
122
+ }
123
+ return file.key !== key;
124
+ });
125
+ setUploadedFiles(filteredFiles !== null && filteredFiles !== void 0 ? filteredFiles : []);
126
+ onChange(uploadedFiles !== null && uploadedFiles !== void 0 ? uploadedFiles : []);
127
+ }, [onChange, uploadedFiles]);
128
+
129
+ /**
130
+ * This function shows a selected file
131
+ */
132
+ const showFile = (0, _react.useCallback)(file => {
133
+ if ('thumbnailUrl' in file) {
134
+ // @ts-expect-error: Type is correct here
135
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
136
+ void chayns.openVideo(file.url);
137
+ return;
138
+ }
139
+
140
+ // @ts-expect-error: Type is correct here
141
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
142
+ void chayns.openImage([`${file.base}/${file.key}`], 0);
143
+ }, []);
144
+ const galleryItems = (0, _react.useMemo)(() => {
145
+ const items = [];
146
+ if (uploadedFiles) {
147
+ uploadedFiles.forEach(file => {
148
+ items.push( /*#__PURE__*/_react.default.createElement(_Gallery.StyledGalleryItem, {
149
+ key: 'thumbnailUrl' in file ? file.id : file.key
150
+ }, /*#__PURE__*/_react.default.createElement(_Gallery.StyledGalleryItemDeleteButton, {
151
+ onClick: () => handleDelete('thumbnailUrl' in file ? file.id : file.key)
152
+ }, /*#__PURE__*/_react.default.createElement(_core.Icon, {
153
+ size: 20,
154
+ icons: ['ts-wrong']
155
+ })), 'thumbnailUrl' in file ? /*#__PURE__*/_react.default.createElement(_Gallery.StyledGalleryItemVideo, {
156
+ onClick: () => showFile(file),
157
+ poster: file.thumbnailUrl
158
+ }, /*#__PURE__*/_react.default.createElement("source", {
159
+ src: file.url,
160
+ type: "video/mp4"
161
+ })) : /*#__PURE__*/_react.default.createElement(_Gallery.StyledGalleryItemImage, {
162
+ onClick: () => showFile(file),
163
+ draggable: false,
164
+ src: `${file.base}/${file.key}`
165
+ })));
166
+ });
167
+ }
168
+ items.push( /*#__PURE__*/_react.default.createElement(_Gallery.StyledGalleryItem, {
169
+ key: "addButton"
170
+ }, /*#__PURE__*/_react.default.createElement(_Gallery.StyledGalleryItemAdd, {
171
+ onClick: openSelectDialog
172
+ }, /*#__PURE__*/_react.default.createElement(_core.Icon, {
173
+ size: 50,
174
+ icons: ['ts-gallery']
175
+ }))));
176
+ return items;
177
+ }, [handleDelete, openSelectDialog, uploadedFiles]);
178
+ return /*#__PURE__*/_react.default.createElement(_Gallery.StyledGallery, null, galleryItems);
179
+ };
11
180
  Gallery.displayName = 'Gallery';
12
181
  var _default = Gallery;
13
182
  exports.default = _default;
@@ -1 +1 @@
1
- {"version":3,"file":"Gallery.js","names":["_react","_interopRequireDefault","require","_Gallery","obj","__esModule","default","Gallery","createElement","StyledGallery","displayName","_default","exports"],"sources":["../../../src/components/gallery/Gallery.tsx"],"sourcesContent":["import React, { FC } from 'react';\nimport { StyledGallery } from './Gallery.styles';\n\nexport type GalleryProps = unknown;\n\nconst Gallery: FC<GalleryProps> = () => <StyledGallery>Gallery</StyledGallery>;\n\nGallery.displayName = 'Gallery';\n\nexport default Gallery;\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AAAiD,SAAAD,uBAAAG,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAIjD,MAAMG,OAAyB,GAAGA,CAAA,kBAAMP,MAAA,CAAAM,OAAA,CAAAE,aAAA,CAACL,QAAA,CAAAM,aAAa,QAAC,SAAO,CAAgB;AAE9EF,OAAO,CAACG,WAAW,GAAG,SAAS;AAAC,IAAAC,QAAA,GAEjBJ,OAAO;AAAAK,OAAA,CAAAN,OAAA,GAAAK,QAAA"}
1
+ {"version":3,"file":"Gallery.js","names":["_react","_interopRequireWildcard","require","_post","_post2","_file","_Gallery","_core","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","Gallery","_ref","accessToken","onChange","personId","uploadedFiles","setUploadedFiles","useState","uploadFiles","useCallback","filesToUpload","videos","filter","_ref2","type","includes","images","_ref3","newUploadedFiles","videoResult","map","video","postVideo","file","concat","Promise","all","flat","imageResult","image","imageUpload","filterDuplicateFiles","handleAdd","filesAdd","openSelectDialog","selectFiles","multiple","then","selectedFiles","length","fileArray","convertFileListToArray","filteredFileArray","_ref4","size","sizeInMB","handleDelete","filteredFiles","id","showFile","chayns","openVideo","url","openImage","base","galleryItems","useMemo","items","forEach","push","createElement","StyledGalleryItem","StyledGalleryItemDeleteButton","onClick","Icon","icons","StyledGalleryItemVideo","poster","thumbnailUrl","src","StyledGalleryItemImage","draggable","StyledGalleryItemAdd","StyledGallery","displayName","_default","exports"],"sources":["../../../src/components/gallery/Gallery.tsx"],"sourcesContent":["import React, { FC, ReactElement, useCallback, useMemo, useState } from 'react';\nimport { imageUpload } from '../../api/image/post';\nimport { postVideo } from '../../api/video/post';\nimport { convertFileListToArray, filterDuplicateFiles, selectFiles } from '../../utils/file';\nimport {\n StyledGallery,\n StyledGalleryItem,\n StyledGalleryItemAdd,\n StyledGalleryItemDeleteButton,\n StyledGalleryItemImage,\n StyledGalleryItemVideo,\n} from './Gallery.styles';\n\n// Types\nimport { Icon } from '@chayns-components/core';\nimport type { Image, UploadedFile, Video } from '../../types/files';\n\nexport type GalleryProps = {\n /**\n * AccessToken of the user\n */\n accessToken: string;\n /**\n * Function to be executed when files are added or removed\n */\n onChange: (files: UploadedFile[]) => void;\n /**\n * PersonId of the user\n */\n personId: string;\n};\n\nconst Gallery: FC<GalleryProps> = ({ accessToken, onChange, personId }) => {\n const [uploadedFiles, setUploadedFiles] = useState<UploadedFile[]>();\n\n /**\n * Upload files\n */\n const uploadFiles = useCallback(\n async (filesToUpload: File[]) => {\n if (!filesToUpload) {\n return;\n }\n\n const videos = filesToUpload.filter(({ type }) => type.includes('video/'));\n const images = filesToUpload.filter(({ type }) => type.includes('image/'));\n let newUploadedFiles: UploadedFile[] = [];\n\n // Upload videos\n const videoResult: Promise<Video>[] = videos.map((video) =>\n postVideo({ accessToken, file: video })\n );\n\n newUploadedFiles = newUploadedFiles.concat(await Promise.all(videoResult));\n newUploadedFiles = newUploadedFiles.flat();\n\n // Upload images\n const imageResult: Promise<Image>[] = images.map((image) =>\n imageUpload({\n accessToken,\n file: image,\n personId,\n })\n );\n\n newUploadedFiles = newUploadedFiles.concat(await Promise.all(imageResult));\n\n if (!uploadedFiles) {\n setUploadedFiles(newUploadedFiles);\n\n return;\n }\n\n setUploadedFiles(filterDuplicateFiles(uploadedFiles, newUploadedFiles));\n },\n [accessToken, personId, uploadedFiles]\n );\n\n /**\n * This function adds new data to the existing data list\n */\n const handleAdd = useCallback(\n (filesAdd: File[]) => {\n if (!filesAdd) {\n return;\n }\n\n void uploadFiles(filesAdd);\n onChange(uploadedFiles ?? []);\n },\n [onChange, uploadFiles, uploadedFiles]\n );\n\n /**\n * Open a dialog to select files\n */\n const openSelectDialog = useCallback(() => {\n void selectFiles({\n multiple: true,\n type: 'image/*, video/*',\n }).then((selectedFiles) => {\n if (selectedFiles && selectedFiles.length > 0) {\n const fileArray = convertFileListToArray(selectedFiles);\n\n // Filters files to use only under 64MB\n const filteredFileArray = fileArray.filter(({ size, type }) => {\n const sizeInMB = size / 1024 / 1024;\n\n if (type.includes('video/') && sizeInMB > 500) {\n return false;\n }\n\n return !(type.includes('image/') && sizeInMB > 64);\n });\n\n if (fileArray.length !== filteredFileArray.length) {\n // ToDo show dialog that some files are to big\n }\n\n if (filteredFileArray.length === 0) {\n // ToDo show dialog that all files are to big\n\n return;\n }\n\n handleAdd(filteredFileArray);\n }\n });\n }, [handleAdd]);\n\n /**\n * This function deletes a selected file from the data list\n */\n const handleDelete = useCallback(\n (key: number | string) => {\n const filteredFiles = uploadedFiles?.filter((file) => {\n if ('thumbnailUrl' in file) {\n return file.id !== key;\n }\n return file.key !== key;\n });\n\n setUploadedFiles(filteredFiles ?? []);\n\n onChange(uploadedFiles ?? []);\n },\n [onChange, uploadedFiles]\n );\n\n /**\n * This function shows a selected file\n */\n const showFile = useCallback((file: UploadedFile) => {\n if ('thumbnailUrl' in file) {\n // @ts-expect-error: Type is correct here\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access\n void chayns.openVideo(file.url);\n\n return;\n }\n\n // @ts-expect-error: Type is correct here\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access\n void chayns.openImage([`${file.base}/${file.key}`], 0);\n }, []);\n\n const galleryItems = useMemo(() => {\n const items: ReactElement[] = [];\n\n if (uploadedFiles) {\n uploadedFiles.forEach((file) => {\n items.push(\n <StyledGalleryItem key={'thumbnailUrl' in file ? file.id : file.key}>\n <StyledGalleryItemDeleteButton\n onClick={() =>\n handleDelete('thumbnailUrl' in file ? file.id : file.key)\n }\n >\n <Icon size={20} icons={['ts-wrong']} />\n </StyledGalleryItemDeleteButton>\n {'thumbnailUrl' in file ? (\n <StyledGalleryItemVideo\n onClick={() => showFile(file)}\n poster={file.thumbnailUrl}\n >\n <source src={file.url} type=\"video/mp4\" />\n </StyledGalleryItemVideo>\n ) : (\n <StyledGalleryItemImage\n onClick={() => showFile(file)}\n draggable={false}\n src={`${file.base}/${file.key}`}\n />\n )}\n </StyledGalleryItem>\n );\n });\n }\n\n items.push(\n <StyledGalleryItem key=\"addButton\">\n <StyledGalleryItemAdd onClick={openSelectDialog}>\n <Icon size={50} icons={['ts-gallery']} />\n </StyledGalleryItemAdd>\n </StyledGalleryItem>\n );\n\n return items;\n }, [handleDelete, openSelectDialog, uploadedFiles]);\n\n return <StyledGallery>{galleryItems}</StyledGallery>;\n};\n\nGallery.displayName = 'Gallery';\n\nexport default Gallery;\n"],"mappings":"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"}
@@ -1 +1,14 @@
1
1
  export declare const StyledGallery: import("styled-components").StyledComponent<"div", any, {}, never>;
2
+ export declare const StyledGalleryItem: import("styled-components").StyledComponent<"div", any, {}, never>;
3
+ export declare const StyledGalleryItemDeleteButton: import("styled-components").StyledComponent<"button", any, {
4
+ theme: import("@chayns-components/core/lib/components/color-scheme-provider/ColorSchemeProvider").Theme;
5
+ }, never>;
6
+ export declare const StyledGalleryItemAdd: import("styled-components").StyledComponent<"button", any, {
7
+ theme: import("@chayns-components/core/lib/components/color-scheme-provider/ColorSchemeProvider").Theme;
8
+ }, never>;
9
+ export declare const StyledGalleryItemImage: import("styled-components").StyledComponent<"img", any, {
10
+ theme: import("@chayns-components/core/lib/components/color-scheme-provider/ColorSchemeProvider").Theme;
11
+ }, never>;
12
+ export declare const StyledGalleryItemVideo: import("styled-components").StyledComponent<"video", any, {
13
+ theme: import("@chayns-components/core/lib/components/color-scheme-provider/ColorSchemeProvider").Theme;
14
+ }, never>;
@@ -3,9 +3,101 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.StyledGallery = void 0;
6
+ exports.StyledGalleryItemVideo = exports.StyledGalleryItemImage = exports.StyledGalleryItemDeleteButton = exports.StyledGalleryItemAdd = exports.StyledGalleryItem = exports.StyledGallery = void 0;
7
7
  var _styledComponents = _interopRequireDefault(require("styled-components"));
8
8
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9
- const StyledGallery = _styledComponents.default.div``;
9
+ const StyledGallery = _styledComponents.default.div`
10
+ display: flex;
11
+ flex-direction: row;
12
+ flex-wrap: wrap;
13
+ gap: 10px;
14
+ padding: 15px;
15
+ `;
10
16
  exports.StyledGallery = StyledGallery;
17
+ const StyledGalleryItem = _styledComponents.default.div`
18
+ position: relative;
19
+ `;
20
+ exports.StyledGalleryItem = StyledGalleryItem;
21
+ const StyledGalleryItemDeleteButton = _styledComponents.default.button`
22
+ background-color: rgba(
23
+ ${_ref => {
24
+ let {
25
+ theme
26
+ } = _ref;
27
+ return theme['000-rgb'];
28
+ }},
29
+ 0.75
30
+ );
31
+ box-shadow: 0 0 0 1px
32
+ rgba(${_ref2 => {
33
+ let {
34
+ theme
35
+ } = _ref2;
36
+ return theme['009-rgb'];
37
+ }}, 0.08) inset;
38
+ position: absolute;
39
+ top: 0;
40
+ right: 0;
41
+ z-index: 2;
42
+ height: 30px;
43
+ width: 30px;
44
+ `;
45
+ exports.StyledGalleryItemDeleteButton = StyledGalleryItemDeleteButton;
46
+ const StyledGalleryItemAdd = _styledComponents.default.button`
47
+ background-color: ${_ref3 => {
48
+ let {
49
+ theme
50
+ } = _ref3;
51
+ return theme['101'];
52
+ }};
53
+ box-shadow: 0 0 0 1px
54
+ rgba(${_ref4 => {
55
+ let {
56
+ theme
57
+ } = _ref4;
58
+ return theme['009-rgb'];
59
+ }}, 0.08) inset;
60
+ width: 150px;
61
+ height: 150px;
62
+ `;
63
+ exports.StyledGalleryItemAdd = StyledGalleryItemAdd;
64
+ const StyledGalleryItemImage = _styledComponents.default.img`
65
+ background-color: ${_ref5 => {
66
+ let {
67
+ theme
68
+ } = _ref5;
69
+ return theme['101'];
70
+ }};
71
+ box-shadow: 0 0 0 1px
72
+ rgba(${_ref6 => {
73
+ let {
74
+ theme
75
+ } = _ref6;
76
+ return theme['009-rgb'];
77
+ }}, 0.08) inset;
78
+ z-index: 1;
79
+ width: 150px;
80
+ aspect-ratio: 1 / 1;
81
+ object-fit: cover;
82
+ `;
83
+ exports.StyledGalleryItemImage = StyledGalleryItemImage;
84
+ const StyledGalleryItemVideo = _styledComponents.default.video`
85
+ background-color: ${_ref7 => {
86
+ let {
87
+ theme
88
+ } = _ref7;
89
+ return theme['101'];
90
+ }};
91
+ box-shadow: 0 0 0 1px
92
+ rgba(${_ref8 => {
93
+ let {
94
+ theme
95
+ } = _ref8;
96
+ return theme['009-rgb'];
97
+ }}, 0.08) inset;
98
+ width: 150px;
99
+ aspect-ratio: 1 / 1;
100
+ object-fit: cover;
101
+ `;
102
+ exports.StyledGalleryItemVideo = StyledGalleryItemVideo;
11
103
  //# sourceMappingURL=Gallery.styles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Gallery.styles.js","names":["_styledComponents","_interopRequireDefault","require","obj","__esModule","default","StyledGallery","styled","div","exports"],"sources":["../../../src/components/gallery/Gallery.styles.ts"],"sourcesContent":["import styled from 'styled-components';\n\nexport const StyledGallery = styled.div``;\n"],"mappings":";;;;;;AAAA,IAAAA,iBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAuC,SAAAD,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEhC,MAAMG,aAAa,GAAGC,yBAAM,CAACC,GAAI,EAAC;AAACC,OAAA,CAAAH,aAAA,GAAAA,aAAA"}
1
+ {"version":3,"file":"Gallery.styles.js","names":["_styledComponents","_interopRequireDefault","require","obj","__esModule","default","StyledGallery","styled","div","exports","StyledGalleryItem","StyledGalleryItemDeleteButton","button","_ref","theme","_ref2","StyledGalleryItemAdd","_ref3","_ref4","StyledGalleryItemImage","img","_ref5","_ref6","StyledGalleryItemVideo","video","_ref7","_ref8"],"sources":["../../../src/components/gallery/Gallery.styles.ts"],"sourcesContent":["import type { WithTheme } from '@chayns-components/core';\nimport styled from 'styled-components';\n\nexport const StyledGallery = styled.div`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 10px;\n padding: 15px;\n`;\n\nexport const StyledGalleryItem = styled.div`\n position: relative;\n`;\n\ntype StyledGalleryItemDeleteButtonProps = WithTheme<unknown>;\n\nexport const StyledGalleryItemDeleteButton = styled.button<StyledGalleryItemDeleteButtonProps>`\n background-color: rgba(\n ${({ theme }: StyledGalleryItemDeleteButtonProps) => theme['000-rgb']},\n 0.75\n );\n box-shadow: 0 0 0 1px\n rgba(${({ theme }: StyledGalleryItemImageProps) => theme['009-rgb']}, 0.08) inset;\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n height: 30px;\n width: 30px;\n`;\n\ntype StyledGalleryItemAddProps = WithTheme<unknown>;\n\nexport const StyledGalleryItemAdd = styled.button<StyledGalleryItemAddProps>`\n background-color: ${({ theme }: StyledGalleryItemAddProps) => theme['101']};\n box-shadow: 0 0 0 1px\n rgba(${({ theme }: StyledGalleryItemImageProps) => theme['009-rgb']}, 0.08) inset;\n width: 150px;\n height: 150px;\n`;\n\ntype StyledGalleryItemImageProps = WithTheme<unknown>;\n\nexport const StyledGalleryItemImage = styled.img<StyledGalleryItemImageProps>`\n background-color: ${({ theme }: StyledGalleryItemImageProps) => theme['101']};\n box-shadow: 0 0 0 1px\n rgba(${({ theme }: StyledGalleryItemImageProps) => theme['009-rgb']}, 0.08) inset;\n z-index: 1;\n width: 150px;\n aspect-ratio: 1 / 1;\n object-fit: cover;\n`;\n\ntype StyledGalleryItemVideoProps = WithTheme<unknown>;\n\nexport const StyledGalleryItemVideo = styled.video<StyledGalleryItemVideoProps>`\n background-color: ${({ theme }: StyledGalleryItemVideoProps) => theme['101']};\n box-shadow: 0 0 0 1px\n rgba(${({ theme }: StyledGalleryItemImageProps) => theme['009-rgb']}, 0.08) inset;\n width: 150px;\n aspect-ratio: 1 / 1;\n object-fit: cover;\n`;\n"],"mappings":";;;;;;AACA,IAAAA,iBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAuC,SAAAD,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEhC,MAAMG,aAAa,GAAGC,yBAAM,CAACC,GAAI;AACxC;AACA;AACA;AACA;AACA;AACA,CAAC;AAACC,OAAA,CAAAH,aAAA,GAAAA,aAAA;AAEK,MAAMI,iBAAiB,GAAGH,yBAAM,CAACC,GAAI;AAC5C;AACA,CAAC;AAACC,OAAA,CAAAC,iBAAA,GAAAA,iBAAA;AAIK,MAAMC,6BAA6B,GAAGJ,yBAAM,CAACK,MAA2C;AAC/F;AACA,UAAUC,IAAA;EAAA,IAAC;IAAEC;EAA0C,CAAC,GAAAD,IAAA;EAAA,OAAKC,KAAK,CAAC,SAAS,CAAC;AAAA,CAAC;AAC9E;AACA;AACA;AACA,eAAeC,KAAA;EAAA,IAAC;IAAED;EAAmC,CAAC,GAAAC,KAAA;EAAA,OAAKD,KAAK,CAAC,SAAS,CAAC;AAAA,CAAC;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAACL,OAAA,CAAAE,6BAAA,GAAAA,6BAAA;AAIK,MAAMK,oBAAoB,GAAGT,yBAAM,CAACK,MAAkC;AAC7E,wBAAwBK,KAAA;EAAA,IAAC;IAAEH;EAAiC,CAAC,GAAAG,KAAA;EAAA,OAAKH,KAAK,CAAC,KAAK,CAAC;AAAA,CAAC;AAC/E;AACA,eAAeI,KAAA;EAAA,IAAC;IAAEJ;EAAmC,CAAC,GAAAI,KAAA;EAAA,OAAKJ,KAAK,CAAC,SAAS,CAAC;AAAA,CAAC;AAC5E;AACA;AACA,CAAC;AAACL,OAAA,CAAAO,oBAAA,GAAAA,oBAAA;AAIK,MAAMG,sBAAsB,GAAGZ,yBAAM,CAACa,GAAiC;AAC9E,wBAAwBC,KAAA;EAAA,IAAC;IAAEP;EAAmC,CAAC,GAAAO,KAAA;EAAA,OAAKP,KAAK,CAAC,KAAK,CAAC;AAAA,CAAC;AACjF;AACA,eAAeQ,KAAA;EAAA,IAAC;IAAER;EAAmC,CAAC,GAAAQ,KAAA;EAAA,OAAKR,KAAK,CAAC,SAAS,CAAC;AAAA,CAAC;AAC5E;AACA;AACA;AACA;AACA,CAAC;AAACL,OAAA,CAAAU,sBAAA,GAAAA,sBAAA;AAIK,MAAMI,sBAAsB,GAAGhB,yBAAM,CAACiB,KAAmC;AAChF,wBAAwBC,KAAA;EAAA,IAAC;IAAEX;EAAmC,CAAC,GAAAW,KAAA;EAAA,OAAKX,KAAK,CAAC,KAAK,CAAC;AAAA,CAAC;AACjF;AACA,eAAeY,KAAA;EAAA,IAAC;IAAEZ;EAAmC,CAAC,GAAAY,KAAA;EAAA,OAAKZ,KAAK,CAAC,SAAS,CAAC;AAAA,CAAC;AAC5E;AACA;AACA;AACA,CAAC;AAACL,OAAA,CAAAc,sBAAA,GAAAA,sBAAA"}
@@ -0,0 +1,17 @@
1
+ export interface Video {
2
+ id: number;
3
+ originalVideoQuality: string;
4
+ thumbnailUrl: string;
5
+ url: string;
6
+ }
7
+ export interface Image {
8
+ key: string;
9
+ base: string;
10
+ meta: Meta;
11
+ }
12
+ export interface Meta {
13
+ preview: string;
14
+ width: string;
15
+ height: string;
16
+ }
17
+ export type UploadedFile = Video | Image;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","names":[],"sources":["../../src/types/files.ts"],"sourcesContent":["export interface Video {\n id: number;\n originalVideoQuality: string;\n thumbnailUrl: string;\n url: string;\n}\n\nexport interface Image {\n key: string;\n base: string;\n meta: Meta;\n}\n\nexport interface Meta {\n preview: string;\n width: string;\n height: string;\n}\n\nexport type UploadedFile = Video | Image;\n"],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import type { UploadedFile } from '../types/files';
2
+ interface SelectFilesOptions {
3
+ type: string;
4
+ multiple: boolean;
5
+ }
6
+ export declare const selectFiles: ({ type, multiple }: SelectFilesOptions) => Promise<null | FileList>;
7
+ export declare const convertFileListToArray: (fileList: FileList) => File[];
8
+ export declare const filterDuplicateFiles: (oldFiles: UploadedFile[], newFiles: UploadedFile[]) => UploadedFile[];
9
+ export {};
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.selectFiles = exports.filterDuplicateFiles = exports.convertFileListToArray = void 0;
7
+ const selectFiles = _ref => {
8
+ let {
9
+ type,
10
+ multiple
11
+ } = _ref;
12
+ return new Promise(resolve => {
13
+ const input = document.createElement('input');
14
+ input.type = 'file';
15
+ if (type !== '*/*' && type) {
16
+ input.accept = type;
17
+ }
18
+ if (multiple) {
19
+ input.multiple = true;
20
+ }
21
+ input.style.visibility = 'none';
22
+ input.style.width = '0';
23
+ input.style.height = '0';
24
+ input.style.display = 'none';
25
+ document.body.appendChild(input);
26
+ input.addEventListener('change', event => {
27
+ document.body.removeChild(input);
28
+ const target = event.target;
29
+ const {
30
+ files
31
+ } = target;
32
+ resolve(files);
33
+ });
34
+ input.click();
35
+ });
36
+ };
37
+ exports.selectFiles = selectFiles;
38
+ const convertFileListToArray = fileList => {
39
+ const filesArray = [];
40
+ for (let i = 0; i < fileList.length; i++) {
41
+ const file = fileList.item(i);
42
+ if (file) {
43
+ filesArray.push(file);
44
+ }
45
+ }
46
+ return filesArray;
47
+ };
48
+ exports.convertFileListToArray = convertFileListToArray;
49
+ const filterDuplicateFiles = (oldFiles, newFiles) => {
50
+ const seenKeys = new Set();
51
+ const filteredFiles = [];
52
+ oldFiles.forEach(file => {
53
+ let key;
54
+ if ('id' in file) {
55
+ key = file.id.toString();
56
+ } else {
57
+ key = file.key;
58
+ }
59
+ seenKeys.add(key);
60
+ filteredFiles.push(file);
61
+ });
62
+ newFiles.forEach(file => {
63
+ let key;
64
+ if ('id' in file) {
65
+ key = file.id.toString();
66
+ } else {
67
+ key = file.key;
68
+ }
69
+ if (!seenKeys.has(key)) {
70
+ seenKeys.add(key);
71
+ filteredFiles.push(file);
72
+ }
73
+ });
74
+ return filteredFiles;
75
+ };
76
+ exports.filterDuplicateFiles = filterDuplicateFiles;
77
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","names":["selectFiles","_ref","type","multiple","Promise","resolve","input","document","createElement","accept","style","visibility","width","height","display","body","appendChild","addEventListener","event","removeChild","target","files","click","exports","convertFileListToArray","fileList","filesArray","i","length","file","item","push","filterDuplicateFiles","oldFiles","newFiles","seenKeys","Set","filteredFiles","forEach","key","id","toString","add","has"],"sources":["../../src/utils/file.ts"],"sourcesContent":["import type { UploadedFile } from '../types/files';\n\ninterface SelectFilesOptions {\n type: string;\n multiple: boolean;\n}\n\nexport const selectFiles = ({ type, multiple }: SelectFilesOptions): Promise<null | FileList> =>\n new Promise((resolve) => {\n const input = document.createElement('input');\n input.type = 'file';\n\n if (type !== '*/*' && type) {\n input.accept = type;\n }\n\n if (multiple) {\n input.multiple = true;\n }\n\n input.style.visibility = 'none';\n input.style.width = '0';\n input.style.height = '0';\n input.style.display = 'none';\n\n document.body.appendChild(input);\n\n input.addEventListener('change', (event) => {\n document.body.removeChild(input);\n\n const target = event.target as HTMLInputElement;\n const { files } = target;\n\n resolve(files);\n });\n\n input.click();\n });\n\nexport const convertFileListToArray = (fileList: FileList): File[] => {\n const filesArray = [];\n for (let i = 0; i < fileList.length; i++) {\n const file = fileList.item(i);\n\n if (file) {\n filesArray.push(file);\n }\n }\n\n return filesArray;\n};\n\nexport const filterDuplicateFiles = (\n oldFiles: UploadedFile[],\n newFiles: UploadedFile[]\n): UploadedFile[] => {\n const seenKeys = new Set<string>();\n const filteredFiles: UploadedFile[] = [];\n\n oldFiles.forEach((file) => {\n let key: string;\n if ('id' in file) {\n key = file.id.toString();\n } else {\n key = file.key;\n }\n\n seenKeys.add(key);\n filteredFiles.push(file);\n });\n\n newFiles.forEach((file) => {\n let key: string;\n if ('id' in file) {\n key = file.id.toString();\n } else {\n key = file.key;\n }\n\n if (!seenKeys.has(key)) {\n seenKeys.add(key);\n filteredFiles.push(file);\n }\n });\n\n return filteredFiles;\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chayns-components/gallery",
3
- "version": "5.0.0-beta.104",
3
+ "version": "5.0.0-beta.106",
4
4
  "description": "A set of beautiful React components for developing your own applications with chayns.",
5
5
  "keywords": [
6
6
  "chayns",
@@ -49,7 +49,7 @@
49
49
  "typescript": "^4.9.5"
50
50
  },
51
51
  "dependencies": {
52
- "@chayns-components/core": "^5.0.0-beta.104",
52
+ "@chayns-components/core": "^5.0.0-beta.105",
53
53
  "@chayns/colors": "^2.0.0",
54
54
  "clsx": "^1.2.1",
55
55
  "framer-motion": "^6.5.1",
@@ -63,5 +63,5 @@
63
63
  "publishConfig": {
64
64
  "access": "public"
65
65
  },
66
- "gitHead": "14f15be7baf4fd754b013d36f1b88b2f9a8c4f77"
66
+ "gitHead": "e22fc61291eefa6633fb92097194be11baf60e71"
67
67
  }
package/lib/index.d.ts DELETED
@@ -1 +0,0 @@
1
- export { default as Gallery } from './components/gallery/Gallery';
package/lib/index.js DELETED
@@ -1,14 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "Gallery", {
7
- enumerable: true,
8
- get: function () {
9
- return _Gallery.default;
10
- }
11
- });
12
- var _Gallery = _interopRequireDefault(require("./components/gallery/Gallery"));
13
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
- //# sourceMappingURL=index.js.map
package/lib/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":["_Gallery","_interopRequireDefault","require","obj","__esModule","default"],"sources":["../src/index.ts"],"sourcesContent":["export { default as Gallery } from './components/gallery/Gallery';\n"],"mappings":";;;;;;;;;;;AAAA,IAAAA,QAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAkE,SAAAD,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA"}