import { useEffect } from "react"; /** * Ctrl+S(맥에서는 Cmd+S)로 저장한다. * *

브라우저의 기본 동작은 "페이지를 파일로 저장"이다. 글을 쓰다가 그 손버릇이 나오면 저장 대화상자가 * 뜨고 편집한 내용은 그대로 남는다 — 저장한 줄 알고 창을 닫으면 잃는다. 그래서 기본 동작을 막고 이 * 화면의 저장으로 돌린다. * *

`enabled` 가 거짓이면 아무것도 하지 않는다. 저장할 것이 없거나 이미 저장 중일 때 단축키가 요청을 * 겹쳐 보내지 않게 하는 것은 호출자의 몫이다 — 화면마다 "지금 저장할 수 있는가"의 뜻이 다르다. */ export function useSaveShortcut( save: () => void | Promise, enabled = true, ) { useEffect(() => { function onKeyDown(event: KeyboardEvent) { if (event.key !== "s" && event.key !== "S") return; if (!(event.ctrlKey || event.metaKey)) return; // Ctrl+Shift+S 는 다른 뜻으로 쓰는 곳이 있어 가로채지 않는다. if (event.shiftKey || event.altKey) return; event.preventDefault(); if (enabled) void save(); } window.addEventListener("keydown", onKeyDown); return () => window.removeEventListener("keydown", onKeyDown); }, [enabled, save]); }