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 }; }