mirror of https://github.com/jetkvm/kvm.git
35 lines
1.6 KiB
TypeScript
35 lines
1.6 KiB
TypeScript
import { useMemo } from "react";
|
|
|
|
import { useSettingsStore } from "@/hooks/stores";
|
|
import { keyboards } from "@/keyboardLayouts";
|
|
|
|
export default function useKeyboardLayout() {
|
|
const { keyboardLayout } = useSettingsStore();
|
|
|
|
const keyboardOptions = useMemo(() => {
|
|
return keyboards.map((keyboard) => {
|
|
return { label: keyboard.name, value: keyboard.isoCode }
|
|
});
|
|
}, []);
|
|
|
|
const isoCode = useMemo(() => {
|
|
// If we don't have a specific layout, default to "en-US" because that was the original layout
|
|
// developed so it is a good fallback. Additionally, we replace "en_US" with "en-US" because
|
|
// the original server-side code used "en_US" as the default value, but that's not the correct
|
|
// ISO code for English/United State. To ensure we remain backward compatible with devices that
|
|
// have not had their Keyboard Layout selected by the user, we want to treat "en_US" as if it was
|
|
// "en-US" to match the ISO standard codes now used in the keyboardLayouts.
|
|
console.debug("Current keyboard layout from store:", keyboardLayout);
|
|
if (keyboardLayout && keyboardLayout.length > 0)
|
|
return keyboardLayout.replace("en_US", "en-US");
|
|
return "en-US";
|
|
}, [keyboardLayout]);
|
|
|
|
const selectedKeyboard = useMemo(() => {
|
|
// fallback to original behaviour of en-US if no isoCode given or matching layout not found
|
|
return keyboards.find(keyboard => keyboard.isoCode === isoCode)
|
|
?? keyboards.find(keyboard => keyboard.isoCode === "en-US")!;
|
|
}, [isoCode]);
|
|
|
|
return { keyboardOptions, isoCode, selectedKeyboard };
|
|
} |