{"version":3,"file":"createTimelineMarkersCommands.mjs","names":[],"sources":["../../../src/hooks/markers/createTimelineMarkersCommands.ts"],"sourcesContent":["import { runTimelineCommand } from '#react/hooks/core/runTimelineCommand';\nimport { timelineCommandFail, timelineCommandOk } from '@techsquidtv/canvas-timeline-core';\nimport type { Marker, TimelineReadonly, TimelineEngine } from '@techsquidtv/canvas-timeline-core';\nimport { compareRational } from '@techsquidtv/canvas-timeline-utils';\nimport type { RationalTime } from '@techsquidtv/canvas-timeline-utils';\nimport type {\n  TimelineMarkerUpdate,\n  UseTimelineMarkersResult,\n} from '#react/hooks/markers/useTimelineMarkers';\n\nexport function sortTimelineMarkers(markers: readonly TimelineReadonly<Marker>[] = []) {\n  return [...markers].sort((left, right) => compareRational(left.time, right.time));\n}\n\n/** Shared imperative commands. Reads current engine state at invocation. */\nexport function createTimelineMarkersCommands(\n  engine: TimelineEngine\n): Omit<UseTimelineMarkersResult, 'markers'> {\n  const findPreviousMarker = (time: RationalTime) =>\n    sortTimelineMarkers(engine.getState().markers)\n      .reverse()\n      .find((marker) => compareRational(marker.time, time) < 0) ?? null;\n\n  const findNextMarker = (time: RationalTime) =>\n    sortTimelineMarkers(engine.getState().markers).find(\n      (marker) => compareRational(marker.time, time) > 0\n    ) ?? null;\n\n  const addMarker = (time: RationalTime, label?: string, color?: string, description?: string) =>\n    runTimelineCommand(() => {\n      const marker = engine.addMarker(time, label, color, description);\n      return timelineCommandOk(marker);\n    });\n\n  const addMarkerAtPlayhead = (label?: string, color?: string, description?: string) =>\n    addMarker(engine.playheadTime, label, color, description);\n\n  const removeMarker = (id: string) =>\n    runTimelineCommand(() =>\n      engine.removeMarker(id) ? timelineCommandOk() : timelineCommandFail('not-found')\n    );\n\n  const updateMarker = (id: string, updates: TimelineMarkerUpdate) =>\n    runTimelineCommand(() => {\n      const marker = engine.updateMarker(id, updates);\n      return marker\n        ? timelineCommandOk(marker)\n        : timelineCommandFail<TimelineReadonly<Marker>>('not-found');\n    });\n\n  const seekToMarker = (id: string) =>\n    runTimelineCommand(() => {\n      const marker = engine.getState().markers?.find((candidate) => candidate.id === id);\n      if (!marker) {\n        return timelineCommandFail<TimelineReadonly<Marker>>('not-found');\n      }\n      engine.updatePlayhead(marker.time);\n      return timelineCommandOk(marker);\n    });\n\n  const seekToNextMarker = () =>\n    runTimelineCommand(() => {\n      const nextMarker = findNextMarker(engine.playheadTime);\n      if (!nextMarker) {\n        return timelineCommandFail<TimelineReadonly<Marker>>('not-found');\n      }\n      engine.updatePlayhead(nextMarker.time);\n      return timelineCommandOk(nextMarker);\n    });\n\n  const seekToPreviousMarker = () =>\n    runTimelineCommand(() => {\n      const previousMarker = findPreviousMarker(engine.playheadTime);\n      if (!previousMarker) {\n        return timelineCommandFail<TimelineReadonly<Marker>>('not-found');\n      }\n      engine.updatePlayhead(previousMarker.time);\n      return timelineCommandOk(previousMarker);\n    });\n  return {\n    addMarker,\n    addMarkerAtPlayhead,\n    removeMarker,\n    updateMarker,\n    seekToMarker,\n    seekToNextMarker,\n    seekToPreviousMarker,\n  };\n}\n"],"mappings":";;;;AAUA,SAAgB,oBAAoB,UAA+C,CAAC,GAAG;CACrF,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,MAAM,UAAU,gBAAgB,KAAK,MAAM,MAAM,IAAI,CAAC;AAClF;;AAGA,SAAgB,8BACd,QAC2C;CAC3C,MAAM,sBAAsB,SAC1B,oBAAoB,OAAO,SAAS,CAAC,CAAC,OAAO,CAAC,CAC3C,QAAQ,CAAC,CACT,MAAM,WAAW,gBAAgB,OAAO,MAAM,IAAI,IAAI,CAAC,KAAK;CAEjE,MAAM,kBAAkB,SACtB,oBAAoB,OAAO,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,MAC5C,WAAW,gBAAgB,OAAO,MAAM,IAAI,IAAI,CACnD,KAAK;CAEP,MAAM,aAAa,MAAoB,OAAgB,OAAgB,gBACrE,yBAAyB;EACvB,MAAM,SAAS,OAAO,UAAU,MAAM,OAAO,OAAO,WAAW;EAC/D,OAAO,kBAAkB,MAAM;CACjC,CAAC;CAEH,MAAM,uBAAuB,OAAgB,OAAgB,gBAC3D,UAAU,OAAO,cAAc,OAAO,OAAO,WAAW;CAE1D,MAAM,gBAAgB,OACpB,yBACE,OAAO,aAAa,EAAE,IAAI,kBAAkB,IAAI,oBAAoB,WAAW,CACjF;CAEF,MAAM,gBAAgB,IAAY,YAChC,yBAAyB;EACvB,MAAM,SAAS,OAAO,aAAa,IAAI,OAAO;EAC9C,OAAO,SACH,kBAAkB,MAAM,IACxB,oBAA8C,WAAW;CAC/D,CAAC;CAEH,MAAM,gBAAgB,OACpB,yBAAyB;EACvB,MAAM,SAAS,OAAO,SAAS,CAAC,CAAC,SAAS,MAAM,cAAc,UAAU,OAAO,EAAE;EACjF,IAAI,CAAC,QACH,OAAO,oBAA8C,WAAW;EAElE,OAAO,eAAe,OAAO,IAAI;EACjC,OAAO,kBAAkB,MAAM;CACjC,CAAC;CAEH,MAAM,yBACJ,yBAAyB;EACvB,MAAM,aAAa,eAAe,OAAO,YAAY;EACrD,IAAI,CAAC,YACH,OAAO,oBAA8C,WAAW;EAElE,OAAO,eAAe,WAAW,IAAI;EACrC,OAAO,kBAAkB,UAAU;CACrC,CAAC;CAEH,MAAM,6BACJ,yBAAyB;EACvB,MAAM,iBAAiB,mBAAmB,OAAO,YAAY;EAC7D,IAAI,CAAC,gBACH,OAAO,oBAA8C,WAAW;EAElE,OAAO,eAAe,eAAe,IAAI;EACzC,OAAO,kBAAkB,cAAc;CACzC,CAAC;CACH,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF"}