memowake-front/context/PermissionContext.tsx

83 lines
2.5 KiB
TypeScript

import PermissionAlert from '@/components/common/PermissionAlert';
import i18n from '@/i18n';
import { PermissionService } from '@/lib/PermissionService';
import React, { createContext, ReactNode, useCallback, useContext, useEffect, useState } from 'react';
import { Linking } from 'react-native';
interface PermissionAlertOptions {
title: string;
message: string;
confirmText?: string;
cancelText?: string;
}
interface PermissionContextType {
showPermissionAlert: (options: PermissionAlertOptions) => Promise<boolean>;
}
interface AlertData {
options: PermissionAlertOptions;
resolve: (value: boolean) => void;
}
const PermissionContext = createContext<PermissionContextType | undefined>(undefined);
export const PermissionProvider = ({ children }: { children: ReactNode }) => {
const [alertData, setAlertData] = useState<AlertData | null>(null);
const showPermissionAlert = useCallback((options: PermissionAlertOptions) => {
return new Promise<boolean>((resolve) => {
setAlertData({ options, resolve });
});
}, []);
useEffect(() => {
PermissionService.set(showPermissionAlert);
// Cleanup on unmount
return () => {
PermissionService.set(null as any); // or a no-op function
};
}, [showPermissionAlert]);
const handleConfirm = () => {
Linking.openSettings();
if (alertData?.resolve) {
alertData.resolve(true);
}
setAlertData(null);
};
const handleCancel = () => {
if (alertData?.resolve) {
alertData.resolve(false);
}
setAlertData(null);
};
return (
<PermissionContext.Provider value={{ showPermissionAlert }}>
{children}
{alertData && (
<PermissionAlert
visible={!!alertData}
title={alertData.options.title}
message={alertData.options.message}
confirmText={alertData.options.confirmText || i18n.t('permission:button.confirm')}
cancelText={alertData.options.cancelText || i18n.t('permission:button.cancel')}
onConfirm={handleConfirm}
onCancel={handleCancel}
/>
)}
</PermissionContext.Provider>
);
};
export const usePermission = (): PermissionContextType => {
const context = useContext(PermissionContext);
if (!context) {
throw new Error('usePermission must be used within a PermissionProvider');
}
return context;
};