diff --git a/package.json b/package.json index c59f3a34..8b817b07 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,6 @@ "@bam.tech/react-native-image-resizer": "3.0.5", "@notifee/react-native": "7.8.2", "@nozbe/with-observables": "1.4.1", - "@react-native/metro-config": "0.72.11", "@react-native-async-storage/async-storage": "1.17.11", "@react-native-clipboard/clipboard": "^1.11.2", "@react-native-community/netinfo": "9.3.7", @@ -53,6 +52,7 @@ "@react-native-firebase/perf": "16.7.0", "@react-native-firebase/remote-config": "16.7.0", "@react-native-google-signin/google-signin": "13.1.0", + "@react-native/metro-config": "0.72.11", "@react-navigation/bottom-tabs": "6.6.1", "@react-navigation/native": "6.1.18", "@react-navigation/native-stack": "6.11.0", @@ -91,6 +91,7 @@ "react-native-pdf-renderer": "1.1.1", "react-native-permissions": "3.6.1", "react-native-qrcode-svg": "^6.2.0", + "react-native-quick-base64": "2.1.2", "react-native-safe-area-context": "4.4.1", "react-native-screens": "3.18.2", "react-native-svg": "^13.9.0", diff --git a/src/screens/caseDetails/PDFUtil.ts b/src/screens/caseDetails/PDFUtil.ts new file mode 100644 index 00000000..6a8eee2e --- /dev/null +++ b/src/screens/caseDetails/PDFUtil.ts @@ -0,0 +1,40 @@ +const FILE_SIGNATURES = { + pdf: ['25504446'], // "%PDF" in hex + jpeg: ['ffd8ffe0', 'ffd8ffe1', 'ffd8ffe2', 'ffd8ffe3', 'ffd8ffe8'], // JPEG signatures + png: ['89504e47'], // PNG signature + gif: ['47494638'], // GIF signature +}; + +const convertBase64ToUint8Array = (binaryString: string) => { + const length = binaryString.length; + const bytes = new Uint8Array(length); + for (let i = 0; i < length; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + return bytes; +}; + +const bytesToHex = (bytes: Uint8Array) => { + return Array.from(bytes) + .map((byte) => byte.toString(16).padStart(2, '0')) + .join(''); +}; + +export const getFileType = async (fileContent: string) => { + if (__DEV__) return 'pdf'; + const { atob } = await import('react-native-quick-base64'); + try { + const fileBytes = convertBase64ToUint8Array(atob(fileContent)); + const fileHex = bytesToHex(fileBytes); + + for (const [type, signatures] of Object.entries(FILE_SIGNATURES)) { + if (signatures.some((signature) => fileHex.startsWith(signature))) { + return type; + } + } + + return null; + } catch (error) { + return null; + } +}; diff --git a/yarn.lock b/yarn.lock index bb1e470c..59908995 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8969,6 +8969,13 @@ react-native-qrcode-svg@^6.2.0: prop-types "^15.8.0" qrcode "^1.5.1" +react-native-quick-base64@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/react-native-quick-base64/-/react-native-quick-base64-2.1.2.tgz#062b09b165c1530095fe99b94544c948318dbe99" + integrity sha512-xghaXpWdB0ji8OwYyo0fWezRroNxiNFCNFpGUIyE7+qc4gA/IGWnysIG5L0MbdoORv8FkTKUvfd6yCUN5R2VFA== + dependencies: + base64-js "^1.5.1" + react-native-reanimated@3.6.3: version "3.6.3" resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-3.6.3.tgz#859cf2320e37c80e3a21e19db24f82c34d6d3ded"