import httpClient from '@/api/httpClient'; import { registerForPushNotificationsAsync } from '@/components/NotificationProvider'; import { useQueryClient } from '@tanstack/react-query'; import * as Notifications from 'expo-notifications'; import { router } from 'expo-router'; import { useEffect, useRef } from 'react'; import { Platform } from 'react-native'; import { getToken } from './storage.native'; export interface IRegisterDeviceBody { token: string; platform: string; } export const commonRequests = { /** * Register device for notification * @param body token * @returns */ async registerDevice(body: IRegisterDeviceBody) { const response = await httpClient.post('https://api.infotarget.uz/api/push-token/', body, { headers: { Authorization: `Bearer ${getToken()}`, }, }); return response; }, }; export function useNotifications() { const notificationListener = useRef(null); const responseListener = useRef(null); const queryClient = useQueryClient(); useEffect(() => { // Android channel if (Platform.OS === 'android') { Notifications.setNotificationChannelAsync('default', { name: 'default', importance: Notifications.AndroidImportance.MAX, vibrationPattern: [0, 250, 250, 250], lightColor: '#FF231F7C', }); } // Foreground listener notificationListener.current = Notifications.addNotificationReceivedListener((notification) => { console.log('Notification received:', notification); }); // User response listener responseListener.current = Notifications.addNotificationResponseReceivedListener((response) => { const data = response.notification.request.content.data; queryClient.refetchQueries({ queryKey: ['notification-list'] }); queryClient.refetchQueries({ queryKey: ['notifications-list'] }); router.push('/profile/notification'); }); // Token olish va serverga yuborish registerForPushNotificationsAsync().then((token) => { if (!token) return; commonRequests.registerDevice({ token, platform: Platform.OS }); }); return () => { notificationListener.current?.remove(); responseListener.current?.remove(); }; }, []); }