From 598b9914c21d609dedfa0a7a8d7d2b774d0bbc6d Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sun, 4 Apr 2021 17:44:52 +0900 Subject: Separate FindPrompt --- src/console/components/Console.tsx | 46 +++++++++++----------- src/console/components/FindPrompt.tsx | 67 ++++++++++++++++++++++++++++++++ src/console/components/console/Input.tsx | 11 +----- 3 files changed, 92 insertions(+), 32 deletions(-) create mode 100644 src/console/components/FindPrompt.tsx diff --git a/src/console/components/Console.tsx b/src/console/components/Console.tsx index 951b627..d4c9151 100644 --- a/src/console/components/Console.tsx +++ b/src/console/components/Console.tsx @@ -1,6 +1,7 @@ import React from "react"; import Input from "./console/Input"; import Completion from "./console/Completion"; +import FindPrompt from "./FindPrompt"; import InfoMessage from "./InfoMessage"; import ErrorMessage from "./ErrorMessage"; import * as consoleActions from "../../console/actions/console"; @@ -178,11 +179,10 @@ const Console: React.FC = () => { } }; - switch (state.mode) { - case "command": - case "find": - return ( - + const ele = (() => { + switch (state.mode) { + case "command": + return ( { select={state.select} /> - - ); - case "info": - return ( - - {state.messageText} - - ); - case "error": - return ( - - {state.messageText} - - ); - default: - return null; - } + ); + case "find": + return ; + case "info": + return {state.messageText}; + case "error": + return {state.messageText}; + default: + return null; + } + })(); + + return ( + + {ele} + + ); }; export default Console; diff --git a/src/console/components/FindPrompt.tsx b/src/console/components/FindPrompt.tsx new file mode 100644 index 0000000..c6a0489 --- /dev/null +++ b/src/console/components/FindPrompt.tsx @@ -0,0 +1,67 @@ +import React from "react"; +import * as consoleActions from "../../console/actions/console"; +import ConsoleFrameClient from "../clients/ConsoleFrameClient"; +import AppContext from "./AppContext"; +import Input from "./console/Input"; +import styled from "styled-components"; + +const ConsoleWrapper = styled.div` + border-top: 1px solid gray; +`; + +const FindPrompt: React.FC = () => { + const { dispatch } = React.useContext(AppContext); + const [inputValue, setInputValue] = React.useState(""); + + const consoleFrameClient = new ConsoleFrameClient(); + const onBlur = () => { + dispatch(consoleActions.hideCommand()); + }; + + const doEnter = (e: React.KeyboardEvent) => { + e.stopPropagation(); + e.preventDefault(); + + const value = (e.target as HTMLInputElement).value; + dispatch(consoleActions.enterFind(value === "" ? undefined : value)); + }; + + const onKeyDown = (e: React.KeyboardEvent) => { + switch (e.key) { + case "Escape": + dispatch(consoleActions.hideCommand()); + break; + case "Enter": + doEnter(e); + break; + } + }; + + const onChange = (e: React.ChangeEvent) => { + setInputValue(e.target.value); + }; + + React.useEffect(() => { + window.focus(); + + const { + scrollWidth: width, + scrollHeight: height, + } = document.getElementById("vimvixen-console")!; + consoleFrameClient.resize(width, height); + }, []); + + return ( + + + + ); +}; + +export default FindPrompt; diff --git a/src/console/components/console/Input.tsx b/src/console/components/console/Input.tsx index 1f56036..7850f43 100644 --- a/src/console/components/console/Input.tsx +++ b/src/console/components/console/Input.tsx @@ -19,7 +19,7 @@ const InputInner = styled.input` `; interface Props { - mode: string; + prompt: string; value: string; onBlur: (e: React.FocusEvent) => void; onKeyDown: (e: React.KeyboardEvent) => void; @@ -33,16 +33,9 @@ const Input: React.FC = (props) => { input?.current?.focus(); }, []); - let prompt = ""; - if (props.mode === "command") { - prompt = ":"; - } else if (props.mode === "find") { - prompt = "/"; - } - return ( - {prompt} + {props.prompt}