| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- export function formatConversationTime(dateStr: string | null | undefined): string {
- if (!dateStr) {
- return "-";
- }
- const date = new Date(dateStr);
- if (Number.isNaN(date.getTime())) {
- return "-";
- }
- const now = new Date();
- const diff = now.getTime() - date.getTime();
- if (diff < 24 * 3600 * 1000 && date.getDate() === now.getDate()) {
- return date.toLocaleTimeString("zh-CN", {
- hour: "2-digit",
- minute: "2-digit",
- });
- }
- return date.toLocaleString("zh-CN", {
- month: "2-digit",
- day: "2-digit",
- hour: "2-digit",
- minute: "2-digit",
- });
- }
- export function formatMessageTime(dateStr: string | null | undefined): string {
- if (!dateStr) {
- return "";
- }
- const date = new Date(dateStr);
- if (Number.isNaN(date.getTime())) {
- return "";
- }
- const now = new Date();
- const diff = now.getTime() - date.getTime();
- if (diff < 24 * 3600 * 1000 && date.getDate() === now.getDate()) {
- return date.toLocaleTimeString("zh-CN", {
- hour: "2-digit",
- minute: "2-digit",
- });
- }
- return date.toLocaleString("zh-CN", {
- month: "2-digit",
- day: "2-digit",
- hour: "2-digit",
- minute: "2-digit",
- });
- }
- export function buildMessagePreview(content: string, maxLength = 50): string {
- if (!content) {
- return "";
- }
- if (content.length <= maxLength) {
- return content;
- }
- return `${content.substring(0, maxLength)}...`;
- }
- // 判断访客是否在线(根据 last_seen_at 字段)
- // 说明:10 秒阈值在公网环境(代理、弱网、移动端切后台)容易抖动,体验上会“刚说完就离线”。
- // 这里放宽到 90 秒,减少误判闪断。
- export function isVisitorOnline(lastSeenAt: string | null | undefined): boolean {
- if (!lastSeenAt) {
- return false;
- }
- const lastSeen = new Date(lastSeenAt);
- if (Number.isNaN(lastSeen.getTime())) {
- return false;
- }
- const now = new Date();
- const diff = now.getTime() - lastSeen.getTime();
- // 90 秒内认为在线
- return diff < 90 * 1000;
- }
|