92 lines
1.8 KiB
TypeScript
92 lines
1.8 KiB
TypeScript
import { Ionicons } from '@expo/vector-icons';
|
|
import { useState } from 'react';
|
|
|
|
export interface DialogConfig {
|
|
title: string;
|
|
message?: string;
|
|
confirmText?: string;
|
|
cancelText?: string;
|
|
destructive?: boolean;
|
|
icon?: keyof typeof Ionicons.glyphMap;
|
|
iconColor?: string;
|
|
}
|
|
|
|
export interface ActionSheetConfig {
|
|
title?: string;
|
|
subtitle?: string;
|
|
cancelText?: string;
|
|
}
|
|
|
|
export interface ActionSheetOption {
|
|
id: string;
|
|
title: string;
|
|
subtitle?: string;
|
|
icon?: keyof typeof Ionicons.glyphMap;
|
|
iconColor?: string;
|
|
destructive?: boolean;
|
|
onPress: () => void;
|
|
}
|
|
|
|
export function useDialog() {
|
|
// 确认弹窗状态
|
|
const [confirmDialog, setConfirmDialog] = useState<{
|
|
visible: boolean;
|
|
config: DialogConfig;
|
|
onConfirm: () => void;
|
|
}>({
|
|
visible: false,
|
|
config: { title: '' },
|
|
onConfirm: () => {},
|
|
});
|
|
|
|
// ActionSheet状态
|
|
const [actionSheet, setActionSheet] = useState<{
|
|
visible: boolean;
|
|
config: ActionSheetConfig;
|
|
options: ActionSheetOption[];
|
|
}>({
|
|
visible: false,
|
|
config: {},
|
|
options: [],
|
|
});
|
|
|
|
// 显示确认弹窗
|
|
const showConfirm = (config: DialogConfig, onConfirm: () => void) => {
|
|
setConfirmDialog({
|
|
visible: true,
|
|
config,
|
|
onConfirm,
|
|
});
|
|
};
|
|
|
|
// 显示ActionSheet
|
|
const showActionSheet = (config: ActionSheetConfig, options: ActionSheetOption[]) => {
|
|
setActionSheet({
|
|
visible: true,
|
|
config,
|
|
options,
|
|
});
|
|
};
|
|
|
|
// 关闭确认弹窗
|
|
const hideConfirm = () => {
|
|
setConfirmDialog(prev => ({ ...prev, visible: false }));
|
|
};
|
|
|
|
// 关闭ActionSheet
|
|
const hideActionSheet = () => {
|
|
setActionSheet(prev => ({ ...prev, visible: false }));
|
|
};
|
|
|
|
return {
|
|
// 确认弹窗
|
|
confirmDialog,
|
|
showConfirm,
|
|
hideConfirm,
|
|
|
|
// ActionSheet
|
|
actionSheet,
|
|
showActionSheet,
|
|
hideActionSheet,
|
|
};
|
|
} |