All files / platform/core/src/utils/hotkeys migrateHotkeys.ts

20% Statements 6/30
8.33% Branches 2/24
33.33% Functions 1/3
20% Lines 6/30

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77  34x                           34x 34x 34x   34x 34x                                                                                                                
import defaults from '../../defaults';
const defaultHotkeyBindings = defaults.hotkeyBindings;
 
/**
 * Migrates old hotkey definitions from localStorage to the new format
 * Old format: 'hotkey-definitions' containing full hotkey definitions array
 * New format: 'user-preferred-keys' containing hashed command keys with their key bindings
 *
 * @private
 */
function migrateOldHotkeyDefinitions({
  generateHash,
}: {
  generateHash: (definition: Record<string, unknown>) => string;
}): void {
  try {
    const oldHotkeyDefinitions = localStorage.getItem('hotkey-definitions');
    const migrated = localStorage.getItem('hotkeys-migrated');
 
    if (!oldHotkeyDefinitions || migrated === 'true') {
      return;
    }
 
    const oldDefinitions = JSON.parse(oldHotkeyDefinitions);
 
    Iif (!Array.isArray(oldDefinitions) || oldDefinitions.length === 0) {
      return;
    }
 
    const defaultBindings = defaultHotkeyBindings || [];
 
    const userPreferredKeys = JSON.parse(localStorage.getItem('user-preferred-keys') || '{}');
 
    oldDefinitions.forEach(oldDefinition => {
      Iif (!oldDefinition.commandName || !oldDefinition.keys) {
        return;
      }
 
      const matchingDefault = defaultBindings.find(defaultBinding => {
        const sameCommand = defaultBinding.commandName === oldDefinition.commandName;
 
        const oldOptions = oldDefinition.commandOptions || {};
        const defaultOptions = defaultBinding.commandOptions || {};
 
        const sameOptions = JSON.stringify(oldOptions) === JSON.stringify(defaultOptions);
 
        return sameCommand && sameOptions;
      });
 
      Iif (
        !matchingDefault ||
        JSON.stringify(matchingDefault.keys) !== JSON.stringify(oldDefinition.keys)
      ) {
        const commandHash = generateHash({
          commandName: oldDefinition.commandName,
          commandOptions: oldDefinition.commandOptions || {},
        });
 
        userPreferredKeys[commandHash] = oldDefinition.keys;
        console.debug(`HotkeysManager: Migrated custom hotkey for ${oldDefinition.commandName}`);
      }
    });
 
    localStorage.setItem('user-preferred-keys', JSON.stringify(userPreferredKeys));
    localStorage.setItem('hotkeys-migrated', 'true');
    localStorage.removeItem('hotkey-definitions');
 
    console.debug('HotkeysManager: Successfully migrated hotkey definitions to new format');
  } catch (error) {
    console.error('HotkeysManager: Error migrating hotkey definitions', error);
 
    localStorage.setItem('hotkeys-migrated', 'false');
  }
}
 
export default migrateOldHotkeyDefinitions;