71 lines
1.9 KiB
TypeScript
71 lines
1.9 KiB
TypeScript
|
|
'use client';
|
||
|
|
|
||
|
|
import { useState, useCallback } from 'react';
|
||
|
|
import type { Marker, CreateMarkerInput } from '@/types/marker';
|
||
|
|
|
||
|
|
export function useMarkers() {
|
||
|
|
const [markers, setMarkers] = useState<Marker[]>([]);
|
||
|
|
|
||
|
|
const addMarker = useCallback((input: CreateMarkerInput): Marker => {
|
||
|
|
const marker: Marker = {
|
||
|
|
...input,
|
||
|
|
id: `marker-${Date.now()}-${Math.random()}`,
|
||
|
|
};
|
||
|
|
setMarkers((prev) => [...prev, marker].sort((a, b) => a.time - b.time));
|
||
|
|
return marker;
|
||
|
|
}, []);
|
||
|
|
|
||
|
|
const updateMarker = useCallback((id: string, updates: Partial<Marker>) => {
|
||
|
|
setMarkers((prev) => {
|
||
|
|
const updated = prev.map((m) =>
|
||
|
|
m.id === id ? { ...m, ...updates } : m
|
||
|
|
);
|
||
|
|
// Re-sort if time changed
|
||
|
|
if ('time' in updates) {
|
||
|
|
return updated.sort((a, b) => a.time - b.time);
|
||
|
|
}
|
||
|
|
return updated;
|
||
|
|
});
|
||
|
|
}, []);
|
||
|
|
|
||
|
|
const removeMarker = useCallback((id: string) => {
|
||
|
|
setMarkers((prev) => prev.filter((m) => m.id !== id));
|
||
|
|
}, []);
|
||
|
|
|
||
|
|
const clearMarkers = useCallback(() => {
|
||
|
|
setMarkers([]);
|
||
|
|
}, []);
|
||
|
|
|
||
|
|
const getMarkerAt = useCallback((time: number, tolerance: number = 0.1): Marker | undefined => {
|
||
|
|
return markers.find((m) => {
|
||
|
|
if (m.type === 'point') {
|
||
|
|
return Math.abs(m.time - time) <= tolerance;
|
||
|
|
} else {
|
||
|
|
// For regions, check if time is within the region
|
||
|
|
return m.endTime !== undefined && time >= m.time && time <= m.endTime;
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}, [markers]);
|
||
|
|
|
||
|
|
const getNextMarker = useCallback((time: number): Marker | undefined => {
|
||
|
|
return markers.find((m) => m.time > time);
|
||
|
|
}, [markers]);
|
||
|
|
|
||
|
|
const getPreviousMarker = useCallback((time: number): Marker | undefined => {
|
||
|
|
const previous = markers.filter((m) => m.time < time);
|
||
|
|
return previous[previous.length - 1];
|
||
|
|
}, [markers]);
|
||
|
|
|
||
|
|
return {
|
||
|
|
markers,
|
||
|
|
addMarker,
|
||
|
|
updateMarker,
|
||
|
|
removeMarker,
|
||
|
|
clearMarkers,
|
||
|
|
getMarkerAt,
|
||
|
|
getNextMarker,
|
||
|
|
getPreviousMarker,
|
||
|
|
setMarkers,
|
||
|
|
};
|
||
|
|
}
|