64 lines
1.6 KiB
TypeScript
64 lines
1.6 KiB
TypeScript
export interface KeyboardActions {
|
|
onMutate?: () => void;
|
|
onRandom?: () => void;
|
|
onProcess?: () => void;
|
|
onDownload?: () => void;
|
|
onDurationDecrease?: (large: boolean) => void;
|
|
onDurationIncrease?: (large: boolean) => void;
|
|
onVolumeDecrease?: (large: boolean) => void;
|
|
onVolumeIncrease?: (large: boolean) => void;
|
|
onEscape?: () => void;
|
|
onUndo?: () => void;
|
|
onPlayFromStart?: () => void;
|
|
}
|
|
|
|
export function createKeyboardHandler(actions: KeyboardActions) {
|
|
return (event: KeyboardEvent) => {
|
|
if (event.target instanceof HTMLInputElement) return;
|
|
|
|
const key = event.key.toLowerCase();
|
|
const isLargeAdjustment = event.shiftKey;
|
|
|
|
switch (key) {
|
|
case 'z':
|
|
actions.onUndo?.();
|
|
break;
|
|
case 'm':
|
|
actions.onMutate?.();
|
|
break;
|
|
case 'r':
|
|
actions.onRandom?.();
|
|
break;
|
|
case 'p':
|
|
actions.onProcess?.();
|
|
break;
|
|
case 'd':
|
|
actions.onDownload?.();
|
|
break;
|
|
case ' ':
|
|
event.preventDefault();
|
|
actions.onPlayFromStart?.();
|
|
break;
|
|
case 'arrowleft':
|
|
event.preventDefault();
|
|
actions.onDurationDecrease?.(isLargeAdjustment);
|
|
break;
|
|
case 'arrowright':
|
|
event.preventDefault();
|
|
actions.onDurationIncrease?.(isLargeAdjustment);
|
|
break;
|
|
case 'arrowdown':
|
|
event.preventDefault();
|
|
actions.onVolumeDecrease?.(isLargeAdjustment);
|
|
break;
|
|
case 'arrowup':
|
|
event.preventDefault();
|
|
actions.onVolumeIncrease?.(isLargeAdjustment);
|
|
break;
|
|
case 'escape':
|
|
actions.onEscape?.();
|
|
break;
|
|
}
|
|
};
|
|
}
|