2026-07-26 16:55:20 +07:00
|
|
|
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
2026-07-27 21:54:31 +07:00
|
|
|
import { useEffect } from "react";
|
2026-07-26 16:14:32 +07:00
|
|
|
|
2026-07-27 21:54:31 +07:00
|
|
|
import { mediaApi } from "@/lib/api";
|
2026-07-26 16:14:32 +07:00
|
|
|
import type { MediaState } 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-07-26 16:55:20 +07:00
|
|
|
export function useMediaState() {
|
|
|
|
|
return useQuery<MediaState>({
|
|
|
|
|
queryKey: ["media-state"],
|
2026-07-27 21:54:31 +07:00
|
|
|
queryFn: () => mediaApi.getStatus(),
|
2026-07-26 16:55:20 +07:00
|
|
|
retry: false,
|
|
|
|
|
refetchInterval: 10_000,
|
|
|
|
|
});
|
2026-07-26 16:14:32 +07:00
|
|
|
}
|
|
|
|
|
|
2026-07-26 16:55:20 +07:00
|
|
|
export function useMediaQueue() {
|
|
|
|
|
const qc = useQueryClient();
|
|
|
|
|
return useMutation({
|
2026-07-27 21:54:31 +07:00
|
|
|
mutationFn: (url: string) => mediaApi.queue(url, "music"),
|
2026-07-26 16:55:20 +07:00
|
|
|
onSuccess: (data) => qc.setQueryData(["media-state"], data),
|
|
|
|
|
});
|
|
|
|
|
}
|
2026-07-26 16:14:32 +07:00
|
|
|
|
2026-07-26 16:55:20 +07:00
|
|
|
export function useMediaSkip() {
|
|
|
|
|
const qc = useQueryClient();
|
|
|
|
|
return useMutation({
|
2026-07-27 21:54:31 +07:00
|
|
|
mutationFn: () => mediaApi.skip(),
|
2026-07-26 16:55:20 +07:00
|
|
|
onSuccess: (data) => qc.setQueryData(["media-state"], data),
|
|
|
|
|
});
|
|
|
|
|
}
|
2026-07-26 16:14:32 +07:00
|
|
|
|
2026-07-26 16:55:20 +07:00
|
|
|
export function useMediaStop() {
|
|
|
|
|
const qc = useQueryClient();
|
|
|
|
|
return useMutation({
|
2026-07-27 21:54:31 +07:00
|
|
|
mutationFn: () => mediaApi.stop(),
|
2026-07-26 16:55:20 +07:00
|
|
|
onSuccess: (data) => qc.setQueryData(["media-state"], data),
|
|
|
|
|
});
|
|
|
|
|
}
|
2026-07-26 16:14:32 +07:00
|
|
|
|
2026-07-26 16:55:20 +07:00
|
|
|
export function useMediaVolume() {
|
|
|
|
|
const qc = useQueryClient();
|
|
|
|
|
return useMutation({
|
2026-07-27 21:54:31 +07:00
|
|
|
mutationFn: (volume: number) => mediaApi.volume(volume),
|
2026-07-26 16:55:20 +07:00
|
|
|
onSuccess: (data) => qc.setQueryData(["media-state"], data),
|
|
|
|
|
});
|
|
|
|
|
}
|
2026-07-26 16:14:32 +07:00
|
|
|
|
2026-07-26 16:55:20 +07:00
|
|
|
/** Subscribe to WS media_state events to keep cache fresh */
|
|
|
|
|
export function useMediaWsSync(ws: WsHook) {
|
|
|
|
|
const qc = useQueryClient();
|
2026-07-26 16:46:53 +07:00
|
|
|
useEffect(() => {
|
2026-07-26 16:55:20 +07:00
|
|
|
const unsub = ws.on("media_state", (data) => {
|
|
|
|
|
qc.setQueryData(["media-state"], data as MediaState);
|
|
|
|
|
});
|
|
|
|
|
return unsub;
|
|
|
|
|
}, [ws, qc]);
|
2026-07-26 16:14:32 +07:00
|
|
|
}
|