1
0

index.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import { ThemedView } from '@/components/themed-view';
  2. import { useColorScheme } from '@/hooks/use-color-scheme';
  3. import { DarkTheme, DefaultTheme, ThemeProvider } from '@react-navigation/native';
  4. import { useEffect, useRef, useState } from "react";
  5. import { BackHandler, Platform, StyleSheet } from "react-native";
  6. import { LogLevel, OneSignal } from 'react-native-onesignal';
  7. import { WebView, WebViewNavigation } from "react-native-webview";
  8. import BottomTabs from "../components/bottom-tabs";
  9. import Header from "../components/header";
  10. import WebViewContainer from "../components/web-view";
  11. import { ONESIGNAL_APP_ID } from "../constants/settings";
  12. import { WebViewHandlers } from "../types/webview-handlers-type";
  13. import { requestAndroidPermissions } from "../utils/android-permissins-request";
  14. export default function App() {
  15. const colorScheme = useColorScheme();
  16. const webViewRef = useRef<WebView>(null);
  17. const [loggedin, setLoggedIn] = useState(false);
  18. const [title, setTitle] = useState("");
  19. const [loading, setLoadingState] = useState(false);
  20. const [canGoBack, setCanGoBack] = useState(false);
  21. const [data, setData] = useState<any>(null);
  22. const [backButtonEnabled, setBackButtonEnabled] = useState(true);
  23. // android permissions request
  24. useEffect(() => {
  25. requestAndroidPermissions();
  26. }, []);
  27. // OneSignal initialization
  28. useEffect(() => {
  29. OneSignal.Debug.setLogLevel(LogLevel.Verbose);
  30. OneSignal.setConsentRequired(true);
  31. OneSignal.initialize(ONESIGNAL_APP_ID);
  32. OneSignal.Notifications.addEventListener('click', (event:any) => {
  33. console.log('OneSignal: notification clicked:', event);
  34. const url = event.notification?.additionalData?.url;
  35. if (url && webViewRef.current) {
  36. webViewRef.current.injectJavaScript(`window.location = '${url}';`);
  37. }
  38. });
  39. }, []);
  40. // Android hardware back button
  41. useEffect(() => {
  42. let backHandler: any;
  43. if (Platform.OS === "android") {
  44. backHandler = BackHandler.addEventListener("hardwareBackPress", () => {
  45. if (backButtonEnabled && webViewRef.current) {
  46. webViewRef.current.goBack();
  47. return true;
  48. }
  49. return false;
  50. });
  51. }
  52. // cleanup
  53. return () => {
  54. if (Platform.OS === "android" && backHandler) {
  55. backHandler.remove();
  56. }
  57. };
  58. }, [backButtonEnabled]);
  59. // Handle navigation changes
  60. const handleNavChange = (nav: WebViewNavigation) => {
  61. setCanGoBack(nav.canGoBack);
  62. setTitle(nav.title || ""); // replaced with 'handleTitleChange'
  63. };
  64. // All WebViewHandlers
  65. const webViewHandlers: WebViewHandlers = {
  66. setLoading: (b:boolean) => {
  67. setLoadingState(b);
  68. },
  69. setData,
  70. setLoggedIn,
  71. onVideoCallStart: (uri, audio) => {
  72. console.log("Video call start:", uri, audio);
  73. // Add your actual video call logic here
  74. },
  75. endVideoCall: () => {
  76. console.log("Video call stop");
  77. },
  78. onRequestPurchase: (payload) => {
  79. console.log("Purchase request:", payload);
  80. },
  81. onRequestSubscription: (payload) => {
  82. console.log("Subscription request:", payload);
  83. },
  84. onHomeMenu: () => {
  85. console.log("Goto home");
  86. webViewRef.current?.reload(); // Example: reload home page
  87. },
  88. reload: () => {
  89. webViewRef.current?.reload();
  90. },
  91. onStateChange: handleNavChange,
  92. onLoadProgress: (progress) => setLoadingState(progress < 1),
  93. //onTitleChange: (newTitle) => setTitle(newTitle),
  94. };
  95. return (
  96. <ThemeProvider value={colorScheme === 'dark' ? DarkTheme : DefaultTheme}>
  97. <ThemedView style={styles.container}>
  98. <Header
  99. title={title}
  100. loading={loading}
  101. canGoBack={canGoBack}
  102. onBack={() => webViewRef.current?.goBack()}
  103. />
  104. <WebViewContainer
  105. ref={webViewRef}
  106. {...webViewHandlers}
  107. />
  108. {loggedin === true && (
  109. <BottomTabs webViewRef={webViewRef} data={data} />
  110. )}
  111. </ThemedView>
  112. </ThemeProvider>
  113. );
  114. }
  115. const styles = StyleSheet.create({
  116. container: { flex: 1 },
  117. });