mirror of
https://github.com/Monadical-SAS/reflector.git
synced 2025-12-21 04:39:06 +00:00
Changed all query hooks to use direct `status === "authenticated"` check instead of derived `isAuthenticated && !isLoading` to avoid race conditions where queries might fire before the authentication token is properly set. This prevents the brief 401 errors that occur on page refresh when the session is being restored.
608 lines
15 KiB
TypeScript
608 lines
15 KiB
TypeScript
"use client";
|
|
|
|
import { $api } from "./apiClient";
|
|
import { useError } from "../(errors)/errorContext";
|
|
import { useQueryClient } from "@tanstack/react-query";
|
|
import type { paths } from "../reflector-api";
|
|
import useSessionStatus from "./useSessionStatus";
|
|
|
|
// Rooms hooks
|
|
export function useRoomsList(page: number = 1) {
|
|
const { setError } = useError();
|
|
const { status } = useSessionStatus();
|
|
|
|
return $api.useQuery(
|
|
"get",
|
|
"/v1/rooms",
|
|
{
|
|
params: {
|
|
query: { page },
|
|
},
|
|
},
|
|
{
|
|
// Only fetch when authenticated
|
|
// Using direct status check to avoid any derived state issues
|
|
enabled: status === "authenticated",
|
|
},
|
|
);
|
|
}
|
|
|
|
// Transcripts hooks
|
|
export function useTranscriptsSearch(
|
|
q: string = "",
|
|
options: {
|
|
limit?: number;
|
|
offset?: number;
|
|
room_id?: string;
|
|
source_kind?: string;
|
|
} = {},
|
|
) {
|
|
const { setError } = useError();
|
|
const { status } = useSessionStatus();
|
|
|
|
return $api.useQuery(
|
|
"get",
|
|
"/v1/transcripts/search",
|
|
{
|
|
params: {
|
|
query: {
|
|
q,
|
|
limit: options.limit,
|
|
offset: options.offset,
|
|
room_id: options.room_id,
|
|
source_kind: options.source_kind as any,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
// Only fetch when authenticated
|
|
enabled: status === "authenticated",
|
|
},
|
|
);
|
|
}
|
|
|
|
export function useTranscriptDelete() {
|
|
const { setError } = useError();
|
|
const queryClient = useQueryClient();
|
|
|
|
return $api.useMutation("delete", "/v1/transcripts/{transcript_id}", {
|
|
onSuccess: () => {
|
|
// Invalidate transcripts queries to refetch
|
|
queryClient.invalidateQueries({
|
|
queryKey: $api.queryOptions("get", "/v1/transcripts/search", {
|
|
params: { query: { q: "" } },
|
|
}).queryKey,
|
|
});
|
|
},
|
|
onError: (error) => {
|
|
setError(error as Error, "There was an error deleting the transcript");
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useTranscriptProcess() {
|
|
const { setError } = useError();
|
|
|
|
return $api.useMutation("post", "/v1/transcripts/{transcript_id}/process", {
|
|
onError: (error) => {
|
|
setError(error as Error, "There was an error processing the transcript");
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useTranscriptGet(transcriptId: string | null) {
|
|
const { setError } = useError();
|
|
const { status } = useSessionStatus();
|
|
|
|
return $api.useQuery(
|
|
"get",
|
|
"/v1/transcripts/{transcript_id}",
|
|
{
|
|
params: {
|
|
path: {
|
|
transcript_id: transcriptId || "",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
// Only fetch when authenticated and transcriptId is provided
|
|
enabled: !!transcriptId && status === "authenticated",
|
|
},
|
|
);
|
|
}
|
|
|
|
// Rooms mutations
|
|
export function useRoomCreate() {
|
|
const { setError } = useError();
|
|
const queryClient = useQueryClient();
|
|
|
|
return $api.useMutation("post", "/v1/rooms", {
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({
|
|
queryKey: $api.queryOptions("get", "/v1/rooms").queryKey,
|
|
});
|
|
},
|
|
onError: (error) => {
|
|
setError(error as Error, "There was an error creating the room");
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useRoomUpdate() {
|
|
const { setError } = useError();
|
|
const queryClient = useQueryClient();
|
|
|
|
return $api.useMutation("patch", "/v1/rooms/{room_id}", {
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({
|
|
queryKey: $api.queryOptions("get", "/v1/rooms").queryKey,
|
|
});
|
|
},
|
|
onError: (error) => {
|
|
setError(error as Error, "There was an error updating the room");
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useRoomDelete() {
|
|
const { setError } = useError();
|
|
const queryClient = useQueryClient();
|
|
|
|
return $api.useMutation("delete", "/v1/rooms/{room_id}", {
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({
|
|
queryKey: $api.queryOptions("get", "/v1/rooms").queryKey,
|
|
});
|
|
},
|
|
onError: (error) => {
|
|
setError(error as Error, "There was an error deleting the room");
|
|
},
|
|
});
|
|
}
|
|
|
|
// Zulip hooks - NOTE: These endpoints are not in the OpenAPI spec yet
|
|
export function useZulipStreams() {
|
|
const { setError } = useError();
|
|
const { status } = useSessionStatus();
|
|
|
|
// @ts-ignore - Zulip endpoint not in OpenAPI spec
|
|
return $api.useQuery(
|
|
"get",
|
|
"/v1/zulip/streams" as any,
|
|
{},
|
|
{
|
|
// Only fetch when authenticated
|
|
enabled: status === "authenticated",
|
|
},
|
|
);
|
|
}
|
|
|
|
export function useZulipTopics(streamId: number | null) {
|
|
const { setError } = useError();
|
|
const { status } = useSessionStatus();
|
|
|
|
// @ts-ignore - Zulip endpoint not in OpenAPI spec
|
|
return $api.useQuery(
|
|
"get",
|
|
streamId ? (`/v1/zulip/streams/${streamId}/topics` as any) : null,
|
|
{},
|
|
{
|
|
// Only fetch when authenticated and streamId is provided
|
|
enabled: !!streamId && status === "authenticated",
|
|
},
|
|
);
|
|
}
|
|
|
|
// Transcript mutations
|
|
export function useTranscriptUpdate() {
|
|
const { setError } = useError();
|
|
const queryClient = useQueryClient();
|
|
|
|
return $api.useMutation("patch", "/v1/transcripts/{transcript_id}", {
|
|
onSuccess: (data, variables) => {
|
|
// Invalidate and refetch transcript data
|
|
queryClient.invalidateQueries({
|
|
queryKey: $api.queryOptions("get", "/v1/transcripts/{transcript_id}", {
|
|
params: {
|
|
path: { transcript_id: variables.params.path.transcript_id },
|
|
},
|
|
}).queryKey,
|
|
});
|
|
},
|
|
onError: (error) => {
|
|
setError(error as Error, "There was an error updating the transcript");
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useTranscriptPostToZulip() {
|
|
const { setError } = useError();
|
|
|
|
// @ts-ignore - Zulip endpoint not in OpenAPI spec
|
|
return $api.useMutation(
|
|
"post",
|
|
"/v1/transcripts/{transcript_id}/zulip" as any,
|
|
{
|
|
onError: (error) => {
|
|
setError(error as Error, "There was an error posting to Zulip");
|
|
},
|
|
},
|
|
);
|
|
}
|
|
|
|
export function useTranscriptUploadAudio() {
|
|
const { setError } = useError();
|
|
const queryClient = useQueryClient();
|
|
|
|
return $api.useMutation(
|
|
"post",
|
|
"/v1/transcripts/{transcript_id}/record/upload",
|
|
{
|
|
onSuccess: (data, variables) => {
|
|
// Invalidate transcript to refresh status
|
|
queryClient.invalidateQueries({
|
|
queryKey: $api.queryOptions(
|
|
"get",
|
|
"/v1/transcripts/{transcript_id}",
|
|
{
|
|
params: {
|
|
path: { transcript_id: variables.params.path.transcript_id },
|
|
},
|
|
},
|
|
).queryKey,
|
|
});
|
|
},
|
|
onError: (error) => {
|
|
setError(error as Error, "There was an error uploading the audio file");
|
|
},
|
|
},
|
|
);
|
|
}
|
|
|
|
// Transcript queries
|
|
export function useTranscriptWaveform(transcriptId: string | null) {
|
|
const { setError } = useError();
|
|
const { status } = useSessionStatus();
|
|
|
|
return $api.useQuery(
|
|
"get",
|
|
"/v1/transcripts/{transcript_id}/audio/waveform",
|
|
{
|
|
params: {
|
|
path: { transcript_id: transcriptId || "" },
|
|
},
|
|
},
|
|
{
|
|
enabled: !!transcriptId && status === "authenticated",
|
|
},
|
|
);
|
|
}
|
|
|
|
export function useTranscriptMP3(transcriptId: string | null) {
|
|
const { setError } = useError();
|
|
const { status } = useSessionStatus();
|
|
|
|
return $api.useQuery(
|
|
"get",
|
|
"/v1/transcripts/{transcript_id}/audio/mp3",
|
|
{
|
|
params: {
|
|
path: { transcript_id: transcriptId || "" },
|
|
},
|
|
},
|
|
{
|
|
enabled: !!transcriptId && status === "authenticated",
|
|
},
|
|
);
|
|
}
|
|
|
|
export function useTranscriptTopics(transcriptId: string | null) {
|
|
const { setError } = useError();
|
|
const { status } = useSessionStatus();
|
|
|
|
return $api.useQuery(
|
|
"get",
|
|
"/v1/transcripts/{transcript_id}/topics",
|
|
{
|
|
params: {
|
|
path: { transcript_id: transcriptId || "" },
|
|
},
|
|
},
|
|
{
|
|
enabled: !!transcriptId && status === "authenticated",
|
|
},
|
|
);
|
|
}
|
|
|
|
export function useTranscriptTopicsWithWords(transcriptId: string | null) {
|
|
const { setError } = useError();
|
|
const { status } = useSessionStatus();
|
|
|
|
return $api.useQuery(
|
|
"get",
|
|
"/v1/transcripts/{transcript_id}/topics/with-words",
|
|
{
|
|
params: {
|
|
path: { transcript_id: transcriptId || "" },
|
|
},
|
|
},
|
|
{
|
|
enabled: !!transcriptId && status === "authenticated",
|
|
},
|
|
);
|
|
}
|
|
|
|
export function useTranscriptTopicsWithWordsPerSpeaker(
|
|
transcriptId: string | null,
|
|
topicId: string | null,
|
|
) {
|
|
const { setError } = useError();
|
|
const { status } = useSessionStatus();
|
|
|
|
return $api.useQuery(
|
|
"get",
|
|
"/v1/transcripts/{transcript_id}/topics/{topic_id}/words-per-speaker",
|
|
{
|
|
params: {
|
|
path: {
|
|
transcript_id: transcriptId || "",
|
|
topic_id: topicId || "",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
enabled: !!transcriptId && !!topicId && status === "authenticated",
|
|
},
|
|
);
|
|
}
|
|
|
|
// Participant operations
|
|
export function useTranscriptParticipants(transcriptId: string | null) {
|
|
const { setError } = useError();
|
|
const { status } = useSessionStatus();
|
|
|
|
return $api.useQuery(
|
|
"get",
|
|
"/v1/transcripts/{transcript_id}/participants",
|
|
{
|
|
params: {
|
|
path: { transcript_id: transcriptId || "" },
|
|
},
|
|
},
|
|
{
|
|
enabled: !!transcriptId && status === "authenticated",
|
|
},
|
|
);
|
|
}
|
|
|
|
export function useTranscriptParticipantUpdate() {
|
|
const { setError } = useError();
|
|
const queryClient = useQueryClient();
|
|
|
|
return $api.useMutation(
|
|
"patch",
|
|
"/v1/transcripts/{transcript_id}/participants/{participant_id}",
|
|
{
|
|
onSuccess: (data, variables) => {
|
|
// Invalidate participants list
|
|
queryClient.invalidateQueries({
|
|
queryKey: $api.queryOptions(
|
|
"get",
|
|
"/v1/transcripts/{transcript_id}/participants",
|
|
{
|
|
params: {
|
|
path: { transcript_id: variables.params.path.transcript_id },
|
|
},
|
|
},
|
|
).queryKey,
|
|
});
|
|
},
|
|
onError: (error) => {
|
|
setError(error as Error, "There was an error updating the participant");
|
|
},
|
|
},
|
|
);
|
|
}
|
|
|
|
export function useTranscriptParticipantCreate() {
|
|
const { setError } = useError();
|
|
const queryClient = useQueryClient();
|
|
|
|
return $api.useMutation(
|
|
"post",
|
|
"/v1/transcripts/{transcript_id}/participants",
|
|
{
|
|
onSuccess: (data, variables) => {
|
|
// Invalidate participants list
|
|
queryClient.invalidateQueries({
|
|
queryKey: $api.queryOptions(
|
|
"get",
|
|
"/v1/transcripts/{transcript_id}/participants",
|
|
{
|
|
params: {
|
|
path: { transcript_id: variables.params.path.transcript_id },
|
|
},
|
|
},
|
|
).queryKey,
|
|
});
|
|
},
|
|
onError: (error) => {
|
|
setError(error as Error, "There was an error creating the participant");
|
|
},
|
|
},
|
|
);
|
|
}
|
|
|
|
export function useTranscriptParticipantDelete() {
|
|
const { setError } = useError();
|
|
const queryClient = useQueryClient();
|
|
|
|
return $api.useMutation(
|
|
"delete",
|
|
"/v1/transcripts/{transcript_id}/participants/{participant_id}",
|
|
{
|
|
onSuccess: (data, variables) => {
|
|
// Invalidate participants list
|
|
queryClient.invalidateQueries({
|
|
queryKey: $api.queryOptions(
|
|
"get",
|
|
"/v1/transcripts/{transcript_id}/participants",
|
|
{
|
|
params: {
|
|
path: { transcript_id: variables.params.path.transcript_id },
|
|
},
|
|
},
|
|
).queryKey,
|
|
});
|
|
},
|
|
onError: (error) => {
|
|
setError(error as Error, "There was an error deleting the participant");
|
|
},
|
|
},
|
|
);
|
|
}
|
|
|
|
export function useTranscriptSpeakerAssign() {
|
|
const { setError } = useError();
|
|
const queryClient = useQueryClient();
|
|
|
|
return $api.useMutation(
|
|
"patch",
|
|
"/v1/transcripts/{transcript_id}/speaker/assign",
|
|
{
|
|
onSuccess: (data, variables) => {
|
|
// Invalidate transcript and participants
|
|
queryClient.invalidateQueries({
|
|
queryKey: $api.queryOptions(
|
|
"get",
|
|
"/v1/transcripts/{transcript_id}",
|
|
{
|
|
params: {
|
|
path: { transcript_id: variables.params.path.transcript_id },
|
|
},
|
|
},
|
|
).queryKey,
|
|
});
|
|
queryClient.invalidateQueries({
|
|
queryKey: $api.queryOptions(
|
|
"get",
|
|
"/v1/transcripts/{transcript_id}/participants",
|
|
{
|
|
params: {
|
|
path: { transcript_id: variables.params.path.transcript_id },
|
|
},
|
|
},
|
|
).queryKey,
|
|
});
|
|
},
|
|
onError: (error) => {
|
|
setError(error as Error, "There was an error assigning the speaker");
|
|
},
|
|
},
|
|
);
|
|
}
|
|
|
|
export function useTranscriptSpeakerMerge() {
|
|
const { setError } = useError();
|
|
const queryClient = useQueryClient();
|
|
|
|
return $api.useMutation(
|
|
"patch",
|
|
"/v1/transcripts/{transcript_id}/speaker/merge",
|
|
{
|
|
onSuccess: (data, variables) => {
|
|
// Invalidate transcript and participants
|
|
queryClient.invalidateQueries({
|
|
queryKey: $api.queryOptions(
|
|
"get",
|
|
"/v1/transcripts/{transcript_id}",
|
|
{
|
|
params: {
|
|
path: { transcript_id: variables.params.path.transcript_id },
|
|
},
|
|
},
|
|
).queryKey,
|
|
});
|
|
queryClient.invalidateQueries({
|
|
queryKey: $api.queryOptions(
|
|
"get",
|
|
"/v1/transcripts/{transcript_id}/participants",
|
|
{
|
|
params: {
|
|
path: { transcript_id: variables.params.path.transcript_id },
|
|
},
|
|
},
|
|
).queryKey,
|
|
});
|
|
},
|
|
onError: (error) => {
|
|
setError(error as Error, "There was an error merging speakers");
|
|
},
|
|
},
|
|
);
|
|
}
|
|
|
|
// Meeting operations
|
|
export function useMeetingAudioConsent() {
|
|
const { setError } = useError();
|
|
|
|
return $api.useMutation("post", "/v1/meetings/{meeting_id}/consent", {
|
|
onError: (error) => {
|
|
setError(error as Error, "There was an error recording consent");
|
|
},
|
|
});
|
|
}
|
|
|
|
// WebRTC operations
|
|
export function useTranscriptWebRTC() {
|
|
const { setError } = useError();
|
|
|
|
return $api.useMutation(
|
|
"post",
|
|
"/v1/transcripts/{transcript_id}/record/webrtc",
|
|
{
|
|
onError: (error) => {
|
|
setError(error as Error, "There was an error with WebRTC connection");
|
|
},
|
|
},
|
|
);
|
|
}
|
|
|
|
// Transcript creation
|
|
export function useTranscriptCreate() {
|
|
const { setError } = useError();
|
|
const queryClient = useQueryClient();
|
|
|
|
return $api.useMutation("post", "/v1/transcripts", {
|
|
onSuccess: () => {
|
|
// Invalidate transcripts list
|
|
queryClient.invalidateQueries({
|
|
queryKey: $api.queryOptions("get", "/v1/transcripts/search", {
|
|
params: { query: { q: "" } },
|
|
}).queryKey,
|
|
});
|
|
},
|
|
onError: (error) => {
|
|
setError(error as Error, "There was an error creating the transcript");
|
|
},
|
|
});
|
|
}
|
|
|
|
// Rooms meeting operations
|
|
export function useRoomsCreateMeeting() {
|
|
const { setError } = useError();
|
|
const queryClient = useQueryClient();
|
|
|
|
return $api.useMutation("post", "/v1/rooms/{room_name}/meeting", {
|
|
onSuccess: () => {
|
|
// Invalidate rooms list to refresh meeting data
|
|
queryClient.invalidateQueries({
|
|
queryKey: $api.queryOptions("get", "/v1/rooms").queryKey,
|
|
});
|
|
},
|
|
onError: (error) => {
|
|
setError(error as Error, "There was an error creating the meeting");
|
|
},
|
|
});
|
|
}
|