Files
sam-react-prod/src/contexts/FCMProvider.tsx

81 lines
1.7 KiB
TypeScript
Raw Normal View History

'use client';
/**
* FCM Provider
*
* Capacitor FCM .
* RootProvider (protected)/layout.tsx에서 .
*
* @example
* ```tsx
* // (protected)/layout.tsx
* import { FCMProvider } from '@/contexts/FCMProvider';
*
* export default function ProtectedLayout({ children }) {
* return (
* <RootProvider>
* <FCMProvider>
* {children}
* </FCMProvider>
* </RootProvider>
* );
* }
* ```
*/
import { ReactNode, createContext, useContext } from 'react';
import { useFCM } from '@/hooks/useFCM';
// ===== Context 타입 =====
interface FCMContextType {
cleanup: () => Promise<void>;
}
const FCMContext = createContext<FCMContextType | undefined>(undefined);
// ===== Provider 컴포넌트 =====
export function FCMProvider({ children }: { children: ReactNode }) {
// FCM 훅 실행 (초기화)
const { cleanup } = useFCM();
return (
<FCMContext.Provider value={{ cleanup }}>
{children}
</FCMContext.Provider>
);
}
// ===== Custom Hook =====
/**
* FCM Context
*
* @example
* ```tsx
* function LogoutButton() {
* const { cleanup } = useFCMContext();
*
* const handleLogout = async () => {
* await cleanup(); // FCM 토큰 해제
* // ... 로그아웃 처리
* };
* }
* ```
*/
export function useFCMContext() {
const context = useContext(FCMContext);
if (context === undefined) {
throw new Error('useFCMContext must be used within a FCMProvider');
}
return context;
}
/**
* FCM Context (Provider )
* undefined FCM이
*/
export function useFCMContextSafe() {
return useContext(FCMContext);
}