Message.svelte 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <script lang="ts">
  2. import dayjs from 'dayjs';
  3. import relativeTime from 'dayjs/plugin/relativeTime';
  4. import isToday from 'dayjs/plugin/isToday';
  5. import isYesterday from 'dayjs/plugin/isYesterday';
  6. dayjs.extend(relativeTime);
  7. dayjs.extend(isToday);
  8. dayjs.extend(isYesterday);
  9. import { getContext } from 'svelte';
  10. const i18n = getContext<Writable<i18nType>>('i18n');
  11. import { settings } from '$lib/stores';
  12. import { WEBUI_BASE_URL } from '$lib/constants';
  13. import Markdown from '$lib/components/chat/Messages/Markdown.svelte';
  14. import ProfileImage from '$lib/components/chat/Messages/ProfileImage.svelte';
  15. import Name from '$lib/components/chat/Messages/Name.svelte';
  16. export let message;
  17. export let showUserProfile = true;
  18. const formatDate = (inputDate) => {
  19. const date = dayjs(inputDate);
  20. const now = dayjs();
  21. if (date.isToday()) {
  22. return `Today at ${date.format('HH:mm')}`;
  23. } else if (date.isYesterday()) {
  24. return `Yesterday at ${date.format('HH:mm')}`;
  25. } else {
  26. return `${date.format('DD/MM/YYYY')} at ${date.format('HH:mm')}`;
  27. }
  28. };
  29. </script>
  30. {#if message}
  31. <div
  32. class="flex flex-col justify-between px-5 {showUserProfile
  33. ? 'mt-3'
  34. : ''} w-full {($settings?.widescreenMode ?? null)
  35. ? 'max-w-full'
  36. : 'max-w-5xl'} mx-auto rounded-lg group"
  37. >
  38. <div
  39. class=" flex w-full message-{message.id}"
  40. id="message-{message.id}"
  41. dir={$settings.chatDirection}
  42. >
  43. <div
  44. class={`flex-shrink-0 ${($settings?.chatDirection ?? 'LTR') === 'LTR' ? 'mr-3' : 'ml-3'}`}
  45. >
  46. {#if showUserProfile}
  47. <ProfileImage
  48. src={message.user?.profile_image_url ??
  49. ($i18n.language === 'dg-DG' ? `/doge.png` : `${WEBUI_BASE_URL}/static/favicon.png`)}
  50. className={'size-7'}
  51. />
  52. {:else}
  53. <div class="w-7 h-7 rounded-full bg-transparent" />
  54. {/if}
  55. </div>
  56. <div class="flex-auto w-0 pl-1">
  57. {#if showUserProfile}
  58. <Name>
  59. {message?.user?.name}
  60. {#if message.created_at}
  61. <span
  62. class=" self-center invisible group-hover:visible text-gray-400 text-xs font-medium capitalize ml-0.5 -mt-0.5"
  63. >
  64. {formatDate(message.created_at / 1000000)}
  65. </span>
  66. {/if}
  67. </Name>
  68. {/if}
  69. <div class="markdown-prose">
  70. <Markdown id={message.id} content={message.content} />
  71. </div>
  72. </div>
  73. </div>
  74. </div>
  75. {/if}