@bosonprotocol/react-kit 0.33.0-alpha.14 → 0.33.0-alpha.15

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 (93) hide show
  1. package/dist/cjs/components/error/SimpleError.d.ts +2 -2
  2. package/dist/cjs/components/error/SimpleError.d.ts.map +1 -1
  3. package/dist/cjs/components/error/SimpleError.js.map +1 -1
  4. package/dist/cjs/components/form/Field.styles.d.ts +13 -1
  5. package/dist/cjs/components/form/Field.styles.d.ts.map +1 -1
  6. package/dist/cjs/components/form/Field.styles.js +17 -10
  7. package/dist/cjs/components/form/Field.styles.js.map +1 -1
  8. package/dist/cjs/components/form/FormField.d.ts +1 -1
  9. package/dist/cjs/components/form/FormField.d.ts.map +1 -1
  10. package/dist/cjs/components/form/FormField.js +14 -2
  11. package/dist/cjs/components/form/FormField.js.map +1 -1
  12. package/dist/cjs/components/form/Select.d.ts.map +1 -1
  13. package/dist/cjs/components/form/Select.js +3 -3
  14. package/dist/cjs/components/form/Select.js.map +1 -1
  15. package/dist/cjs/components/form/Upload/BaseUpload.d.ts +69 -0
  16. package/dist/cjs/components/form/Upload/BaseUpload.d.ts.map +1 -0
  17. package/dist/cjs/components/form/Upload/BaseUpload.js +264 -0
  18. package/dist/cjs/components/form/Upload/BaseUpload.js.map +1 -0
  19. package/dist/cjs/components/form/Upload/Upload.d.ts +3 -41
  20. package/dist/cjs/components/form/Upload/Upload.d.ts.map +1 -1
  21. package/dist/cjs/components/form/Upload/Upload.js +7 -258
  22. package/dist/cjs/components/form/Upload/Upload.js.map +1 -1
  23. package/dist/cjs/components/form/Upload/UploadedFile.js +2 -2
  24. package/dist/cjs/components/form/Upload/UploadedFile.js.map +1 -1
  25. package/dist/cjs/components/form/Upload/WithUploadToIpfs.js +2 -2
  26. package/dist/cjs/components/form/Upload/WithUploadToIpfs.js.map +1 -1
  27. package/dist/cjs/components/form/index.d.ts +2 -1
  28. package/dist/cjs/components/form/index.d.ts.map +1 -1
  29. package/dist/cjs/components/form/index.js +4 -2
  30. package/dist/cjs/components/form/index.js.map +1 -1
  31. package/dist/cjs/components/form/types.d.ts +7 -2
  32. package/dist/cjs/components/form/types.d.ts.map +1 -1
  33. package/dist/cjs/index.d.ts +1 -0
  34. package/dist/cjs/index.d.ts.map +1 -1
  35. package/dist/cjs/index.js +1 -0
  36. package/dist/cjs/index.js.map +1 -1
  37. package/dist/cjs/lib/bytes/bytesToSize.d.ts +1 -1
  38. package/dist/cjs/lib/bytes/bytesToSize.d.ts.map +1 -1
  39. package/dist/cjs/lib/bytes/bytesToSize.js +2 -1
  40. package/dist/cjs/lib/bytes/bytesToSize.js.map +1 -1
  41. package/dist/esm/components/error/SimpleError.d.ts +2 -2
  42. package/dist/esm/components/error/SimpleError.d.ts.map +1 -1
  43. package/dist/esm/components/error/SimpleError.js.map +1 -1
  44. package/dist/esm/components/form/Field.styles.d.ts +13 -1
  45. package/dist/esm/components/form/Field.styles.d.ts.map +1 -1
  46. package/dist/esm/components/form/Field.styles.js +11 -7
  47. package/dist/esm/components/form/Field.styles.js.map +1 -1
  48. package/dist/esm/components/form/FormField.d.ts +1 -1
  49. package/dist/esm/components/form/FormField.d.ts.map +1 -1
  50. package/dist/esm/components/form/FormField.js +2 -2
  51. package/dist/esm/components/form/FormField.js.map +1 -1
  52. package/dist/esm/components/form/Select.d.ts.map +1 -1
  53. package/dist/esm/components/form/Select.js +19 -16
  54. package/dist/esm/components/form/Select.js.map +1 -1
  55. package/dist/esm/components/form/Upload/BaseUpload.d.ts +69 -0
  56. package/dist/esm/components/form/Upload/BaseUpload.d.ts.map +1 -0
  57. package/dist/esm/components/form/Upload/BaseUpload.js +226 -0
  58. package/dist/esm/components/form/Upload/BaseUpload.js.map +1 -0
  59. package/dist/esm/components/form/Upload/Upload.d.ts +3 -41
  60. package/dist/esm/components/form/Upload/Upload.d.ts.map +1 -1
  61. package/dist/esm/components/form/Upload/Upload.js +5 -225
  62. package/dist/esm/components/form/Upload/Upload.js.map +1 -1
  63. package/dist/esm/components/form/Upload/UploadedFile.js +1 -1
  64. package/dist/esm/components/form/Upload/UploadedFile.js.map +1 -1
  65. package/dist/esm/components/form/Upload/WithUploadToIpfs.js +1 -1
  66. package/dist/esm/components/form/Upload/WithUploadToIpfs.js.map +1 -1
  67. package/dist/esm/components/form/index.d.ts +2 -1
  68. package/dist/esm/components/form/index.d.ts.map +1 -1
  69. package/dist/esm/components/form/index.js +2 -1
  70. package/dist/esm/components/form/index.js.map +1 -1
  71. package/dist/esm/components/form/types.d.ts +7 -2
  72. package/dist/esm/components/form/types.d.ts.map +1 -1
  73. package/dist/esm/index.d.ts +1 -0
  74. package/dist/esm/index.d.ts.map +1 -1
  75. package/dist/esm/index.js +1 -0
  76. package/dist/esm/index.js.map +1 -1
  77. package/dist/esm/lib/bytes/bytesToSize.d.ts +1 -1
  78. package/dist/esm/lib/bytes/bytesToSize.d.ts.map +1 -1
  79. package/dist/esm/lib/bytes/bytesToSize.js +1 -1
  80. package/dist/esm/lib/bytes/bytesToSize.js.map +1 -1
  81. package/package.json +5 -5
  82. package/src/components/error/SimpleError.tsx +2 -2
  83. package/src/components/form/Field.styles.ts +28 -9
  84. package/src/components/form/FormField.tsx +3 -1
  85. package/src/components/form/Select.tsx +21 -18
  86. package/src/components/form/Upload/BaseUpload.tsx +366 -0
  87. package/src/components/form/Upload/Upload.tsx +8 -360
  88. package/src/components/form/Upload/UploadedFile.tsx +1 -1
  89. package/src/components/form/Upload/WithUploadToIpfs.tsx +1 -1
  90. package/src/components/form/index.ts +2 -1
  91. package/src/components/form/types.ts +5 -2
  92. package/src/index.tsx +1 -0
  93. package/src/lib/bytes/bytesToSize.ts +1 -1
@@ -1,360 +1,8 @@
1
- import * as Sentry from "@sentry/browser";
2
- import { useField } from "formik";
3
- import { Image, Trash, VideoCamera } from "phosphor-react";
4
- import React, { useCallback, useEffect, useRef, useState } from "react";
5
- import { loadAndSetMedia } from "../../../lib/base64/base64";
6
- import bytesToSize from "../../../lib/bytes/bytesToSize";
7
- import { theme } from "../../../theme";
8
-
9
- import Loading from "../../ui/loading/LoadingWrapper";
10
- import ThemedButton from "../../ui/ThemedButton";
11
- import { Typography } from "../../ui/Typography";
12
- import Error from "../Error";
13
- import {
14
- FieldFileUploadWrapper,
15
- FieldInput,
16
- FileUploadWrapper,
17
- ImagePreview,
18
- VideoPreview
19
- } from "../Field.styles";
20
- import type { UploadFileType, UploadProps, FileProps } from "../types";
21
- import UploadedFiles from "./UploadedFiles";
22
- import { WithUploadToIpfs, WithUploadToIpfsProps } from "./WithUploadToIpfs";
23
- import { useModal } from "../../modal/useModal";
24
- import { ImageEditorModal } from "./ImageEditorModal/ImageEditorModal";
25
- const colors = theme.colors.light;
26
-
27
- function Upload({
28
- name,
29
- accept = "image/*",
30
- disabled,
31
- maxSize,
32
- multiple = false,
33
- trigger,
34
- onFilesSelect,
35
- placeholder,
36
- wrapperProps,
37
- onLoadSinglePreviewImage,
38
- withUpload,
39
- withEditor,
40
- saveToIpfs,
41
- loadMedia,
42
- onLoading,
43
- width,
44
- height,
45
- borderRadius,
46
- imgPreviewStyle,
47
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
48
- removeFile,
49
- saveButtonTheme,
50
- ...props
51
- }: UploadProps & WithUploadToIpfsProps) {
52
- const { updateProps, store } = useModal();
53
- const [showEditor, setShowEditor] = useState<boolean>(false);
54
- const [isLoading, setIsLoading] = useState<boolean>(false);
55
- const [preview, setPreview] = useState<string | null>();
56
- const [field, meta, helpers] = useField(name);
57
-
58
- const handleLoading = useCallback(
59
- (loadingValue: boolean) => {
60
- onLoading?.(loadingValue);
61
- setIsLoading(loadingValue);
62
- },
63
- [onLoading]
64
- );
65
-
66
- const errorMessage = meta.error && meta.touched ? meta.error : "";
67
- const displayError = typeof errorMessage === "string" && errorMessage !== "";
68
-
69
- const inputRef = useRef<HTMLInputElement | null>(null);
70
- const [nativeFiles, setNativeFiles] = useState<File[] | null>(null);
71
- const setFiles = useCallback(
72
- (value: unknown) => {
73
- helpers.setValue(value);
74
- },
75
- [helpers]
76
- );
77
-
78
- const files = field.value as UploadFileType[];
79
- const mimetypes = accept.split(",").map((acc) => acc.trim());
80
- const isImageOnly = mimetypes.every((mimetype) =>
81
- mimetype.startsWith("image/")
82
- );
83
- const isVideoOnly = mimetypes.every((mimetype) =>
84
- mimetype.startsWith("video/")
85
- );
86
-
87
- useEffect(() => {
88
- onFilesSelect?.(files);
89
- helpers.setValue(files);
90
-
91
- if (!multiple && files && files?.length !== 0) {
92
- if (isImageOnly) {
93
- if (withUpload) {
94
- loadIpfsImagePreview(files[0] as FileProps);
95
- } else {
96
- loadAndSetMedia(files[0] as File, (base64Uri) => {
97
- setPreview(base64Uri);
98
- onLoadSinglePreviewImage?.(base64Uri);
99
- });
100
- }
101
- } else if (isVideoOnly) {
102
- if (withUpload) {
103
- loadIpfsVideo(files[0] as FileProps);
104
- } else {
105
- loadAndSetMedia(files[0] as File, (base64Uri) => {
106
- setPreview(base64Uri);
107
- });
108
- }
109
- }
110
- }
111
- }, [files]); // eslint-disable-line
112
-
113
- const loadIpfsVideo = async (file: FileProps) => {
114
- const fileSrc = file && file?.src ? file?.src : false;
115
- if (!fileSrc) {
116
- return false;
117
- }
118
- handleLoading(true);
119
- try {
120
- const imagePreview = await loadMedia(fileSrc || "");
121
- if (imagePreview) {
122
- setPreview(imagePreview);
123
- } else {
124
- console.warn(
125
- `imagePreview ${imagePreview} is falsy in loadIpfsImagePreview`
126
- );
127
- }
128
- } catch (error) {
129
- console.error(error);
130
- Sentry.captureException(error);
131
- } finally {
132
- handleLoading(false);
133
- }
134
- };
135
-
136
- const loadIpfsImagePreview = async (file: FileProps) => {
137
- const fileSrc = file && file?.src ? file?.src : false;
138
- if (!fileSrc) {
139
- return false;
140
- }
141
- try {
142
- handleLoading(true);
143
- const imagePreview = await loadMedia(fileSrc || "");
144
- if (imagePreview) {
145
- setPreview(imagePreview);
146
- onLoadSinglePreviewImage?.(imagePreview);
147
- } else {
148
- console.warn(
149
- `imagePreview ${imagePreview} is falsy in loadIpfsImagePreview`
150
- );
151
- }
152
- } catch (error) {
153
- console.error(error);
154
- Sentry.captureException(error);
155
- } finally {
156
- handleLoading(false);
157
- }
158
- };
159
-
160
- const handleChooseFile = () => {
161
- const input = inputRef.current;
162
- if (input) {
163
- input.click();
164
- }
165
- };
166
-
167
- const handleRemoveAllFiles = () => {
168
- if (disabled) {
169
- return;
170
- }
171
- setFiles([]);
172
- setPreview(null);
173
- };
174
-
175
- const handleRemoveFile = (index: number) => {
176
- const newArray = files.filter(
177
- (i: File | FileProps, k: number) => k !== index
178
- );
179
- setFiles(newArray);
180
- };
181
-
182
- const handleChange = useCallback(
183
- async (filesArray: File[] | null) => {
184
- if (!meta.touched) {
185
- helpers.setTouched(true);
186
- }
187
-
188
- if (!filesArray) {
189
- return;
190
- }
191
- for (const file of filesArray) {
192
- if (maxSize) {
193
- if (file.size > maxSize) {
194
- const error = `File size cannot exceed more than ${bytesToSize(
195
- maxSize
196
- )}`;
197
- // TODO: change to notification
198
- console.error(error);
199
- }
200
- }
201
- }
202
- setFiles(filesArray);
203
- },
204
- [helpers, maxSize, meta.touched, setFiles]
205
- );
206
-
207
- const handleSave = useCallback(
208
- async (efiles: File[] | null) => {
209
- if (!meta.touched) {
210
- helpers.setTouched(true);
211
- }
212
- handleLoading(true);
213
- const files = await saveToIpfs(efiles);
214
- if (files) {
215
- setFiles(files);
216
- } else {
217
- setFiles([]);
218
- console.warn(
219
- `There has been an error because 'files' ${files} is falsy in handleSave`
220
- );
221
- }
222
- handleLoading(false);
223
- },
224
- [meta.touched, handleLoading, saveToIpfs, helpers, setFiles]
225
- );
226
- const saveFn = withUpload ? handleSave : handleChange;
227
- const style = {
228
- borderRadius: borderRadius ? `${borderRadius}%` : "",
229
- width: width ? `100%` : ""
230
- };
231
- return (
232
- <>
233
- {withEditor && showEditor && (
234
- <ImageEditorModal
235
- saveButtonTheme={saveButtonTheme}
236
- files={nativeFiles}
237
- borderRadius={borderRadius}
238
- width={width}
239
- height={height}
240
- hideModal={async (fileList) => {
241
- if (fileList) {
242
- await saveFn(fileList);
243
- }
244
-
245
- setShowEditor(false);
246
- updateProps({
247
- ...store,
248
- modalType: store.modalType,
249
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
250
- // @ts-ignore
251
- modalProps: {
252
- ...store.modalProps,
253
- hidden: false
254
- }
255
- });
256
- }}
257
- />
258
- )}
259
- <FieldFileUploadWrapper {...wrapperProps} $disabled={!!disabled}>
260
- <FieldInput
261
- {...props}
262
- hidden
263
- type="file"
264
- accept={accept}
265
- multiple={multiple}
266
- onChange={async (e) => {
267
- const files = e.target.files
268
- ? Object.values(e.target.files)
269
- : e.target.files;
270
-
271
- if (files && withEditor) {
272
- setNativeFiles(files);
273
- setShowEditor(true);
274
- updateProps({
275
- ...store,
276
- modalType: store.modalType,
277
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
278
- // @ts-ignore
279
- modalProps: {
280
- ...store.modalProps,
281
- hidden: true
282
- }
283
- });
284
- } else {
285
- await saveFn(files);
286
- }
287
- e.target.value = ""; // allow user to select the same file again
288
- }}
289
- ref={(ref) => {
290
- inputRef.current = ref;
291
- }}
292
- disabled={disabled}
293
- />
294
- {trigger ? (
295
- <ThemedButton onClick={handleChooseFile} type="button">
296
- <>{trigger}</>
297
- </ThemedButton>
298
- ) : (
299
- <FileUploadWrapper
300
- data-disabled={disabled}
301
- onClick={handleChooseFile}
302
- error={errorMessage}
303
- style={style}
304
- >
305
- {isLoading ? (
306
- <Loading size={2} />
307
- ) : (
308
- <>
309
- {field.value && field.value?.length !== 0 && preview ? (
310
- <>
311
- {isVideoOnly ? (
312
- <VideoPreview
313
- src={
314
- preview?.startsWith("http")
315
- ? preview
316
- : "data:video/mp4;base64," +
317
- preview?.substring(
318
- "data:application/octet-stream;base64,".length
319
- )
320
- }
321
- autoPlay
322
- muted
323
- loop
324
- />
325
- ) : (
326
- <ImagePreview
327
- style={{ ...imgPreviewStyle }}
328
- src={preview}
329
- />
330
- )}
331
- </>
332
- ) : isVideoOnly ? (
333
- <VideoCamera size={24} />
334
- ) : (
335
- <Image size={24} />
336
- )}
337
- {placeholder && (
338
- <Typography tag="p" style={{ marginBottom: "0" }}>
339
- {placeholder}
340
- </Typography>
341
- )}
342
- </>
343
- )}
344
- </FileUploadWrapper>
345
- )}
346
- {!disabled && field.value && field.value?.length !== 0 && preview && (
347
- <div onClick={handleRemoveAllFiles} data-remove style={style}>
348
- <Trash size={24} color={colors.white} />
349
- </div>
350
- )}
351
- {multiple && (
352
- <UploadedFiles files={files} handleRemoveFile={handleRemoveFile} />
353
- )}
354
- </FieldFileUploadWrapper>
355
- <Error display={displayError} message={errorMessage} />
356
- </>
357
- );
358
- }
359
-
360
- export default WithUploadToIpfs(Upload);
1
+ import { UploadProps } from "../types";
2
+ import BaseUpload from "./BaseUpload";
3
+ import React from "react";
4
+ export type { UploadProps } from "../types";
5
+
6
+ export const Upload = (props: UploadProps) => {
7
+ return <BaseUpload {...props} />;
8
+ };
@@ -1,7 +1,7 @@
1
1
  import { ImageSquare, X } from "phosphor-react";
2
2
  import React, { useCallback } from "react";
3
3
  import styled from "styled-components";
4
- import bytesToSize from "../../../lib/bytes/bytesToSize";
4
+ import { bytesToSize } from "../../../lib/bytes/bytesToSize";
5
5
  import { theme } from "../../../theme";
6
6
 
7
7
  import { Grid } from "../../ui/Grid";
@@ -8,7 +8,7 @@ import ErrorToast from "../../toasts/common/ErrorToast";
8
8
  import { Typography } from "../../ui/Typography";
9
9
  import { FileProps, UploadProps } from "../types";
10
10
  import { useSaveImageToIpfs } from "../../../hooks/ipfs/useSaveImageToIpfs";
11
- import bytesToSize from "../../../lib/bytes/bytesToSize";
11
+ import { bytesToSize } from "../../../lib/bytes/bytesToSize";
12
12
 
13
13
  const colors = theme.colors.light;
14
14
 
@@ -9,4 +9,5 @@ export { default as Select, SelectProps } from "./Select";
9
9
  export * from "./CountrySelect";
10
10
  export * from "./BaseTagsInput";
11
11
  export * from "./BaseTextArea";
12
- export { default as Upload } from "./Upload/Upload";
12
+ export { default as BaseUpload, BaseUploadProps } from "./Upload/BaseUpload";
13
+ export { Upload, UploadProps } from "./Upload/Upload";
@@ -2,7 +2,8 @@ import { ReactNode } from "react";
2
2
  import { SingleValue } from "react-select";
3
3
  import { CSSProperties } from "styled-components";
4
4
  import { ImageEditorModalProps } from "./Upload/ImageEditorModal/ImageEditorModal";
5
- import type { TextAreaTheme } from "./Field.styles";
5
+ import type { FileUploadWrapperTheme, TextAreaTheme } from "./Field.styles";
6
+ import type { GridProps } from "../ui/Grid";
6
7
 
7
8
  export interface BaseProps {
8
9
  name: string;
@@ -30,7 +31,7 @@ export interface ErrorProps {
30
31
  message?: string;
31
32
  }
32
33
 
33
- export interface FormFieldProps {
34
+ export interface FormFieldProps extends GridProps {
34
35
  title: string;
35
36
  titleIcon?: ReactNode;
36
37
  subTitle?: string | false;
@@ -100,6 +101,7 @@ export interface SelectProps extends BaseProps {
100
101
  Partial<{
101
102
  selected: Partial<CSSProperties>;
102
103
  disabled: Partial<CSSProperties>;
104
+ focus: Partial<CSSProperties>;
103
105
  }>;
104
106
  placeholder: Partial<CSSProperties> & Partial<{ error: CSSProperties }>;
105
107
  input: Partial<CSSProperties> & Partial<{ error: CSSProperties }>;
@@ -122,6 +124,7 @@ export type UploadProps = BaseProps & {
122
124
  width?: number;
123
125
  height?: number;
124
126
  imgPreviewStyle?: Pick<CSSProperties, "objectFit">;
127
+ theme?: Partial<{ triggerTheme: FileUploadWrapperTheme }>;
125
128
  } & (
126
129
  | {
127
130
  withEditor: true;
package/src/index.tsx CHANGED
@@ -71,6 +71,7 @@ export * from "./components/ui/MuteButton";
71
71
  export * from "./components/ui/CardCTA";
72
72
  export * from "./components/form";
73
73
  export * from "./lib/magicLink/logout";
74
+ export * from "./lib/bytes/bytesToSize";
74
75
  export * from "./lib/magicLink/provider";
75
76
  export * from "./lib/const/networks";
76
77
  export * from "./lib/errors/transactions";
@@ -1,4 +1,4 @@
1
- export default function bytesToSize(bytes: number) {
1
+ export function bytesToSize(bytes: number) {
2
2
  const sizes = ["Bytes", "KB", "MB", "GB", "TB"];
3
3
  const i = Math.floor(Math.log(bytes) / Math.log(1024));
4
4
  return `${Math.round(bytes / Math.pow(1024, i))} ${sizes[i]}`;