{"version":3,"file":"handle-week-view-key-down.cjs","names":[],"sources":["../../../src/components/WeekView/handle-week-view-key-down.ts"],"sourcesContent":["import { RefObject } from 'react';\n\n/** Reference to a 2D array of slot buttons: [dayIndex][slotIndex] */\nexport type WeekViewControlsRef = RefObject<HTMLButtonElement[][]>;\n\ntype Direction = 'up' | 'down' | 'left' | 'right';\n\ninterface SlotPosition {\n  dayIndex: number;\n  slotIndex: number;\n}\n\nfunction getDirection(key: KeyboardEvent['key']): Direction | null {\n  switch (key) {\n    case 'ArrowDown':\n      return 'down';\n    case 'ArrowUp':\n      return 'up';\n    case 'ArrowRight':\n      return 'right';\n    case 'ArrowLeft':\n      return 'left';\n    default:\n      return null;\n  }\n}\n\nfunction getControlsSize(controlsRef: WeekViewControlsRef): number[] | null {\n  if (!controlsRef.current) {\n    return null;\n  }\n  return controlsRef.current.map((day) => (day ? day.length : 0));\n}\n\ninterface GetNextPositionInput {\n  direction: Direction;\n  dayIndex: number;\n  slotIndex: number;\n  size: number[];\n}\n\nfunction getNextPosition({\n  direction,\n  dayIndex,\n  slotIndex,\n  size,\n}: GetNextPositionInput): SlotPosition | null {\n  const currentDaySize = size[dayIndex];\n  if (!currentDaySize) {\n    return null;\n  }\n\n  switch (direction) {\n    case 'up': {\n      if (slotIndex === 0) {\n        return null;\n      }\n      return {\n        dayIndex,\n        slotIndex: slotIndex - 1,\n      };\n    }\n\n    case 'down': {\n      if (slotIndex === currentDaySize - 1) {\n        return null;\n      }\n      return {\n        dayIndex,\n        slotIndex: slotIndex + 1,\n      };\n    }\n\n    case 'left': {\n      if (dayIndex === 0) {\n        return null;\n      }\n      const prevDaySize = size[dayIndex - 1];\n      const clampedSlotIndex = Math.min(slotIndex, prevDaySize - 1);\n      return {\n        dayIndex: dayIndex - 1,\n        slotIndex: clampedSlotIndex,\n      };\n    }\n\n    case 'right': {\n      if (dayIndex === size.length - 1) {\n        return null;\n      }\n      const nextDaySize = size[dayIndex + 1];\n      const clampedSlotIndex = Math.min(slotIndex, nextDaySize - 1);\n      return {\n        dayIndex: dayIndex + 1,\n        slotIndex: clampedSlotIndex,\n      };\n    }\n\n    default:\n      return null;\n  }\n}\n\ninterface FocusOnNextControlInput {\n  controlsRef: WeekViewControlsRef;\n  direction: Direction;\n  dayIndex: number;\n  slotIndex: number;\n  size: number[];\n}\n\nfunction focusOnNextFocusableControl({\n  controlsRef,\n  direction,\n  dayIndex,\n  slotIndex,\n  size,\n}: FocusOnNextControlInput): void {\n  const nextPosition = getNextPosition({\n    direction,\n    dayIndex,\n    slotIndex,\n    size,\n  });\n\n  if (!nextPosition) {\n    return;\n  }\n\n  const controlToFocus = controlsRef.current?.[nextPosition.dayIndex]?.[nextPosition.slotIndex];\n\n  if (!controlToFocus) {\n    return;\n  }\n\n  if (controlToFocus.disabled || controlToFocus.getAttribute('data-hidden')) {\n    focusOnNextFocusableControl({\n      controlsRef,\n      direction,\n      dayIndex: nextPosition.dayIndex,\n      slotIndex: nextPosition.slotIndex,\n      size,\n    });\n  } else {\n    controlToFocus.focus();\n  }\n}\n\nexport interface HandleWeekViewKeyDownInput {\n  controlsRef: WeekViewControlsRef;\n  dayIndex: number;\n  slotIndex: number;\n  event: React.KeyboardEvent<HTMLButtonElement>;\n}\n\nexport function handleWeekViewKeyDown({\n  controlsRef,\n  dayIndex,\n  slotIndex,\n  event,\n}: HandleWeekViewKeyDownInput): void {\n  const direction = getDirection(event.key);\n\n  if (direction) {\n    event.preventDefault();\n\n    const size = getControlsSize(controlsRef);\n\n    if (!size) {\n      return;\n    }\n\n    focusOnNextFocusableControl({\n      controlsRef,\n      direction,\n      dayIndex,\n      slotIndex,\n      size,\n    });\n  }\n}\n"],"mappings":";;AAYA,SAAS,aAAa,KAA6C;CACjE,QAAQ,KAAR;EACE,KAAK,aACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,cACH,OAAO;EACT,KAAK,aACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAEA,SAAS,gBAAgB,aAAmD;CAC1E,IAAI,CAAC,YAAY,SACf,OAAO;CAET,OAAO,YAAY,QAAQ,KAAK,QAAS,MAAM,IAAI,SAAS,CAAE;AAChE;AASA,SAAS,gBAAgB,EACvB,WACA,UACA,WACA,QAC4C;CAC5C,MAAM,iBAAiB,KAAK;CAC5B,IAAI,CAAC,gBACH,OAAO;CAGT,QAAQ,WAAR;EACE,KAAK;GACH,IAAI,cAAc,GAChB,OAAO;GAET,OAAO;IACL;IACA,WAAW,YAAY;GACzB;EAGF,KAAK;GACH,IAAI,cAAc,iBAAiB,GACjC,OAAO;GAET,OAAO;IACL;IACA,WAAW,YAAY;GACzB;EAGF,KAAK,QAAQ;GACX,IAAI,aAAa,GACf,OAAO;GAET,MAAM,cAAc,KAAK,WAAW;GACpC,MAAM,mBAAmB,KAAK,IAAI,WAAW,cAAc,CAAC;GAC5D,OAAO;IACL,UAAU,WAAW;IACrB,WAAW;GACb;EACF;EAEA,KAAK,SAAS;GACZ,IAAI,aAAa,KAAK,SAAS,GAC7B,OAAO;GAET,MAAM,cAAc,KAAK,WAAW;GACpC,MAAM,mBAAmB,KAAK,IAAI,WAAW,cAAc,CAAC;GAC5D,OAAO;IACL,UAAU,WAAW;IACrB,WAAW;GACb;EACF;EAEA,SACE,OAAO;CACX;AACF;AAUA,SAAS,4BAA4B,EACnC,aACA,WACA,UACA,WACA,QACgC;CAChC,MAAM,eAAe,gBAAgB;EACnC;EACA;EACA;EACA;CACF,CAAC;CAED,IAAI,CAAC,cACH;CAGF,MAAM,iBAAiB,YAAY,UAAU,aAAa,SAAS,GAAG,aAAa;CAEnF,IAAI,CAAC,gBACH;CAGF,IAAI,eAAe,YAAY,eAAe,aAAa,aAAa,GACtE,4BAA4B;EAC1B;EACA;EACA,UAAU,aAAa;EACvB,WAAW,aAAa;EACxB;CACF,CAAC;MAED,eAAe,MAAM;AAEzB;AASA,SAAgB,sBAAsB,EACpC,aACA,UACA,WACA,SACmC;CACnC,MAAM,YAAY,aAAa,MAAM,GAAG;CAExC,IAAI,WAAW;EACb,MAAM,eAAe;EAErB,MAAM,OAAO,gBAAgB,WAAW;EAExC,IAAI,CAAC,MACH;EAGF,4BAA4B;GAC1B;GACA;GACA;GACA;GACA;EACF,CAAC;CACH;AACF"}