messageApi.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { API_BASE_URL } from "@/lib/config";
  2. import { MessageItem } from "../types";
  3. interface SendMessagePayload {
  4. conversationId: number;
  5. content: string;
  6. senderId?: number;
  7. senderIsAgent?: boolean;
  8. }
  9. export async function fetchMessages(
  10. conversationId: number
  11. ): Promise<MessageItem[]> {
  12. const res = await fetch(
  13. `${API_BASE_URL}/messages?conversation_id=${conversationId}`,
  14. {
  15. cache: "no-store",
  16. }
  17. );
  18. if (!res.ok) {
  19. throw new Error("获取消息失败");
  20. }
  21. const data = await res.json();
  22. if (!Array.isArray(data)) {
  23. return [];
  24. }
  25. return data;
  26. }
  27. export async function sendMessage({
  28. conversationId,
  29. content,
  30. senderId,
  31. senderIsAgent = true,
  32. }: SendMessagePayload): Promise<void> {
  33. const res = await fetch(`${API_BASE_URL}/messages`, {
  34. method: "POST",
  35. headers: { "Content-Type": "application/json" },
  36. body: JSON.stringify({
  37. conversation_id: conversationId,
  38. content,
  39. sender_is_agent: senderIsAgent,
  40. sender_id: typeof senderId === "number" ? senderId : 0,
  41. }),
  42. });
  43. if (!res.ok) {
  44. const error = await res.json().catch(() => ({}));
  45. console.error(
  46. `❌ 发送消息失败: 对话ID=${conversationId}, 状态=${res.status}, 错误=${JSON.stringify(error)}`
  47. );
  48. throw new Error(error.error || "发送消息失败");
  49. }
  50. }
  51. export interface MarkMessagesReadResult {
  52. message_ids: number[];
  53. unread_count: number;
  54. read_at?: string;
  55. }
  56. export async function markMessagesRead(
  57. conversationId: number,
  58. readerIsAgent: boolean
  59. ): Promise<MarkMessagesReadResult | null> {
  60. const res = await fetch(`${API_BASE_URL}/messages/read`, {
  61. method: "PUT",
  62. headers: { "Content-Type": "application/json" },
  63. body: JSON.stringify({
  64. conversation_id: conversationId,
  65. reader_is_agent: readerIsAgent,
  66. }),
  67. });
  68. if (!res.ok) {
  69. return null;
  70. }
  71. const data = await res.json();
  72. return {
  73. message_ids: Array.isArray(data.message_ids) ? data.message_ids : [],
  74. unread_count:
  75. typeof data.unread_count === "number" ? data.unread_count : 0,
  76. read_at: typeof data.read_at === "string" ? data.read_at : undefined,
  77. };
  78. }