diff --git a/web/src/layouts/shared/Inputs.tsx b/web/src/layouts/shared/Inputs.tsx index 55a576d..676e7d3 100644 --- a/web/src/layouts/shared/Inputs.tsx +++ b/web/src/layouts/shared/Inputs.tsx @@ -1,7 +1,9 @@ -import { Checkbox, Group, InputVariant, MantineSize, NumberInput, TextInput, ThemeIcon, Tooltip, createStyles } from "@mantine/core"; +import { Checkbox, Group, InputVariant, MantineSize, NumberInput, Switch, TextInput, ThemeIcon, Tooltip, createStyles } from "@mantine/core"; +import { getHotkeyHandler } from "@mantine/hooks"; import React from "react"; import { BsQuestionCircle } from "react-icons/bs"; import { useLocale } from "../../providers/LocaleProvider"; +import { useVisibility } from "../../providers/VisibilityProvider"; interface InputProps { label?: string; @@ -56,6 +58,7 @@ const useInputStyles = createStyles((theme) => ({ })); const NumInput: React.FC = (props) => { + const exitUi = useVisibility((state) => state.exitUI); const { classes } = useInputStyles(); const variant = props.inputVariant ?? props.disabled ? "filled" : "default"; const arrowSize = props.icArrow !== false ? (props.icArrowSize ?? 10) : undefined; @@ -88,12 +91,14 @@ const NumInput: React.FC = (props) => { ) } + onKeyDown={getHotkeyHandler([["Escape", exitUi]])} /> ); } const StringInput: React.FC = (props) => { const locale = useLocale((state) => state.locale); + const exitUi = useVisibility((state) => state.exitUI); const { classes } = useInputStyles(); const variant = props.inputVariant ?? props.disabled ? "filled" : "default"; const arrowSize = props.icArrow !== false ? (props.icArrowSize ?? 10) : undefined; @@ -129,12 +134,14 @@ const StringInput: React.FC = (props) => { ) } + onKeyDown={getHotkeyHandler([["Escape", exitUi]])} /> ); }; const TooltipCheckbox: React.FC = (props) => { + const exitUi = useVisibility((state) => state.exitUI); const arrowSize = props.icArrow !== false ? (props.icArrowSize ?? 10) : undefined; return ( @@ -143,6 +150,7 @@ const TooltipCheckbox: React.FC = (props) => { label={props.label} checked={props.value} onChange={(e) => { if (props.setValue !== undefined) props.setValue(e.currentTarget.checked) }} + onKeyDown={getHotkeyHandler([["Escape", exitUi]])} /> { props.infoCircle && ( @@ -163,6 +171,40 @@ const TooltipCheckbox: React.FC = (props) => { ); }; +const TooltipSwitch: React.FC = (props) => { + const exitUi = useVisibility((state) => state.exitUI); + const arrowSize = props.icArrow !== false ? (props.icArrowSize ?? 10) : undefined; + + return ( + + { if (props.setValue !== undefined) props.setValue(e.currentTarget.checked) }} + size={props.size} + labelPosition={props.labelPosition} + onKeyDown={getHotkeyHandler([["Escape", exitUi]])} + /> + { + props.infoCircle && ( + + + + + + ) + } + + ); +} + export const MemoNumberInput = React.memo(NumInput); export const MemoStringInput = React.memo(StringInput); export const MemoTooltipCheckbox = React.memo(TooltipCheckbox); +export const MemoTooltipSwitch = React.memo(TooltipSwitch); diff --git a/web/src/layouts/shared/RoomSelect.tsx b/web/src/layouts/shared/RoomSelect.tsx index 4928016..ee2d6e3 100644 --- a/web/src/layouts/shared/RoomSelect.tsx +++ b/web/src/layouts/shared/RoomSelect.tsx @@ -1,10 +1,13 @@ import { Select } from "@mantine/core"; +import { getHotkeyHandler } from "@mantine/hooks"; import React from "react"; import { useLocale } from "../../providers/LocaleProvider"; +import { useVisibility } from "../../providers/VisibilityProvider"; import { RoomsStoreState, useRoomsStore } from "../../store/rooms"; const RoomSelect: React.FC = () => { const locale = useLocale((state) => state.locale); + const exitUi = useVisibility((state) => state.exitUI); const [roomSelectList, selectedRoom, roomList] = useRoomsStore((state) => [state.roomSelectList, state.selectedRoom, state.roomList]); const [setSelectedRoom, setActiveRoom] = useRoomsStore((state) => [state.setSelectedRoom, state.setActiveRoom]); @@ -30,9 +33,9 @@ const RoomSelect: React.FC = () => { nothingFound={locale("ui_room_select_nothing_found")} data={roomSelectList} maxDropdownHeight={200} + onKeyDown={getHotkeyHandler([["Escape", exitUi]])} /> ) }; -export default RoomSelect; export const MemoRoomSelect = React.memo(RoomSelect); diff --git a/web/src/layouts/views/portals/components/DebugMenu.tsx b/web/src/layouts/views/portals/components/DebugMenu.tsx index 57d7bd6..65b2007 100644 --- a/web/src/layouts/views/portals/components/DebugMenu.tsx +++ b/web/src/layouts/views/portals/components/DebugMenu.tsx @@ -1,6 +1,7 @@ -import { ActionIcon, Menu, Switch } from "@mantine/core"; +import { ActionIcon, Menu } from "@mantine/core"; import { useEffect } from "react"; import { FaGear } from "react-icons/fa6"; +import { MemoTooltipSwitch } from "../../../shared/Inputs"; import { useLocale } from "../../../../providers/LocaleProvider"; import { usePortalsStore } from "../../../../store/portals"; import { fetchNui } from "../../../../utils/fetchNui"; @@ -25,25 +26,25 @@ const DebugMenu: React.FC = () => { {locale("ui_portal_debug")} toggleSwitch("enablePortalInfo")} + value={enableInfo ?? false} + setValue={() => toggleSwitch("enablePortalInfo")} /> toggleSwitch("enablePortalOutline")} + value={enableOutline ?? false} + setValue={() => toggleSwitch("enablePortalOutline")} /> toggleSwitch("enablePortalFill")} + value={enableFill ?? false} + setValue={() => toggleSwitch("enablePortalFill")} /> diff --git a/web/src/layouts/views/portals/components/PortalInfo.tsx b/web/src/layouts/views/portals/components/PortalInfo.tsx index 2b4d17f..34f8421 100644 --- a/web/src/layouts/views/portals/components/PortalInfo.tsx +++ b/web/src/layouts/views/portals/components/PortalInfo.tsx @@ -1,6 +1,7 @@ -import { Alert, Center, Checkbox, Divider, Group, Paper, Space, Switch, Table, Text, Title } from "@mantine/core"; +import { Alert, Center, Checkbox, Divider, Group, Paper, Space, Table, Title } from "@mantine/core"; import { useEffect, useState } from "react"; import EntitySettings from "./EntitySettings"; +import { MemoTooltipSwitch } from "../../../shared/Inputs"; import { useLocale } from "../../../../providers/LocaleProvider"; import { useGeneralStore } from "../../../../store/general"; import { usePortalsStore } from "../../../../store/portals"; @@ -63,12 +64,12 @@ const PortalInfo: React.FC = (props) => { {`${props.portal.mloPortalIndex}. ${intRoom.displayName} [${intRoom.index}] ↔ ${extRoom.displayName} [${extRoom.index}]`} - setNavigate(!navigate)} + value={navigate} + setValue={() => setNavigate(!navigate)} />