|
1 | 1 | <script lang="ts">
|
2 | 2 | import { goto } from '$app/navigation';
|
3 | 3 | import { Message } from '$lib/fragments';
|
4 |
| - import Group from '$lib/fragments/Group/Group.svelte'; |
5 | 4 | import { isSearching, searchError, searchResults, searchUsers } from '$lib/stores/users';
|
6 |
| - import type { Chat, GroupInfo, MessageType } from '$lib/types'; |
| 5 | + import type { Chat, MessageType } from '$lib/types'; |
7 | 6 | import { Avatar, Button, Input } from '$lib/ui';
|
8 | 7 | import { clickOutside } from '$lib/utils';
|
9 | 8 | import { apiClient } from '$lib/utils/axios';
|
10 | 9 | import { onMount } from 'svelte';
|
11 | 10 | import { heading } from '../../store';
|
12 | 11 |
|
13 | 12 | let messages = $state<MessageType[]>([]);
|
14 |
| - let groups: GroupInfo[] = $state([]); |
15 | 13 | let allMembers = $state<Record<string, string>[]>([]);
|
16 | 14 | let selectedMembers = $state<string[]>([]);
|
17 | 15 | let currentUserId = '';
|
|
25 | 23 | const { data: userData } = await apiClient.get('/api/users');
|
26 | 24 | currentUserId = userData.id;
|
27 | 25 |
|
28 |
| - // Separate direct messages and group chats |
29 |
| - const directMessages: MessageType[] = []; |
30 |
| - const groupChats: GroupInfo[] = []; |
31 |
| -
|
32 |
| - data.chats.forEach((c) => { |
33 |
| - const members = c.participants.filter((u) => u.id !== userData.id); |
34 |
| - const memberNames = members.map((m) => m.name ?? m.handle ?? m.ename); |
35 |
| - const isGroup = members.length > 1; |
36 |
| -
|
37 |
| - if (isGroup) { |
38 |
| - // This is a group chat |
39 |
| - groupChats.push({ |
40 |
| - id: c.id, |
41 |
| - name: c.handle ?? memberNames.join(', '), |
42 |
| - avatar: '/images/group.png' |
43 |
| - }); |
44 |
| - } |
45 |
| -
|
46 |
| - const avatar = isGroup |
47 |
| - ? '/images/group.png' |
48 |
| - : members[0]?.avatarUrl || |
| 26 | + // Filter out group chats, only show direct messages |
| 27 | + messages = data.chats |
| 28 | + .filter((c) => c.participants.length === 2) // Only direct messages (2 participants: user + other person) |
| 29 | + .map((c) => { |
| 30 | + const members = c.participants.filter((u) => u.id !== userData.id); |
| 31 | + const memberNames = members.map((m) => m.name ?? m.handle ?? m.ename); |
| 32 | + const avatar = |
| 33 | + members[0]?.avatarUrl || |
49 | 34 | 'https://cdn.jsdelivr.net/npm/[email protected]/icons/people-fill.svg';
|
50 | 35 |
|
51 |
| - directMessages.push({ |
52 |
| - id: c.id, |
53 |
| - avatar, |
54 |
| - username: c.handle ?? memberNames.join(', '), |
55 |
| - unread: c.latestMessage ? !c.latestMessage.isRead : false, |
56 |
| - text: c.latestMessage?.text ?? 'No message yet', |
57 |
| - handle: c.handle ?? memberNames.join(', '), |
58 |
| - name: c.handle ?? memberNames.join(', ') |
| 36 | + return { |
| 37 | + id: c.id, |
| 38 | + avatar, |
| 39 | + username: c.handle ?? memberNames.join(', '), |
| 40 | + unread: c.latestMessage ? !c.latestMessage.isRead : false, |
| 41 | + text: c.latestMessage?.text ?? 'No message yet', |
| 42 | + handle: c.handle ?? memberNames.join(', '), |
| 43 | + name: c.handle ?? memberNames.join(', ') |
| 44 | + }; |
59 | 45 | });
|
60 |
| - }); |
61 |
| -
|
62 |
| - messages = directMessages; |
63 |
| - groups = groupChats; |
64 | 46 | } catch (error) {
|
65 | 47 | console.error('Failed to load messages:', error);
|
66 | 48 | }
|
|
103 | 85 | name: allMembers.find((m) => m.id === selectedMembers[0])?.name ?? 'New Chat',
|
104 | 86 | participantIds: [selectedMembers[0]]
|
105 | 87 | });
|
106 |
| - await loadMessages(); // Refresh to include the new direct message |
107 | 88 | } else {
|
108 | 89 | // Create group chat
|
109 |
| - const groupMembers = allMembers.filter((m) => selectedMembers.includes(m.id)); |
| 90 | + const groupMembers = allMembers.filter((m) => m.id === selectedMembers[0]); |
110 | 91 | const groupName = groupMembers.map((m) => m.name ?? m.handle ?? m.ename).join(', ');
|
111 | 92 |
|
112 | 93 | // Create group chat via API
|
113 |
| - const response = await apiClient.post('/api/chats', { |
| 94 | + await apiClient.post('/api/chats', { |
114 | 95 | name: groupName,
|
115 | 96 | participantIds: selectedMembers,
|
116 | 97 | isGroup: true
|
117 | 98 | });
|
118 |
| -
|
119 |
| - // Add to local groups state |
120 |
| - const newGroup: GroupInfo = { |
121 |
| - id: response.data.id, |
122 |
| - name: groupName, |
123 |
| - avatar: '/images/group.png' |
124 |
| - }; |
125 |
| - groups = [...groups, newGroup]; |
126 |
| -
|
127 |
| - // Also add to messages for consistency |
128 |
| - const newMessage: MessageType = { |
129 |
| - id: response.data.id, |
130 |
| - avatar: newGroup.avatar, |
131 |
| - username: groupName, |
132 |
| - text: 'Group chat created', |
133 |
| - unread: false, |
134 |
| - name: groupName, |
135 |
| - handle: groupName |
136 |
| - }; |
137 |
| - messages = [newMessage, ...messages]; |
138 | 99 | }
|
| 100 | +
|
| 101 | + // Redirect to messages page with refresh |
| 102 | + window.location.href = '/messages'; |
139 | 103 | } catch (err) {
|
140 | 104 | console.error('Failed to create chat:', err);
|
141 | 105 | alert('Failed to create chat. Please try again.');
|
|
176 | 140 | {/each}
|
177 | 141 | {/if}
|
178 | 142 |
|
179 |
| - {#if groups.length > 0} |
180 |
| - <h3 class="text-md mb-2 mt-6 font-semibold text-gray-700">Groups</h3> |
181 |
| - {#each groups as group} |
182 |
| - <Group |
183 |
| - name={group.name || 'New Group'} |
184 |
| - avatar={group.avatar} |
185 |
| - unread={true} |
186 |
| - callback={() => goto(`/group/${group.id}`)} |
187 |
| - /> |
188 |
| - {/each} |
189 |
| - {:else if messages.length === 0} |
| 143 | + {#if messages.length === 0} |
190 | 144 | <div class="w-full px-5 py-5 text-center text-sm text-gray-500">
|
191 | 145 | You don't have any messages yet. Start a Direct Message by searching a name.
|
192 | 146 | </div>
|
|
286 | 240 | <Button
|
287 | 241 | size="sm"
|
288 | 242 | variant="primary"
|
289 |
| - callback={createChat} |
| 243 | + callback={() => createChat()} |
290 | 244 | disabled={selectedMembers.length === 0}
|
291 | 245 | >
|
292 | 246 | {selectedMembers.length === 1 ? 'Start Chat' : 'Create Group'}
|
|
0 commit comments