Skip to content

Commit d68deae

Browse files
authored
Merge pull request #56473 from callstack-internal/feature/55176-bump-react-fast-pdf-2
Bump react-fast-pdf
2 parents fbcd7dd + 70add88 commit d68deae

File tree

6 files changed

+47
-7
lines changed

6 files changed

+47
-7
lines changed

config/webpack/webpack.common.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,12 @@ const getCommonConfiguration = ({file = '.env', platform = 'web'}: Environment):
179179
// We are importing this worker as a string by using asset/source otherwise it will default to loading via an HTTPS request later.
180180
// This causes issues if we have gone offline before the pdfjs web worker is set up as we won't be able to load it from the server.
181181
{
182+
// eslint-disable-next-line prefer-regex-literals
183+
test: new RegExp('node_modules/pdfjs-dist/build/pdf.worker.min.mjs'),
184+
type: 'asset/source',
185+
},
186+
{
187+
// eslint-disable-next-line prefer-regex-literals
182188
test: new RegExp('node_modules/pdfjs-dist/legacy/build/pdf.worker.min.mjs'),
183189
type: 'asset/source',
184190
},

src/components/PDFThumbnail/index.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
11
import 'core-js/proposals/promise-with-resolvers';
22
// eslint-disable-next-line import/extensions
3-
import pdfWorkerSource from 'pdfjs-dist/legacy/build/pdf.worker.min.mjs';
3+
import pdfWorkerSource from 'pdfjs-dist/build/pdf.worker.min.mjs';
4+
// eslint-disable-next-line import/extensions
5+
import pdfWorkerLegacySource from 'pdfjs-dist/legacy/build/pdf.worker.min.mjs';
46
import React, {useMemo, useState} from 'react';
57
import {View} from 'react-native';
68
import {Document, pdfjs, Thumbnail} from 'react-pdf';
79
import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator';
810
import useThemeStyles from '@hooks/useThemeStyles';
911
import addEncryptedAuthTokenToURL from '@libs/addEncryptedAuthTokenToURL';
12+
import {isMobileSafari, isModernSafari} from '@libs/Browser';
1013
import PDFThumbnailError from './PDFThumbnailError';
1114
import type PDFThumbnailProps from './types';
1215

16+
const shouldUseLegacyWorker = isMobileSafari() && !isModernSafari();
17+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
18+
const pdfWorker = shouldUseLegacyWorker ? pdfWorkerLegacySource : pdfWorkerSource;
19+
1320
if (!pdfjs.GlobalWorkerOptions.workerSrc) {
14-
pdfjs.GlobalWorkerOptions.workerSrc = URL.createObjectURL(new Blob([pdfWorkerSource], {type: 'text/javascript'}));
21+
pdfjs.GlobalWorkerOptions.workerSrc = URL.createObjectURL(new Blob([pdfWorker], {type: 'text/javascript'}));
1522
}
1623

1724
function PDFThumbnail({previewSourceURL, style, isAuthTokenRequired = false, enabled = true, onPassword, onLoadError, onLoadSuccess}: PDFThumbnailProps) {

src/libs/Browser/index.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type {GetBrowser, IsChromeIOS, IsMobile, IsMobileChrome, IsMobileSafari, IsMobileWebKit, IsSafari, OpenRouteInDesktopApp} from './types';
1+
import type {GetBrowser, IsChromeIOS, IsMobile, IsMobileChrome, IsMobileSafari, IsMobileWebKit, IsModernSafari, IsSafari, OpenRouteInDesktopApp} from './types';
22

33
const getBrowser: GetBrowser = () => '';
44

@@ -14,6 +14,8 @@ const isChromeIOS: IsChromeIOS = () => false;
1414

1515
const isSafari: IsSafari = () => false;
1616

17+
const isModernSafari: IsModernSafari = () => false;
18+
1719
const openRouteInDesktopApp: OpenRouteInDesktopApp = () => {};
1820

19-
export {getBrowser, isMobile, isMobileSafari, isMobileWebKit, isSafari, isMobileChrome, isChromeIOS, openRouteInDesktopApp};
21+
export {getBrowser, isMobile, isMobileSafari, isMobileWebKit, isSafari, isModernSafari, isMobileChrome, isChromeIOS, openRouteInDesktopApp};

src/libs/Browser/index.website.ts

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import CONFIG from '@src/CONFIG';
22
import CONST from '@src/CONST';
33
import ROUTES from '@src/ROUTES';
4-
import type {GetBrowser, IsChromeIOS, IsMobile, IsMobileChrome, IsMobileSafari, IsMobileWebKit, IsSafari, OpenRouteInDesktopApp} from './types';
4+
import type {GetBrowser, IsChromeIOS, IsMobile, IsMobileChrome, IsMobileSafari, IsMobileWebKit, IsModernSafari, IsSafari, OpenRouteInDesktopApp} from './types';
55

66
let isOpenRouteInDesktop = false;
77
/**
@@ -77,6 +77,16 @@ const isChromeIOS: IsChromeIOS = () => {
7777

7878
const isSafari: IsSafari = () => getBrowser() === 'safari' || isMobileSafari();
7979

80+
/**
81+
* Checks if the requesting user agent is a modern version of Safari on iOS (version 18 or higher).
82+
*/
83+
const isModernSafari: IsModernSafari = (): boolean => {
84+
const version = navigator.userAgent.match(/OS (\d+_\d+)/);
85+
const iosVersion = version ? version[1].replace('_', '.') : '';
86+
87+
return parseFloat(iosVersion) >= 18;
88+
};
89+
8090
/**
8191
* The session information needs to be passed to the Desktop app, and the only way to do that is by using query params. There is no other way to transfer the data.
8292
*/
@@ -127,4 +137,16 @@ const resetIsOpeningRouteInDesktop = () => {
127137
isOpenRouteInDesktop = false;
128138
};
129139

130-
export {getBrowser, isMobile, isMobileSafari, isMobileWebKit, isSafari, isMobileChrome, isChromeIOS, openRouteInDesktopApp, isOpeningRouteInDesktop, resetIsOpeningRouteInDesktop};
140+
export {
141+
getBrowser,
142+
isMobile,
143+
isMobileSafari,
144+
isMobileWebKit,
145+
isSafari,
146+
isModernSafari,
147+
isMobileChrome,
148+
isChromeIOS,
149+
openRouteInDesktopApp,
150+
isOpeningRouteInDesktop,
151+
resetIsOpeningRouteInDesktop,
152+
};

src/libs/Browser/types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ type IsChromeIOS = () => boolean;
1212

1313
type IsSafari = () => boolean;
1414

15+
type IsModernSafari = () => boolean;
16+
1517
type OpenRouteInDesktopApp = (shortLivedAuthToken?: string, email?: string, initialRoute?: string) => void;
1618

17-
export type {GetBrowser, IsMobile, IsMobileSafari, IsMobileChrome, IsMobileWebKit, IsSafari, IsChromeIOS, OpenRouteInDesktopApp};
19+
export type {GetBrowser, IsMobile, IsMobileSafari, IsMobileChrome, IsMobileWebKit, IsSafari, IsModernSafari, IsChromeIOS, OpenRouteInDesktopApp};

src/types/modules/pdf.worker.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
declare module 'pdfjs-dist/legacy/build/pdf.worker.min.mjs';
2+
declare module 'pdfjs-dist/build/pdf.worker.min.mjs';

0 commit comments

Comments
 (0)