From fff1657bddbc9acfcee2d133cf5fcb757ae65523 Mon Sep 17 00:00:00 2001 From: Peter Muriuki Date: Wed, 20 Nov 2024 13:43:48 +0300 Subject: [PATCH 1/5] Add browser image compression to fhir-group --- packages/fhir-group-management/package.json | 1 + yarn.lock | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/packages/fhir-group-management/package.json b/packages/fhir-group-management/package.json index 3a9b1c998..144705da6 100644 --- a/packages/fhir-group-management/package.json +++ b/packages/fhir-group-management/package.json @@ -38,6 +38,7 @@ "@opensrp/rbac": "workspace:^", "@opensrp/react-utils": "^0.0.12", "@opensrp/reducer-factory": "^0.0.13", + "browser-image-compression": "^2.0.2", "fhirclient": "^2.3.11", "uuid": "^8.3.1" }, diff --git a/yarn.lock b/yarn.lock index 8b37342f3..a38cabf80 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3903,6 +3903,7 @@ __metadata: "@opensrp/reducer-factory": ^0.0.13 "@opensrp/store": ^0.0.10 "@types/uuid": 8.3.0 + browser-image-compression: ^2.0.2 fhirclient: ^2.3.11 uuid: ^8.3.1 peerDependencies: @@ -8490,6 +8491,15 @@ __metadata: languageName: node linkType: hard +"browser-image-compression@npm:^2.0.2": + version: 2.0.2 + resolution: "browser-image-compression@npm:2.0.2" + dependencies: + uzip: 0.20201231.0 + checksum: 16051f07b0ec3927d30600d244d07d46bd41de16d6c44b872efe89f4b2b22dbd9dfbb66e3d1ff2c6282057722456a53759996e1478774dc520843ffb48f7441e + languageName: node + linkType: hard + "browser-process-hrtime@npm:^1.0.0": version: 1.0.0 resolution: "browser-process-hrtime@npm:1.0.0" @@ -28895,6 +28905,13 @@ __metadata: languageName: node linkType: hard +"uzip@npm:0.20201231.0": + version: 0.20201231.0 + resolution: "uzip@npm:0.20201231.0" + checksum: 34253f4c3d996571b10b659eea415bec952bde940e1fd44090ce19687b6dbaae411d8e6321b9028e44aa442379659d71bb39e95ba15de0626cfe970d90b24f40 + languageName: node + linkType: hard + "v8-compile-cache@npm:2.3.0, v8-compile-cache@npm:^2.0.3": version: 2.3.0 resolution: "v8-compile-cache@npm:2.3.0" From bdb6397a5f05f3ddfdbdd9f8c6b27200a5044f02 Mon Sep 17 00:00:00 2001 From: Peter Muriuki Date: Wed, 20 Nov 2024 13:44:26 +0300 Subject: [PATCH 2/5] Validate image is < 5mb and compress --- .../components/CommodityAddEdit/Eusm/utils.ts | 24 ++++++++++++++++++- .../src/components/ProductForm/index.tsx | 1 + .../src/components/ProductForm/utils.tsx | 18 +++++++++++++- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/packages/fhir-group-management/src/components/CommodityAddEdit/Eusm/utils.ts b/packages/fhir-group-management/src/components/CommodityAddEdit/Eusm/utils.ts index 9d4e22f4c..7d12f7035 100644 --- a/packages/fhir-group-management/src/components/CommodityAddEdit/Eusm/utils.ts +++ b/packages/fhir-group-management/src/components/CommodityAddEdit/Eusm/utils.ts @@ -52,6 +52,8 @@ import { UploadFile } from 'antd'; import { Coding } from '@smile-cdr/fhirts/dist/FHIR-R4/classes/coding'; import { R4GroupTypeCodes } from '@opensrp/fhir-helpers'; import { defaultValidationRulesFactory } from '../../ProductForm/utils'; +import { RcFile } from 'antd/es/upload'; +import imageCompression from 'browser-image-compression'; export type EusmGroupFormFields = GroupFormFields<{ group: IGroup; binary?: IBinary }>; @@ -282,6 +284,23 @@ function fileToBase64(file?: File): Promise { }); } +/** + * Compresses images before uploading, images is scaled down and + * converted to webp format + * + * @param file - image file to be downscaled + */ +export async function compressImage(file: RcFile | undefined) { + if (!file) return; + const options = { + maxSizeMB: 1, + maxWidthOrHeight: 1920, + fileType: 'image/webp', + }; + const compressedBlob = await imageCompression(file, options); + return compressedBlob; +} + /** * generates the binary payload for uploaded image * @@ -298,6 +317,9 @@ export async function getProductImagePayload( const currentImageb64 = await fileToBase64(currentImage); const initialImageb64 = await fileToBase64(initialImage); + const scaledDownImage = await compressImage(currentImage); + const scaledDownCurrentImageb64 = await fileToBase64(scaledDownImage); + if (currentImageb64 === initialImageb64) { // This could mean it was not added or removed. return { @@ -313,7 +335,7 @@ export async function getProductImagePayload( id, resourceType: binaryResourceType, contentType: currentImage.type, - data: currentImageb64, + data: scaledDownCurrentImageb64, }; return { changed: true, diff --git a/packages/fhir-group-management/src/components/ProductForm/index.tsx b/packages/fhir-group-management/src/components/ProductForm/index.tsx index 2f4dba13e..30ac1ef5d 100644 --- a/packages/fhir-group-management/src/components/ProductForm/index.tsx +++ b/packages/fhir-group-management/src/components/ProductForm/index.tsx @@ -278,6 +278,7 @@ function CommodityForm< {({ getFieldValue }) => { return (