Messages.svelte 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <script lang="ts">
  2. import { v4 as uuidv4 } from 'uuid';
  3. import { chats, config, settings, user as _user, mobile, currentChatPage } from '$lib/stores';
  4. import { tick, getContext, onMount, createEventDispatcher } from 'svelte';
  5. const dispatch = createEventDispatcher();
  6. import { toast } from 'svelte-sonner';
  7. import Message from './Messages/Message.svelte';
  8. import Loader from '../common/Loader.svelte';
  9. import Spinner from '../common/Spinner.svelte';
  10. const i18n = getContext('i18n');
  11. export let messages = [];
  12. export let top = false;
  13. export let onLoad: Function = () => {};
  14. let messagesLoading = false;
  15. const loadMoreMessages = async () => {
  16. // scroll slightly down to disable continuous loading
  17. const element = document.getElementById('messages-container');
  18. element.scrollTop = element.scrollTop + 100;
  19. messagesLoading = true;
  20. await onLoad();
  21. await tick();
  22. messagesLoading = false;
  23. };
  24. </script>
  25. {#if messages}
  26. {@const messageList = messages.slice().reverse()}
  27. <div>
  28. {#if !top}
  29. <Loader
  30. on:visible={(e) => {
  31. console.log('visible');
  32. if (!messagesLoading) {
  33. loadMoreMessages();
  34. }
  35. }}
  36. >
  37. <div class="w-full flex justify-center py-1 text-xs animate-pulse items-center gap-2">
  38. <Spinner className=" size-4" />
  39. <div class=" ">Loading...</div>
  40. </div>
  41. </Loader>
  42. {/if}
  43. {#each messageList as message, messageIdx (message.id)}
  44. <Message
  45. {message}
  46. showUserProfile={messageIdx === 0 ||
  47. messageList.at(messageIdx - 1)?.user_id !== message.user_id}
  48. />
  49. {/each}
  50. <div class="pb-6" />
  51. </div>
  52. {/if}