feat: implement useOverlayDismiss hook for consistent modal dismissal behavior

This commit is contained in:
hamed
2026-08-10 11:27:16 +03:30
parent 8a18457751
commit 3365a0427e
12 changed files with 227 additions and 36 deletions
+6 -3
View File
@@ -1,4 +1,4 @@
import React, { useState } from 'react';
import React, { useCallback, useState } from 'react';
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { CheckIcon, XMarkIcon, PhoneIcon } from '@heroicons/react/24/outline';
import { toast } from 'sonner';
@@ -9,6 +9,7 @@ import { formatDate } from '../lib/utils';
import PageHeader from '../components/ui/PageHeader';
import Pagination from '../components/ui/Pagination';
import ConfirmDialog from '../components/ui/ConfirmDialog';
import { useOverlayDismiss } from '../hooks/useOverlayDismiss';
interface PreRegistration {
uuid: string;
@@ -49,6 +50,8 @@ export default function PreRegistrationsPage() {
const [approveTarget, setApproveTarget] = useState<PreRegistration | null>(null);
const [rejectTarget, setRejectTarget] = useState<PreRegistration | null>(null);
const [rejectNote, setRejectNote] = useState('');
const closeReject = useCallback(() => setRejectTarget(null), []);
const rejectDismiss = useOverlayDismiss(closeReject);
const limit = 20;
const { data, isLoading } = useQuery<PaginatedResponse<PreRegistration>>({
@@ -206,8 +209,8 @@ export default function PreRegistrationsPage() {
{/* Reject Dialog */}
{rejectTarget && (
<Portal>
<div className="overlay" onClick={() => setRejectTarget(null)}>
<div className="modal" style={{ maxWidth: 420 }} onClick={(e) => e.stopPropagation()}>
<div className="overlay" {...rejectDismiss}>
<div className="modal" style={{ maxWidth: 420 }}>
<div className="modal-head">
<b>رد درخواست {rejectTarget.name}</b>
</div>