diff --git a/src/components/fontButton/ControlFont.tsx b/src/components/fontButton/ControlFont.tsx index 1595e25..a341fea 100644 --- a/src/components/fontButton/ControlFont.tsx +++ b/src/components/fontButton/ControlFont.tsx @@ -7,10 +7,16 @@ import { STORAGE_KEYS } from "../../background/constants"; type UppercaseFontWeight = "REGULAR" | "BOLD" | "XBOLD"; type UppercaseFontSize = "XS" | "S" | "M" | "L" | "XL"; -const ControlFont = () => { +interface ControlFontProps { + onClose: () => void; +} + +const ControlFont: React.FC = ({ onClose }) => { const [selectedWeight, setSelectedWeight] = useState("BOLD"); const [selectedSize, setSelectedSize] = useState("S"); + const [hasChanged, setHasChanged] = useState(false); + const { setFontSize, setFontWeight, @@ -63,14 +69,6 @@ const ControlFont = () => { } }, [fontWeight, fontSize]); - function isValidFontWeight(value: string): value is UppercaseFontWeight { - return ["REGULAR", "BOLD", "XBOLD"].includes(value); - } - - function isValidFontSize(value: string): value is UppercaseFontSize { - return ["XS", "S", "M", "L", "XL"].includes(value); - } - const sendMessage = (type: string) => { chrome.runtime.sendMessage({ type }, (response) => { if (chrome.runtime.lastError) { @@ -81,39 +79,35 @@ const ControlFont = () => { const handleWeightClick = (label: string) => { const value = weightMap[label]; + + if (value !== selectedWeight) setHasChanged(true); setSelectedWeight(value); - if (chrome?.storage?.local) { - chrome.storage.local - .set({ [STORAGE_KEYS.FONT_WEIGHT]: toFontWeight(value) }) - .catch((err) => console.error("폰트 굵기 저장 오류:", err)); - } + chrome.storage?.local + .set({ [STORAGE_KEYS.FONT_WEIGHT]: toFontWeight(value) }) + .catch((err) => console.error("폰트 굵기 저장 오류:", err)); sendMessage(`SET_FONT_WEIGHT_${value}`); - - const fontWeight = toFontWeight(value); - setFontWeight(fontWeight); + setFontWeight(toFontWeight(value)); }; const handleSizeClick = (label: string) => { const value = sizeMap[label]; + + if (value !== selectedSize) setHasChanged(true); setSelectedSize(value); - if (chrome?.storage?.local) { - chrome.storage.local - .set({ [STORAGE_KEYS.FONT_SIZE]: toFontSize(value) }) - .catch((err) => console.error("폰트 크기 저장 오류:", err)); - } + chrome.storage?.local + .set({ [STORAGE_KEYS.FONT_SIZE]: toFontSize(value) }) + .catch((err) => console.error("폰트 크기 저장 오류:", err)); sendMessage(`SET_FONT_SIZE_${value}`); - - const fontSize = toFontSize(value); - setFontSize(fontSize); + setFontSize(toFontSize(value)); }; return (
{ )}
+ + ); }; diff --git a/src/components/modeButton/ControlMode.tsx b/src/components/modeButton/ControlMode.tsx index 534a3c7..d70bf27 100644 --- a/src/components/modeButton/ControlMode.tsx +++ b/src/components/modeButton/ControlMode.tsx @@ -3,8 +3,13 @@ import { ModeButton } from "./component"; import { useTheme } from "@src/contexts/ThemeContext"; import { STORAGE_KEYS } from "../../background/constants"; -const ControlMode = () => { +interface ControlModeProps { + onClose: () => void; +} + +const ControlMode: React.FC = ({ onClose }) => { const [selectedMode, setSelectedMode] = useState<"LIGHT" | "DARK">("LIGHT"); + const [hasChanged, setHasChanged] = useState(false); const { fontClasses, setTheme, theme } = useTheme(); const isDarkMode = theme === "dark"; @@ -19,15 +24,17 @@ const ControlMode = () => { const handleModeClick = (label: string) => { const value = modeMap[label]; + if (value !== selectedMode) { + setHasChanged(true); + } + setSelectedMode(value); const themeMode = value === "DARK" ? "dark" : "light"; setTheme(themeMode); - if (chrome?.storage?.local) { - chrome.storage.local - .set({ [STORAGE_KEYS.THEME_MODE]: `SET_MODE_${value}` }) - .catch((err) => console.error("테마 모드 저장 오류:", err)); - } + chrome.storage?.local + .set({ [STORAGE_KEYS.THEME_MODE]: `SET_MODE_${value}` }) + .catch((err) => console.error("테마 모드 저장 오류:", err)); chrome.runtime.sendMessage( { type: `SET_MODE_${value}` }, @@ -58,7 +65,7 @@ const ControlMode = () => { isSelected={value === selectedMode} modeType={value} aria-label={ - "고대비 화면 설정" + label.replace("\n", " ") + "고대비 화면 설정 " + label.replace("\n", " ") } > {label.split("\n").map((line, i) => ( @@ -68,6 +75,13 @@ const ControlMode = () => { ))} + + ); }; diff --git a/src/components/panelContent/component.tsx b/src/components/panelContent/component.tsx index b4a4701..f4b54cc 100644 --- a/src/components/panelContent/component.tsx +++ b/src/components/panelContent/component.tsx @@ -9,9 +9,13 @@ import { menuItems } from "@src/constants/menuItems"; interface PanelContentProps { menuId: string | null; + setMenuId: (id: string | null) => void; } -export const PanelContent: React.FC = ({ menuId }) => { +export const PanelContent: React.FC = ({ + menuId, + setMenuId, +}) => { const panelRef = useRef(null); const { firstFocusableRef, lastFocusableRef, isPanelFocused } = useFocusManagement(menuId, panelRef); @@ -19,15 +23,15 @@ export const PanelContent: React.FC = ({ menuId }) => { const renderPanelContent = () => { switch (menuId) { case "high-contrast": - return ; + return setMenuId(null)} />; case "font": - return ; + return setMenuId(null)} />; case "shortcut": return ; case "my-info": return ; case "service": - return ; + return setMenuId(null)} />; default: return null; } diff --git a/src/components/serviceButton/ControlService.tsx b/src/components/serviceButton/ControlService.tsx index 5b48a9d..636f624 100644 --- a/src/components/serviceButton/ControlService.tsx +++ b/src/components/serviceButton/ControlService.tsx @@ -2,22 +2,29 @@ import React, { useState } from "react"; import { useTheme } from "@src/contexts/ThemeContext"; import { ServiceButton } from "./component"; -const ControlService = () => { +interface ControlServiceProps { + onClose: () => void; +} + +const ControlService: React.FC = ({ onClose }) => { const { theme, fontClasses } = useTheme(); const isDarkMode = theme === "dark"; const [isLogoVisible, setIsLogoVisible] = useState(true); + const [hasChanged, setHasChanged] = useState(false); const stopExtension = () => { chrome.runtime.sendMessage( { type: "SET_STYLES_ENABLED", enabled: false }, () => { + setHasChanged(true); window.close(); }, ); }; const toggleLogo = (visible: boolean) => { + if (visible !== isLogoVisible) setHasChanged(true); chrome.runtime.sendMessage( { type: "SET_IFRAME_VISIBLE", visible }, () => { @@ -61,6 +68,13 @@ const ControlService = () => { + + ); }; diff --git a/src/components/shortcutTab/component.tsx b/src/components/shortcutTab/component.tsx index a34ee55..5de432e 100644 --- a/src/components/shortcutTab/component.tsx +++ b/src/components/shortcutTab/component.tsx @@ -50,6 +50,14 @@ export function ShortcutTab() { ALT + A + +
+ 쿠팡 제품정보 열기 또는 접기 +
+
+ ALT + I +
+
diff --git a/src/iframe/iframe.tsx b/src/iframe/iframe.tsx index 67f33fe..69a004e 100644 --- a/src/iframe/iframe.tsx +++ b/src/iframe/iframe.tsx @@ -309,7 +309,10 @@ const App: React.FC = () => { isModalOpen && selectedMenu !== null ? "flex" : "hidden" }`} > - +