Files
assistant-storefront/app/javascript/dashboard/composables/useDetectKeyboardLayout.js
Liang XJ 092fb2e083
Some checks failed
Lock Threads / action (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
Publish Chatwoot EE docker images / build (linux/amd64, ubuntu-latest) (push) Has been cancelled
Publish Chatwoot EE docker images / build (linux/arm64, ubuntu-22.04-arm) (push) Has been cancelled
Publish Chatwoot EE docker images / merge (push) Has been cancelled
Publish Chatwoot CE docker images / build (linux/amd64, ubuntu-latest) (push) Has been cancelled
Publish Chatwoot CE docker images / build (linux/arm64, ubuntu-22.04-arm) (push) Has been cancelled
Publish Chatwoot CE docker images / merge (push) Has been cancelled
Run Chatwoot CE spec / lint-backend (push) Has been cancelled
Run Chatwoot CE spec / lint-frontend (push) Has been cancelled
Run Chatwoot CE spec / frontend-tests (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (0, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (1, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (10, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (11, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (12, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (13, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (14, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (15, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (2, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (3, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (4, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (5, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (6, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (7, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (8, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (9, 16) (push) Has been cancelled
Run Linux nightly installer / nightly (push) Has been cancelled
Initial commit: Add logistics and order_detail message types
- Add Logistics component with progress tracking
- Add OrderDetail component for order information
- Support data-driven steps and actions
- Add blue color scale to widget SCSS
- Fix node overflow and progress bar rendering issues
- Add English translations for dashboard components

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-26 11:16:56 +08:00

74 lines
2.0 KiB
JavaScript

import {
LAYOUT_QWERTY,
LAYOUT_QWERTZ,
LAYOUT_AZERTY,
} from 'shared/helpers/KeyboardHelpers';
/**
* Detects the keyboard layout using a legacy method by creating a hidden input and dispatching a key event.
* @returns {Promise<string>} A promise that resolves to the detected keyboard layout.
*/
async function detectLegacy() {
const input = document.createElement('input');
input.style.position = 'fixed';
input.style.top = '-100px';
document.body.appendChild(input);
input.focus();
return new Promise(resolve => {
const keyboardEvent = new KeyboardEvent('keypress', {
key: 'y',
keyCode: 89,
which: 89,
bubbles: true,
cancelable: true,
});
const handler = e => {
document.body.removeChild(input);
document.removeEventListener('keypress', handler);
if (e.key === 'z') {
resolve(LAYOUT_QWERTY);
} else if (e.key === 'y') {
resolve(LAYOUT_QWERTZ);
} else {
resolve(LAYOUT_AZERTY);
}
};
document.addEventListener('keypress', handler);
input.dispatchEvent(keyboardEvent);
});
}
/**
* Detects the keyboard layout using the modern navigator.keyboard API.
* @returns {Promise<string>} A promise that resolves to the detected keyboard layout.
*/
async function detect() {
const map = await navigator.keyboard.getLayoutMap();
const q = map.get('KeyQ');
const w = map.get('KeyW');
const e = map.get('KeyE');
const r = map.get('KeyR');
const t = map.get('KeyT');
const y = map.get('KeyY');
return [q, w, e, r, t, y].join('').toUpperCase();
}
/**
* Uses either the modern or legacy method to detect the keyboard layout, caching the result.
* @returns {Promise<string>} A promise that resolves to the detected keyboard layout.
*/
export async function useDetectKeyboardLayout() {
const cachedLayout = window.cw_keyboard_layout;
if (cachedLayout) {
return cachedLayout;
}
const layout = navigator.keyboard ? await detect() : await detectLegacy();
window.cw_keyboard_layout = layout;
return layout;
}