format.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. export function formatConversationTime(dateStr: string | null | undefined): string {
  2. if (!dateStr) {
  3. return "-";
  4. }
  5. const date = new Date(dateStr);
  6. if (Number.isNaN(date.getTime())) {
  7. return "-";
  8. }
  9. const now = new Date();
  10. const diff = now.getTime() - date.getTime();
  11. if (diff < 24 * 3600 * 1000 && date.getDate() === now.getDate()) {
  12. return date.toLocaleTimeString("zh-CN", {
  13. hour: "2-digit",
  14. minute: "2-digit",
  15. });
  16. }
  17. return date.toLocaleString("zh-CN", {
  18. month: "2-digit",
  19. day: "2-digit",
  20. hour: "2-digit",
  21. minute: "2-digit",
  22. });
  23. }
  24. export function formatMessageTime(dateStr: string | null | undefined): string {
  25. if (!dateStr) {
  26. return "";
  27. }
  28. const date = new Date(dateStr);
  29. if (Number.isNaN(date.getTime())) {
  30. return "";
  31. }
  32. const now = new Date();
  33. const diff = now.getTime() - date.getTime();
  34. if (diff < 24 * 3600 * 1000 && date.getDate() === now.getDate()) {
  35. return date.toLocaleTimeString("zh-CN", {
  36. hour: "2-digit",
  37. minute: "2-digit",
  38. });
  39. }
  40. return date.toLocaleString("zh-CN", {
  41. month: "2-digit",
  42. day: "2-digit",
  43. hour: "2-digit",
  44. minute: "2-digit",
  45. });
  46. }
  47. export function buildMessagePreview(content: string, maxLength = 50): string {
  48. if (!content) {
  49. return "";
  50. }
  51. if (content.length <= maxLength) {
  52. return content;
  53. }
  54. return `${content.substring(0, maxLength)}...`;
  55. }
  56. // 判断访客是否在线(根据 last_seen_at 字段)
  57. // 说明:10 秒阈值在公网环境(代理、弱网、移动端切后台)容易抖动,体验上会“刚说完就离线”。
  58. // 这里放宽到 90 秒,减少误判闪断。
  59. export function isVisitorOnline(lastSeenAt: string | null | undefined): boolean {
  60. if (!lastSeenAt) {
  61. return false;
  62. }
  63. const lastSeen = new Date(lastSeenAt);
  64. if (Number.isNaN(lastSeen.getTime())) {
  65. return false;
  66. }
  67. const now = new Date();
  68. const diff = now.getTime() - lastSeen.getTime();
  69. // 90 秒内认为在线
  70. return diff < 90 * 1000;
  71. }