{"version":3,"file":"useTimelineTrackLockControl.mjs","names":[],"sources":["../../../src/hooks/tracks/useTimelineTrackLockControl.ts"],"sourcesContent":["import { useCallback, useMemo, type ButtonHTMLAttributes } from 'react';\nimport type { TimelineCommandResult } from '@techsquidtv/canvas-timeline-core';\nimport { useTimelineSelector } from '#react/hooks/core/useTimelineSelector';\nimport { useTimelineTrackCommands } from '#react/hooks/tracks/useTimelineTrackCommands';\nimport { getTimelineTrackLabel } from '#react/hooks/tracks/timelineTrackLabel';\n\n/** Props returned for a track lock button. */\nexport type TimelineTrackLockControlButtonProps = ButtonHTMLAttributes<HTMLButtonElement>;\n\n/** Result returned by `useTimelineTrackLockControl`. */\nexport interface UseTimelineTrackLockControlResult {\n  /** Requested track id. */\n  trackId: string;\n  /** Whether the requested track exists. */\n  exists: boolean;\n  /** Human-readable track label. */\n  label: string;\n  /** Whether the track is locked for editing. */\n  locked: boolean;\n  /** Sets this track's locked state. */\n  setLocked: (locked: boolean) => TimelineCommandResult;\n  /** Toggles this track's locked state. */\n  toggleLock: () => TimelineCommandResult;\n  /** Props for a semantic lock toggle button. */\n  buttonProps: TimelineTrackLockControlButtonProps;\n}\n\n/**\n * Adapts one timeline track into a semantic lock toggle button.\n *\n * @param trackId - Track id to bind.\n * @returns Current lock state, commands, and DOM-ready button props.\n */\nexport function useTimelineTrackLockControl(trackId: string): UseTimelineTrackLockControlResult {\n  const commands = useTimelineTrackCommands();\n  const state = useTimelineSelector((snapshot) => {\n    const index = snapshot.tracks.findIndex((track) => track.id === trackId);\n    const track = snapshot.tracks[index] ?? null;\n    return {\n      exists: track !== null,\n      locked: track?.locked ?? false,\n      label: getTimelineTrackLabel(track, index, trackId),\n    };\n  });\n\n  const setLocked = useCallback(\n    (locked: boolean) => commands.setLocked(trackId, locked),\n    [commands, trackId]\n  );\n  const toggleLock = useCallback(() => commands.toggleLock(trackId), [commands, trackId]);\n\n  const buttonProps = useMemo<TimelineTrackLockControlButtonProps>(\n    () => ({\n      type: 'button',\n      'aria-label': state.locked ? `Unlock ${state.label}` : `Lock ${state.label}`,\n      'aria-pressed': state.locked,\n      title: state.locked ? `Unlock ${state.label}` : `Lock ${state.label}`,\n      disabled: !state.exists,\n      'data-track-id': trackId,\n      'data-track-locked': String(state.locked),\n      onClick: () => {\n        commands.toggleLock(trackId);\n      },\n    }),\n    [commands, state, trackId]\n  );\n\n  return useMemo(\n    () => ({\n      trackId,\n      exists: state.exists,\n      label: state.label,\n      locked: state.locked,\n      setLocked,\n      toggleLock,\n      buttonProps,\n    }),\n    [buttonProps, state.exists, state.label, state.locked, setLocked, toggleLock, trackId]\n  );\n}\n"],"mappings":";;;;;;;;;;;AAiCA,SAAgB,4BAA4B,SAAoD;CAC9F,MAAM,WAAW,yBAAyB;CAC1C,MAAM,QAAQ,qBAAqB,aAAa;EAC9C,MAAM,QAAQ,SAAS,OAAO,WAAW,UAAU,MAAM,OAAO,OAAO;EACvE,MAAM,QAAQ,SAAS,OAAO,UAAU;EACxC,OAAO;GACL,QAAQ,UAAU;GAClB,QAAQ,OAAO,UAAU;GACzB,OAAO,sBAAsB,OAAO,OAAO,OAAO;EACpD;CACF,CAAC;CAED,MAAM,YAAY,aACf,WAAoB,SAAS,UAAU,SAAS,MAAM,GACvD,CAAC,UAAU,OAAO,CACpB;CACA,MAAM,aAAa,kBAAkB,SAAS,WAAW,OAAO,GAAG,CAAC,UAAU,OAAO,CAAC;CAEtF,MAAM,cAAc,eACX;EACL,MAAM;EACN,cAAc,MAAM,SAAS,UAAU,MAAM,UAAU,QAAQ,MAAM;EACrE,gBAAgB,MAAM;EACtB,OAAO,MAAM,SAAS,UAAU,MAAM,UAAU,QAAQ,MAAM;EAC9D,UAAU,CAAC,MAAM;EACjB,iBAAiB;EACjB,qBAAqB,OAAO,MAAM,MAAM;EACxC,eAAe;GACb,SAAS,WAAW,OAAO;EAC7B;CACF,IACA;EAAC;EAAU;EAAO;CAAO,CAC3B;CAEA,OAAO,eACE;EACL;EACA,QAAQ,MAAM;EACd,OAAO,MAAM;EACb,QAAQ,MAAM;EACd;EACA;EACA;CACF,IACA;EAAC;EAAa,MAAM;EAAQ,MAAM;EAAO,MAAM;EAAQ;EAAW;EAAY;CAAO,CACvF;AACF"}