From 24c65fc5a81e313e8fd7964c32321fc09303301b Mon Sep 17 00:00:00 2001 From: Steve Ruiz Date: Wed, 14 Jul 2021 15:05:58 +0100 Subject: [PATCH] Fixes keyboard shortcuts while typing, improves page panel input Adds enter key to confirm --- components/editor.tsx | 11 ++------ components/page-panel/page-options.tsx | 38 ++++++++++++++++++++++---- hooks/useKeyboardEvents.ts | 14 ++++------ 3 files changed, 41 insertions(+), 22 deletions(-) diff --git a/components/editor.tsx b/components/editor.tsx index 4f9e9c3cc..aab9587b5 100644 --- a/components/editor.tsx +++ b/components/editor.tsx @@ -10,21 +10,14 @@ import PagePanel from './page-panel/page-panel' import CodePanel from './code-panel/code-panel' import DebugPanel from './debug-panel/debug-panel' import ControlsPanel from './controls-panel/controls-panel' -import { useEffect, useRef } from 'react' export default function Editor({ roomId }: { roomId?: string }): JSX.Element { - const rLayout = useRef(null) - - useEffect(() => { - rLayout.current?.focus() - }, []) - - useKeyboardEvents(rLayout) useLoadOnMount(roomId) useStateTheme() + useKeyboardEvents() return ( - + diff --git a/components/page-panel/page-options.tsx b/components/page-panel/page-options.tsx index 49e97fddb..fda1afd64 100644 --- a/components/page-panel/page-options.tsx +++ b/components/page-panel/page-options.tsx @@ -10,11 +10,15 @@ import { DialogInputWrapper, Divider, } from 'components/shared' -import { useState } from 'react' +import { useEffect, useRef, useState } from 'react' import state, { useSelector } from 'state' import { Page } from 'types' export default function PageOptions({ page }: { page: Page }): JSX.Element { + const [isOpen, setIsOpen] = useState(false) + + const rInput = useRef(null) + const hasOnlyOnePage = useSelector( (s) => Object.keys(s.data.document.pages).length <= 1 ) @@ -34,7 +38,11 @@ export default function PageOptions({ page }: { page: Page }): JSX.Element { } function handleOpenChange(isOpen: boolean) { - if (isOpen) return + setIsOpen(isOpen) + + if (isOpen) { + return + } if (page.name.length === 0) { state.send('RENAMED_PAGE', { @@ -57,8 +65,24 @@ export default function PageOptions({ page }: { page: Page }): JSX.Element { e.stopPropagation() } + function handleKeydown(e: React.KeyboardEvent) { + if (e.key === 'Enter') { + handleSave() + setIsOpen(false) + } + } + + useEffect(() => { + if (isOpen) { + setTimeout(() => { + rInput.current?.focus() + rInput.current?.select() + }, 0) + } + }, [isOpen]) + return ( - + - + -) { +export default function useKeyboardEvents() { useEffect(() => { function handleKeyDown(e: KeyboardEvent) { const info = inputs.keydown(e) @@ -367,11 +365,11 @@ export default function useKeyboardEvents( } } - ref.current?.addEventListener('keydown', handleKeyDown) - ref.current?.addEventListener('keyup', handleKeyUp) + window.addEventListener('keydown', handleKeyDown) + window.addEventListener('keyup', handleKeyUp) return () => { - ref.current?.removeEventListener('keydown', handleKeyDown) - ref.current?.removeEventListener('keyup', handleKeyUp) + window.removeEventListener('keydown', handleKeyDown) + window.removeEventListener('keyup', handleKeyUp) } }, []) }