Skip to content

Commit a210911

Browse files
committed
create useModalClose hook
1 parent 757b9c3 commit a210911

File tree

3 files changed

+31
-1
lines changed

3 files changed

+31
-1
lines changed

src/components/AddSourceDialog.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { useState } from "react";
2+
import { useModalClose } from "../hooks/useModalClose";
23

34
interface AddSourceDialogProps {
45
onAdd: (source: NewSourceFormData) => void;
@@ -44,6 +45,7 @@ const initialFormState: FormFields = {
4445

4546
export function AddSourceDialog({ onAdd, onClose }: AddSourceDialogProps) {
4647
const [formState, setFormState] = useState<FormFields>(initialFormState);
48+
const { handleOverlayClick } = useModalClose(onClose);
4749

4850
function handleSubmit(e: React.FormEvent) {
4951
e.preventDefault();
@@ -111,6 +113,7 @@ export function AddSourceDialog({ onAdd, onClose }: AddSourceDialogProps) {
111113
<div
112114
className="fixed inset-0 bg-black/50 flex items-center justify-center"
113115
style={{ zIndex: 9999 }}
116+
onClick={handleOverlayClick}
114117
>
115118
<div className="bg-white rounded-lg p-6 w-full max-w-md">
116119
<h2 className="text-lg font-semibold mb-4">Add New Map Source</h2>

src/components/ApiKeysDialog.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useState } from "react";
22
import { useLocalStorage } from "../hooks/useLocalStorage";
3+
import { useModalClose } from "../hooks/useModalClose";
34

45
interface ApiKeysDialogProps {
56
onClose: () => void;
@@ -12,6 +13,7 @@ interface ApiKeys {
1213
export function ApiKeysDialog({ onClose }: ApiKeysDialogProps) {
1314
const [apiKeys, setApiKeys] = useLocalStorage<ApiKeys>("apiKeys", {});
1415
const [googleMapsKey, setGoogleMapsKey] = useState(apiKeys.googleMaps || "");
16+
const { handleOverlayClick } = useModalClose(onClose);
1517

1618
const handleSubmit = (e: React.FormEvent) => {
1719
e.preventDefault();
@@ -23,7 +25,10 @@ export function ApiKeysDialog({ onClose }: ApiKeysDialogProps) {
2325
};
2426

2527
return (
26-
<div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
28+
<div
29+
className="fixed inset-0 bg-black/50 flex items-center justify-center z-50"
30+
onClick={handleOverlayClick}
31+
>
2732
<div className="bg-white rounded-lg p-6 w-full max-w-md">
2833
<div className="flex justify-between items-center mb-4">
2934
<h2 className="text-lg font-semibold">API Keys Configuration</h2>

src/hooks/useModalClose.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { useEffect } from "react";
2+
3+
export function useModalClose(onClose: () => void) {
4+
useEffect(() => {
5+
const handleEscape = (event: KeyboardEvent) => {
6+
if (event.key === "Escape") {
7+
onClose();
8+
}
9+
};
10+
11+
window.addEventListener("keydown", handleEscape);
12+
return () => window.removeEventListener("keydown", handleEscape);
13+
}, [onClose]);
14+
15+
const handleOverlayClick = (event: React.MouseEvent) => {
16+
if (event.target === event.currentTarget) {
17+
onClose();
18+
}
19+
};
20+
21+
return { handleOverlayClick };
22+
}

0 commit comments

Comments
 (0)