Problem
All three modal components contain identical useEffect logic for opening/closing the native <dialog> element:
useEffect(() => {
const dialog = dialogRef.current
if (!dialog) return
if (isOpen && !dialog.open) {
dialog.showModal()
} else if (!isOpen && dialog.open) {
dialog.close()
}
}, [isOpen])
This is repeated in:
DeleteConfirmModal.tsx
RenameModal.tsx
NewMemberModal.tsx
Proposed Solution
Extract to a custom hook:
function useDialogControl(isOpen: boolean, dialogRef: RefObject<HTMLDialogElement>) {
useEffect(() => {
const dialog = dialogRef.current
if (!dialog) return
if (isOpen && !dialog.open) {
dialog.showModal()
} else if (!isOpen && dialog.open) {
dialog.close()
}
}, [isOpen])
}
Impact
- 3 files affected
- Low risk refactor
- Improves DRY compliance
Discovered during PR review of fix/replace-prompt-with-modal
Problem
All three modal components contain identical useEffect logic for opening/closing the native
<dialog>element:This is repeated in:
DeleteConfirmModal.tsxRenameModal.tsxNewMemberModal.tsxProposed Solution
Extract to a custom hook:
Impact
Discovered during PR review of fix/replace-prompt-with-modal