@moustafahelmi/react-native-quran-app 1.4.0

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.
Files changed (131) hide show
  1. package/.bundle/config +2 -0
  2. package/.eslintrc.js +4 -0
  3. package/.prettierrc.js +7 -0
  4. package/.watchmanconfig +1 -0
  5. package/App.tsx +23 -0
  6. package/Gemfile +9 -0
  7. package/Gemfile.lock +105 -0
  8. package/MIGRATION.md +163 -0
  9. package/README.md +210 -0
  10. package/ReactotronConfig.js +7 -0
  11. package/__tests__/App.test.tsx +17 -0
  12. package/android/app/build.gradle +118 -0
  13. package/android/app/debug.keystore +0 -0
  14. package/android/app/proguard-rules.pro +10 -0
  15. package/android/app/src/debug/AndroidManifest.xml +9 -0
  16. package/android/app/src/main/AndroidManifest.xml +25 -0
  17. package/android/app/src/main/assets/fonts/Cairo.ttf +0 -0
  18. package/android/app/src/main/assets/fonts/QCF_BSML.ttf +0 -0
  19. package/android/app/src/main/assets/fonts/QCF_P001.ttf +0 -0
  20. package/android/app/src/main/java/com/quranapp/MainActivity.kt +22 -0
  21. package/android/app/src/main/java/com/quranapp/MainApplication.kt +43 -0
  22. package/android/app/src/main/res/drawable/rn_edit_text_material.xml +37 -0
  23. package/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  24. package/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  25. package/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  26. package/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  27. package/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  28. package/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  29. package/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  30. package/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  31. package/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  32. package/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  33. package/android/app/src/main/res/values/strings.xml +3 -0
  34. package/android/app/src/main/res/values/styles.xml +9 -0
  35. package/android/build.gradle +21 -0
  36. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  37. package/android/gradle/wrapper/gradle-wrapper.properties +7 -0
  38. package/android/gradle.properties +41 -0
  39. package/android/gradlew +249 -0
  40. package/android/gradlew.bat +92 -0
  41. package/android/link-assets-manifest.json +17 -0
  42. package/android/settings.gradle +4 -0
  43. package/app.json +4 -0
  44. package/babel.config.js +3 -0
  45. package/index.js +11 -0
  46. package/ios/.xcode.env +11 -0
  47. package/ios/Podfile +40 -0
  48. package/ios/Podfile.lock +1460 -0
  49. package/ios/QuranApp/AppDelegate.h +6 -0
  50. package/ios/QuranApp/AppDelegate.mm +31 -0
  51. package/ios/QuranApp/Images.xcassets/AppIcon.appiconset/Contents.json +53 -0
  52. package/ios/QuranApp/Images.xcassets/Contents.json +6 -0
  53. package/ios/QuranApp/Info.plist +57 -0
  54. package/ios/QuranApp/LaunchScreen.storyboard +47 -0
  55. package/ios/QuranApp/PrivacyInfo.xcprivacy +38 -0
  56. package/ios/QuranApp/main.m +10 -0
  57. package/ios/QuranApp.xcodeproj/project.pbxproj +729 -0
  58. package/ios/QuranApp.xcodeproj/xcshareddata/xcschemes/QuranApp.xcscheme +88 -0
  59. package/ios/QuranApp.xcworkspace/contents.xcworkspacedata +10 -0
  60. package/ios/QuranAppTests/Info.plist +24 -0
  61. package/ios/QuranAppTests/QuranAppTests.m +66 -0
  62. package/ios/link-assets-manifest.json +17 -0
  63. package/jest.config.js +3 -0
  64. package/metro.config.js +11 -0
  65. package/package.json +54 -0
  66. package/react-native.config.js +7 -0
  67. package/screenshots/1.png +0 -0
  68. package/screenshots/2.png +0 -0
  69. package/screenshots/3.png +0 -0
  70. package/screenshots/4.png +0 -0
  71. package/screenshots/5.png +0 -0
  72. package/src/assets/fonts/Cairo.ttf +0 -0
  73. package/src/assets/fonts/QCF_BSML.ttf +0 -0
  74. package/src/assets/fonts/QCF_P001.ttf +0 -0
  75. package/src/assets/images/bookmark.png +0 -0
  76. package/src/assets/images/close.png +0 -0
  77. package/src/assets/images/copy.png +0 -0
  78. package/src/assets/images/down-chevron.png +0 -0
  79. package/src/assets/images/mushafFrame.png +0 -0
  80. package/src/assets/images/pause.png +0 -0
  81. package/src/assets/images/play-button.png +0 -0
  82. package/src/assets/images/play.svg +16 -0
  83. package/src/assets/images/playNext.png +0 -0
  84. package/src/assets/images/surahNameFrame.png +0 -0
  85. package/src/common/chapters.ts +1346 -0
  86. package/src/common/constants.ts +27 -0
  87. package/src/common/images.ts +13 -0
  88. package/src/common/index.ts +8 -0
  89. package/src/common/juzs.ts +411 -0
  90. package/src/common/priorityPages.ts +46 -0
  91. package/src/common/themes.ts +7 -0
  92. package/src/components/index.ts +3 -0
  93. package/src/components/lists/index.ts +3 -0
  94. package/src/components/lists/pageVersesList.tsx +220 -0
  95. package/src/components/lists/verseLinesWordsList.tsx +90 -0
  96. package/src/components/modals/index.ts +3 -0
  97. package/src/components/modals/optionsModal.tsx +126 -0
  98. package/src/components/modals/recitersModal.tsx +118 -0
  99. package/src/components/sections/audioPlayer.tsx +185 -0
  100. package/src/components/sections/audioPlayerControls.tsx +100 -0
  101. package/src/components/sections/index.ts +4 -0
  102. package/src/components/sections/loader.tsx +33 -0
  103. package/src/helpers/index.ts +1 -0
  104. package/src/helpers/quranHelpers.tsx +17 -0
  105. package/src/hooks/apis/index.ts +10 -0
  106. package/src/hooks/apis/useGetChapterAudio.ts +111 -0
  107. package/src/hooks/apis/useGetChapterByPage.ts +166 -0
  108. package/src/hooks/apis/useGetChapterLookup.ts +31 -0
  109. package/src/hooks/apis/useGetReciters.ts +44 -0
  110. package/src/hooks/controllers/index.ts +25 -0
  111. package/src/hooks/controllers/useAudioPlayerController.tsx +63 -0
  112. package/src/hooks/controllers/useOptionsModalController.ts +99 -0
  113. package/src/hooks/controllers/usePageFontFileController.ts +255 -0
  114. package/src/hooks/controllers/usePageLineController.ts +108 -0
  115. package/src/hooks/helpers/index.ts +6 -0
  116. package/src/hooks/helpers/useQuranFontPreloader.ts +225 -0
  117. package/src/hooks/index.ts +3 -0
  118. package/src/index.ts +5 -0
  119. package/src/layouts/bismillahText.tsx +18 -0
  120. package/src/layouts/index.ts +4 -0
  121. package/src/layouts/quranChapterHeader.tsx +49 -0
  122. package/src/layouts/quranPageLayout.tsx +178 -0
  123. package/src/types/global.d.ts +7 -0
  124. package/src/types/index.ts +212 -0
  125. package/src/utils/axiosInstance.ts +7 -0
  126. package/src/utils/fileHandlers.ts +96 -0
  127. package/src/utils/handleBeforeAndAfterCurrentVerse.ts +41 -0
  128. package/src/utils/index.ts +6 -0
  129. package/src/utils/matrics.ts +37 -0
  130. package/tsconfig.json +3 -0
  131. package/videos/1.gif +0 -0
@@ -0,0 +1,7 @@
1
+ import axios from 'axios';
2
+ import {QURAN_API} from '../common';
3
+ const axiosInstance = axios.create({
4
+ baseURL: QURAN_API,
5
+ });
6
+
7
+ export default axiosInstance;
@@ -0,0 +1,96 @@
1
+ import RNFS from 'react-native-fs';
2
+ import {QURAN_CHAPTERS_DIRECTORY, QURAN_JUZS_DIRECTORY} from '../common';
3
+ import {QuranTypesEnums} from '../types';
4
+
5
+ const downloadFontsFiles = () => {
6
+ RNFS.downloadFile({
7
+ fromUrl: 'https://websitetask123.000webhostapp.com/fontsFiles.zip',
8
+ toFile: `${RNFS.DocumentDirectoryPath}/fonts`,
9
+ background: true, // Enable downloading in the background (iOS only)
10
+ discretionary: true, // Allow the OS to control the timing and speed (iOS only)
11
+ progress: res => {
12
+ // Handle download progress updates if needed
13
+ const progress = (res.bytesWritten / res.contentLength) * 100;
14
+ },
15
+ })
16
+ .promise.then(res => {
17
+ console.log('res', JSON.stringify(res));
18
+ })
19
+ .catch(err => {
20
+ console.log('Download error:', err);
21
+ });
22
+ };
23
+
24
+ const isFileExists = (filePath: string) => {
25
+ return RNFS.exists(filePath)
26
+ .then(exists => exists)
27
+ .catch(error => {
28
+ console.log(error);
29
+ });
30
+ };
31
+ const saveChapterAsJsonFile = (
32
+ fileName: string,
33
+ fileContent: string,
34
+ type: QuranTypesEnums,
35
+ ) => {
36
+ RNFS.writeFile(
37
+ `${
38
+ type === QuranTypesEnums.chapter
39
+ ? QURAN_CHAPTERS_DIRECTORY
40
+ : QURAN_JUZS_DIRECTORY
41
+ }/${fileName}`,
42
+ fileContent,
43
+ 'utf8',
44
+ )
45
+ .then(success => {
46
+ console.log('FILE WRITTEN!');
47
+ })
48
+ .catch(err => {
49
+ console.log(err.message);
50
+ });
51
+ };
52
+ const readFromLocalStorageFile = (fileName: string, type: QuranTypesEnums) => {
53
+ return RNFS.readFile(
54
+ `${
55
+ type === QuranTypesEnums.chapter
56
+ ? QURAN_CHAPTERS_DIRECTORY
57
+ : QURAN_JUZS_DIRECTORY
58
+ }/${fileName}`,
59
+ 'utf8',
60
+ )
61
+ .then(res => res)
62
+ .catch(err => {
63
+ console.log(err.message);
64
+ });
65
+ };
66
+ const handleQuranChaptersDirectory = async () => {
67
+ const isDirectoryExixts = await isFileExists(QURAN_CHAPTERS_DIRECTORY);
68
+ if (!isDirectoryExixts)
69
+ RNFS.mkdir(QURAN_CHAPTERS_DIRECTORY)
70
+ .then(() => {
71
+ console.log('Folder created successfully');
72
+ })
73
+ .catch(error => {
74
+ console.error('Error creating folder:', error);
75
+ });
76
+ };
77
+ const handleQuranJuzsDirectory = async () => {
78
+ const isDirectoryExixts = await isFileExists(QURAN_JUZS_DIRECTORY);
79
+ if (!isDirectoryExixts)
80
+ RNFS.mkdir(QURAN_JUZS_DIRECTORY)
81
+ .then(() => {
82
+ console.log('Folder created successfully');
83
+ })
84
+ .catch(error => {
85
+ console.error('Error creating folder:', error);
86
+ });
87
+ };
88
+
89
+ export {
90
+ downloadFontsFiles,
91
+ isFileExists,
92
+ saveChapterAsJsonFile,
93
+ handleQuranChaptersDirectory,
94
+ readFromLocalStorageFile,
95
+ handleQuranJuzsDirectory,
96
+ };
@@ -0,0 +1,41 @@
1
+ import {ISurahVerse, IVersesBeforeAndAfterCurrentVerse} from '../types';
2
+
3
+ interface IProps {
4
+ originalVerse: ISurahVerse[];
5
+ selectedVerse: ISurahVerse;
6
+ setVersesBeforeAndAfterCurrentVerse: (
7
+ value: IVersesBeforeAndAfterCurrentVerse,
8
+ ) => void;
9
+ }
10
+
11
+ const handleVersesBeforeAndAfterCurrentVerse = ({
12
+ originalVerse,
13
+ selectedVerse,
14
+ setVersesBeforeAndAfterCurrentVerse,
15
+ }: IProps) => {
16
+ const originalVerseLength = originalVerse?.length;
17
+ const selectedVerseIndex = originalVerse?.findIndex(
18
+ (item: ISurahVerse) => item?.id === selectedVerse?.id,
19
+ );
20
+ const indexOfVerseAfterSelectedVerse =
21
+ selectedVerseIndex + 1 <= originalVerseLength - 1
22
+ ? selectedVerseIndex + 1
23
+ : -1;
24
+ const indexOfVerseBeforeSelectedVerse =
25
+ selectedVerseIndex - 1 <= originalVerseLength - 1 &&
26
+ selectedVerseIndex - 1 >= 0
27
+ ? selectedVerseIndex - 1
28
+ : -1;
29
+ setVersesBeforeAndAfterCurrentVerse({
30
+ beforeCurrentVerse:
31
+ indexOfVerseBeforeSelectedVerse != -1
32
+ ? originalVerse[indexOfVerseBeforeSelectedVerse]
33
+ : null,
34
+ afterCurrentVerse:
35
+ indexOfVerseAfterSelectedVerse != -1
36
+ ? originalVerse[indexOfVerseAfterSelectedVerse]
37
+ : null,
38
+ });
39
+ };
40
+
41
+ export default handleVersesBeforeAndAfterCurrentVerse;
@@ -0,0 +1,6 @@
1
+ import axiosInstance from './axiosInstance';
2
+ import handleVersesBeforeAndAfterCurrentVerse from './handleBeforeAndAfterCurrentVerse';
3
+ export {axiosInstance, handleVersesBeforeAndAfterCurrentVerse};
4
+
5
+ export * from './matrics';
6
+ export * from './fileHandlers';
@@ -0,0 +1,37 @@
1
+ import {Dimensions, PixelRatio} from 'react-native';
2
+
3
+ const {width, height} = Dimensions.get('window');
4
+
5
+ const guidelineBaseWidth = 375;
6
+ const guidelineBaseHeight = 812;
7
+
8
+ const horizontalScale = (size: number) => (width / guidelineBaseWidth) * size;
9
+ const verticalScale = (size: number) => (height / guidelineBaseHeight) * size;
10
+ const moderateScale = (size: number, factor = 0.5) =>
11
+ size + (horizontalScale(size) - size) * factor;
12
+
13
+ const heightPercentageToDP = (heightPercent: number | string) => {
14
+ // Parse string percentage input and convert it to number.
15
+ const elemHeight =
16
+ typeof heightPercent === 'number'
17
+ ? heightPercent
18
+ : parseFloat(heightPercent);
19
+
20
+ // Use PixelRatio.roundToNearestPixel method in order to round the layout
21
+ // size (dp) to the nearest one that correspons to an integer number of pixels.
22
+ return PixelRatio.roundToNearestPixel((height * elemHeight) / 100);
23
+ };
24
+
25
+ const widthPercentageToDP = (widthPercent: number | string) => {
26
+ // Parse string percentage input and convert it to number.
27
+ const elemWidth =
28
+ typeof widthPercent === 'number' ? widthPercent : parseFloat(widthPercent);
29
+
30
+ // Use PixelRatio.roundToNearestPixel method in order to round the layout
31
+ // size (dp) to the nearest one that correspons to an integer number of pixels.
32
+ return PixelRatio.roundToNearestPixel((width * elemWidth) / 100);
33
+ };
34
+ const hp = (value: number | string) => heightPercentageToDP(value);
35
+ const wp = (value: number | string) => widthPercentageToDP(value);
36
+
37
+ export {horizontalScale, verticalScale, moderateScale, hp, wp};
package/tsconfig.json ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "@react-native/typescript-config/tsconfig.json"
3
+ }
package/videos/1.gif ADDED
Binary file