create share chat stuff

This commit is contained in:
Nate Kelley 2025-09-11 11:37:25 -06:00
parent 4291597b5c
commit f5afb2772e
No known key found for this signature in database
GPG Key ID: FD90372AB8D98B4F
3 changed files with 125 additions and 0 deletions

View File

@ -7,6 +7,7 @@ import {
} from '@tanstack/react-query';
import last from 'lodash/last';
import { useMemo } from 'react';
import { create } from 'mutative';
import type { BusterChatMessage } from '@/api/asset_interfaces/chat';
import type { IBusterChat } from '@/api/asset_interfaces/chat/iChatInterfaces';
import { chatQueryKeys } from '@/api/query_keys/chat';
@ -27,8 +28,11 @@ import {
getChat,
getListChats,
getListLogs,
shareChat,
unshareChat,
updateChat,
updateChatMessageFeedback,
updateChatShare,
} from './requests';
export const useGetListChats = (
@ -340,3 +344,95 @@ export const useRemoveChatFromCollections = () => {
},
});
};
export const useShareChat = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: shareChat,
onMutate: ({ id, params }) => {
const queryKey = chatQueryKeys.chatsGetChat(id).queryKey;
queryClient.setQueryData(queryKey, (previousData: IBusterChat | undefined) => {
if (!previousData) return previousData;
return create(previousData, (draft: IBusterChat) => {
draft.individual_permissions = [
...params.map((p) => ({
...p,
name: p.name,
avatar_url: p.avatar_url || null,
})),
...(draft.individual_permissions || []),
].sort((a, b) => a.email.localeCompare(b.email));
});
});
},
onSuccess: (data) => {
const upgradedChat = updateChatToIChat(data).iChat;
queryClient.setQueryData(
chatQueryKeys.chatsGetChat(data.id).queryKey,
upgradedChat
);
},
});
};
export const useUnshareChat = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: unshareChat,
onMutate: (variables) => {
const queryKey = chatQueryKeys.chatsGetChat(variables.id).queryKey;
queryClient.setQueryData(queryKey, (previousData: IBusterChat | undefined) => {
if (!previousData) return previousData;
return create(previousData, (draft: IBusterChat) => {
draft.individual_permissions = (
draft.individual_permissions?.filter((t) => !variables.data.includes(t.email)) || []
).sort((a, b) => a.email.localeCompare(b.email));
});
});
},
onSuccess: (data) => {
const upgradedChat = updateChatToIChat(data).iChat;
queryClient.setQueryData(
chatQueryKeys.chatsGetChat(upgradedChat.id).queryKey,
upgradedChat
);
},
});
};
export const useUpdateChatShare = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: updateChatShare,
onMutate: (variables) => {
const queryKey = chatQueryKeys.chatsGetChat(variables.id).queryKey;
queryClient.setQueryData(queryKey, (previousData: IBusterChat | undefined) => {
if (!previousData) return previousData;
return create(previousData, (draft: IBusterChat) => {
draft.individual_permissions = (
draft.individual_permissions?.map((t) => {
const found = variables.params.users?.find((v) => v.email === t.email);
if (found) return { ...t, ...found };
return t;
}) || []
).sort((a, b) => a.email.localeCompare(b.email));
if (variables.params.publicly_accessible !== undefined) {
draft.publicly_accessible = variables.params.publicly_accessible;
}
if (variables.params.public_password !== undefined) {
draft.public_password = variables.params.public_password;
}
if (variables.params.public_expiry_date !== undefined) {
draft.public_expiry_date = variables.params.public_expiry_date;
}
if (variables.params.workspace_sharing !== undefined) {
draft.workspace_sharing = variables.params.workspace_sharing;
}
});
});
},
});
};

View File

@ -8,11 +8,17 @@ import type {
GetChatsListResponse,
GetLogsListRequest,
GetLogsListResponse,
ShareChatResponse,
UpdateChatMessageFeedbackRequest,
UpdateChatMessageFeedbackResponse,
UpdateChatRequest,
UpdateChatResponse,
} from '@buster/server-shared/chats';
import type {
ShareDeleteRequest,
SharePostRequest,
ShareUpdateRequest,
} from '@buster/server-shared/share';
import { mainApi, mainApiV2 } from '../instances';
const CHATS_BASE = '/chats';
@ -66,3 +72,23 @@ export const duplicateChat = async ({
}: DuplicateChatRequest): Promise<DuplicateChatResponse> => {
return mainApi.post(`${CHATS_BASE}/duplicate`, { id, message_id }).then((res) => res.data);
};
export const shareChat = async ({ id, params }: { id: string; params: SharePostRequest }) => {
return mainApi.post<string>(`${CHATS_BASE}/${id}/sharing`, params).then((res) => res.data);
};
export const unshareChat = async ({ id, data }: { id: string; data: ShareDeleteRequest }) => {
return mainApi.delete<boolean>(`${CHATS_BASE}/${id}/sharing`, { data }).then((res) => res.data);
};
export const updateChatShare = async ({
id,
params,
}: {
id: string;
params: ShareUpdateRequest;
}) => {
return mainApi
.put<ShareChatResponse>(`${CHATS_BASE}/${id}/sharing`, params)
.then((res) => res.data);
};

View File

@ -31,3 +31,6 @@ export type DuplicateChatResponse = z.infer<typeof DuplicateChatResponseSchema>;
// Response for deleting chats (void)
export const DeleteChatsResponseSchema = z.void();
export type DeleteChatsResponse = z.infer<typeof DeleteChatsResponseSchema>;
export const ShareChatResponseSchema = ChatWithMessagesSchema;
export type ShareChatResponse = z.infer<typeof ShareChatResponseSchema>;