/
lizardking
/
react_project
Обзор
Документация
Войти
/
lizardking
/
react_project
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
react19
src/shared/ui/ConfirmDialog/ConfirmDialogProvider.tsx
62 строки
2 KB
LizardKing
Task 8 - React Portal
10 ноя 2025, 16:20
10 ноя 2025, 16:20
683d199
Код
Авторство
О чём код?
import React, { useCallback, useMemo, useState } from 'react' import { ConfirmDialog } from './ConfirmDialog' import { ConfirmDialogContext } from './context' import type { ConfirmDialogOptions, DialogState, ShowConfirmDialog } from './types' export function ConfirmDialogProvider({ children }: { children: React.ReactNode }) { const [state, setState] = useState<DialogState>({ isOpen: false, options: null, resolve: null, }) const showConfirmDialog = useCallback<ShowConfirmDialog>( (options?: ConfirmDialogOptions) => new Promise<boolean>((resolve) => { setState({ isOpen: true, options: options ?? {}, resolve, }) }), [], ) const handleResolve = useCallback((result: boolean) => { setState((previous) => { previous.resolve?.(result) return { isOpen: false, options: null, resolve: null } }) }, []) const handleConfirm = useCallback(() => { handleResolve(true) }, [handleResolve]) const handleCancel = useCallback(() => { handleResolve(false) }, [handleResolve]) const contextValue = useMemo<ShowConfirmDialog>(() => showConfirmDialog, [showConfirmDialog]) const safeTitle = state.options?.title ?? 'Подтвердить действие?' const safeDescription = state.options?.description ?? 'Это действие необратимо.' const safeConfirm = state.options?.confirmText ?? 'Подтвердить' const safeCancel = state.options?.cancelText ?? 'Отмена' return ( <ConfirmDialogContext.Provider value={contextValue}> {children} {state.isOpen && ( <ConfirmDialog title={safeTitle} description={safeDescription} confirmText={safeConfirm} cancelText={safeCancel} onConfirm={handleConfirm} onCancel={handleCancel} /> )} </ConfirmDialogContext.Provider> ) }