{"version":3,"file":"useTimelineClipGroups.mjs","names":[],"sources":["../../../src/hooks/clips/useTimelineClipGroups.ts"],"sourcesContent":["import { runTimelineCommand } from '#react/hooks/core/runTimelineCommand';\nimport { timelineCommandFail, timelineCommandOk } from '@techsquidtv/canvas-timeline-core';\nimport type {\n  TimelineCommandResult,\n  TimelineReadonly,\n  TimelineClipEntry,\n  TimelineClipGroup,\n} from '@techsquidtv/canvas-timeline-core';\nimport { useTimelineEngine } from '#react/hooks/core/useTimelineEngine';\nimport { useTimelineSelector } from '#react/hooks/core/useTimelineSelector';\nimport { useCallback } from 'react';\n/** Result returned by `useTimelineClipGroups`. */\nexport interface UseTimelineClipGroupsResult {\n  /** Current clip groups. */\n  groups: readonly TimelineReadonly<TimelineClipGroup>[];\n  /** Returns one clip group by id. */\n  getClipGroup: (groupId: string) => TimelineClipGroup | undefined;\n  /** Returns the clip group containing a clip. */\n  getClipGroupForClip: (clipId: string) => TimelineClipGroup | undefined;\n  /** Returns clips contained by a group in group order. */\n  getClipGroupClips: (groupId: string) => TimelineClipEntry[];\n  /** Groups existing clips. */\n  groupClips: (\n    clipIds: readonly string[],\n    label?: string\n  ) => TimelineCommandResult<TimelineClipGroup>;\n  /** Removes one clip group. */\n  ungroupClipGroup: (groupId: string) => TimelineCommandResult;\n  /** Removes the current selected group, or groups containing selected clips. */\n  ungroupSelectedClips: () => TimelineCommandResult;\n}\n\n/**\n * Exposes clip group state and commands for editor chrome.\n *\n * @returns Clip group collection, selected group metadata, lookups, and commands.\n */\nexport function useTimelineClipGroups(): UseTimelineClipGroupsResult {\n  const engine = useTimelineEngine();\n  const state = useTimelineSelector((state) => ({ clipGroups: state.clipGroups }));\n  const groups = state.clipGroups;\n\n  const getClipGroup = useCallback((groupId: string) => engine.getClipGroup(groupId), [engine]);\n  const getClipGroupForClip = useCallback(\n    (clipId: string) => engine.getClipGroupForClip(clipId),\n    [engine]\n  );\n  const getClipGroupClips = useCallback(\n    (groupId: string) => engine.getClipGroupClips(groupId),\n    [engine]\n  );\n\n  const groupClips = useCallback(\n    (clipIds: readonly string[], label?: string) =>\n      runTimelineCommand(() => {\n        const group = engine.createClipGroup({\n          clipIds,\n          ...(label !== undefined ? { label } : {}),\n        });\n        return group === null\n          ? timelineCommandFail<TimelineClipGroup>('invalid-range')\n          : timelineCommandOk(group);\n      }),\n    [engine]\n  );\n\n  const ungroupClipGroup = useCallback(\n    (groupId: string) =>\n      runTimelineCommand(() =>\n        engine.ungroupClipGroup(groupId) ? timelineCommandOk() : timelineCommandFail('not-found')\n      ),\n    [engine]\n  );\n\n  const ungroupSelectedClips = useCallback(\n    () =>\n      runTimelineCommand(() => {\n        return engine.ungroupClips(engine.getSelectedClipIds())\n          ? timelineCommandOk()\n          : timelineCommandFail('not-found');\n      }),\n    [engine]\n  );\n\n  return {\n    groups,\n    getClipGroup,\n    getClipGroupForClip,\n    getClipGroupClips,\n    groupClips,\n    ungroupClipGroup,\n    ungroupSelectedClips,\n  };\n}\n"],"mappings":";;;;;;;;;;;AAqCA,SAAgB,wBAAqD;CACnE,MAAM,SAAS,kBAAkB;CA8CjC,OAAO;EACL,QA9CY,qBAAqB,WAAW,EAAE,YAAY,MAAM,WAAW,EAC1D,CAAC,CAAC;EA8CnB,cA5CmB,aAAa,YAAoB,OAAO,aAAa,OAAO,GAAG,CAAC,MAAM,CA4C9E;EACX,qBA5C0B,aACzB,WAAmB,OAAO,oBAAoB,MAAM,GACrD,CAAC,MAAM,CA0CW;EAClB,mBAzCwB,aACvB,YAAoB,OAAO,kBAAkB,OAAO,GACrD,CAAC,MAAM,CAuCS;EAChB,YArCiB,aAChB,SAA4B,UAC3B,yBAAyB;GACvB,MAAM,QAAQ,OAAO,gBAAgB;IACnC;IACA,GAAI,UAAU,KAAA,IAAY,EAAE,MAAM,IAAI,CAAC;GACzC,CAAC;GACD,OAAO,UAAU,OACb,oBAAuC,eAAe,IACtD,kBAAkB,KAAK;EAC7B,CAAC,GACH,CAAC,MAAM,CA0BE;EACT,kBAxBuB,aACtB,YACC,yBACE,OAAO,iBAAiB,OAAO,IAAI,kBAAkB,IAAI,oBAAoB,WAAW,CAC1F,GACF,CAAC,MAAM,CAmBQ;EACf,sBAjB2B,kBAEzB,yBAAyB;GACvB,OAAO,OAAO,aAAa,OAAO,mBAAmB,CAAC,IAClD,kBAAkB,IAClB,oBAAoB,WAAW;EACrC,CAAC,GACH,CAAC,MAAM,CAUY;CACrB;AACF"}