@oneblink/apps-react 8.10.0-alpha.3 → 8.10.0-beta.2

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.
@@ -1,9 +1,9 @@
1
1
  import * as React from 'react';
2
2
  import { Area } from 'react-easy-crop';
3
- declare function AnnotationModal({ imageSrc, onClose, onSave, }: {
3
+ declare function CropModal({ imageSrc, onClose, onSave, }: {
4
4
  imageSrc: string;
5
5
  onClose: () => void;
6
6
  onSave: (imageArea: Area) => void;
7
7
  }): React.JSX.Element;
8
- declare const _default: React.MemoExoticComponent<typeof AnnotationModal>;
8
+ declare const _default: React.MemoExoticComponent<typeof CropModal>;
9
9
  export default _default;
@@ -1,8 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import ImageCropper from '.';
3
3
  import scrollingService from '../../services/scrolling-service';
4
- function AnnotationModal({ imageSrc, onClose, onSave, }) {
5
- const annotationContentElementRef = React.useRef(null);
4
+ function CropModal({ imageSrc, onClose, onSave, }) {
6
5
  const [croppedAreaPixels, setCroppedAreaPixels] = React.useState(null);
7
6
  const handleSaveCrop = React.useCallback(async () => {
8
7
  if (!croppedAreaPixels)
@@ -18,11 +17,11 @@ function AnnotationModal({ imageSrc, onClose, onSave, }) {
18
17
  return (React.createElement("div", { className: "modal is-active" },
19
18
  React.createElement("div", { className: "modal-background-faded" }),
20
19
  React.createElement("div", { className: "ob-crop ob-border-radius" },
21
- React.createElement("div", { ref: annotationContentElementRef, className: "ob-crop__content ob-border-radius" },
20
+ React.createElement("div", { className: "ob-crop__content ob-border-radius" },
22
21
  React.createElement(ImageCropper, { imgSrc: imageSrc, onCropComplete: setCroppedAreaPixels })),
23
22
  React.createElement("div", { className: "ob-annotation__buttons ob-annotation__buttons-actions" },
24
23
  React.createElement("button", { type: "button", className: "button is-light ob-button ob-annotation__button ob-annotation__button-action cypress-crop-cancel-button", onClick: onClose }, "Cancel"),
25
24
  React.createElement("button", { type: "button", className: "button is-primary ob-button ob-annotation__button ob-annotation__button-action cypress-crop-save-button", disabled: !croppedAreaPixels, onClick: handleSaveCrop }, "Save")))));
26
25
  }
27
- export default React.memo(AnnotationModal);
26
+ export default React.memo(CropModal);
28
27
  //# sourceMappingURL=CropModal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CropModal.js","sourceRoot":"","sources":["../../../src/components/ImageCropper/CropModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,YAAY,MAAM,GAAG,CAAA;AAE5B,OAAO,gBAAgB,MAAM,kCAAkC,CAAA;AAE/D,SAAS,eAAe,CAAC,EACvB,QAAQ,EACR,OAAO,EACP,MAAM,GAKP;IACC,MAAM,2BAA2B,GAAG,KAAK,CAAC,MAAM,CAAiB,IAAI,CAAC,CAAA;IAEtE,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAC9D,IAAI,CACL,CAAA;IAED,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;QAClD,IAAI,CAAC,iBAAiB;YAAE,OAAM;QAE9B,MAAM,CAAC,iBAAiB,CAAC,CAAA;IAC3B,CAAC,EAAE,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAA;IAE/B,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,gBAAgB,CAAC,gBAAgB,EAAE,CAAA;QAEnC,OAAO,GAAG,EAAE;YACV,gBAAgB,CAAC,eAAe,EAAE,CAAA;QACpC,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,CACL,6BAAK,SAAS,EAAC,iBAAiB;QAC9B,6BAAK,SAAS,EAAC,wBAAwB,GAAO;QAC9C,6BAAK,SAAS,EAAC,0BAA0B;YACvC,6BACE,GAAG,EAAE,2BAA2B,EAChC,SAAS,EAAC,mCAAmC;gBAE7C,oBAAC,YAAY,IACX,MAAM,EAAE,QAAQ,EAChB,cAAc,EAAE,oBAAoB,GACpC,CACE;YACN,6BAAK,SAAS,EAAC,uDAAuD;gBACpE,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,yGAAyG,EACnH,OAAO,EAAE,OAAO,aAGT;gBACT,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,yGAAyG,EACnH,QAAQ,EAAE,CAAC,iBAAiB,EAC5B,OAAO,EAAE,cAAc,WAGhB,CACL,CACF,CACF,CACP,CAAA;AACH,CAAC;AAED,eAAe,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA","sourcesContent":["import * as React from 'react'\nimport ImageCropper from '.'\nimport { Area } from 'react-easy-crop'\nimport scrollingService from '../../services/scrolling-service'\n\nfunction AnnotationModal({\n imageSrc,\n onClose,\n onSave,\n}: {\n imageSrc: string\n onClose: () => void\n onSave: (imageArea: Area) => void\n}) {\n const annotationContentElementRef = React.useRef<HTMLDivElement>(null)\n\n const [croppedAreaPixels, setCroppedAreaPixels] = React.useState<Area | null>(\n null,\n )\n\n const handleSaveCrop = React.useCallback(async () => {\n if (!croppedAreaPixels) return\n\n onSave(croppedAreaPixels)\n }, [croppedAreaPixels, onSave])\n\n React.useEffect(() => {\n scrollingService.disableScrolling()\n\n return () => {\n scrollingService.enableScrolling()\n }\n }, [])\n\n return (\n <div className=\"modal is-active\">\n <div className=\"modal-background-faded\"></div>\n <div className=\"ob-crop ob-border-radius\">\n <div\n ref={annotationContentElementRef}\n className=\"ob-crop__content ob-border-radius\"\n >\n <ImageCropper\n imgSrc={imageSrc}\n onCropComplete={setCroppedAreaPixels}\n />\n </div>\n <div className=\"ob-annotation__buttons ob-annotation__buttons-actions\">\n <button\n type=\"button\"\n className=\"button is-light ob-button ob-annotation__button ob-annotation__button-action cypress-crop-cancel-button\"\n onClick={onClose}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"button is-primary ob-button ob-annotation__button ob-annotation__button-action cypress-crop-save-button\"\n disabled={!croppedAreaPixels}\n onClick={handleSaveCrop}\n >\n Save\n </button>\n </div>\n </div>\n </div>\n )\n}\n\nexport default React.memo(AnnotationModal)\n"]}
1
+ {"version":3,"file":"CropModal.js","sourceRoot":"","sources":["../../../src/components/ImageCropper/CropModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,YAAY,MAAM,GAAG,CAAA;AAE5B,OAAO,gBAAgB,MAAM,kCAAkC,CAAA;AAE/D,SAAS,SAAS,CAAC,EACjB,QAAQ,EACR,OAAO,EACP,MAAM,GAKP;IACC,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAC9D,IAAI,CACL,CAAA;IAED,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;QAClD,IAAI,CAAC,iBAAiB;YAAE,OAAM;QAE9B,MAAM,CAAC,iBAAiB,CAAC,CAAA;IAC3B,CAAC,EAAE,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAA;IAE/B,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,gBAAgB,CAAC,gBAAgB,EAAE,CAAA;QAEnC,OAAO,GAAG,EAAE;YACV,gBAAgB,CAAC,eAAe,EAAE,CAAA;QACpC,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,CACL,6BAAK,SAAS,EAAC,iBAAiB;QAC9B,6BAAK,SAAS,EAAC,wBAAwB,GAAO;QAC9C,6BAAK,SAAS,EAAC,0BAA0B;YACvC,6BAAK,SAAS,EAAC,mCAAmC;gBAChD,oBAAC,YAAY,IACX,MAAM,EAAE,QAAQ,EAChB,cAAc,EAAE,oBAAoB,GACpC,CACE;YACN,6BAAK,SAAS,EAAC,uDAAuD;gBACpE,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,yGAAyG,EACnH,OAAO,EAAE,OAAO,aAGT;gBACT,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,yGAAyG,EACnH,QAAQ,EAAE,CAAC,iBAAiB,EAC5B,OAAO,EAAE,cAAc,WAGhB,CACL,CACF,CACF,CACP,CAAA;AACH,CAAC;AAED,eAAe,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA","sourcesContent":["import * as React from 'react'\nimport ImageCropper from '.'\nimport { Area } from 'react-easy-crop'\nimport scrollingService from '../../services/scrolling-service'\n\nfunction CropModal({\n imageSrc,\n onClose,\n onSave,\n}: {\n imageSrc: string\n onClose: () => void\n onSave: (imageArea: Area) => void\n}) {\n const [croppedAreaPixels, setCroppedAreaPixels] = React.useState<Area | null>(\n null,\n )\n\n const handleSaveCrop = React.useCallback(async () => {\n if (!croppedAreaPixels) return\n\n onSave(croppedAreaPixels)\n }, [croppedAreaPixels, onSave])\n\n React.useEffect(() => {\n scrollingService.disableScrolling()\n\n return () => {\n scrollingService.enableScrolling()\n }\n }, [])\n\n return (\n <div className=\"modal is-active\">\n <div className=\"modal-background-faded\"></div>\n <div className=\"ob-crop ob-border-radius\">\n <div className=\"ob-crop__content ob-border-radius\">\n <ImageCropper\n imgSrc={imageSrc}\n onCropComplete={setCroppedAreaPixels}\n />\n </div>\n <div className=\"ob-annotation__buttons ob-annotation__buttons-actions\">\n <button\n type=\"button\"\n className=\"button is-light ob-button ob-annotation__button ob-annotation__button-action cypress-crop-cancel-button\"\n onClick={onClose}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"button is-primary ob-button ob-annotation__button ob-annotation__button-action cypress-crop-save-button\"\n disabled={!croppedAreaPixels}\n onClick={handleSaveCrop}\n >\n Save\n </button>\n </div>\n </div>\n </div>\n )\n}\n\nexport default React.memo(CropModal)\n"]}
@@ -99,7 +99,7 @@ const FormElementFile = ({ element, onRemove, file, onChange, disableUpload, ind
99
99
  }
100
100
  }, [file, onChange]);
101
101
  return (React.createElement(React.Fragment, null,
102
- React.createElement(FileCard, { element: element, isUploading: isUploading, isUploadPaused: disableUpload, uploadErrorMessage: uploadErrorMessage, loadAttachmentUrlError: loadAttachmentUrlError, isLoadingAttachmentUrl: isLoadingAttachmentUrl || state.isLoading, attachmentUrl: attachmentUrl, isContentTypeImage: isContentTypeImage, fileName: file.fileName, onDownload: canDownload ? handleDownload : undefined, onRemove: handleRemove, onRetry: handleRetry, progress: progress, index: index, onAnnotate: setIsAnnotating, onCrop: setIsCropping }),
102
+ React.createElement(FileCard, { element: element, isUploading: isUploading, isUploadPaused: disableUpload, uploadErrorMessage: uploadErrorMessage, loadAttachmentUrlError: loadAttachmentUrlError, isLoadingAttachmentUrl: isLoadingAttachmentUrl || state.isLoading, attachmentUrl: attachmentUrl, isContentTypeImage: isContentTypeImage, fileName: file.fileName, onDownload: canDownload ? handleDownload : undefined, onRemove: handleRemove, onRetry: handleRetry, progress: progress, index: index, onAnnotate: isContentTypeImage ? setIsAnnotating : undefined, onCrop: isContentTypeImage ? setIsCropping : undefined }),
103
103
  isCropping && attachmentUrl && (React.createElement(CropModal, { imageSrc: attachmentUrl, onClose: clearIsCropping, onSave: handleSaveCrop })),
104
104
  isAnnotating && attachmentUrl && (React.createElement(AnnotationModal, { imageSrc: attachmentUrl, onClose: clearIsAnnotating, onSave: handleAnnotate })),
105
105
  state.error && (React.createElement(Modal, { isOpen: true, title: "Whoops...", className: "cypress-error-modal", titleClassName: "cypress-error-title", actions: React.createElement("button", { type: "button", className: "button ob-button is-primary cypress-close-error-button", onClick: () => setState({ isLoading: false }), autoFocus: true }, "Okay") },
@@ -1 +1 @@
1
- {"version":3,"file":"FormElementFile.js","sourceRoot":"","sources":["../../src/form-elements/FormElementFile.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport downloadAttachment from '../services/download-file'\nimport { FormTypes } from '@oneblink/types'\nimport useAttachment, { OnChange } from '../hooks/attachments/useAttachment'\nimport FileCard from '../components/renderer/attachments/FileCard'\nimport { attachmentsService } from '@oneblink/apps'\nimport useBooleanState from '../hooks/useBooleanState'\nimport CropModal from '../components/ImageCropper/CropModal'\nimport AnnotationModal, {\n superimposeAnnotationOnImage,\n} from '../components/renderer/AnnotationModal'\nimport { Area } from 'react-easy-crop'\nimport { generateCroppedImageBlob } from '../components/ImageCropper'\nimport { prepareNewAttachment } from '../services/attachments'\nimport Modal from '../components/renderer/Modal'\n\ntype Props = {\n element: FormTypes.FilesElement\n /** If set to `undefined`, the remove button will be hidden */\n onRemove: ((id: string) => void) | undefined\n file: attachmentsService.Attachment\n disableUpload: boolean\n onChange: OnChange\n index: number\n}\n\nconst FormElementFile = ({\n element,\n onRemove,\n file,\n onChange,\n disableUpload,\n index,\n}: Props) => {\n const [isAnnotating, setIsAnnotating, clearIsAnnotating] =\n useBooleanState(false)\n const [isCropping, setIsCropping, clearIsCropping] = useBooleanState(false)\n const [state, setState] = React.useState<{\n isLoading: boolean\n error?: Error\n }>({\n isLoading: false,\n error: undefined,\n })\n const {\n attachmentUrl,\n contentType,\n isUploading,\n uploadErrorMessage,\n isLoadingAttachmentUrl,\n loadAttachmentUrlError,\n isContentTypeImage,\n canDownload,\n progress,\n } = useAttachment(file, element, onChange, disableUpload)\n\n const handleRemove = React.useMemo(() => {\n if (!onRemove) {\n return\n }\n return () => {\n if (!file.type) {\n return onRemove(file.id)\n }\n return onRemove(file._id)\n }\n }, [file, onRemove])\n\n const handleDownload = React.useCallback(async () => {\n await downloadAttachment(file)\n }, [file])\n\n const handleAnnotate = React.useCallback(\n async (annotationDataUri: string) => {\n if (!attachmentUrl || file.type) return\n clearIsAnnotating()\n\n setState({\n isLoading: true,\n })\n\n try {\n const blob = await superimposeAnnotationOnImage({\n annotationDataUri,\n attachmentUrl,\n })\n setState({\n isLoading: false,\n })\n if (!blob) return\n const attachment = prepareNewAttachment(blob, file.fileName, element)\n onChange(file.id, attachment)\n } catch (error) {\n setState({\n error: error as Error,\n isLoading: false,\n })\n }\n },\n [attachmentUrl, clearIsAnnotating, element, file, onChange],\n )\n const handleSaveCrop = React.useCallback(\n async (croppedAreaPixels: Area) => {\n if (!attachmentUrl || file.type) return\n clearIsCropping()\n\n setState({\n isLoading: true,\n })\n\n try {\n const croppedImage = await generateCroppedImageBlob({\n croppedAreaPixels,\n imgSrc: attachmentUrl,\n fileType: contentType,\n })\n setState({\n isLoading: false,\n })\n if (!croppedImage) return\n const attachment = prepareNewAttachment(\n croppedImage,\n file.fileName,\n element,\n )\n onChange(file.id, attachment)\n } catch (error) {\n setState({\n error: error as Error,\n isLoading: false,\n })\n }\n },\n [attachmentUrl, clearIsCropping, contentType, element, file, onChange],\n )\n const handleRetry = React.useMemo(() => {\n if (file.type === 'ERROR' && file.data) {\n return () => {\n onChange(file._id, {\n type: 'NEW',\n _id: file._id,\n data: file.data,\n fileName: file.fileName,\n isPrivate: file.isPrivate,\n })\n }\n }\n }, [file, onChange])\n\n return (\n <>\n <FileCard\n element={element}\n isUploading={isUploading}\n isUploadPaused={disableUpload}\n uploadErrorMessage={uploadErrorMessage}\n loadAttachmentUrlError={loadAttachmentUrlError}\n isLoadingAttachmentUrl={isLoadingAttachmentUrl || state.isLoading}\n attachmentUrl={attachmentUrl}\n isContentTypeImage={isContentTypeImage}\n fileName={file.fileName}\n onDownload={canDownload ? handleDownload : undefined}\n onRemove={handleRemove}\n onRetry={handleRetry}\n progress={progress}\n index={index}\n onAnnotate={setIsAnnotating}\n onCrop={setIsCropping}\n />\n {isCropping && attachmentUrl && (\n <CropModal\n imageSrc={attachmentUrl}\n onClose={clearIsCropping}\n onSave={handleSaveCrop}\n />\n )}\n {isAnnotating && attachmentUrl && (\n <AnnotationModal\n imageSrc={attachmentUrl}\n onClose={clearIsAnnotating}\n onSave={handleAnnotate}\n />\n )}\n {state.error && (\n <Modal\n isOpen\n title=\"Whoops...\"\n className=\"cypress-error-modal\"\n titleClassName=\"cypress-error-title\"\n actions={\n <button\n type=\"button\"\n className=\"button ob-button is-primary cypress-close-error-button\"\n onClick={() => setState({ isLoading: false })}\n autoFocus\n >\n Okay\n </button>\n }\n >\n <p>\n An error occurred while attempting to edit an image. Please click{' '}\n <b>Okay</b> below to try again. If the problem persists, please\n contact support.\n </p>\n\n <div className=\"content has-margin-top-6\">\n <blockquote>{state.error.toString()}</blockquote>\n </div>\n </Modal>\n )}\n </>\n )\n}\n\nexport default React.memo<Props>(FormElementFile)\n"]}
1
+ {"version":3,"file":"FormElementFile.js","sourceRoot":"","sources":["../../src/form-elements/FormElementFile.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport downloadAttachment from '../services/download-file'\nimport { FormTypes } from '@oneblink/types'\nimport useAttachment, { OnChange } from '../hooks/attachments/useAttachment'\nimport FileCard from '../components/renderer/attachments/FileCard'\nimport { attachmentsService } from '@oneblink/apps'\nimport useBooleanState from '../hooks/useBooleanState'\nimport CropModal from '../components/ImageCropper/CropModal'\nimport AnnotationModal, {\n superimposeAnnotationOnImage,\n} from '../components/renderer/AnnotationModal'\nimport { Area } from 'react-easy-crop'\nimport { generateCroppedImageBlob } from '../components/ImageCropper'\nimport { prepareNewAttachment } from '../services/attachments'\nimport Modal from '../components/renderer/Modal'\n\ntype Props = {\n element: FormTypes.FilesElement\n /** If set to `undefined`, the remove button will be hidden */\n onRemove: ((id: string) => void) | undefined\n file: attachmentsService.Attachment\n disableUpload: boolean\n onChange: OnChange\n index: number\n}\n\nconst FormElementFile = ({\n element,\n onRemove,\n file,\n onChange,\n disableUpload,\n index,\n}: Props) => {\n const [isAnnotating, setIsAnnotating, clearIsAnnotating] =\n useBooleanState(false)\n const [isCropping, setIsCropping, clearIsCropping] = useBooleanState(false)\n const [state, setState] = React.useState<{\n isLoading: boolean\n error?: Error\n }>({\n isLoading: false,\n error: undefined,\n })\n const {\n attachmentUrl,\n contentType,\n isUploading,\n uploadErrorMessage,\n isLoadingAttachmentUrl,\n loadAttachmentUrlError,\n isContentTypeImage,\n canDownload,\n progress,\n } = useAttachment(file, element, onChange, disableUpload)\n\n const handleRemove = React.useMemo(() => {\n if (!onRemove) {\n return\n }\n return () => {\n if (!file.type) {\n return onRemove(file.id)\n }\n return onRemove(file._id)\n }\n }, [file, onRemove])\n\n const handleDownload = React.useCallback(async () => {\n await downloadAttachment(file)\n }, [file])\n\n const handleAnnotate = React.useCallback(\n async (annotationDataUri: string) => {\n if (!attachmentUrl || file.type) return\n clearIsAnnotating()\n\n setState({\n isLoading: true,\n })\n\n try {\n const blob = await superimposeAnnotationOnImage({\n annotationDataUri,\n attachmentUrl,\n })\n setState({\n isLoading: false,\n })\n if (!blob) return\n const attachment = prepareNewAttachment(blob, file.fileName, element)\n onChange(file.id, attachment)\n } catch (error) {\n setState({\n error: error as Error,\n isLoading: false,\n })\n }\n },\n [attachmentUrl, clearIsAnnotating, element, file, onChange],\n )\n const handleSaveCrop = React.useCallback(\n async (croppedAreaPixels: Area) => {\n if (!attachmentUrl || file.type) return\n clearIsCropping()\n\n setState({\n isLoading: true,\n })\n\n try {\n const croppedImage = await generateCroppedImageBlob({\n croppedAreaPixels,\n imgSrc: attachmentUrl,\n fileType: contentType,\n })\n setState({\n isLoading: false,\n })\n if (!croppedImage) return\n const attachment = prepareNewAttachment(\n croppedImage,\n file.fileName,\n element,\n )\n onChange(file.id, attachment)\n } catch (error) {\n setState({\n error: error as Error,\n isLoading: false,\n })\n }\n },\n [attachmentUrl, clearIsCropping, contentType, element, file, onChange],\n )\n const handleRetry = React.useMemo(() => {\n if (file.type === 'ERROR' && file.data) {\n return () => {\n onChange(file._id, {\n type: 'NEW',\n _id: file._id,\n data: file.data,\n fileName: file.fileName,\n isPrivate: file.isPrivate,\n })\n }\n }\n }, [file, onChange])\n\n return (\n <>\n <FileCard\n element={element}\n isUploading={isUploading}\n isUploadPaused={disableUpload}\n uploadErrorMessage={uploadErrorMessage}\n loadAttachmentUrlError={loadAttachmentUrlError}\n isLoadingAttachmentUrl={isLoadingAttachmentUrl || state.isLoading}\n attachmentUrl={attachmentUrl}\n isContentTypeImage={isContentTypeImage}\n fileName={file.fileName}\n onDownload={canDownload ? handleDownload : undefined}\n onRemove={handleRemove}\n onRetry={handleRetry}\n progress={progress}\n index={index}\n onAnnotate={isContentTypeImage ? setIsAnnotating : undefined}\n onCrop={isContentTypeImage ? setIsCropping : undefined}\n />\n {isCropping && attachmentUrl && (\n <CropModal\n imageSrc={attachmentUrl}\n onClose={clearIsCropping}\n onSave={handleSaveCrop}\n />\n )}\n {isAnnotating && attachmentUrl && (\n <AnnotationModal\n imageSrc={attachmentUrl}\n onClose={clearIsAnnotating}\n onSave={handleAnnotate}\n />\n )}\n {state.error && (\n <Modal\n isOpen\n title=\"Whoops...\"\n className=\"cypress-error-modal\"\n titleClassName=\"cypress-error-title\"\n actions={\n <button\n type=\"button\"\n className=\"button ob-button is-primary cypress-close-error-button\"\n onClick={() => setState({ isLoading: false })}\n autoFocus\n >\n Okay\n </button>\n }\n >\n <p>\n An error occurred while attempting to edit an image. Please click{' '}\n <b>Okay</b> below to try again. If the problem persists, please\n contact support.\n </p>\n\n <div className=\"content has-margin-top-6\">\n <blockquote>{state.error.toString()}</blockquote>\n </div>\n </Modal>\n )}\n </>\n )\n}\n\nexport default React.memo<Props>(FormElementFile)\n"]}
@@ -133,9 +133,10 @@ export default function useAttachment(value, element, onChange, disableUpload) {
133
133
  }
134
134
  let ignore = false;
135
135
  const abortController = new AbortController();
136
- const privateAttachmentUrl = tenants.current.apiOrigin + value.path;
137
136
  const effect = async () => {
138
137
  try {
138
+ const url = new URL(value.url, tenants.current.apiOrigin);
139
+ const privateAttachmentUrl = url.href;
139
140
  const blob = await urlToBlobAsync(privateAttachmentUrl, abortController.signal);
140
141
  if (ignore) {
141
142
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"useAttachment.js","sourceRoot":"","sources":["../../../src/hooks/attachments/useAttachment.ts"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { attachmentsService } from '@oneblink/apps'\nimport { FormTypes } from '@oneblink/types'\nimport useFormDefinition from '../useFormDefinition'\nimport useIsOffline from '../useIsOffline'\nimport { FormElementBinaryStorageValue } from '../../types/attachments'\nimport { checkIfContentTypeIsImage } from '../../services/attachments'\nimport useAuth from '../../hooks/useAuth'\nimport { urlToBlobAsync } from '../../services/blob-utils'\nimport useAttachmentBlobs from '../../hooks/attachments/useAttachmentBlobs'\nimport useOnUploadAttachmentContext from '../useOnUploadAttachment'\nimport tenants from '@oneblink/apps/dist/tenants'\n\nexport type OnChange = (\n id: string,\n attachment: attachmentsService.Attachment,\n) => void\n\nexport default function useAttachment(\n value: FormElementBinaryStorageValue,\n element: FormTypes.FormElementBinaryStorage,\n onChange: OnChange,\n disableUpload?: boolean,\n) {\n const isPrivate = element.storageType !== 'public'\n const form = useFormDefinition()\n const isOffline = useIsOffline()\n const onUploadAttachment = useOnUploadAttachmentContext()\n const { isLoggedIn, isUsingFormsKey } = useAuth()\n const { storeAttachmentBlobLocally, getAttachmentBlobLocally } =\n useAttachmentBlobs()\n\n const isAuthenticated = isLoggedIn || isUsingFormsKey\n\n const [attachmentUrlState, setAttachmentUrlState] = React.useState<{\n attachmentUrl?: string | null\n loadAttachmentUrlError?: Error\n isContentTypeImage?: boolean\n }>({})\n const [progressState, setProgressState] = React.useState<number | undefined>()\n\n const onProgress = React.useCallback(({ progress }: { progress: number }) => {\n setProgressState(progress)\n }, [])\n\n // TRIGGER UPLOAD\n React.useEffect(() => {\n const formId = form?.id\n\n if (\n isOffline ||\n disableUpload ||\n !formId ||\n !value ||\n typeof value !== 'object' ||\n value.type !== 'NEW'\n ) {\n return\n }\n\n const data = value.data\n if (!data) {\n onChange(value._id, {\n ...value,\n type: 'ERROR',\n errorMessage:\n 'We were unable to read this file from your file system. Please try again. If the problem persists, please contact your application administrators.',\n })\n return\n }\n\n let ignore = false\n const abortController = new AbortController()\n\n const effect = async () => {\n try {\n console.log('Attempting to upload attachment...', value.fileName)\n const upload = await onUploadAttachment(\n {\n formId,\n fileName: value.fileName,\n contentType: data.type,\n data,\n isPrivate,\n onProgress,\n },\n abortController.signal,\n )\n if (ignore) {\n return\n }\n\n storeAttachmentBlobLocally({ attachmentId: upload.id, blob: data })\n\n console.log('Successfully Uploaded attachment!', upload)\n\n // UPDATE ATTACHMENT\n onChange(value._id, upload)\n } catch (error) {\n if (ignore) {\n return\n }\n\n console.warn('Failed to upload attachment...', value.fileName, error)\n onChange(value._id, {\n ...value,\n type: 'ERROR',\n errorMessage: (error as Error).message,\n })\n }\n }\n\n effect()\n\n return () => {\n ignore = true\n abortController.abort()\n }\n }, [\n disableUpload,\n form?.id,\n isOffline,\n isPrivate,\n onChange,\n onProgress,\n onUploadAttachment,\n storeAttachmentBlobLocally,\n value,\n ])\n\n // TRIGGER DOWNLOAD\n React.useEffect(() => {\n if (!value) {\n return\n }\n\n // If the value is string we will assume a base64 data uri\n if (typeof value === 'string') {\n setAttachmentUrlState({\n attachmentUrl: value,\n })\n return\n }\n\n if (value.type) {\n if (!value.data) {\n return\n }\n\n const attachmentUrl = URL.createObjectURL(value.data)\n setAttachmentUrlState({\n attachmentUrl,\n isContentTypeImage: checkIfContentTypeIsImage(value.data.type),\n })\n return\n }\n\n // Check for locally stored Blob\n const locallyStoredAttachment = getAttachmentBlobLocally(value.id)\n if (locallyStoredAttachment) {\n const attachmentUrl = URL.createObjectURL(locallyStoredAttachment.blob)\n console.log('Created object url from locally stored Blob', attachmentUrl)\n setAttachmentUrlState({\n attachmentUrl,\n isContentTypeImage: checkIfContentTypeIsImage(value.contentType),\n })\n return\n }\n\n // If user is not logged in or is offline, we can't download private attachments.\n // If the blob was not stored locally (above) for some reason, the user is SOL\n if (!isAuthenticated || isOffline) {\n setAttachmentUrlState({\n attachmentUrl: null,\n })\n return\n }\n\n let ignore = false\n const abortController = new AbortController()\n const privateAttachmentUrl = tenants.current.apiOrigin + value.path\n\n const effect = async () => {\n try {\n const blob = await urlToBlobAsync(\n privateAttachmentUrl,\n abortController.signal,\n )\n if (ignore) {\n return\n }\n // Store private attachment in Context\n storeAttachmentBlobLocally({ attachmentId: value.id, blob })\n const attachmentUrl = URL.createObjectURL(blob)\n console.log(\n 'Created object url from private attachment for image',\n attachmentUrl,\n )\n setAttachmentUrlState({\n attachmentUrl: attachmentUrl,\n })\n } catch (error) {\n if (ignore) {\n return\n }\n console.warn('Error loading file:', error)\n setAttachmentUrlState({\n loadAttachmentUrlError: error as Error,\n })\n }\n }\n effect()\n\n return () => {\n ignore = true\n abortController.abort()\n }\n }, [\n getAttachmentBlobLocally,\n isAuthenticated,\n isOffline,\n storeAttachmentBlobLocally,\n value,\n ])\n\n React.useEffect(() => {\n return () => {\n const attachmentUrl = attachmentUrlState.attachmentUrl\n if (attachmentUrl && attachmentUrl.startsWith('blob:')) {\n console.log('revoking attachment url:', attachmentUrl)\n URL.revokeObjectURL(attachmentUrl)\n }\n }\n }, [attachmentUrlState.attachmentUrl])\n\n const isUploading = React.useMemo(() => {\n return !!(\n value &&\n typeof value !== 'string' &&\n value.type &&\n value.type === 'NEW'\n )\n }, [value])\n\n const uploadErrorMessage = React.useMemo(() => {\n if (\n value &&\n typeof value !== 'string' &&\n value.type &&\n value.type === 'ERROR'\n ) {\n return value.errorMessage\n }\n }, [value])\n\n const canDownload = React.useMemo(() => {\n if (!value) {\n return false\n }\n\n // legacy attachment as base64 data\n if (typeof value === 'string') {\n return true\n }\n\n // attachments still uploading or failed to upload\n if (value.type) {\n // can only be downloaded if we still have the data\n return !!value.data\n }\n\n // private attachments can only be downloaded if user is authenticated\n if (isAuthenticated) {\n return true\n }\n\n return false\n }, [isAuthenticated, value])\n\n return {\n isUploading,\n uploadErrorMessage,\n isLoadingAttachmentUrl: attachmentUrlState.attachmentUrl === undefined,\n ...attachmentUrlState,\n canDownload,\n progress: progressState,\n contentType:\n typeof value !== 'string' && !value?.type\n ? value?.contentType\n : undefined,\n }\n}\n"]}
1
+ {"version":3,"file":"useAttachment.js","sourceRoot":"","sources":["../../../src/hooks/attachments/useAttachment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,iBAAiB,MAAM,sBAAsB,CAAA;AACpD,OAAO,YAAY,MAAM,iBAAiB,CAAA;AAE1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AACtE,OAAO,OAAO,MAAM,qBAAqB,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,kBAAkB,MAAM,4CAA4C,CAAA;AAC3E,OAAO,4BAA4B,MAAM,0BAA0B,CAAA;AACnE,OAAO,OAAO,MAAM,6BAA6B,CAAA;AAOjD,MAAM,CAAC,OAAO,UAAU,aAAa,CACnC,KAAoC,EACpC,OAA2C,EAC3C,QAAkB,EAClB,aAAuB;IAEvB,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,KAAK,QAAQ,CAAA;IAClD,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAA;IAChC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,MAAM,kBAAkB,GAAG,4BAA4B,EAAE,CAAA;IACzD,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,OAAO,EAAE,CAAA;IACjD,MAAM,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,GAC5D,kBAAkB,EAAE,CAAA;IAEtB,MAAM,eAAe,GAAG,UAAU,IAAI,eAAe,CAAA;IAErD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAI/D,EAAE,CAAC,CAAA;IACN,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAsB,CAAA;IAE9E,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAwB,EAAE,EAAE;QAC1E,gBAAgB,CAAC,QAAQ,CAAC,CAAA;IAC5B,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,iBAAiB;IACjB,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,MAAM,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,EAAE,CAAA;QAEvB,IACE,SAAS;YACT,aAAa;YACb,CAAC,MAAM;YACP,CAAC,KAAK;YACN,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,CAAC,IAAI,KAAK,KAAK,EACpB,CAAC;YACD,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;QACvB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE;gBAClB,GAAG,KAAK;gBACR,IAAI,EAAE,OAAO;gBACb,YAAY,EACV,oJAAoJ;aACvJ,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,IAAI,MAAM,GAAG,KAAK,CAAA;QAClB,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA;QAE7C,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;YACxB,IAAI,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;gBACjE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC;oBACE,MAAM;oBACN,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,WAAW,EAAE,IAAI,CAAC,IAAI;oBACtB,IAAI;oBACJ,SAAS;oBACT,UAAU;iBACX,EACD,eAAe,CAAC,MAAM,CACvB,CAAA;gBACD,IAAI,MAAM,EAAE,CAAC;oBACX,OAAM;gBACR,CAAC;gBAED,0BAA0B,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;gBAEnE,OAAO,CAAC,GAAG,CAAC,mCAAmC,EAAE,MAAM,CAAC,CAAA;gBAExD,oBAAoB;gBACpB,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YAC7B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,MAAM,EAAE,CAAC;oBACX,OAAM;gBACR,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC,gCAAgC,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;gBACrE,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE;oBAClB,GAAG,KAAK;oBACR,IAAI,EAAE,OAAO;oBACb,YAAY,EAAG,KAAe,CAAC,OAAO;iBACvC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,CAAA;QAED,MAAM,EAAE,CAAA;QAER,OAAO,GAAG,EAAE;YACV,MAAM,GAAG,IAAI,CAAA;YACb,eAAe,CAAC,KAAK,EAAE,CAAA;QACzB,CAAC,CAAA;IACH,CAAC,EAAE;QACD,aAAa;QACb,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,EAAE;QACR,SAAS;QACT,SAAS;QACT,QAAQ;QACR,UAAU;QACV,kBAAkB;QAClB,0BAA0B;QAC1B,KAAK;KACN,CAAC,CAAA;IAEF,mBAAmB;IACnB,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAM;QACR,CAAC;QAED,0DAA0D;QAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,qBAAqB,CAAC;gBACpB,aAAa,EAAE,KAAK;aACrB,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAChB,OAAM;YACR,CAAC;YAED,MAAM,aAAa,GAAG,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACrD,qBAAqB,CAAC;gBACpB,aAAa;gBACb,kBAAkB,EAAE,yBAAyB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;aAC/D,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,gCAAgC;QAChC,MAAM,uBAAuB,GAAG,wBAAwB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAClE,IAAI,uBAAuB,EAAE,CAAC;YAC5B,MAAM,aAAa,GAAG,GAAG,CAAC,eAAe,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAA;YACvE,OAAO,CAAC,GAAG,CAAC,6CAA6C,EAAE,aAAa,CAAC,CAAA;YACzE,qBAAqB,CAAC;gBACpB,aAAa;gBACb,kBAAkB,EAAE,yBAAyB,CAAC,KAAK,CAAC,WAAW,CAAC;aACjE,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,iFAAiF;QACjF,8EAA8E;QAC9E,IAAI,CAAC,eAAe,IAAI,SAAS,EAAE,CAAC;YAClC,qBAAqB,CAAC;gBACpB,aAAa,EAAE,IAAI;aACpB,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,IAAI,MAAM,GAAG,KAAK,CAAA;QAClB,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA;QAE7C,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;YACxB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;gBACzD,MAAM,oBAAoB,GAAG,GAAG,CAAC,IAAI,CAAA;gBACrC,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,oBAAoB,EACpB,eAAe,CAAC,MAAM,CACvB,CAAA;gBACD,IAAI,MAAM,EAAE,CAAC;oBACX,OAAM;gBACR,CAAC;gBACD,sCAAsC;gBACtC,0BAA0B,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;gBAC5D,MAAM,aAAa,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;gBAC/C,OAAO,CAAC,GAAG,CACT,sDAAsD,EACtD,aAAa,CACd,CAAA;gBACD,qBAAqB,CAAC;oBACpB,aAAa,EAAE,aAAa;iBAC7B,CAAC,CAAA;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,MAAM,EAAE,CAAC;oBACX,OAAM;gBACR,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAA;gBAC1C,qBAAqB,CAAC;oBACpB,sBAAsB,EAAE,KAAc;iBACvC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,CAAA;QACD,MAAM,EAAE,CAAA;QAER,OAAO,GAAG,EAAE;YACV,MAAM,GAAG,IAAI,CAAA;YACb,eAAe,CAAC,KAAK,EAAE,CAAA;QACzB,CAAC,CAAA;IACH,CAAC,EAAE;QACD,wBAAwB;QACxB,eAAe;QACf,SAAS;QACT,0BAA0B;QAC1B,KAAK;KACN,CAAC,CAAA;IAEF,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,OAAO,GAAG,EAAE;YACV,MAAM,aAAa,GAAG,kBAAkB,CAAC,aAAa,CAAA;YACtD,IAAI,aAAa,IAAI,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,aAAa,CAAC,CAAA;gBACtD,GAAG,CAAC,eAAe,CAAC,aAAa,CAAC,CAAA;YACpC,CAAC;QACH,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,CAAA;IAEtC,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACrC,OAAO,CAAC,CAAC,CACP,KAAK;YACL,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,CAAC,IAAI;YACV,KAAK,CAAC,IAAI,KAAK,KAAK,CACrB,CAAA;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAEX,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAC5C,IACE,KAAK;YACL,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,CAAC,IAAI;YACV,KAAK,CAAC,IAAI,KAAK,OAAO,EACtB,CAAC;YACD,OAAO,KAAK,CAAC,YAAY,CAAA;QAC3B,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAEX,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACrC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAA;QACd,CAAC;QAED,mCAAmC;QACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAA;QACb,CAAC;QAED,kDAAkD;QAClD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,mDAAmD;YACnD,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;QACrB,CAAC;QAED,sEAAsE;QACtE,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAA;IAE5B,OAAO;QACL,WAAW;QACX,kBAAkB;QAClB,sBAAsB,EAAE,kBAAkB,CAAC,aAAa,KAAK,SAAS;QACtE,GAAG,kBAAkB;QACrB,WAAW;QACX,QAAQ,EAAE,aAAa;QACvB,WAAW,EACT,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,CAAA;YACvC,CAAC,CAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,WAAW;YACpB,CAAC,CAAC,SAAS;KAChB,CAAA;AACH,CAAC","sourcesContent":["import * as React from 'react'\nimport { attachmentsService } from '@oneblink/apps'\nimport { FormTypes } from '@oneblink/types'\nimport useFormDefinition from '../useFormDefinition'\nimport useIsOffline from '../useIsOffline'\nimport { FormElementBinaryStorageValue } from '../../types/attachments'\nimport { checkIfContentTypeIsImage } from '../../services/attachments'\nimport useAuth from '../../hooks/useAuth'\nimport { urlToBlobAsync } from '../../services/blob-utils'\nimport useAttachmentBlobs from '../../hooks/attachments/useAttachmentBlobs'\nimport useOnUploadAttachmentContext from '../useOnUploadAttachment'\nimport tenants from '@oneblink/apps/dist/tenants'\n\nexport type OnChange = (\n id: string,\n attachment: attachmentsService.Attachment,\n) => void\n\nexport default function useAttachment(\n value: FormElementBinaryStorageValue,\n element: FormTypes.FormElementBinaryStorage,\n onChange: OnChange,\n disableUpload?: boolean,\n) {\n const isPrivate = element.storageType !== 'public'\n const form = useFormDefinition()\n const isOffline = useIsOffline()\n const onUploadAttachment = useOnUploadAttachmentContext()\n const { isLoggedIn, isUsingFormsKey } = useAuth()\n const { storeAttachmentBlobLocally, getAttachmentBlobLocally } =\n useAttachmentBlobs()\n\n const isAuthenticated = isLoggedIn || isUsingFormsKey\n\n const [attachmentUrlState, setAttachmentUrlState] = React.useState<{\n attachmentUrl?: string | null\n loadAttachmentUrlError?: Error\n isContentTypeImage?: boolean\n }>({})\n const [progressState, setProgressState] = React.useState<number | undefined>()\n\n const onProgress = React.useCallback(({ progress }: { progress: number }) => {\n setProgressState(progress)\n }, [])\n\n // TRIGGER UPLOAD\n React.useEffect(() => {\n const formId = form?.id\n\n if (\n isOffline ||\n disableUpload ||\n !formId ||\n !value ||\n typeof value !== 'object' ||\n value.type !== 'NEW'\n ) {\n return\n }\n\n const data = value.data\n if (!data) {\n onChange(value._id, {\n ...value,\n type: 'ERROR',\n errorMessage:\n 'We were unable to read this file from your file system. Please try again. If the problem persists, please contact your application administrators.',\n })\n return\n }\n\n let ignore = false\n const abortController = new AbortController()\n\n const effect = async () => {\n try {\n console.log('Attempting to upload attachment...', value.fileName)\n const upload = await onUploadAttachment(\n {\n formId,\n fileName: value.fileName,\n contentType: data.type,\n data,\n isPrivate,\n onProgress,\n },\n abortController.signal,\n )\n if (ignore) {\n return\n }\n\n storeAttachmentBlobLocally({ attachmentId: upload.id, blob: data })\n\n console.log('Successfully Uploaded attachment!', upload)\n\n // UPDATE ATTACHMENT\n onChange(value._id, upload)\n } catch (error) {\n if (ignore) {\n return\n }\n\n console.warn('Failed to upload attachment...', value.fileName, error)\n onChange(value._id, {\n ...value,\n type: 'ERROR',\n errorMessage: (error as Error).message,\n })\n }\n }\n\n effect()\n\n return () => {\n ignore = true\n abortController.abort()\n }\n }, [\n disableUpload,\n form?.id,\n isOffline,\n isPrivate,\n onChange,\n onProgress,\n onUploadAttachment,\n storeAttachmentBlobLocally,\n value,\n ])\n\n // TRIGGER DOWNLOAD\n React.useEffect(() => {\n if (!value) {\n return\n }\n\n // If the value is string we will assume a base64 data uri\n if (typeof value === 'string') {\n setAttachmentUrlState({\n attachmentUrl: value,\n })\n return\n }\n\n if (value.type) {\n if (!value.data) {\n return\n }\n\n const attachmentUrl = URL.createObjectURL(value.data)\n setAttachmentUrlState({\n attachmentUrl,\n isContentTypeImage: checkIfContentTypeIsImage(value.data.type),\n })\n return\n }\n\n // Check for locally stored Blob\n const locallyStoredAttachment = getAttachmentBlobLocally(value.id)\n if (locallyStoredAttachment) {\n const attachmentUrl = URL.createObjectURL(locallyStoredAttachment.blob)\n console.log('Created object url from locally stored Blob', attachmentUrl)\n setAttachmentUrlState({\n attachmentUrl,\n isContentTypeImage: checkIfContentTypeIsImage(value.contentType),\n })\n return\n }\n\n // If user is not logged in or is offline, we can't download private attachments.\n // If the blob was not stored locally (above) for some reason, the user is SOL\n if (!isAuthenticated || isOffline) {\n setAttachmentUrlState({\n attachmentUrl: null,\n })\n return\n }\n\n let ignore = false\n const abortController = new AbortController()\n\n const effect = async () => {\n try {\n const url = new URL(value.url, tenants.current.apiOrigin)\n const privateAttachmentUrl = url.href\n const blob = await urlToBlobAsync(\n privateAttachmentUrl,\n abortController.signal,\n )\n if (ignore) {\n return\n }\n // Store private attachment in Context\n storeAttachmentBlobLocally({ attachmentId: value.id, blob })\n const attachmentUrl = URL.createObjectURL(blob)\n console.log(\n 'Created object url from private attachment for image',\n attachmentUrl,\n )\n setAttachmentUrlState({\n attachmentUrl: attachmentUrl,\n })\n } catch (error) {\n if (ignore) {\n return\n }\n console.warn('Error loading file:', error)\n setAttachmentUrlState({\n loadAttachmentUrlError: error as Error,\n })\n }\n }\n effect()\n\n return () => {\n ignore = true\n abortController.abort()\n }\n }, [\n getAttachmentBlobLocally,\n isAuthenticated,\n isOffline,\n storeAttachmentBlobLocally,\n value,\n ])\n\n React.useEffect(() => {\n return () => {\n const attachmentUrl = attachmentUrlState.attachmentUrl\n if (attachmentUrl && attachmentUrl.startsWith('blob:')) {\n console.log('revoking attachment url:', attachmentUrl)\n URL.revokeObjectURL(attachmentUrl)\n }\n }\n }, [attachmentUrlState.attachmentUrl])\n\n const isUploading = React.useMemo(() => {\n return !!(\n value &&\n typeof value !== 'string' &&\n value.type &&\n value.type === 'NEW'\n )\n }, [value])\n\n const uploadErrorMessage = React.useMemo(() => {\n if (\n value &&\n typeof value !== 'string' &&\n value.type &&\n value.type === 'ERROR'\n ) {\n return value.errorMessage\n }\n }, [value])\n\n const canDownload = React.useMemo(() => {\n if (!value) {\n return false\n }\n\n // legacy attachment as base64 data\n if (typeof value === 'string') {\n return true\n }\n\n // attachments still uploading or failed to upload\n if (value.type) {\n // can only be downloaded if we still have the data\n return !!value.data\n }\n\n // private attachments can only be downloaded if user is authenticated\n if (isAuthenticated) {\n return true\n }\n\n return false\n }, [isAuthenticated, value])\n\n return {\n isUploading,\n uploadErrorMessage,\n isLoadingAttachmentUrl: attachmentUrlState.attachmentUrl === undefined,\n ...attachmentUrlState,\n canDownload,\n progress: progressState,\n contentType:\n typeof value !== 'string' && !value?.type\n ? value?.contentType\n : undefined,\n }\n}\n"]}
@@ -79,7 +79,8 @@ export default async function downloadAttachment(attachment) {
79
79
  }
80
80
  return;
81
81
  }
82
- const blob = await urlToBlobAsync(tenants.current.apiOrigin + attachment.path);
82
+ const url = new URL(attachment.url, tenants.current.apiOrigin);
83
+ const blob = await urlToBlobAsync(url.href);
83
84
  return await downloadFile(blob, attachment.fileName);
84
85
  }
85
86
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"download-file.js","sourceRoot":"","sources":["../../src/services/download-file.ts"],"names":[],"mappings":"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","sourcesContent":["import { Sentry, attachmentsService } from '@oneblink/apps'\nimport * as bulmaToast from 'bulma-toast'\nimport fileSaver from 'file-saver'\nimport { urlToBlobAsync } from './blob-utils'\nimport tenants from '@oneblink/apps/dist/tenants'\n\nasync function downloadFile(data: Blob | string, fileName: string) {\n if (window.cordova) {\n const file = typeof data === 'string' ? await urlToBlobAsync(data) : data\n await new Promise((resolve, reject) => {\n window.requestFileSystem(\n window.PERSISTENT,\n 0,\n (fs) => {\n fs.root.getFile(\n fileName,\n {\n create: true,\n exclusive: false,\n },\n (fileEntry) => {\n // Create a FileWriter object for our FileEntry\n fileEntry.createWriter(\n (fileWriter) => {\n fileWriter.onwriteend = () => {\n // @ts-expect-error ???\n window.cordova.plugins.fileOpener2.open(\n // @ts-expect-error ???\n fileEntry.nativeURL,\n file.type,\n {\n error: (error: Error) => {\n console.log(\n 'An error occurred opening the downloaded file',\n )\n reject(error)\n },\n success: () => resolve(undefined),\n },\n )\n }\n\n fileWriter.onerror = (error) => {\n console.log(\n 'An error occurred writing the file to file system',\n )\n reject(error)\n }\n\n fileWriter.write(file)\n },\n (error) => {\n console.log(\n 'An error attempting to create file writer for new file',\n )\n reject(error)\n },\n )\n },\n (error) => {\n console.log(\n 'An error occurred getting new file data from file system',\n )\n reject(error)\n },\n )\n },\n (error) => {\n console.log('An error occurred requesting access to the file system')\n reject(error)\n },\n )\n })\n return\n } else {\n fileSaver.saveAs(data, fileName)\n }\n}\n\nconst handleError = (error?: Error) => {\n if (error) {\n console.warn('An error occurred attempting to download file:', error)\n Sentry.captureException(error)\n bulmaToast.toast({\n message:\n 'Sorry, there was an issue downloading your file, please try again.',\n // @ts-expect-error bulma sets this string as a class, so we are hacking in our own classes\n type: 'ob-toast is-danger cypress-download-file-toast',\n dismissible: true,\n closeOnClick: true,\n })\n }\n}\n\nexport async function downloadFileLegacy(dataURI: string, fileName: string) {\n try {\n return await downloadFile(dataURI, fileName)\n } catch (error) {\n handleError(error as Error)\n }\n}\n\nexport default async function downloadAttachment(\n attachment: attachmentsService.Attachment,\n) {\n try {\n if (attachment.type) {\n if (attachment.data) {\n await downloadFile(attachment.data, attachment.fileName)\n }\n return\n }\n const blob = await urlToBlobAsync(\n tenants.current.apiOrigin + attachment.path,\n )\n return await downloadFile(blob, attachment.fileName)\n } catch (error) {\n handleError(error as Error)\n }\n}\n"]}
1
+ {"version":3,"file":"download-file.js","sourceRoot":"","sources":["../../src/services/download-file.ts"],"names":[],"mappings":"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","sourcesContent":["import { Sentry, attachmentsService } from '@oneblink/apps'\nimport * as bulmaToast from 'bulma-toast'\nimport fileSaver from 'file-saver'\nimport { urlToBlobAsync } from './blob-utils'\nimport tenants from '@oneblink/apps/dist/tenants'\n\nasync function downloadFile(data: Blob | string, fileName: string) {\n if (window.cordova) {\n const file = typeof data === 'string' ? await urlToBlobAsync(data) : data\n await new Promise((resolve, reject) => {\n window.requestFileSystem(\n window.PERSISTENT,\n 0,\n (fs) => {\n fs.root.getFile(\n fileName,\n {\n create: true,\n exclusive: false,\n },\n (fileEntry) => {\n // Create a FileWriter object for our FileEntry\n fileEntry.createWriter(\n (fileWriter) => {\n fileWriter.onwriteend = () => {\n // @ts-expect-error ???\n window.cordova.plugins.fileOpener2.open(\n // @ts-expect-error ???\n fileEntry.nativeURL,\n file.type,\n {\n error: (error: Error) => {\n console.log(\n 'An error occurred opening the downloaded file',\n )\n reject(error)\n },\n success: () => resolve(undefined),\n },\n )\n }\n\n fileWriter.onerror = (error) => {\n console.log(\n 'An error occurred writing the file to file system',\n )\n reject(error)\n }\n\n fileWriter.write(file)\n },\n (error) => {\n console.log(\n 'An error attempting to create file writer for new file',\n )\n reject(error)\n },\n )\n },\n (error) => {\n console.log(\n 'An error occurred getting new file data from file system',\n )\n reject(error)\n },\n )\n },\n (error) => {\n console.log('An error occurred requesting access to the file system')\n reject(error)\n },\n )\n })\n return\n } else {\n fileSaver.saveAs(data, fileName)\n }\n}\n\nconst handleError = (error?: Error) => {\n if (error) {\n console.warn('An error occurred attempting to download file:', error)\n Sentry.captureException(error)\n bulmaToast.toast({\n message:\n 'Sorry, there was an issue downloading your file, please try again.',\n // @ts-expect-error bulma sets this string as a class, so we are hacking in our own classes\n type: 'ob-toast is-danger cypress-download-file-toast',\n dismissible: true,\n closeOnClick: true,\n })\n }\n}\n\nexport async function downloadFileLegacy(dataURI: string, fileName: string) {\n try {\n return await downloadFile(dataURI, fileName)\n } catch (error) {\n handleError(error as Error)\n }\n}\n\nexport default async function downloadAttachment(\n attachment: attachmentsService.Attachment,\n) {\n try {\n if (attachment.type) {\n if (attachment.data) {\n await downloadFile(attachment.data, attachment.fileName)\n }\n return\n }\n const url = new URL(attachment.url, tenants.current.apiOrigin)\n const blob = await urlToBlobAsync(url.href)\n return await downloadFile(blob, attachment.fileName)\n } catch (error) {\n handleError(error as Error)\n }\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@oneblink/apps-react",
3
3
  "description": "Helper functions for OneBlink apps in ReactJS.",
4
- "version": "8.10.0-alpha.3",
4
+ "version": "8.10.0-beta.2",
5
5
  "author": "OneBlink <developers@oneblink.io> (https://oneblink.io)",
6
6
  "bugs": {
7
7
  "url": "https://github.com/oneblink/apps-react/issues"