mirror of
https://github.com/jetkvm/kvm.git
synced 2025-09-16 08:38:14 +00:00
The recent fix to PasteModal will silently fail a paste if the keyboardLayout hasn't been selected in the settings yet, then when you look in Settings it looks like it's set to Belgian, but it's really just blank. Set it to default to en-US in both these places so it works like it did previously. Fixes #492
82 lines
2.8 KiB
TypeScript
82 lines
2.8 KiB
TypeScript
import { useCallback, useEffect, useMemo } from "react";
|
|
|
|
import { useSettingsStore } from "@/hooks/stores";
|
|
import { useJsonRpc } from "@/hooks/useJsonRpc";
|
|
import notifications from "@/notifications";
|
|
import { SettingsPageHeader } from "@components/SettingsPageheader";
|
|
import { layouts } from "@/keyboardLayouts";
|
|
|
|
import { SelectMenuBasic } from "../components/SelectMenuBasic";
|
|
|
|
import { SettingsItem } from "./devices.$id.settings";
|
|
|
|
export default function SettingsKeyboardRoute() {
|
|
const keyboardLayout = useSettingsStore(state => state.keyboardLayout);
|
|
const setKeyboardLayout = useSettingsStore(
|
|
state => state.setKeyboardLayout,
|
|
);
|
|
|
|
// this ensures we always get the original en-US if it hasn't been set yet
|
|
const safeKeyboardLayout = useMemo(() => {
|
|
if (keyboardLayout && keyboardLayout.length > 0)
|
|
return keyboardLayout;
|
|
return "en-US";
|
|
}, [keyboardLayout]);
|
|
|
|
const layoutOptions = Object.entries(layouts).map(([code, language]) => { return { value: code, label: language } })
|
|
|
|
const [send] = useJsonRpc();
|
|
|
|
useEffect(() => {
|
|
send("getKeyboardLayout", {}, resp => {
|
|
if ("error" in resp) return;
|
|
setKeyboardLayout(resp.result as string);
|
|
});
|
|
}, []); // eslint-disable-line react-hooks/exhaustive-deps
|
|
|
|
const onKeyboardLayoutChange = useCallback(
|
|
(e: React.ChangeEvent<HTMLSelectElement>) => {
|
|
const layout = e.target.value;
|
|
send("setKeyboardLayout", { layout }, resp => {
|
|
if ("error" in resp) {
|
|
notifications.error(
|
|
`Failed to set keyboard layout: ${resp.error.data || "Unknown error"}`,
|
|
);
|
|
}
|
|
notifications.success("Keyboard layout set successfully");
|
|
setKeyboardLayout(layout);
|
|
});
|
|
},
|
|
[send, setKeyboardLayout],
|
|
);
|
|
|
|
return (
|
|
<div className="space-y-4">
|
|
<SettingsPageHeader
|
|
title="Keyboard"
|
|
description="Configure keyboard layout settings for your device"
|
|
/>
|
|
|
|
<div className="space-y-4">
|
|
{ /* this menu item could be renamed to plain "Keyboard layout" in the future, when also the virtual keyboard layout mappings are being implemented */ }
|
|
<SettingsItem
|
|
title="Paste text"
|
|
description="Keyboard layout of target operating system"
|
|
>
|
|
<SelectMenuBasic
|
|
size="SM"
|
|
label=""
|
|
fullWidth
|
|
value={safeKeyboardLayout}
|
|
onChange={onKeyboardLayoutChange}
|
|
options={layoutOptions}
|
|
/>
|
|
</SettingsItem>
|
|
<p className="text-xs text-slate-600 dark:text-slate-400">
|
|
Pasting text sends individual key strokes to the target device. The keyboard layout determines which key codes are being sent. Ensure that the keyboard layout in JetKVM matches the settings in the operating system.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|