2026-07-26 16:55:20 +07:00
|
|
|
import { useEffect } from "react";
|
2026-08-01 09:19:39 +07:00
|
|
|
import useSWR, { useSWRConfig } from "swr";
|
|
|
|
|
import { useAction } from "@/hooks/use-action";
|
2026-07-26 16:14:32 +07:00
|
|
|
import { recordingsApi } from "@/lib/api";
|
|
|
|
|
import type { VoiceRecording } from "@/lib/types";
|
2026-07-27 21:54:31 +07:00
|
|
|
import type { WsHook } from "@/lib/ws-hook";
|
2026-07-26 16:14:32 +07:00
|
|
|
|
2026-08-01 09:19:39 +07:00
|
|
|
const RECORDINGS_KEY = ["recordings"] as const;
|
|
|
|
|
|
2026-07-26 16:55:20 +07:00
|
|
|
export function useRecordings() {
|
2026-08-01 09:19:39 +07:00
|
|
|
return useSWR<VoiceRecording[]>(RECORDINGS_KEY, async () => {
|
|
|
|
|
const res = await recordingsApi.list(50);
|
|
|
|
|
return res.items;
|
2026-07-26 16:55:20 +07:00
|
|
|
});
|
2026-07-26 16:14:32 +07:00
|
|
|
}
|
|
|
|
|
|
2026-07-26 16:55:20 +07:00
|
|
|
export function useDeleteRecording() {
|
2026-08-01 09:19:39 +07:00
|
|
|
const { mutate } = useSWRConfig();
|
|
|
|
|
return useAction((id: string) => recordingsApi.delete(id), {
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
void mutate(RECORDINGS_KEY);
|
|
|
|
|
},
|
2026-07-26 16:55:20 +07:00
|
|
|
});
|
|
|
|
|
}
|
2026-07-26 16:14:32 +07:00
|
|
|
|
2026-07-26 16:55:20 +07:00
|
|
|
export function useRecordingsWsSync(ws: WsHook) {
|
2026-08-01 09:19:39 +07:00
|
|
|
const { mutate } = useSWRConfig();
|
2026-07-26 16:46:53 +07:00
|
|
|
useEffect(() => {
|
2026-07-26 16:55:20 +07:00
|
|
|
const unsub = ws.on("voice_recording_uploaded", (data) => {
|
|
|
|
|
const rec = data as VoiceRecording;
|
2026-08-01 09:19:39 +07:00
|
|
|
void mutate(
|
|
|
|
|
RECORDINGS_KEY,
|
|
|
|
|
(old: VoiceRecording[] | undefined) => (old ? [rec, ...old] : [rec]),
|
|
|
|
|
{ revalidate: false },
|
2026-07-26 16:55:20 +07:00
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
return unsub;
|
2026-08-01 09:19:39 +07:00
|
|
|
}, [ws, mutate]);
|
2026-07-26 16:14:32 +07:00
|
|
|
}
|