45 lines
1.1 KiB
TypeScript
45 lines
1.1 KiB
TypeScript
import { Alert as RNAlert, Platform } from 'react-native';
|
|
|
|
interface AlertButton {
|
|
text: string;
|
|
onPress?: () => void;
|
|
style?: 'default' | 'cancel' | 'destructive';
|
|
}
|
|
|
|
class PlatformAlert {
|
|
alert(title: string, message?: string, buttons?: AlertButton[]) {
|
|
if (Platform.OS === 'web') {
|
|
this.webAlert(title, message, buttons);
|
|
} else {
|
|
RNAlert.alert(title, message, buttons);
|
|
}
|
|
}
|
|
|
|
private webAlert(title: string, message?: string, buttons?: AlertButton[]) {
|
|
const fullMessage = message ? `${title}\n\n${message}` : title;
|
|
|
|
if (!buttons || buttons.length === 0) {
|
|
window.alert(fullMessage);
|
|
return;
|
|
}
|
|
|
|
if (buttons.length === 1) {
|
|
window.alert(fullMessage);
|
|
buttons[0].onPress?.();
|
|
return;
|
|
}
|
|
|
|
const confirmed = window.confirm(fullMessage);
|
|
|
|
if (confirmed) {
|
|
const confirmButton = buttons.find(btn => btn.style !== 'cancel');
|
|
confirmButton?.onPress?.();
|
|
} else {
|
|
const cancelButton = buttons.find(btn => btn.style === 'cancel');
|
|
cancelButton?.onPress?.();
|
|
}
|
|
}
|
|
}
|
|
|
|
export const Alert = new PlatformAlert();
|