@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.
- package/.bundle/config +2 -0
- package/.eslintrc.js +4 -0
- package/.prettierrc.js +7 -0
- package/.watchmanconfig +1 -0
- package/App.tsx +23 -0
- package/Gemfile +9 -0
- package/Gemfile.lock +105 -0
- package/MIGRATION.md +163 -0
- package/README.md +210 -0
- package/ReactotronConfig.js +7 -0
- package/__tests__/App.test.tsx +17 -0
- package/android/app/build.gradle +118 -0
- package/android/app/debug.keystore +0 -0
- package/android/app/proguard-rules.pro +10 -0
- package/android/app/src/debug/AndroidManifest.xml +9 -0
- package/android/app/src/main/AndroidManifest.xml +25 -0
- package/android/app/src/main/assets/fonts/Cairo.ttf +0 -0
- package/android/app/src/main/assets/fonts/QCF_BSML.ttf +0 -0
- package/android/app/src/main/assets/fonts/QCF_P001.ttf +0 -0
- package/android/app/src/main/java/com/quranapp/MainActivity.kt +22 -0
- package/android/app/src/main/java/com/quranapp/MainApplication.kt +43 -0
- package/android/app/src/main/res/drawable/rn_edit_text_material.xml +37 -0
- package/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
- package/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
- package/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
- package/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
- package/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
- package/android/app/src/main/res/values/strings.xml +3 -0
- package/android/app/src/main/res/values/styles.xml +9 -0
- package/android/build.gradle +21 -0
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/android/gradle.properties +41 -0
- package/android/gradlew +249 -0
- package/android/gradlew.bat +92 -0
- package/android/link-assets-manifest.json +17 -0
- package/android/settings.gradle +4 -0
- package/app.json +4 -0
- package/babel.config.js +3 -0
- package/index.js +11 -0
- package/ios/.xcode.env +11 -0
- package/ios/Podfile +40 -0
- package/ios/Podfile.lock +1460 -0
- package/ios/QuranApp/AppDelegate.h +6 -0
- package/ios/QuranApp/AppDelegate.mm +31 -0
- package/ios/QuranApp/Images.xcassets/AppIcon.appiconset/Contents.json +53 -0
- package/ios/QuranApp/Images.xcassets/Contents.json +6 -0
- package/ios/QuranApp/Info.plist +57 -0
- package/ios/QuranApp/LaunchScreen.storyboard +47 -0
- package/ios/QuranApp/PrivacyInfo.xcprivacy +38 -0
- package/ios/QuranApp/main.m +10 -0
- package/ios/QuranApp.xcodeproj/project.pbxproj +729 -0
- package/ios/QuranApp.xcodeproj/xcshareddata/xcschemes/QuranApp.xcscheme +88 -0
- package/ios/QuranApp.xcworkspace/contents.xcworkspacedata +10 -0
- package/ios/QuranAppTests/Info.plist +24 -0
- package/ios/QuranAppTests/QuranAppTests.m +66 -0
- package/ios/link-assets-manifest.json +17 -0
- package/jest.config.js +3 -0
- package/metro.config.js +11 -0
- package/package.json +54 -0
- package/react-native.config.js +7 -0
- package/screenshots/1.png +0 -0
- package/screenshots/2.png +0 -0
- package/screenshots/3.png +0 -0
- package/screenshots/4.png +0 -0
- package/screenshots/5.png +0 -0
- package/src/assets/fonts/Cairo.ttf +0 -0
- package/src/assets/fonts/QCF_BSML.ttf +0 -0
- package/src/assets/fonts/QCF_P001.ttf +0 -0
- package/src/assets/images/bookmark.png +0 -0
- package/src/assets/images/close.png +0 -0
- package/src/assets/images/copy.png +0 -0
- package/src/assets/images/down-chevron.png +0 -0
- package/src/assets/images/mushafFrame.png +0 -0
- package/src/assets/images/pause.png +0 -0
- package/src/assets/images/play-button.png +0 -0
- package/src/assets/images/play.svg +16 -0
- package/src/assets/images/playNext.png +0 -0
- package/src/assets/images/surahNameFrame.png +0 -0
- package/src/common/chapters.ts +1346 -0
- package/src/common/constants.ts +27 -0
- package/src/common/images.ts +13 -0
- package/src/common/index.ts +8 -0
- package/src/common/juzs.ts +411 -0
- package/src/common/priorityPages.ts +46 -0
- package/src/common/themes.ts +7 -0
- package/src/components/index.ts +3 -0
- package/src/components/lists/index.ts +3 -0
- package/src/components/lists/pageVersesList.tsx +220 -0
- package/src/components/lists/verseLinesWordsList.tsx +90 -0
- package/src/components/modals/index.ts +3 -0
- package/src/components/modals/optionsModal.tsx +126 -0
- package/src/components/modals/recitersModal.tsx +118 -0
- package/src/components/sections/audioPlayer.tsx +185 -0
- package/src/components/sections/audioPlayerControls.tsx +100 -0
- package/src/components/sections/index.ts +4 -0
- package/src/components/sections/loader.tsx +33 -0
- package/src/helpers/index.ts +1 -0
- package/src/helpers/quranHelpers.tsx +17 -0
- package/src/hooks/apis/index.ts +10 -0
- package/src/hooks/apis/useGetChapterAudio.ts +111 -0
- package/src/hooks/apis/useGetChapterByPage.ts +166 -0
- package/src/hooks/apis/useGetChapterLookup.ts +31 -0
- package/src/hooks/apis/useGetReciters.ts +44 -0
- package/src/hooks/controllers/index.ts +25 -0
- package/src/hooks/controllers/useAudioPlayerController.tsx +63 -0
- package/src/hooks/controllers/useOptionsModalController.ts +99 -0
- package/src/hooks/controllers/usePageFontFileController.ts +255 -0
- package/src/hooks/controllers/usePageLineController.ts +108 -0
- package/src/hooks/helpers/index.ts +6 -0
- package/src/hooks/helpers/useQuranFontPreloader.ts +225 -0
- package/src/hooks/index.ts +3 -0
- package/src/index.ts +5 -0
- package/src/layouts/bismillahText.tsx +18 -0
- package/src/layouts/index.ts +4 -0
- package/src/layouts/quranChapterHeader.tsx +49 -0
- package/src/layouts/quranPageLayout.tsx +178 -0
- package/src/types/global.d.ts +7 -0
- package/src/types/index.ts +212 -0
- package/src/utils/axiosInstance.ts +7 -0
- package/src/utils/fileHandlers.ts +96 -0
- package/src/utils/handleBeforeAndAfterCurrentVerse.ts +41 -0
- package/src/utils/index.ts +6 -0
- package/src/utils/matrics.ts +37 -0
- package/tsconfig.json +3 -0
- package/videos/1.gif +0 -0
|
@@ -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,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
package/videos/1.gif
ADDED
|
Binary file
|