Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hotfix/view pdf android #583

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion assets/translations/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,10 @@
},
"courseFileListItem": {
"openFileError": "Cannot open the file.",
"reDownloadFile": "Redownload file"
"reDownloadFile": "Redownload file",
"fileSavedDocumentsPath": "File saved in the documents folder",
"fileSaved": "File saved in",
"pdfViewer": "PDF viewer"
},
"courseFilesTab": {
"browseFiles": "Browse files",
Expand Down
5 changes: 4 additions & 1 deletion assets/translations/it.json
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,10 @@
},
"courseFileListItem": {
"openFileError": "Impossibile aprire il file.",
"reDownloadFile": "Ri-scarica file"
"reDownloadFile": "Ri-scarica file",
"fileSavedDocumentsPath": "File salvato nella cartella documenti",
"fileSaved": "File salvato in",
"pdfViewer": "Visualizzatore PDF"
},
"courseFilesTab": {
"browseFiles": "Esplora file",
Expand Down
158 changes: 82 additions & 76 deletions ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1478,6 +1478,8 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- Yoga
- react-native-pdf (6.7.6):
- React-Core
- react-native-pdf-light (2.4.1):
- React-Core
- react-native-render-html (6.3.4):
Expand Down Expand Up @@ -2061,6 +2063,7 @@ DEPENDENCIES:
- "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)"
- react-native-override-color-scheme (from `../node_modules/react-native-override-color-scheme`)
- react-native-pager-view (from `../node_modules/react-native-pager-view`)
- react-native-pdf (from `../node_modules/react-native-pdf`)
- react-native-pdf-light (from `../node_modules/react-native-pdf-light`)
- react-native-render-html (from `../node_modules/react-native-render-html`)
- react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`)
Expand Down Expand Up @@ -2230,6 +2233,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-override-color-scheme"
react-native-pager-view:
:path: "../node_modules/react-native-pager-view"
react-native-pdf:
:path: "../node_modules/react-native-pdf"
react-native-pdf-light:
:path: "../node_modules/react-native-pdf-light"
react-native-render-html:
Expand Down Expand Up @@ -2355,94 +2360,95 @@ SPEC CHECKSUMS:
MapboxMobileEvents: d044b9edbe0ec7df60f6c2c9634fe9a7f449266b
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
RCT-Folly: bf5c0376ffe4dd2cf438dcf86db385df9fdce648
RCT-Folly: 84578c8756030547307e4572ab1947de1685c599
RCTDeprecation: fde92935b3caa6cb65cbff9fbb7d3a9867ffb259
RCTRequired: 75c6cee42d21c1530a6f204ba32ff57335d19007
RCTTypeSafety: 7e6fe47bfb693c50d4669db1a480ca5331795f5b
React: 8e73704cdd5c7f801936776d2fc434c605a7827b
React-callinvoker: fa27d1e091e683de88f576e6a5d4efc171929a4c
React-Core: 8dd14bffcc9b877091b698e45701160669a31f91
React-CoreModules: b4437acf2ef25ce3689c84df661dc5d806559b35
React-cxxreact: 6125cd820da7e18f9ca8343b3c42ee61634a4e0d
React-Core: 948deed7fa720eeb0d901ff9e45c3719767dab5f
React-CoreModules: a11ba75f64245d12a0869203664a802c11594c43
React-cxxreact: a5ce05f8a0a1398958523f948fce00d4c8ce38ff
React-debug: f474f5c202a277f76c81bf7cf26284f2c09880d7
React-defaultsnativemodule: 05f1a83669c4f01b5761b58ca0968306c99f3d50
React-domnativemodule: 64f3f5089cf214c31aa1821dd8fd4abc481baa91
React-Fabric: ba9636cfc7f9b77df6cb7edb2c70d0237026404b
React-FabricComponents: c408da05a4ea5ba071732245b4a7f48f904e610a
React-FabricImage: c409858f319f11709b49ffa6c5bca4faf794cb44
React-defaultsnativemodule: 6962ad056662f78298e498b186b4552f04159aa8
React-domnativemodule: 9426536ea5f9f469ea18386104a123da41618b5e
React-Fabric: bbdcc01a98528846efacf0767567a8e76df794bb
React-FabricComponents: ab8967c5898d88f37486df0eb0111384c498d821
React-FabricImage: 7a06db59488b37f509dee73fa0b2811608a67058
React-featureflags: 929732439d139ac0662e08f009f1a51ed2b91ed3
React-featureflagsnativemodule: 2f899ad011b6b1a8aa8babe4fafa0a68725faeb6
React-graphics: a5cad35307286e9f83e212834e95fef4010d03d0
React-hermes: 14aafa9630579b84c2167b563bdb8c811970a03e
React-idlecallbacksnativemodule: ba1475765a2900e1adc76ce45a625ef5f79fdc19
React-ImageManager: 41945afb3ace0c52255057ec4ae6af6f5a23539f
React-jserrorhandler: ecbc4622df7ab3d0066a4313cde4172d45745508
React-jsi: ff383df87c7047e976a66be45df59e4e0db5346e
React-jsiexecutor: 2bb8b172f226f2f502521d33dd7666e701d45f45
React-jsinspector: 4d51b903543f21076b658ef8412f3102778dbc92
React-jsitracing: 654f4d9cb9fd99b3d96f239ceb215ae49ce28ac0
React-logger: 97c9dafae1f1a638001a9d1d0e93d431f2f9cb7b
React-Mapbuffer: 3146a13424f9fec2ea1f1462d49d566e4d69b732
React-microtasksnativemodule: 8fa0a3d8542f6ae7712deebe0802ee17a623718b
react-native-blob-util: 39a20f2ef11556d958dc4beb0aa07d1ef2690745
react-native-blur: a1bf334589f44658a58a859b1f3defe28e367fcf
react-native-date-picker: 06a4d96ab525a163c7a90bccd68833d136b0bb13
react-native-document-picker: 7343222102ece8aec51390717f47ad7119c7921f
react-native-geolocation: 0c7a8496962d3268ac5b28f22a8e5d7a04c43f1a
react-native-html-to-pdf: 4c5c6e26819fe202971061594058877aa9b25265
react-native-menu: b7e42b26d3014c993db0f0ae3d5fcc523d5585bd
react-native-netinfo: f0a9899081c185db1de5bb2fdc1c88c202a059ac
react-native-override-color-scheme: 3badbbee9a4ea2a9c3e5b4a5d9fd9eaba8761870
react-native-pager-view: c476f76d54f946df5147645e902d3d7173688187
react-native-pdf-light: 60505ab2d7d5312154e9e4dc311c19c7540d2774
react-native-render-html: 984dfe2294163d04bf5fe25d7c9f122e60e05ebe
react-native-safe-area-context: 4532f1a0c5d34a46b9324ccaaedcb5582a302b7d
react-native-video: 9aec95eecb1c523b67e71a44032935f77f926276
React-featureflagsnativemodule: f43cb1106038209288cff1b6f40aa9efc52bdc06
React-graphics: 6367275cc82d631c588a7146fd8dc69ec2f447e8
React-hermes: b9bbe9c808d7ab1750ce089b243b03e4a099af63
React-idlecallbacksnativemodule: 03cbc9e272530c6f0074d244648f4ad7a0a17066
React-ImageManager: 5b001b9e974f5ba81f0645d3d799e2a20c61d91e
React-jserrorhandler: 35e5e5a5a99b7b36c3802a2d12ca86889ed5982a
React-jsi: d0d8c4019fd91d0cb4b432f2518e08dc37433a13
React-jsiexecutor: 1cdaf24e36919d899250938f0f6c79ec1a256923
React-jsinspector: 2fabeadbd0eb1cbd83a6fc2026fb38c75b200947
React-jsitracing: 7c7c89c963893efd25e0d04c23e854b9a93e0b7e
React-logger: 7b5b458327a1ff0d7e5a349430d1ed133dcebaa3
React-Mapbuffer: 0d88ad9afa9e195dd7634424bde1d38e4129e646
React-microtasksnativemodule: 7198aff94d07184642b452007fe7166399fb47d6
react-native-blob-util: f7234c91ad0e3faeee51b3edee80b61553f74993
react-native-blur: 3d5dd1ed2dd810b304ac3bcee9cf7d460757c89b
react-native-date-picker: 585252087d4820b4cd8f2cf80068f6e8f5b72413
react-native-document-picker: 530879d9e89b490f0954bcc4ab697c5b5e35d659
react-native-geolocation: b485eb8776fea2dfa95a0f5469f2008fc40a56d4
react-native-html-to-pdf: 7a49e6c58ac5221bcc093027b195f4b214f27a9d
react-native-menu: 6eb1bc1cffd6f3f29e0d33f0326552f805637b9c
react-native-netinfo: cec9c4e86083cb5b6aba0e0711f563e2fbbff187
react-native-override-color-scheme: ffee175f44cafe12c6264aed171e6039b7c64bfe
react-native-pager-view: 8bd7d72d1c260ef565952ac617ab6e492c457894
react-native-pdf: 5ad328deec86764b0684cfe3d64f2a81b1b9aacb
react-native-pdf-light: bf37b7f2ed2ac57493bbda9a85ed43d195866d2d
react-native-render-html: 5afc4751f1a98621b3009432ef84c47019dcb2bd
react-native-safe-area-context: b13be9714d9771fbde0120bc519c963484de3a71
react-native-video: 591de66f98b3fc96491a79015fa6bb735ec65474
React-nativeconfig: 93fe8c85a8c40820c57814e30f3e44b94c995a7b
React-NativeModulesApple: b3e076fd0d7b73417fe1e8c8b26e3c57ae9b74aa
React-perflogger: 1c55bcd3c392137cbaf0d21d8bb87ce9a0cebb15
React-performancetimeline: e89249db10b8f7bf8f72c2e9bd471ac37d48b753
React-NativeModulesApple: a4457b73e63e983db66d66612160006bccb00ad5
React-perflogger: 3140b7778984a486db80d4d2aeaa266cae4eb8c7
React-performancetimeline: 41c100bc1299d7b150821b99cf26661c51ed9ab0
React-RCTActionSheet: 9407c795fbeee35da2dae3cd6b5c4e5da6ff8bd3
React-RCTAnimation: 7ee1c2a77aab7e5c568611d8092a994cfcbe8410
React-RCTAppDelegate: e7b835203804bfd12a8baad30ab4c67f7da7bf24
React-RCTBlob: 761072706300d22624ec2d6bf860b77d95ebd3da
React-RCTFabric: a6c44c606009f889ef7431e71f03c5339fb72e6e
React-RCTImage: b6614fde902ec9647f15236da94df2d24c40523f
React-RCTLinking: 25950eda5d5f786bfb3daf513ea7d848555a2a93
React-RCTNetwork: b69407c4119fd7a1cc07db4a94563f2546f8770d
React-RCTSettings: b310a4923446c3a8950fa866c8cf83323a9e1b87
React-RCTText: 77c6eda5be1dee657f5183f75fe0fdcdb7b2b35d
React-RCTVibration: b4889c7702aea1b07316be1ec0de2e36e9a4d077
React-RCTAnimation: 48e5c6b541fd4c7a96c333e61974c3de34bbe849
React-RCTAppDelegate: e7c9ec6b2728e0335c8bd086f05de81529b54645
React-RCTBlob: f67be4e0fbe51db1574aec402754054ab9c39668
React-RCTFabric: 3cf48f54567f00835ffa1fc687dfde2f3b1f190c
React-RCTImage: 57894a0e42502461d87449bec6cb0f124a49a93b
React-RCTLinking: abd71677bc3353327bec26b0ccd0a0c3960efa1c
React-RCTNetwork: 2e91efa49b63e54a9782922e5ca1d09ff2789341
React-RCTSettings: fd13eebaa3f9af0b56a0ecb053b108e160fbfe07
React-RCTText: 4cd7c87db1e1da51a96b86ce39c5468c1dbaae60
React-RCTVibration: 579f64ceb06701eca3004a500169e1152c1ef7d2
React-rendererconsistency: 5ef1c4642fd6365bf6d5d4e29a3ae02c3a1b8980
React-rendererdebug: 7f6a24cbb5008a22ccb34a0d031a259b006facf6
React-rendererdebug: 8952e1ad914c680d4978916a9eed7c6dc85301d7
React-rncore: 0e5394ce20a9d2bf12409d14395588c7b9e6e9ce
React-RuntimeApple: bbe293f233d17304c9597309acde7505080fd53d
React-RuntimeCore: 5a1cbfc3e7af4fbdea2b9b1efd39cd51a4d4006f
React-RuntimeApple: f5ed38fba1230713313e88e750dcad06948ba625
React-RuntimeCore: 0fc488daf136f05d96349772828ccf64f66d6d2a
React-runtimeexecutor: ffac5f09795a5e881477e0d72a0fa6385456bed3
React-RuntimeHermes: 0a1fd1c150faed8341887dd89895eeb8d4d2d3c5
React-runtimescheduler: e7df538274de0c65736068e40efc0d2228f42d0d
React-RuntimeHermes: b8f395d41116c3bdf3373e87c39a856f69c3fff8
React-runtimescheduler: 933c72afd4f285b2bb473c0de2482ee250f3e735
React-timing: b3b233fe819d9e5b6ca32b605aa732621bdfa5aa
React-utils: 5362bd16a9563f9916e7a56c011ddc533507650f
ReactCodegen: 865bafc5c17ec2181620ced1a32c39c38ab2951d
ReactCommon: 422e364463f33e336fc4db196aeb50fd801d90d6
RNCAsyncStorage: d35c79ffba52c1013013e16b1fc295aec2feabb6
RNCClipboard: 2821ac938ef46f736a8de0c8814845dde2dcbdfb
RNDeviceInfo: 29e01d5ae94bdb5a0f6c11a4c438132545b4df80
RNFastImage: 5c9c9fed9c076e521b3f509fe79e790418a544e8
RNFBApp: 5d3d1b9d563857c68d161a3226d9dd6d6be1a846
RNFBMessaging: 2895d9dfa1cfea663c26a1b5dfb5faf17ad096f8
RNFileViewer: ce7ca3ac370e18554d35d6355cffd7c30437c592
RNFS: 4ac0f0ea233904cb798630b3c077808c06931688
RNGestureHandler: 511250b190a284388f9dd0d2e56c1df76f14cfb8
RNImageCropPicker: 771e2ca319d2cf92e04ebf334ece892ee9a6728f
RNKeychain: bfe3d12bf4620fe488771c414530bf16e88f3678
RNLocalize: 298e85ce16540a11de40c1a588ead39fc5e9a072
rnmapbox-maps: 334654168efcdc29584a9af1519d890a07a4a28e
RNPermissions: 107a3106f541d738b80450cdf2dd9fbd134646eb
RNReanimated: 3e6072b3d49d4fc687b8f1ba3022f0fdc0b43969
RNScreens: c7ceced6a8384cb9be5e7a5e88e9e714401fd958
RNSentry: 20fff14a1beee1313d8c3631c54d3e6cced73410
RNSVG: 8b1a777d54096b8c2a0fd38fc9d5a454332bbb4d
React-utils: 0c825829a8e2ca39bb049d95f270a2dbf39ecb05
ReactCodegen: 3b0ff1c9015e3ebcf2bd2f8559995c74bfacf8a1
ReactCommon: c21a3d6a8d3e98b6e99730139a52f59f0beea89d
RNCAsyncStorage: 40367e8d25522dca9c3513c7b9815a184669bd97
RNCClipboard: 7c3e3b5f71d84ef61690ad377b6c50cf27864ff5
RNDeviceInfo: ae26ae45db3f9937f038a284bcd0a1db8d70db96
RNFastImage: 462a183c4b0b6b26fdfd639e1ed6ba37536c3b87
RNFBApp: 598b2df8ff9014bdd6ebc33a531947629196d576
RNFBMessaging: 3323183f2b06939d4abd4dd76299b2b08dae453c
RNFileViewer: 4b5d83358214347e4ab2d4ca8d5c1c90d869e251
RNFS: 89de7d7f4c0f6bafa05343c578f61118c8282ed8
RNGestureHandler: 27a63f2218affdf1a426d56682f9b174904838b3
RNImageCropPicker: d14a08134d1b5bc2d5f29a12ce3ac1d402dd2389
RNKeychain: bbe2f6d5cc008920324acb49ef86ccc03d3b38e4
RNLocalize: d024afa9204c13885e61dc88b8190651bcaabac9
rnmapbox-maps: 42fe0ccc373fe24032aa224736feb4c39a24d604
RNPermissions: 95f7574e1ef4bb4c4d9f6a9a8125d0ae809bd052
RNReanimated: 3b207674fbe474b0b5a408c5cbdfd8a3eec1439d
RNScreens: 35bb8e81aeccf111baa0ea01a54231390dbbcfd9
RNSentry: 066541f7e9a39ca16b42df38a7f274063524bfb9
RNSVG: 8542aa11770b27563714bbd8494a8436385fc85f
SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d
SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d
Sentry: f8374b5415bc38dfb5645941b3ae31230fbeae57
Expand All @@ -2453,4 +2459,4 @@ SPEC CHECKSUMS:

PODFILE CHECKSUM: e87b6939d36becad7b6420c245dee47d379df497

COCOAPODS: 1.15.2
COCOAPODS: 1.16.2
35 changes: 35 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions src/core/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@ import { DocumentDirectoryPath, ExternalDirectoryPath } from 'react-native-fs';
export const IS_ANDROID = Platform.OS === 'android';
export const IS_IOS = Platform.OS === 'ios';
export const MAX_RECENT_SEARCHES = 10;
export const ANDROID_DOCUMENT_DIRECTORY_PATH = '/storage/emulated/0/Documents';
export const PUBLIC_APP_DIRECTORY_PATH = IS_IOS
? DocumentDirectoryPath
: Platform.Version > '29'
? ANDROID_DOCUMENT_DIRECTORY_PATH
: ExternalDirectoryPath;
export const courseColors = [
{ name: 'colors.red', color: '#DC2626' },
Expand Down
4 changes: 4 additions & 0 deletions src/core/hooks/useDownloadCourseFile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ import {
} from 'react-native-fs';
import { dirname } from 'react-native-path';

import { useNavigation } from '@react-navigation/core';
import { NativeStackNavigationProp } from '@react-navigation/native-stack';

import { CourseFilesCacheContext } from '../../features/courses/contexts/CourseFilesCacheContext';
import { UnsupportedFileTypeError } from '../../features/courses/errors/UnsupportedFileTypeError';
import { useCoursesFilesCachePath } from '../../features/courses/hooks/useCourseFilesCachePath';
Expand All @@ -29,6 +32,7 @@ export const useDownloadCourseFile = (
const { t } = useTranslation();
const coursesFilesCachePath = useCoursesFilesCachePath();
const { downloadsRef, setDownloads } = useDownloadsContext();
const navigation = useNavigation<NativeStackNavigationProp<any>>();
const {
cache,
isRefreshing: isCacheRefreshing,
Expand Down
35 changes: 30 additions & 5 deletions src/features/courses/components/CourseFileListItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ import { BASE_PATH, CourseFileOverview } from '@polito/api-client';
import { MenuView } from '@react-native-menu/menu';
import { MenuComponentProps } from '@react-native-menu/menu/src/types';
import { useNavigation } from '@react-navigation/native';
import { NativeStackNavigationProp } from '@react-navigation/native-stack';

import { useFeedbackContext } from '../../../../src/core/contexts/FeedbackContext';
import { IS_IOS } from '../../../core/constants';
import { useDownloadCourseFile } from '../../../core/hooks/useDownloadCourseFile';
import { useNotifications } from '../../../core/hooks/useNotifications';
Expand Down Expand Up @@ -96,7 +98,7 @@ export const CourseFileListItem = memo(
...rest
}: Props) => {
const { t } = useTranslation();
const navigation = useNavigation();
const navigation = useNavigation<NativeStackNavigationProp<any>>();
const { colors, fontSizes, spacing } = useTheme();
const iconProps = useMemo(
() => ({
Expand All @@ -107,6 +109,7 @@ export const CourseFileListItem = memo(
);
const courseId = useCourseContext();
const [courseFilesCache] = useCourseFilesCachePath();
const { setFeedback } = useFeedbackContext();
const { getUnreadsCount } = useNotifications();
const fileNotificationScope = useMemo(
() => ['teaching', 'courses', courseId.toString(), 'files', item.id],
Expand Down Expand Up @@ -171,11 +174,33 @@ export const CourseFileListItem = memo(
);

const openDownloadedFile = useCallback(() => {
openFile().catch(e => {
if (e instanceof UnsupportedFileTypeError) {
Alert.alert(t('common.error'), t('courseFileListItem.openFileError'));
if (Platform.OS === 'android') {
try {
setFeedback({
text:
Platform.Version > 29
? t('courseFileListItem.fileSavedDocumentsPath')
: t('courseFileListItem.fileSaved') + cachedFilePath,
isPersistent: false,
});
} catch (e) {
if (e instanceof UnsupportedFileTypeError) {
Alert.alert(
t('common.error'),
t('courseFileListItem.openFileError'),
);
}
}
});
} else {
openFile().catch(e => {
if (e instanceof UnsupportedFileTypeError) {
Alert.alert(
t('common.error'),
t('courseFileListItem.openFileError'),
);
}
});
}
}, [openFile, t]);

const downloadFile = useCallback(async () => {
Expand Down
Loading