Deskripsi: - on klik pada background notification - hide and show notificationn foreground No Issues
153 lines
6.6 KiB
TypeScript
153 lines
6.6 KiB
TypeScript
import HeaderRightAnnouncementList from "@/components/announcement/headerAnnouncementList";
|
|
import ButtonBackHeader from "@/components/buttonBackHeader";
|
|
import HeaderDiscussionGeneral from "@/components/discussion_general/headerDiscussionGeneral";
|
|
import HeaderRightDivisionList from "@/components/division/headerDivisionList";
|
|
import HeaderRightGroupList from "@/components/group/headerGroupList";
|
|
import HeaderMemberList from "@/components/member/headerMemberList";
|
|
import HeaderRightPositionList from "@/components/position/headerRightPositionList";
|
|
import HeaderRightProjectList from "@/components/project/headerProjectList";
|
|
import Text from "@/components/Text";
|
|
import ToastCustom from "@/components/toastCustom";
|
|
import { Headers } from "@/constants/Headers";
|
|
import { apiReadOneNotification } from "@/lib/api";
|
|
import { pushToPage } from "@/lib/pushToPage";
|
|
import store from "@/lib/store";
|
|
import { useAuthSession } from "@/providers/AuthProvider";
|
|
import AsyncStorage from "@react-native-async-storage/async-storage";
|
|
import firebase from '@react-native-firebase/app';
|
|
import { Redirect, router, Stack, usePathname } from "expo-router";
|
|
import { StatusBar } from 'expo-status-bar';
|
|
import { useEffect } from "react";
|
|
import { Easing, Notifier } from 'react-native-notifier';
|
|
import { Provider } from "react-redux";
|
|
|
|
export default function RootLayout() {
|
|
const { token, decryptToken, isLoading } = useAuthSession()
|
|
const pathname = usePathname()
|
|
|
|
async function handleReadNotification(id: string, category: string, idContent: string, title: string) {
|
|
try {
|
|
if (title != "Komentar Baru") {
|
|
const hasil = await decryptToken(String(token?.current))
|
|
const response = await apiReadOneNotification({ user: hasil, id: id })
|
|
}
|
|
pushToPage(category, idContent)
|
|
} catch (error) {
|
|
console.error(error)
|
|
}
|
|
}
|
|
|
|
useEffect(() => {
|
|
const checkNavigation = async () => {
|
|
const navData = await AsyncStorage.getItem('navigateOnOpen');
|
|
if (navData) {
|
|
const { screen, content } = JSON.parse(navData);
|
|
await AsyncStorage.removeItem('navigateOnOpen'); // reset
|
|
pushToPage(screen, content)
|
|
}
|
|
};
|
|
|
|
checkNavigation();
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
const unsubscribe = firebase.app().messaging().onMessage(async remoteMessage => {
|
|
const id = remoteMessage?.data?.id;
|
|
const category = remoteMessage?.data?.category;
|
|
const content = remoteMessage?.data?.content;
|
|
const title = remoteMessage?.notification?.title;
|
|
|
|
if (remoteMessage.notification != undefined && remoteMessage.notification.title != undefined && remoteMessage.notification.body != undefined) {
|
|
if (category == 'discussion-general' && pathname == '/discussion/' + content) {
|
|
return null
|
|
} else if (pathname != `/${category}/${content}`) {
|
|
Notifier.showNotification({
|
|
title: title,
|
|
description: remoteMessage.notification?.body,
|
|
duration: 3000,
|
|
animationDuration: 300,
|
|
showEasing: Easing.ease,
|
|
onPress: () => handleReadNotification(String(id), String(category), String(content), String(title)),
|
|
hideOnPress: true,
|
|
});
|
|
}
|
|
}
|
|
});
|
|
|
|
return unsubscribe;
|
|
}, [pathname]);
|
|
|
|
|
|
if (isLoading) {
|
|
return <Text>Loading...</Text>;
|
|
}
|
|
|
|
if (!token?.current) {
|
|
return <Redirect href="/" />;
|
|
}
|
|
|
|
return (
|
|
<Provider store={store}>
|
|
<Stack screenOptions={Headers.shadow} >
|
|
<Stack.Screen name="home" options={{ title: 'Home' }} />
|
|
<Stack.Screen name="feature" options={{ title: 'Fitur' }} />
|
|
<Stack.Screen name="search" options={{ title: 'Pencarian' }} />
|
|
<Stack.Screen name="notification" options={{
|
|
title: 'Notifikasi',
|
|
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
|
|
headerTitle: 'Notifikasi',
|
|
headerTitleAlign: 'center'
|
|
}} />
|
|
<Stack.Screen name="profile" options={{ title: 'Profile' }} />
|
|
<Stack.Screen name="member/index" options={{
|
|
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
|
|
title: 'Anggota',
|
|
headerTitleAlign: 'center',
|
|
headerRight: () => <HeaderMemberList />
|
|
}} />
|
|
<Stack.Screen name="discussion/index" options={{
|
|
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
|
|
title: 'Diskusi Umum',
|
|
headerTitleAlign: 'center',
|
|
headerRight: () => <HeaderDiscussionGeneral />
|
|
}} />
|
|
<Stack.Screen name="project/index" options={{
|
|
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
|
|
title: 'Kegiatan',
|
|
headerTitleAlign: 'center',
|
|
headerRight: () => <HeaderRightProjectList />
|
|
}} />
|
|
<Stack.Screen name="division/index" options={{
|
|
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
|
|
title: 'Divisi',
|
|
headerTitleAlign: 'center',
|
|
headerRight: () => <HeaderRightDivisionList />
|
|
}} />
|
|
<Stack.Screen name="division/[id]/(fitur-division)" options={{ headerShown: false }} />
|
|
<Stack.Screen name="group/index" options={{
|
|
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
|
|
headerTitle: 'Lembaga Desa',
|
|
headerTitleAlign: 'center',
|
|
headerRight: () => <HeaderRightGroupList />
|
|
}} />
|
|
<Stack.Screen name="position/index" options={{
|
|
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
|
|
headerTitle: 'Jabatan',
|
|
headerTitleAlign: 'center',
|
|
headerRight: () => <HeaderRightPositionList />
|
|
}} />
|
|
<Stack.Screen name="announcement/index"
|
|
options={{
|
|
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
|
|
headerTitle: 'Pengumuman',
|
|
headerTitleAlign: 'center',
|
|
headerRight: () => <HeaderRightAnnouncementList />
|
|
}}
|
|
/>
|
|
</Stack>
|
|
<StatusBar style="light" translucent={false} backgroundColor="black" />
|
|
<ToastCustom />
|
|
</Provider>
|
|
)
|
|
}
|