import * as Notifications from 'expo-notifications'; import { useCallback, useEffect, useState } from 'react'; import { NotificationData, notificationService, NotificationTypes } from '../services/notifications'; export interface UseNotificationsReturn { isInitialized: boolean; permissionStatus: Notifications.PermissionStatus | null; initialize: () => Promise; requestPermission: () => Promise; sendNotification: (notification: NotificationData) => Promise; scheduleNotification: (notification: NotificationData, date: Date) => Promise; scheduleRepeatingNotification: ( notification: NotificationData, interval: { seconds?: number; minutes?: number; hours?: number; days?: number; weeks?: number; months?: number; years?: number; } ) => Promise; cancelNotification: (notificationId: string) => Promise; cancelAllNotifications: () => Promise; getAllScheduledNotifications: () => Promise; sendWorkoutReminder: (title: string, body: string, date?: Date) => Promise; sendMoodCheckinReminder: (title: string, body: string, date?: Date) => Promise; } export const useNotifications = (): UseNotificationsReturn => { const [isInitialized, setIsInitialized] = useState(false); const [permissionStatus, setPermissionStatus] = useState(null); const initialize = useCallback(async () => { try { await notificationService.initialize(); const status = await notificationService.getPermissionStatus(); setPermissionStatus(status); setIsInitialized(true); } catch (error) { console.error('初始化通知服务失败:', error); } }, []); const requestPermission = useCallback(async () => { try { const status = await notificationService.requestPermission(); setPermissionStatus(status); return status; } catch (error) { console.error('请求通知权限失败:', error); throw error; } }, []); const sendNotification = useCallback(async (notification: NotificationData) => { return notificationService.sendImmediateNotification(notification); }, []); const scheduleNotification = useCallback(async (notification: NotificationData, date: Date) => { return notificationService.scheduleNotificationAtDate(notification, date); }, []); const scheduleRepeatingNotification = useCallback(async ( notification: NotificationData, interval: { seconds?: number; minutes?: number; hours?: number; days?: number; weeks?: number; months?: number; years?: number; } ) => { return notificationService.scheduleRepeatingNotification(notification, interval); }, []); const cancelNotification = useCallback(async (notificationId: string) => { return notificationService.cancelNotification(notificationId); }, []); const cancelAllNotifications = useCallback(async () => { return notificationService.cancelAllNotifications(); }, []); const getAllScheduledNotifications = useCallback(async () => { return notificationService.getAllScheduledNotifications(); }, []); const sendWorkoutReminder = useCallback(async (title: string, body: string, date?: Date) => { const notification: NotificationData = { title, body, data: { type: NotificationTypes.WORKOUT_REMINDER }, sound: true, priority: 'high', }; if (date) { return notificationService.scheduleNotificationAtDate(notification, date); } else { return notificationService.sendImmediateNotification(notification); } }, []); // sendGoalAchievement 函数已删除,因为目标功能已移除 const sendMoodCheckinReminder = useCallback(async (title: string, body: string, date?: Date) => { const notification: NotificationData = { title, body, data: { type: NotificationTypes.MOOD_CHECKIN }, sound: true, priority: 'normal', }; if (date) { return notificationService.scheduleNotificationAtDate(notification, date); } else { return notificationService.sendImmediateNotification(notification); } }, []); // 组件挂载时自动初始化 useEffect(() => { initialize(); }, [initialize]); return { isInitialized, permissionStatus, initialize, requestPermission, sendNotification, scheduleNotification, scheduleRepeatingNotification, cancelNotification, cancelAllNotifications, getAllScheduledNotifications, sendWorkoutReminder, sendMoodCheckinReminder, }; };