Guest User

Untitled

a guest
May 19th, 2024
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.96 KB | None | 0 0
  1. "use client";
  2.  
  3. import { useRouter } from "next/navigation";
  4. import { useEffect, useMemo, useState } from "react";
  5. import useConversation from "../../hooks/useConversation";
  6. import { Button, Modal, Card, Group, Stack, Text, ThemeIcon } from "@mantine/core";
  7. import ConversationBox from "./ConversationBox";
  8. import { IconUserPlus} from "@tabler/icons-react";
  9. import { socket } from "../../../socket";
  10. import { useSession } from "next-auth/react";
  11. import { find } from "lodash";
  12.  
  13. import { useDisclosure } from "@mantine/hooks";
  14. import { User } from "@prisma/client";
  15. import GroupChatModal from "./GroupChatModal";
  16.  
  17.  
  18. export default function ConversationList({initialItems, users}: {initialItems: any, users: User[]}) {
  19. const [items, setItems] = useState(initialItems);
  20.  
  21. // Control Group Modal
  22. const [opened, { open, close }] = useDisclosure(false);
  23.  
  24. const [ newMessage, setNewMessage ] = useState(false);
  25. const router = useRouter();
  26.  
  27. const session = useSession();
  28.  
  29.  
  30.  
  31. const { conversationId, isOpen } = useConversation();
  32.  
  33.  
  34. const socketKey = useMemo(() => {
  35. return session.data?.user?.email;
  36. }, [session.data?.user?.email])
  37.  
  38.  
  39.  
  40. // Join Conversation Room To Receive Real Time Messages
  41. useEffect(() => {
  42. if ( !socketKey ) {
  43. return ;
  44. }
  45. socket.emit('join', socketKey);
  46.  
  47. const seenHandler = (conversation) => {
  48. console.log(conversation);
  49. setItems([])
  50. console.log(items)
  51. }
  52.  
  53. const newHandler = ( conversation ) => {
  54. setItems((current) => {
  55. if ( find(current, {id: conversationId}) ) {
  56. return current;
  57. }
  58.  
  59. return [conversation, ...current];
  60. })
  61. }
  62.  
  63. // Socket Emit
  64. const deleteHandler = (conversation) => {
  65. setItems((currentItems) => {
  66. return currentItems.filter((item) => item.id !== conversation.id);
  67. });
  68. }
  69.  
  70.  
  71.  
  72.  
  73. socket.on("updated conversation", seenHandler);
  74. socket.on("conversation:new", newHandler);
  75. socket.on("conversation:remove", deleteHandler);
  76.  
  77. return() => {
  78. // Leave the socket room on dismount
  79. socket.emit('leave', String(socketKey));
  80. socket.off("updated conversation", seenHandler);
  81. socket.off("conversation:new", newHandler);
  82. socket.off("conversation:remove", deleteHandler);
  83. }
  84.  
  85.  
  86. }, [socketKey])
  87.  
  88. return (
  89.  
  90.  
  91. <>
  92.  
  93. <GroupChatModal opened={opened} close={close} users={users} />
  94.  
  95. <Card shadow="sm" withBorder flex={1}>
  96.  
  97. <Card.Section p="xs" withBorder>
  98. <Group wrap="nowrap" flex={1} justify="space-between">
  99. <Text fw={700} size="lg"> Conversations </Text>
  100.  
  101. <ThemeIcon variant="light" size="md" onClick={open}>
  102. <IconUserPlus style={{ width: '70%', height: '70%' }} />
  103. </ThemeIcon>
  104. </Group>
  105. </Card.Section>
  106.  
  107. <Card.Section/>
  108. <Stack flex={1} gap={0}>
  109.  
  110. {
  111. items.map((item: any) => (
  112. <ConversationBox
  113. key={item.id}
  114. data={item}
  115. selected={conversationId === item.id}
  116. newMessage={false}
  117. />
  118.  
  119. ))
  120. }
  121.  
  122. </Stack>
  123. <Card.Section/>
  124.  
  125. </Card>
  126.  
  127. </>
  128.  
  129.  
  130. );
  131. }
Advertisement
Add Comment
Please, Sign In to add comment