UNPKG

@lobehub/chat

Version:

Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.

87 lines (67 loc) 2.39 kB
import dayjs from 'dayjs'; import isToday from 'dayjs/plugin/isToday'; import isYesterday from 'dayjs/plugin/isYesterday'; import { ChatTopic, GroupedTopic, TimeGroupId } from '@/types/topic'; // 初始化 dayjs 插件 dayjs.extend(isToday); dayjs.extend(isYesterday); const getTopicGroupId = (timestamp: number): TimeGroupId => { const date = dayjs(timestamp); const now = dayjs(); if (date.isToday()) { return 'today'; } if (date.isYesterday()) { return 'yesterday'; } // 7天内(不包括今天和昨天) const weekAgo = now.subtract(7, 'day'); if (date.isAfter(weekAgo) && !date.isToday() && !date.isYesterday()) { return 'week'; } // 当前月份(不包括前面已经分组的日期) // 使用原生的月份和年份比较 if (date.month() === now.month() && date.year() === now.year()) { return 'month'; } // 当年的其他月份 if (date.year() === now.year()) { return `${date.year()}-${(date.month() + 1).toString().padStart(2, '0')}`; } // 更早的年份 return `${date.year()}`; }; // 确保分组的排序 const sortGroups = (groups: GroupedTopic[]): GroupedTopic[] => { const orderMap = new Map<string, number>(); // 设置固定分组的顺序 orderMap.set('today', 0); orderMap.set('yesterday', 1); orderMap.set('week', 2); orderMap.set('month', 3); return groups.sort((a, b) => { const orderA = orderMap.get(a.id) ?? Number.MAX_SAFE_INTEGER; const orderB = orderMap.get(b.id) ?? Number.MAX_SAFE_INTEGER; if (orderA !== Number.MAX_SAFE_INTEGER || orderB !== Number.MAX_SAFE_INTEGER) { return orderA - orderB; } // 对于年月格式和年份格式的分组,按时间倒序排序 return b.id.localeCompare(a.id); }); }; // 时间分组的具体实现 export const groupTopicsByTime = (topics: ChatTopic[]): GroupedTopic[] => { if (!topics.length) return []; const sortedTopics = [...topics].sort((a, b) => b.createdAt - a.createdAt); const groupsMap = new Map<TimeGroupId, ChatTopic[]>(); sortedTopics.forEach((topic) => { const groupId = getTopicGroupId(topic.createdAt); const existingGroup = groupsMap.get(groupId) || []; groupsMap.set(groupId, [...existingGroup, topic]); }); const result = Array.from(groupsMap.entries()).map(([id, children]) => ({ children, id, })); return sortGroups(result); };