faq-api.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { apiPost } from "@/lib/api";
  2. export type FaqItem = {
  3. id: string;
  4. question: string;
  5. answer: string;
  6. };
  7. function pickString(record: Record<string, unknown>, keys: string[]): string {
  8. for (const key of keys) {
  9. const value = record[key];
  10. if (typeof value === "string" && value.trim()) return value.trim();
  11. }
  12. return "";
  13. }
  14. function pickList(raw: unknown): unknown[] {
  15. if (!raw || typeof raw !== "object") return [];
  16. const o = raw as Record<string, unknown>;
  17. const inner = o.data ?? o.list ?? o.rows ?? o.records;
  18. if (Array.isArray(inner)) return inner;
  19. if (inner && typeof inner === "object") {
  20. const x = inner as Record<string, unknown>;
  21. if (Array.isArray(x.list)) return x.list;
  22. if (Array.isArray(x.records)) return x.records;
  23. if (Array.isArray(x.rows)) return x.rows;
  24. }
  25. return [];
  26. }
  27. function normalizeFaqRow(row: unknown, index: number): FaqItem | null {
  28. if (!row || typeof row !== "object") return null;
  29. const r = row as Record<string, unknown>;
  30. const question = pickString(r, [
  31. "title",
  32. "question",
  33. "questionTitle",
  34. "name",
  35. "q",
  36. "subject",
  37. ]);
  38. const answer = pickString(r, [
  39. "content",
  40. "answer",
  41. "reply",
  42. "description",
  43. "a",
  44. "questionContent",
  45. "detail",
  46. "remark",
  47. ]);
  48. if (!question && !answer) return null;
  49. const id = String(r.id ?? r.questionId ?? index).trim() || String(index);
  50. return {
  51. id,
  52. question: question || answer.slice(0, 80) || "—",
  53. answer: answer || "—",
  54. };
  55. }
  56. export async function fetchCommonQuestions(
  57. page: { current: number; row: number } = { current: 1, row: 100 },
  58. ): Promise<{ items: FaqItem[]; failed: boolean }> {
  59. const current = Number.isFinite(page.current) ? Math.max(1, page.current) : 1;
  60. const row = Number.isFinite(page.row) ? Math.max(1, Math.min(200, page.row)) : 100;
  61. try {
  62. const payload = await apiPost<unknown, { page: { current: number; row: number } }>(
  63. "/common/question/search/list",
  64. { page: { current, row } },
  65. );
  66. const list = pickList(payload);
  67. const items: FaqItem[] = [];
  68. list.forEach((item, i) => {
  69. const n = normalizeFaqRow(item, i);
  70. if (n) items.push(n);
  71. });
  72. return { items, failed: false };
  73. } catch {
  74. return { items: [], failed: true };
  75. }
  76. }