@bosonprotocol/react-kit 0.34.0-alpha.38 → 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.
Files changed (43) hide show
  1. package/dist/cjs/components/form/Field.styles.d.ts +5 -0
  2. package/dist/cjs/components/form/Field.styles.d.ts.map +1 -1
  3. package/dist/cjs/components/form/Field.styles.js +35 -8
  4. package/dist/cjs/components/form/Field.styles.js.map +1 -1
  5. package/dist/cjs/components/form/Upload/BaseUpload.d.ts +2 -0
  6. package/dist/cjs/components/form/Upload/BaseUpload.d.ts.map +1 -1
  7. package/dist/cjs/components/form/Upload/BaseUpload.js +67 -8
  8. package/dist/cjs/components/form/Upload/BaseUpload.js.map +1 -1
  9. package/dist/cjs/components/form/Upload/UploadedFile.d.ts +2 -1
  10. package/dist/cjs/components/form/Upload/UploadedFile.d.ts.map +1 -1
  11. package/dist/cjs/components/form/Upload/UploadedFile.js +3 -3
  12. package/dist/cjs/components/form/Upload/UploadedFile.js.map +1 -1
  13. package/dist/cjs/components/form/Upload/UploadedFiles.d.ts +2 -1
  14. package/dist/cjs/components/form/Upload/UploadedFiles.d.ts.map +1 -1
  15. package/dist/cjs/components/form/Upload/UploadedFiles.js +2 -2
  16. package/dist/cjs/components/form/Upload/UploadedFiles.js.map +1 -1
  17. package/dist/cjs/components/form/types.d.ts +1 -0
  18. package/dist/cjs/components/form/types.d.ts.map +1 -1
  19. package/dist/esm/components/form/Field.styles.d.ts +5 -0
  20. package/dist/esm/components/form/Field.styles.d.ts.map +1 -1
  21. package/dist/esm/components/form/Field.styles.js +34 -7
  22. package/dist/esm/components/form/Field.styles.js.map +1 -1
  23. package/dist/esm/components/form/Upload/BaseUpload.d.ts +2 -0
  24. package/dist/esm/components/form/Upload/BaseUpload.d.ts.map +1 -1
  25. package/dist/esm/components/form/Upload/BaseUpload.js +68 -10
  26. package/dist/esm/components/form/Upload/BaseUpload.js.map +1 -1
  27. package/dist/esm/components/form/Upload/UploadedFile.d.ts +2 -1
  28. package/dist/esm/components/form/Upload/UploadedFile.d.ts.map +1 -1
  29. package/dist/esm/components/form/Upload/UploadedFile.js +4 -4
  30. package/dist/esm/components/form/Upload/UploadedFile.js.map +1 -1
  31. package/dist/esm/components/form/Upload/UploadedFiles.d.ts +2 -1
  32. package/dist/esm/components/form/Upload/UploadedFiles.d.ts.map +1 -1
  33. package/dist/esm/components/form/Upload/UploadedFiles.js +2 -2
  34. package/dist/esm/components/form/Upload/UploadedFiles.js.map +1 -1
  35. package/dist/esm/components/form/types.d.ts +1 -0
  36. package/dist/esm/components/form/types.d.ts.map +1 -1
  37. package/package.json +5 -5
  38. package/src/components/form/Field.styles.ts +40 -7
  39. package/src/components/form/Upload/BaseUpload.tsx +155 -59
  40. package/src/components/form/Upload/UploadedFile.tsx +5 -3
  41. package/src/components/form/Upload/UploadedFiles.tsx +7 -1
  42. package/src/components/form/types.ts +1 -0
  43. package/src/stories/buttons/Upload.stories.tsx +8 -0
@@ -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 {...wrapperProps} $disabled={!!disabled}>
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
- <FileUploadWrapper
320
- data-disabled={disabled}
321
- onClick={handleChooseFile}
322
- $error={errorMessage}
323
- style={{ ...style, ...theme?.overrides }}
324
- theme={theme?.triggerTheme}
325
- >
326
- {isLoading ? (
327
- <Loading size={2} />
328
- ) : (
329
- <>
330
- {showPreview ? (
331
- <>
332
- {isVideoOnly ? (
333
- <VideoPreview
334
- src={
335
- preview?.startsWith("http")
336
- ? preview
337
- : preview?.startsWith(
338
- "data:application/octet-stream;base64,"
339
- )
340
- ? "data:video/mp4;base64," +
341
- preview?.substring(
342
- "data:application/octet-stream;base64,".length
343
- )
344
- : preview
345
- }
346
- autoPlay
347
- muted
348
- loop
349
- />
350
- ) : (
351
- <ImagePreview
352
- style={{ ...imgPreviewStyle }}
353
- src={preview}
354
- />
355
- )}
356
- </>
357
- ) : isVideoOnly ? (
358
- <VideoCamera size={24} />
359
- ) : (
360
- <Image size={24} />
361
- )}
362
- {placeholder && !showPreview && (
363
- <Typography tag="p" marginBottom={0} textAlign="center">
364
- {placeholder}
365
- </Typography>
366
- )}
367
- </>
368
- )}
369
- </FileUploadWrapper>
370
- )}
371
- {!disabled && field.value && field.value?.length !== 0 && preview && (
372
- <div onClick={handleRemoveAllFiles} data-remove style={style}>
373
- <Trash size={24} color={colors.white} />
374
- </div>
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 files={files} handleRemoveFile={handleRemoveFile} />
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
  &nbsp;&nbsp; {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({ files, handleRemoveFile }: Props) {
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)}
@@ -181,6 +181,7 @@ export type UploadProps = BaseProps & {
181
181
  theme?: Partial<{
182
182
  triggerTheme: FileUploadWrapperTheme;
183
183
  overrides: React.CSSProperties;
184
+ uploadButton: React.CSSProperties;
184
185
  }>;
185
186
  } & (
186
187
  | {
@@ -88,3 +88,11 @@ export const VideoOnly = {
88
88
  withUpload: false
89
89
  } satisfies BaseUploadProps
90
90
  };
91
+
92
+ export const PdfOnly = {
93
+ args: {
94
+ ...BASE_ARGS,
95
+ accept: "application/pdf",
96
+ placeholder: "Upload pdf"
97
+ } satisfies BaseUploadProps
98
+ };