@bosonprotocol/react-kit 0.34.0-alpha.37 → 0.34.0-alpha.39
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.
- package/dist/cjs/components/form/Field.styles.d.ts +5 -0
- package/dist/cjs/components/form/Field.styles.d.ts.map +1 -1
- package/dist/cjs/components/form/Field.styles.js +39 -12
- package/dist/cjs/components/form/Field.styles.js.map +1 -1
- package/dist/cjs/components/form/Upload/BaseUpload.d.ts +2 -0
- package/dist/cjs/components/form/Upload/BaseUpload.d.ts.map +1 -1
- package/dist/cjs/components/form/Upload/BaseUpload.js +67 -8
- package/dist/cjs/components/form/Upload/BaseUpload.js.map +1 -1
- package/dist/cjs/components/form/Upload/UploadedFile.d.ts +2 -1
- package/dist/cjs/components/form/Upload/UploadedFile.d.ts.map +1 -1
- package/dist/cjs/components/form/Upload/UploadedFile.js +3 -3
- package/dist/cjs/components/form/Upload/UploadedFile.js.map +1 -1
- package/dist/cjs/components/form/Upload/UploadedFiles.d.ts +2 -1
- package/dist/cjs/components/form/Upload/UploadedFiles.d.ts.map +1 -1
- package/dist/cjs/components/form/Upload/UploadedFiles.js +2 -2
- package/dist/cjs/components/form/Upload/UploadedFiles.js.map +1 -1
- package/dist/cjs/components/form/types.d.ts +1 -0
- package/dist/cjs/components/form/types.d.ts.map +1 -1
- package/dist/esm/components/form/Field.styles.d.ts +5 -0
- package/dist/esm/components/form/Field.styles.d.ts.map +1 -1
- package/dist/esm/components/form/Field.styles.js +38 -11
- package/dist/esm/components/form/Field.styles.js.map +1 -1
- package/dist/esm/components/form/Upload/BaseUpload.d.ts +2 -0
- package/dist/esm/components/form/Upload/BaseUpload.d.ts.map +1 -1
- package/dist/esm/components/form/Upload/BaseUpload.js +68 -10
- package/dist/esm/components/form/Upload/BaseUpload.js.map +1 -1
- package/dist/esm/components/form/Upload/UploadedFile.d.ts +2 -1
- package/dist/esm/components/form/Upload/UploadedFile.d.ts.map +1 -1
- package/dist/esm/components/form/Upload/UploadedFile.js +4 -4
- package/dist/esm/components/form/Upload/UploadedFile.js.map +1 -1
- package/dist/esm/components/form/Upload/UploadedFiles.d.ts +2 -1
- package/dist/esm/components/form/Upload/UploadedFiles.d.ts.map +1 -1
- package/dist/esm/components/form/Upload/UploadedFiles.js +2 -2
- package/dist/esm/components/form/Upload/UploadedFiles.js.map +1 -1
- package/dist/esm/components/form/types.d.ts +1 -0
- package/dist/esm/components/form/types.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/components/form/Field.styles.ts +44 -11
- package/src/components/form/Upload/BaseUpload.tsx +155 -59
- package/src/components/form/Upload/UploadedFile.tsx +5 -3
- package/src/components/form/Upload/UploadedFiles.tsx +7 -1
- package/src/components/form/types.ts +1 -0
- package/src/stories/buttons/Upload.stories.tsx +8 -0
- package/src/stories/form/BaseCheckbox.stories.tsx +2 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as Sentry from "@sentry/browser";
|
|
2
2
|
import { useField } from "formik";
|
|
3
|
-
import { Image, Trash, VideoCamera } from "phosphor-react";
|
|
3
|
+
import { Image, Trash, VideoCamera, FilePdf, Upload, X } from "phosphor-react";
|
|
4
4
|
import React, { useCallback, useEffect, useRef, useState } from "react";
|
|
5
5
|
import { loadAndSetMedia } from "../../../lib/base64/base64";
|
|
6
6
|
import { bytesToSize } from "../../../lib/bytes/bytesToSize";
|
|
@@ -13,6 +13,7 @@ import ErrorComponent from "../Error";
|
|
|
13
13
|
import {
|
|
14
14
|
FieldFileUploadWrapper,
|
|
15
15
|
FieldInput,
|
|
16
|
+
PdfOnlyLabel,
|
|
16
17
|
FileUploadWrapper,
|
|
17
18
|
ImagePreview,
|
|
18
19
|
VideoPreview
|
|
@@ -26,6 +27,7 @@ import UploadedFiles from "./UploadedFiles";
|
|
|
26
27
|
import { WithUploadToIpfs, WithUploadToIpfsProps } from "./WithUploadToIpfs";
|
|
27
28
|
import { useModal } from "../../modal/useModal";
|
|
28
29
|
import { ImageEditorModal } from "./ImageEditorModal/ImageEditorModal";
|
|
30
|
+
import { Grid } from "../../ui/Grid";
|
|
29
31
|
const colors = theme.colors.light;
|
|
30
32
|
export type BaseUploadProps = UploadPropsWithNoIpfs;
|
|
31
33
|
function BaseUpload({
|
|
@@ -91,6 +93,9 @@ function BaseUpload({
|
|
|
91
93
|
const isVideoOnly = mimetypes.every((mimetype) =>
|
|
92
94
|
mimetype.startsWith("video/")
|
|
93
95
|
);
|
|
96
|
+
const isPdfOnly = mimetypes.every((mimetype) =>
|
|
97
|
+
mimetype.startsWith("application/pdf")
|
|
98
|
+
);
|
|
94
99
|
|
|
95
100
|
useEffect(() => {
|
|
96
101
|
onFilesSelect?.(files);
|
|
@@ -114,6 +119,12 @@ function BaseUpload({
|
|
|
114
119
|
setPreview(base64Uri);
|
|
115
120
|
});
|
|
116
121
|
}
|
|
122
|
+
} else if (isPdfOnly) {
|
|
123
|
+
if (withUpload) {
|
|
124
|
+
loadIpfsFile(files[0] as FileProps);
|
|
125
|
+
} else {
|
|
126
|
+
setPreview(files[0]?.name);
|
|
127
|
+
}
|
|
117
128
|
}
|
|
118
129
|
}
|
|
119
130
|
}, [files]); // eslint-disable-line
|
|
@@ -165,6 +176,27 @@ function BaseUpload({
|
|
|
165
176
|
}
|
|
166
177
|
};
|
|
167
178
|
|
|
179
|
+
const loadIpfsFile = async (file: FileProps) => {
|
|
180
|
+
const fileSrc = file && file?.src ? file?.src : false;
|
|
181
|
+
if (!fileSrc) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
handleLoading(true);
|
|
186
|
+
const filePreview = await loadMedia(fileSrc || "");
|
|
187
|
+
if (filePreview) {
|
|
188
|
+
setPreview(filePreview);
|
|
189
|
+
} else {
|
|
190
|
+
console.warn(`filePreview ${filePreview} is falsy in loadIpfsFile`);
|
|
191
|
+
}
|
|
192
|
+
} catch (error) {
|
|
193
|
+
console.error(error);
|
|
194
|
+
Sentry.captureException(error);
|
|
195
|
+
} finally {
|
|
196
|
+
handleLoading(false);
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
|
|
168
200
|
const handleChooseFile = () => {
|
|
169
201
|
const input = inputRef.current;
|
|
170
202
|
if (input) {
|
|
@@ -276,11 +308,16 @@ function BaseUpload({
|
|
|
276
308
|
/>
|
|
277
309
|
)}
|
|
278
310
|
{errorMesage && errorComponent?.(errorMesage)}
|
|
279
|
-
<FieldFileUploadWrapper
|
|
311
|
+
<FieldFileUploadWrapper
|
|
312
|
+
{...wrapperProps}
|
|
313
|
+
$isPdfOnly={isPdfOnly}
|
|
314
|
+
$disabled={!!disabled}
|
|
315
|
+
>
|
|
280
316
|
<FieldInput
|
|
281
317
|
{...props}
|
|
282
318
|
hidden
|
|
283
319
|
type="file"
|
|
320
|
+
id={`file-${name}`}
|
|
284
321
|
accept={accept}
|
|
285
322
|
multiple={multiple}
|
|
286
323
|
onChange={async (e) => {
|
|
@@ -316,65 +353,124 @@ function BaseUpload({
|
|
|
316
353
|
<>{trigger}</>
|
|
317
354
|
</ThemedButton>
|
|
318
355
|
) : (
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
356
|
+
(!isPdfOnly || (isPdfOnly && files.length > 0 && !multiple)) && (
|
|
357
|
+
<FileUploadWrapper
|
|
358
|
+
$isPdfOnly={isPdfOnly}
|
|
359
|
+
data-disabled={disabled}
|
|
360
|
+
onClick={() => {
|
|
361
|
+
if (!isPdfOnly) {
|
|
362
|
+
handleChooseFile();
|
|
363
|
+
}
|
|
364
|
+
}}
|
|
365
|
+
$error={errorMessage}
|
|
366
|
+
style={{ ...style, ...theme?.overrides }}
|
|
367
|
+
theme={theme?.triggerTheme}
|
|
368
|
+
>
|
|
369
|
+
{isLoading ? (
|
|
370
|
+
<Loading size={2} />
|
|
371
|
+
) : (
|
|
372
|
+
<>
|
|
373
|
+
{showPreview ? (
|
|
374
|
+
<>
|
|
375
|
+
{isVideoOnly ? (
|
|
376
|
+
<VideoPreview
|
|
377
|
+
src={
|
|
378
|
+
preview?.startsWith("http")
|
|
379
|
+
? preview
|
|
380
|
+
: preview?.startsWith(
|
|
381
|
+
"data:application/octet-stream;base64,"
|
|
382
|
+
)
|
|
383
|
+
? "data:video/mp4;base64," +
|
|
384
|
+
preview?.substring(
|
|
385
|
+
"data:application/octet-stream;base64,"
|
|
386
|
+
.length
|
|
387
|
+
)
|
|
388
|
+
: preview
|
|
389
|
+
}
|
|
390
|
+
autoPlay
|
|
391
|
+
muted
|
|
392
|
+
loop
|
|
393
|
+
/>
|
|
394
|
+
) : isPdfOnly ? (
|
|
395
|
+
<Grid
|
|
396
|
+
flexDirection="row"
|
|
397
|
+
alignItems="center"
|
|
398
|
+
gap="0.25rem"
|
|
399
|
+
>
|
|
400
|
+
<div>
|
|
401
|
+
<FilePdf size={24} />
|
|
402
|
+
</div>
|
|
403
|
+
<Typography>{preview}</Typography>
|
|
404
|
+
<button
|
|
405
|
+
type="button"
|
|
406
|
+
style={{
|
|
407
|
+
display: "flex",
|
|
408
|
+
justifyContent: "center"
|
|
409
|
+
}}
|
|
410
|
+
onClick={(e) => {
|
|
411
|
+
e.preventDefault();
|
|
412
|
+
e.stopPropagation();
|
|
413
|
+
handleRemoveAllFiles();
|
|
414
|
+
}}
|
|
415
|
+
>
|
|
416
|
+
<X size={12.5} />
|
|
417
|
+
</button>
|
|
418
|
+
</Grid>
|
|
419
|
+
) : (
|
|
420
|
+
<ImagePreview
|
|
421
|
+
style={{ ...imgPreviewStyle }}
|
|
422
|
+
src={preview}
|
|
423
|
+
/>
|
|
424
|
+
)}
|
|
425
|
+
</>
|
|
426
|
+
) : isVideoOnly ? (
|
|
427
|
+
<VideoCamera size={24} />
|
|
428
|
+
) : isPdfOnly ? (
|
|
429
|
+
<FilePdf size={24} />
|
|
430
|
+
) : (
|
|
431
|
+
<Image size={24} />
|
|
432
|
+
)}
|
|
433
|
+
{placeholder && !showPreview && (
|
|
434
|
+
<Typography
|
|
435
|
+
tag="p"
|
|
436
|
+
marginBottom={0}
|
|
437
|
+
textAlign="center"
|
|
438
|
+
{...(isPdfOnly && { marginTop: 0 })}
|
|
439
|
+
>
|
|
440
|
+
{placeholder}
|
|
441
|
+
</Typography>
|
|
442
|
+
)}
|
|
443
|
+
</>
|
|
444
|
+
)}
|
|
445
|
+
</FileUploadWrapper>
|
|
446
|
+
)
|
|
375
447
|
)}
|
|
448
|
+
{!disabled &&
|
|
449
|
+
field.value &&
|
|
450
|
+
field.value?.length !== 0 &&
|
|
451
|
+
preview &&
|
|
452
|
+
!isPdfOnly && (
|
|
453
|
+
<div onClick={handleRemoveAllFiles} data-remove style={style}>
|
|
454
|
+
<Trash size={24} color={colors.white} />
|
|
455
|
+
</div>
|
|
456
|
+
)}
|
|
376
457
|
{multiple && (
|
|
377
|
-
<UploadedFiles
|
|
458
|
+
<UploadedFiles
|
|
459
|
+
files={files}
|
|
460
|
+
isPdfOnly={isPdfOnly}
|
|
461
|
+
handleRemoveFile={handleRemoveFile}
|
|
462
|
+
/>
|
|
463
|
+
)}
|
|
464
|
+
{isPdfOnly && (
|
|
465
|
+
<Grid>
|
|
466
|
+
<PdfOnlyLabel
|
|
467
|
+
htmlFor={`file-${name}`}
|
|
468
|
+
$disabled={disabled}
|
|
469
|
+
style={{ ...theme?.uploadButton }}
|
|
470
|
+
>
|
|
471
|
+
Upload file <Upload size={20} />
|
|
472
|
+
</PdfOnlyLabel>
|
|
473
|
+
</Grid>
|
|
378
474
|
)}
|
|
379
475
|
</FieldFileUploadWrapper>
|
|
380
476
|
<ErrorComponent display={displayError} message={errorMessage} />
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ImageSquare, X } from "phosphor-react";
|
|
1
|
+
import { ImageSquare, X, FilePdf } from "phosphor-react";
|
|
2
2
|
import React, { useCallback } from "react";
|
|
3
3
|
import styled from "styled-components";
|
|
4
4
|
import { bytesToSize } from "../../../lib/bytes/bytesToSize";
|
|
@@ -33,6 +33,7 @@ interface Props {
|
|
|
33
33
|
base64Content?: string;
|
|
34
34
|
showSize: boolean;
|
|
35
35
|
color: "grey" | "white";
|
|
36
|
+
isPdfOnly?: boolean;
|
|
36
37
|
handleRemoveFile?: () => void;
|
|
37
38
|
}
|
|
38
39
|
export default function UploadedFile({
|
|
@@ -41,12 +42,13 @@ export default function UploadedFile({
|
|
|
41
42
|
color,
|
|
42
43
|
base64Content,
|
|
43
44
|
showSize,
|
|
45
|
+
isPdfOnly,
|
|
44
46
|
handleRemoveFile
|
|
45
47
|
}: Props) {
|
|
46
48
|
const FileContent = useCallback(() => {
|
|
47
49
|
return (
|
|
48
50
|
<>
|
|
49
|
-
<ImageSquare size={23} />
|
|
51
|
+
{isPdfOnly ? <FilePdf size={23} /> : <ImageSquare size={23} />}
|
|
50
52
|
<Typography fontSize="1rem" fontWeight="400">
|
|
51
53
|
{fileName}
|
|
52
54
|
</Typography>
|
|
@@ -57,7 +59,7 @@ export default function UploadedFile({
|
|
|
57
59
|
)}
|
|
58
60
|
</>
|
|
59
61
|
);
|
|
60
|
-
}, [fileName, fileSize, showSize]);
|
|
62
|
+
}, [fileName, isPdfOnly, fileSize, showSize]);
|
|
61
63
|
return (
|
|
62
64
|
<Grid>
|
|
63
65
|
<AttachmentContainer $isLeftAligned={color === "white"}>
|
|
@@ -5,13 +5,19 @@ import { UploadFileType } from "../types";
|
|
|
5
5
|
interface Props {
|
|
6
6
|
files: UploadFileType[];
|
|
7
7
|
handleRemoveFile: (index: number) => void;
|
|
8
|
+
isPdfOnly?: boolean;
|
|
8
9
|
}
|
|
9
|
-
export default function UploadedFiles({
|
|
10
|
+
export default function UploadedFiles({
|
|
11
|
+
files,
|
|
12
|
+
handleRemoveFile,
|
|
13
|
+
isPdfOnly
|
|
14
|
+
}: Props) {
|
|
10
15
|
return (
|
|
11
16
|
<>
|
|
12
17
|
{files.map((file: UploadFileType, index: number) => {
|
|
13
18
|
return (
|
|
14
19
|
<UploadedFile
|
|
20
|
+
isPdfOnly={isPdfOnly}
|
|
15
21
|
key={`${file?.name || ""}_${index}`}
|
|
16
22
|
fileName={file?.name || `file_${index}`}
|
|
17
23
|
fileSize={Number(file?.size || 0)}
|
|
@@ -113,8 +113,9 @@ export const CustomThemeWithError = {
|
|
|
113
113
|
};
|
|
114
114
|
|
|
115
115
|
export const SimpleWithChildren = {
|
|
116
|
+
name: "With error with children",
|
|
116
117
|
args: {
|
|
117
118
|
...BASE_ARGS,
|
|
118
|
-
children: <
|
|
119
|
+
children: <div>text in paragraph</div>
|
|
119
120
|
}
|
|
120
121
|
};
|