Messages.svelte 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <script lang="ts">
  2. import { toast } from 'svelte-sonner';
  3. import dayjs from 'dayjs';
  4. import relativeTime from 'dayjs/plugin/relativeTime';
  5. import isToday from 'dayjs/plugin/isToday';
  6. import isYesterday from 'dayjs/plugin/isYesterday';
  7. dayjs.extend(relativeTime);
  8. dayjs.extend(isToday);
  9. dayjs.extend(isYesterday);
  10. import { tick, getContext, onMount, createEventDispatcher } from 'svelte';
  11. import { settings } from '$lib/stores';
  12. import Message from './Messages/Message.svelte';
  13. import Loader from '../common/Loader.svelte';
  14. import Spinner from '../common/Spinner.svelte';
  15. const i18n = getContext('i18n');
  16. export let channel = null;
  17. export let messages = [];
  18. export let top = false;
  19. export let onLoad: Function = () => {};
  20. let messagesLoading = false;
  21. const loadMoreMessages = async () => {
  22. // scroll slightly down to disable continuous loading
  23. const element = document.getElementById('messages-container');
  24. element.scrollTop = element.scrollTop + 100;
  25. messagesLoading = true;
  26. await onLoad();
  27. await tick();
  28. messagesLoading = false;
  29. };
  30. </script>
  31. {#if messages}
  32. {@const messageList = messages.slice().reverse()}
  33. <div>
  34. {#if !top}
  35. <Loader
  36. on:visible={(e) => {
  37. console.log('visible');
  38. if (!messagesLoading) {
  39. loadMoreMessages();
  40. }
  41. }}
  42. >
  43. <div class="w-full flex justify-center py-1 text-xs animate-pulse items-center gap-2">
  44. <Spinner className=" size-4" />
  45. <div class=" ">Loading...</div>
  46. </div>
  47. </Loader>
  48. {:else}
  49. <div
  50. class="px-5 py-5
  51. {($settings?.widescreenMode ?? null) ? 'max-w-full' : 'max-w-5xl'} mx-auto"
  52. >
  53. {#if channel}
  54. <div class="flex flex-col py-1 gap-1.5">
  55. <div class="text-2xl font-medium capitalize">{channel.name}</div>
  56. <div class=" text-gray-500">
  57. This channel was created on {dayjs(channel.created_at / 1000000).format(
  58. 'MMMM D, YYYY'
  59. )}. This is the very beginning of the {channel.name}
  60. channel.
  61. </div>
  62. </div>
  63. {:else}
  64. <div class="flex justify-center py-1 text-xs items-center gap-2">
  65. <div class=" ">Start of the channel</div>
  66. </div>
  67. {/if}
  68. </div>
  69. {#if messageList.length > 0}
  70. <hr class=" border-gray-50 dark:border-gray-700/20 py-2.5 w-full" />
  71. {/if}
  72. {/if}
  73. {#each messageList as message, messageIdx (message.id)}
  74. <Message
  75. {message}
  76. showUserProfile={messageIdx === 0 ||
  77. messageList.at(messageIdx - 1)?.user_id !== message.user_id}
  78. />
  79. {/each}
  80. <div class="pb-6" />
  81. </div>
  82. {/if}