From d205416137d8e6ed47c363dbb39eed3429c863c8 Mon Sep 17 00:00:00 2001
From: dbswl701
Date: Wed, 18 Jun 2025 00:28:35 +0900
Subject: [PATCH 1/8] =?UTF-8?q?feat:=20DMList=20=ED=98=B8=EC=B6=9C=20api?=
=?UTF-8?q?=20=EC=97=B0=EA=B2=B0(=EB=B0=B1=EC=97=94=EB=93=9C=20=EC=97=85?=
=?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EC=9D=B4=ED=9B=84=20=EC=88=98?=
=?UTF-8?q?=EC=A0=95=20=ED=95=84=EC=9A=94)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/service/feature/channel/api/channelAPI.ts | 38 +++++++++++++++----
.../channel/hook/query/useChannelQuery.ts | 13 ++++++-
src/service/feature/channel/types/channel.ts | 33 ++++++++++++----
src/service/feature/chat/index.ts | 7 +++-
.../feature/common/axios/axiosInstance.ts | 9 +++--
src/view/layout/LayoutWithSidebar.tsx | 8 ++--
.../components/channel/DirectMessages.tsx | 17 ++++-----
.../pages/Friends/components/UserCard.tsx | 30 +++++++--------
8 files changed, 104 insertions(+), 51 deletions(-)
diff --git a/src/service/feature/channel/api/channelAPI.ts b/src/service/feature/channel/api/channelAPI.ts
index a36ba56..bb1298f 100644
--- a/src/service/feature/channel/api/channelAPI.ts
+++ b/src/service/feature/channel/api/channelAPI.ts
@@ -1,4 +1,5 @@
import { createAxiosInstance } from '@service/feature/common/axios/axiosInstance';
+import { Channel2, DMDetail } from '../types/channel';
const axios = createAxiosInstance();
@@ -8,7 +9,10 @@ export const getChannelList = async (teamId: string) => {
};
export const createChannel = async ({
- teamId, categoryId, name, channelType,
+ teamId,
+ categoryId,
+ name,
+ channelType,
}: {
teamId: string;
categoryId: number;
@@ -37,14 +41,19 @@ export const deleteChannel = async ({
return res.data;
};
-export const moveChannel = async (teamId: string, categoryId: number, channelId: number, body: {
- destCategoryId: number;
- prevChannelId: number;
- nextChannelId: number;
-}) => {
+export const moveChannel = async (
+ teamId: string,
+ categoryId: number,
+ channelId: number,
+ body: {
+ destCategoryId: number;
+ prevChannelId: number;
+ nextChannelId: number;
+ },
+) => {
const res = await axios.patch(
`/teams/${teamId}/categories/${categoryId}/channels/${channelId}`,
- body
+ body,
);
return res.data;
};
@@ -63,3 +72,18 @@ export const editChannel = async ({
);
return res.data;
};
+
+export const getDMDetail = async (channelId: number): Promise => {
+ const res = await axios.get(`/channels/${channelId}`);
+ return res.data.data;
+};
+
+export const getDMList = async (): Promise => {
+ const res = await axios.get(`/channels/me`);
+ return res.data.data;
+};
+
+export const createDM = async (memberIds: string[]) => {
+ const res = await axios.post(`/channels/members`, memberIds);
+ return res.data.data;
+};
diff --git a/src/service/feature/channel/hook/query/useChannelQuery.ts b/src/service/feature/channel/hook/query/useChannelQuery.ts
index 15510a1..2a3299f 100644
--- a/src/service/feature/channel/hook/query/useChannelQuery.ts
+++ b/src/service/feature/channel/hook/query/useChannelQuery.ts
@@ -1,5 +1,8 @@
import { useQuery } from '@tanstack/react-query';
-import { getChannelList } from '@service/feature/channel/api/channelAPI.ts';
+import {
+ getChannelList,
+ getDMList,
+} from '@service/feature/channel/api/channelAPI.ts';
import { Channel } from '@service/feature/channel/types/channel.ts';
// response 형식이 다름. 임시로 설정하여 사용중
@@ -11,3 +14,11 @@ export const useChannelListQuery = (serverId: string) => {
staleTime: 1000 * 60 * 5,
});
};
+
+export const useDMListQuery = () => {
+ return useQuery({
+ queryKey: ['DMList'],
+ queryFn: getDMList,
+ staleTime: 1000 * 60 * 5,
+ });
+};
diff --git a/src/service/feature/channel/types/channel.ts b/src/service/feature/channel/types/channel.ts
index 4eb89d4..e3e2317 100644
--- a/src/service/feature/channel/types/channel.ts
+++ b/src/service/feature/channel/types/channel.ts
@@ -8,6 +8,30 @@ export type ChannelType = 'text' | 'voice' | 'event';
// [key: string]: unknown;
// }
+export interface DMDetail {
+ channel: Channel2;
+ channelMembers: ChannelMember[];
+}
+
+export interface ChannelMember {
+ id: string;
+ nickname: string;
+ name: string;
+ avatarUrl: string;
+ state: 'ONLINE' | 'OFFLINE';
+ createdAt: string;
+}
+
+// 팀 서버 상세 조회에서 불러오는 channel 타입도 이것. 추후 아래 Channel 타입에서 이걸로 변경해야 할 듯
+export interface Channel2 {
+ id: number;
+ name: string;
+ position: number;
+ type: string;
+ accessType: string;
+ chatId: string;
+}
+
export interface Channel {
categoriesView: CategoriesView[];
team: Team;
@@ -32,12 +56,5 @@ export interface Team {
export interface TeamMembers {
id: number;
role: 'OWNER' | 'MEMBER';
- memberInfo: {
- id: string;
- nickname: string;
- name: string;
- avatarUrl: string;
- state: 'OFFLINE' | 'ONLINE';
- createdAt: string;
- };
+ memberInfo: ChannelMember;
}
diff --git a/src/service/feature/chat/index.ts b/src/service/feature/chat/index.ts
index 3381ff6..7cecc98 100644
--- a/src/service/feature/chat/index.ts
+++ b/src/service/feature/chat/index.ts
@@ -1,7 +1,10 @@
export { useChat } from './hook/useChat';
-export { useChannelListQuery } from '../channel/hook/query/useChannelQuery.ts';
+export {
+ useChannelListQuery,
+ useDMListQuery,
+} from '../channel/hook/query/useChannelQuery.ts';
export { useMessageHistory } from './hook/useMessageHistory';
export { useSendMessage } from './hook/useSendMessage';
export { useSocket } from './context/useSocket';
export { SocketProvider } from './context/SocketProvider';
-export * from './store/chatSlice';
\ No newline at end of file
+export * from './store/chatSlice';
diff --git a/src/service/feature/common/axios/axiosInstance.ts b/src/service/feature/common/axios/axiosInstance.ts
index 89dde4e..84987d6 100644
--- a/src/service/feature/common/axios/axiosInstance.ts
+++ b/src/service/feature/common/axios/axiosInstance.ts
@@ -6,7 +6,8 @@ import { getCookie } from '../../auth/lib/getCookie';
export type ServiceType = 'members' | 'teams' | 'dialog';
const API_CONFIG = {
- BASE_DOMAIN: 'https://flowchat.shop:30200',
+ // BASE_DOMAIN: 'https://flowchat.shop:30200',
+ BASE_DOMAIN: 'http://flowchat.shop:30100',
HEADERS: {
JSON: 'application/json',
},
@@ -59,15 +60,15 @@ export const createAxiosInstance = (): AxiosInstance => {
}
return config;
},
- (error) => Promise.reject(error)
+ (error) => Promise.reject(error),
);
instance.interceptors.response.use(
(response: AxiosResponse) => response,
- handleAxiosError
+ handleAxiosError,
);
return instance;
};
-export default createAxiosInstance;
\ No newline at end of file
+export default createAxiosInstance;
diff --git a/src/view/layout/LayoutWithSidebar.tsx b/src/view/layout/LayoutWithSidebar.tsx
index 9e99579..be9f845 100644
--- a/src/view/layout/LayoutWithSidebar.tsx
+++ b/src/view/layout/LayoutWithSidebar.tsx
@@ -14,15 +14,15 @@ const LayoutWithSidebar = () => {
-
-
- {[
- {
- id: 'sdfsdf',
- name: '사용자3',
- state: 'DND',
- avatarUrl: 'profile',
- },
- ].map((user) => (
+ {data?.map((user) => (
))}
diff --git a/src/view/pages/Friends/components/UserCard.tsx b/src/view/pages/Friends/components/UserCard.tsx
index 137e757..21ddf43 100644
--- a/src/view/pages/Friends/components/UserCard.tsx
+++ b/src/view/pages/Friends/components/UserCard.tsx
@@ -8,23 +8,17 @@ import {
} from 'src/service/feature/friend/hook/useFriendQuery.ts';
import MoreMenu from './MoreMenu.tsx';
import { Check, EllipsisVertical, X } from 'lucide-react';
+import { Channel2 } from '@service/feature/channel/types/channel.ts';
interface UserCardProps {
status?: string;
- isActive: boolean;
+ isActive?: boolean;
className?: string;
friendshipId: number;
type?: 'sent' | 'received' | 'message';
openMenuId?: number | null;
setOpenMenuId?: React.Dispatch
>;
- user:
- | FriendInfoData
- | {
- avatarUrl: string;
- state: string;
- name: string;
- id: string;
- };
+ user: Channel2;
}
const UserCard = ({
@@ -39,10 +33,13 @@ const UserCard = ({
}: UserCardProps) => {
const navigation = useNavigate();
- const { id, name, avatarUrl, state: isOnline } = user;
+ // const { id, name, avatarUrl, state: isOnline } = user;
+ const { name, chatId } = user;
+
+ console.log('user: ', user);
const handleClick = () => {
- navigation(`/channels/@me/${id}`);
+ navigation(`/channels/@me/${chatId}`);
};
// 친구 요청 취소
@@ -58,8 +55,8 @@ const UserCard = ({
@@ -67,12 +64,13 @@ const UserCard = ({

-
*/}
From 456af196b1611d0e8412b3bd1a349221523d61b6 Mon Sep 17 00:00:00 2001
From: dbswl701
Date: Wed, 18 Jun 2025 02:09:38 +0900
Subject: [PATCH 2/8] =?UTF-8?q?style:=20=EC=95=84=EC=9D=B4=EC=BD=98=20?=
=?UTF-8?q?=EC=83=89=EC=83=81=20=EB=93=B1=20=EC=9E=90=EC=9E=98=ED=95=9C=20?=
=?UTF-8?q?=EC=88=98=EC=A0=95=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/view/components/layout/sidebar/top/TopSidebar.tsx | 4 ++--
src/view/layout/sidebar/components/team/ChatServer.tsx | 2 +-
src/view/pages/Friends/components/Navigation.tsx | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/view/components/layout/sidebar/top/TopSidebar.tsx b/src/view/components/layout/sidebar/top/TopSidebar.tsx
index bcfa752..ee409ec 100644
--- a/src/view/components/layout/sidebar/top/TopSidebar.tsx
+++ b/src/view/components/layout/sidebar/top/TopSidebar.tsx
@@ -1,6 +1,6 @@
import { useState } from 'react';
import Inbox from '../components/top/Inbox';
-import { Archive } from 'lucide-react';
+import { InboxIcon } from 'lucide-react';
const TopSidebar = () => {
const [toggle, setToggle] = useState(false);
@@ -13,7 +13,7 @@ const TopSidebar = () => {
className='w-8 h-8 p-1 rounded-full hover:bg-[#42454A]'
onClick={() => setToggle((prev) => !prev)}
>
-
+
{toggle && }
diff --git a/src/view/layout/sidebar/components/team/ChatServer.tsx b/src/view/layout/sidebar/components/team/ChatServer.tsx
index e7bcb2a..27525c2 100644
--- a/src/view/layout/sidebar/components/team/ChatServer.tsx
+++ b/src/view/layout/sidebar/components/team/ChatServer.tsx
@@ -26,7 +26,7 @@ export default function ChatServer({
!server &&
me
)}
{server?.iconUrl ? (
-

+

) : (
{server?.name}
)}
diff --git a/src/view/pages/Friends/components/Navigation.tsx b/src/view/pages/Friends/components/Navigation.tsx
index 01e6416..578f982 100644
--- a/src/view/pages/Friends/components/Navigation.tsx
+++ b/src/view/pages/Friends/components/Navigation.tsx
@@ -27,7 +27,7 @@ const Navigation = ({ activeButton, setActiveButton }: NavigationProps) => {
-
친구
+
친구
From 9cf0685ec4d49849e83bc51feba526167f326fcc Mon Sep 17 00:00:00 2001
From: dbswl701
Date: Wed, 18 Jun 2025 02:11:00 +0900
Subject: [PATCH 3/8] =?UTF-8?q?fix:=20=ED=8C=80=20=EC=83=9D=EC=84=B1=20?=
=?UTF-8?q?=EB=AA=A8=EB=8B=AC=20=EB=8B=A4=EC=8B=9C=20=EC=97=B4=20=EB=95=8C?=
=?UTF-8?q?=20=EC=B4=88=EA=B8=B0=ED=99=94?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/view/components/common/Modal.tsx | 13 +++++++++++--
.../layout/sidebar/components/team/AddTeamModal.tsx | 12 +++++++++---
src/view/pages/Friends/components/SearchFriends.tsx | 2 +-
3 files changed, 21 insertions(+), 6 deletions(-)
diff --git a/src/view/components/common/Modal.tsx b/src/view/components/common/Modal.tsx
index 6823415..2d7092a 100644
--- a/src/view/components/common/Modal.tsx
+++ b/src/view/components/common/Modal.tsx
@@ -114,7 +114,7 @@ Modal.Title = ({
onClick={() => context?.setIsOpen(false)}
className='mr-1 group'
>
-
+
)}
@@ -237,10 +237,12 @@ Modal.ProTip = ({ children }: { children: string }) => {
Modal.Footer = ({
onSubmit,
+ onClose,
backBtnText,
submitBtnText,
}: {
onSubmit: () => void;
+ onClose?: () => void;
backBtnText?: string;
submitBtnText?: string;
}) => {
@@ -252,10 +254,17 @@ Modal.Footer = ({
onSubmit();
};
+ const handleClose = () => {
+ if (onClose) {
+ onClose();
+ }
+ context.setIsOpen(false);
+ };
+
return (
);
};
From 56fefc325a9e74aa2f5db20d8a4fd858d1593d0f Mon Sep 17 00:00:00 2001
From: dbswl701
Date: Wed, 18 Jun 2025 02:12:38 +0900
Subject: [PATCH 4/8] =?UTF-8?q?feat:=20DMList=20=EB=B0=B1=EC=97=94?=
=?UTF-8?q?=EB=93=9C=20=EC=9D=91=EB=8B=B5=20=ED=98=95=EC=8B=9D=20=EB=B3=80?=
=?UTF-8?q?=EA=B2=BD=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=88=98=EC=A0=95=20?=
=?UTF-8?q?=EB=B0=8F=202=EB=AA=85=20=EC=9D=B4=EC=83=81=EC=9D=B8=20?=
=?UTF-8?q?=EA=B2=BD=EC=9A=B0=20=EB=B0=98=EC=98=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/service/feature/channel/api/channelAPI.ts | 4 +-
src/service/feature/channel/types/channel.ts | 4 +
.../components/channel/DirectMessages.tsx | 18 ++--
.../pages/Friends/components/DMUserCard.tsx | 91 +++++++++++++++++++
4 files changed, 105 insertions(+), 12 deletions(-)
create mode 100644 src/view/pages/Friends/components/DMUserCard.tsx
diff --git a/src/service/feature/channel/api/channelAPI.ts b/src/service/feature/channel/api/channelAPI.ts
index bb1298f..d8eba6b 100644
--- a/src/service/feature/channel/api/channelAPI.ts
+++ b/src/service/feature/channel/api/channelAPI.ts
@@ -1,5 +1,5 @@
import { createAxiosInstance } from '@service/feature/common/axios/axiosInstance';
-import { Channel2, DMDetail } from '../types/channel';
+import { DMDetail, DMList } from '../types/channel';
const axios = createAxiosInstance();
@@ -78,7 +78,7 @@ export const getDMDetail = async (channelId: number): Promise => {
return res.data.data;
};
-export const getDMList = async (): Promise => {
+export const getDMList = async (): Promise => {
const res = await axios.get(`/channels/me`);
return res.data.data;
};
diff --git a/src/service/feature/channel/types/channel.ts b/src/service/feature/channel/types/channel.ts
index e3e2317..785f346 100644
--- a/src/service/feature/channel/types/channel.ts
+++ b/src/service/feature/channel/types/channel.ts
@@ -13,6 +13,10 @@ export interface DMDetail {
channelMembers: ChannelMember[];
}
+export interface DMList extends Channel2 {
+ channelMembers: ChannelMember[];
+}
+
export interface ChannelMember {
id: string;
nickname: string;
diff --git a/src/view/layout/sidebar/components/channel/DirectMessages.tsx b/src/view/layout/sidebar/components/channel/DirectMessages.tsx
index 76ae341..cd002b7 100644
--- a/src/view/layout/sidebar/components/channel/DirectMessages.tsx
+++ b/src/view/layout/sidebar/components/channel/DirectMessages.tsx
@@ -1,7 +1,7 @@
-import UserCard from '@pages/Friends/components/UserCard';
import { useDMListQuery } from '@service/feature/chat';
import { useParams } from 'react-router-dom';
import { Plus } from 'lucide-react';
+import DMUserCard from '@pages/Friends/components/DMUserCard';
const DirectMessages = () => {
const params = useParams();
@@ -12,7 +12,6 @@ const DirectMessages = () => {
if (isLoading) return Loading...
;
if (error) return 에러 발생
;
- console.log('DM list 출력: ', data);
const handlePlus = () => {
console.log('plus 버튼 클릭');
};
@@ -24,20 +23,19 @@ const DirectMessages = () => {
DIRECT MESSAGES
- {data?.map((user) => (
- (
+
))}
diff --git a/src/view/pages/Friends/components/DMUserCard.tsx b/src/view/pages/Friends/components/DMUserCard.tsx
new file mode 100644
index 0000000..0f29d8c
--- /dev/null
+++ b/src/view/pages/Friends/components/DMUserCard.tsx
@@ -0,0 +1,91 @@
+import { useNavigate } from 'react-router-dom';
+import { DMList } from '@service/feature/channel/types/channel.ts';
+
+interface UserCardProps {
+ isActive?: boolean;
+ className?: string;
+ channel: DMList;
+}
+
+const DMUserCard = ({ channel, isActive, className }: UserCardProps) => {
+ const navigation = useNavigate();
+
+ // 만약 맴버가 여러명이면 맴버 순서대로 2명 프로필 노출
+ // const user = channel.channelMembers;
+
+ // 백엔드 개발 완료되기 전 임시 데이터
+ const user = [
+ { id: 0, state: 'ONLINE' },
+ // { id: 1, state: 'OFFLINE' },
+ ];
+
+ const memberSize = user.length;
+
+ const handleClick = () => {
+ navigation(`/channels/@me/${channel.chatId}`);
+ };
+
+ return (
+
+
+
+ {memberSize === 1 ? (
+
+

+
+
+ ) : (
+
+

+
+

+
+
+ )}
+
+
+
+ {channel.name}
+
+ {memberSize !== 1 ? (
+
+ ) : null}
+
+
+
+ );
+};
+
+export default DMUserCard;
From a567954e2fe3601d6784fe32fc511eded806099b Mon Sep 17 00:00:00 2001
From: dbswl701
Date: Wed, 18 Jun 2025 17:39:15 +0900
Subject: [PATCH 5/8] =?UTF-8?q?feat:=20DMUserCard=EC=99=80=20=EB=B6=84?=
=?UTF-8?q?=EB=A6=AC=ED=95=98=EB=A9=B4=EC=84=9C=20Friend=EC=9D=98=20UserCa?=
=?UTF-8?q?rd=EB=8F=84=20=EB=B3=80=EA=B2=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/service/feature/friend/types/friend.ts | 13 +-
.../pages/Friends/components/FriendCard.tsx | 123 +++++++++++++--
.../pages/Friends/components/FriendList.tsx | 13 +-
.../pages/Friends/components/UserCard.tsx | 148 ------------------
4 files changed, 123 insertions(+), 174 deletions(-)
delete mode 100644 src/view/pages/Friends/components/UserCard.tsx
diff --git a/src/service/feature/friend/types/friend.ts b/src/service/feature/friend/types/friend.ts
index ada328b..ea6f2ed 100644
--- a/src/service/feature/friend/types/friend.ts
+++ b/src/service/feature/friend/types/friend.ts
@@ -1,14 +1,7 @@
+import { ChannelMember } from '@service/feature/channel/types/channel';
+
export interface FriendData {
friendshipId: 8;
friendshipDateTime: string;
- friendshipInfo: FriendInfoData;
-}
-
-export interface FriendInfoData {
- id: string;
- nickname: string;
- name: string;
- avatarUrl: string;
- state: 'ONLINE' | 'OFFLINE';
- createdAt: string;
+ friendshipInfo: ChannelMember;
}
diff --git a/src/view/pages/Friends/components/FriendCard.tsx b/src/view/pages/Friends/components/FriendCard.tsx
index 986cda0..21e217a 100644
--- a/src/view/pages/Friends/components/FriendCard.tsx
+++ b/src/view/pages/Friends/components/FriendCard.tsx
@@ -1,30 +1,127 @@
-import UserCard from '@pages/Friends/components/UserCard';
-import { FriendData } from 'src/service/feature/friend/types/friend';
+import { Check, EllipsisVertical, X } from 'lucide-react';
+import {
+ useAcceptFriend,
+ useCancelFriend,
+ useRefuseFriend,
+} from '@service/feature/friend/hook/useFriendQuery';
+import MoreMenu from './MoreMenu';
+import { ChannelMember } from '@service/feature/channel/types/channel';
+import { useNavigate } from 'react-router-dom';
const FriendCard = ({
user,
+ friendshipId,
type = 'message',
openMenuId,
setOpenMenuId,
}: {
- user: FriendData;
+ user: ChannelMember;
+ friendshipId: number;
type?: 'sent' | 'received' | 'message';
onToggle?: () => void;
openMenuId?: number | null;
setOpenMenuId?: React.Dispatch>;
}) => {
+ const navigation = useNavigate();
+
+ const { id, name, state, avatarUrl } = user;
+
+ // TODO: 추후 chatId 받아오는 방식 고려.
+ // 현재는 DM 채널과 유저를 매칭시킬 수 있는 방법이 없음.
+ const handleClick = () => {
+ navigation(`/channels/@me/${id}`);
+ };
+
+ // 친구 요청 취소
+ const { mutate: cancleFriendMutate } = useCancelFriend();
+
+ // 친구 요청 수락
+ const { mutate: acceptFriendMutate } = useAcceptFriend();
+
+ // 친구 요청 거절
+ const { mutate: refuseFriendMutate } = useRefuseFriend();
+
return (
-
+
+
+
+

+
+
+
+
+ {name}
+
+ {status ? (
+
+ {status ? (
+
+ {status}
+
+ ) : null}
+
+ ) : null}
+
+
+ {type === 'message' && (
+
+
+
+
+
+ )}
+ {type === 'sent' && (
+
+ )}
+
+ {type === 'received' && (
+
+
+
+
+ )}
+
);
};
diff --git a/src/view/pages/Friends/components/FriendList.tsx b/src/view/pages/Friends/components/FriendList.tsx
index 37652e5..99890e3 100644
--- a/src/view/pages/Friends/components/FriendList.tsx
+++ b/src/view/pages/Friends/components/FriendList.tsx
@@ -89,7 +89,12 @@ export default function FriendList({ activeButton }: NavigationProps) {
{searchData.sent?.map((user: FriendData, idx: number) => (
-
+
))}
{searchData.sent?.length === 0 && (
(
))}
@@ -134,7 +140,8 @@ export default function FriendList({ activeButton }: NavigationProps) {
searchData.map((user: FriendData, idx: number) => (
diff --git a/src/view/pages/Friends/components/UserCard.tsx b/src/view/pages/Friends/components/UserCard.tsx
deleted file mode 100644
index dbaefb3..0000000
--- a/src/view/pages/Friends/components/UserCard.tsx
+++ /dev/null
@@ -1,148 +0,0 @@
-import { useNavigate } from 'react-router-dom';
-import { FriendInfoData } from 'src/service/feature/friend/types/friend.ts';
-import Icon from '@components/common/Icon.tsx';
-import {
- useAcceptFriend,
- useCancelFriend,
- useRefuseFriend,
-} from 'src/service/feature/friend/hook/useFriendQuery.ts';
-import MoreMenu from './MoreMenu.tsx';
-import { Check, EllipsisVertical, X } from 'lucide-react';
-import { Channel2 } from '@service/feature/channel/types/channel.ts';
-
-interface UserCardProps {
- status?: string;
- isActive?: boolean;
- className?: string;
- friendshipId: number;
- type?: 'sent' | 'received' | 'message';
- openMenuId?: number | null;
- setOpenMenuId?: React.Dispatch>;
- user: Channel2;
-}
-
-const UserCard = ({
- user,
- status,
- isActive,
- className,
- type,
- friendshipId,
- setOpenMenuId,
- openMenuId,
-}: UserCardProps) => {
- const navigation = useNavigate();
-
- // const { id, name, avatarUrl, state: isOnline } = user;
- const { name, chatId } = user;
-
- console.log('user: ', user);
-
- const handleClick = () => {
- navigation(`/channels/@me/${chatId}`);
- };
-
- // 친구 요청 취소
- const { mutate: cancleFriendMutate } = useCancelFriend();
-
- // 친구 요청 수락
- const { mutate: acceptFriendMutate } = useAcceptFriend();
-
- // 친구 요청 거절
- const { mutate: refuseFriendMutate } = useRefuseFriend();
-
- return (
-
-
-
-

- {/*
-
-
*/}
-
-
-
- {name}
-
- {status ? (
-
- {status ? (
-
- {status}
-
- ) : null}
-
- ) : null}
-
-
- {type === 'message' && (
-
-
-
- )}
- {type === 'sent' && (
-
- )}
-
- {type === 'received' && (
-
-
-
-
- )}
-
- );
-};
-
-export default UserCard;
From 54975f78aa1dbbb52b282511e46a82e42ec0b59e Mon Sep 17 00:00:00 2001
From: dbswl701
Date: Wed, 18 Jun 2025 17:39:53 +0900
Subject: [PATCH 6/8] =?UTF-8?q?feat:=20DMList=EC=97=90=20=EC=8A=A4?=
=?UTF-8?q?=EC=BC=88=EB=A0=88=ED=86=A4=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../sidebar/channel/DirectChannelSidebar.tsx | 24 ++++++++++--
.../components/channel/DirectMessages.tsx | 38 +++++--------------
.../components/channel/SidebarLayout.tsx | 6 +--
.../components/skeletons/SkeletonDMList.tsx | 15 ++++++++
4 files changed, 49 insertions(+), 34 deletions(-)
create mode 100644 src/view/layout/sidebar/components/skeletons/SkeletonDMList.tsx
diff --git a/src/view/layout/sidebar/channel/DirectChannelSidebar.tsx b/src/view/layout/sidebar/channel/DirectChannelSidebar.tsx
index f01513d..83e8eae 100644
--- a/src/view/layout/sidebar/channel/DirectChannelSidebar.tsx
+++ b/src/view/layout/sidebar/channel/DirectChannelSidebar.tsx
@@ -1,15 +1,33 @@
import { SidebarLayout } from '../components/channel/SidebarLayout.tsx';
import ChannelNavigation from '../components/channel/ChannelNavigation.tsx';
import DirectMessages from '../components/channel/DirectMessages.tsx';
+import { Plus } from 'lucide-react';
const DirectChannelSidebar = () => {
+ const handlePlus = () => {
+ console.log('plus 버튼 클릭');
+ };
return (
-
-
+
+
+
+
+ DIRECT MESSAGES
+
+
+
+
+
);
};
-export default DirectChannelSidebar;
\ No newline at end of file
+export default DirectChannelSidebar;
diff --git a/src/view/layout/sidebar/components/channel/DirectMessages.tsx b/src/view/layout/sidebar/components/channel/DirectMessages.tsx
index cd002b7..7ca8a13 100644
--- a/src/view/layout/sidebar/components/channel/DirectMessages.tsx
+++ b/src/view/layout/sidebar/components/channel/DirectMessages.tsx
@@ -1,7 +1,7 @@
import { useDMListQuery } from '@service/feature/chat';
import { useParams } from 'react-router-dom';
-import { Plus } from 'lucide-react';
import DMUserCard from '@pages/Friends/components/DMUserCard';
+import SkeletonDMList from '../skeletons/SkeletonDMList';
const DirectMessages = () => {
const params = useParams();
@@ -9,36 +9,18 @@ const DirectMessages = () => {
const userId = params.channelId;
const { data, isLoading, error } = useDMListQuery();
- if (isLoading) return Loading...
;
+ if (isLoading) return ;
if (error) return 에러 발생
;
- const handlePlus = () => {
- console.log('plus 버튼 클릭');
- };
-
return (
-
-
-
- DIRECT MESSAGES
-
-
-
-
- {data?.map((channel) => (
-
- ))}
-
+
+ {data?.map((channel) => (
+
+ ))}
);
};
diff --git a/src/view/layout/sidebar/components/channel/SidebarLayout.tsx b/src/view/layout/sidebar/components/channel/SidebarLayout.tsx
index 3ae342a..07a1536 100644
--- a/src/view/layout/sidebar/components/channel/SidebarLayout.tsx
+++ b/src/view/layout/sidebar/components/channel/SidebarLayout.tsx
@@ -1,7 +1,7 @@
export const SidebarLayout = ({ children }: { children: React.ReactNode }) => (
-
-
+
-);
\ No newline at end of file
+);
diff --git a/src/view/layout/sidebar/components/skeletons/SkeletonDMList.tsx b/src/view/layout/sidebar/components/skeletons/SkeletonDMList.tsx
new file mode 100644
index 0000000..b935e8a
--- /dev/null
+++ b/src/view/layout/sidebar/components/skeletons/SkeletonDMList.tsx
@@ -0,0 +1,15 @@
+const SkeletonDMList = () => {
+ return (
+
+ );
+};
+
+export default SkeletonDMList;
From cd24b46f41d74a4261c035feefedb7e3a9b3cd99 Mon Sep 17 00:00:00 2001
From: dbswl701
Date: Wed, 18 Jun 2025 17:40:26 +0900
Subject: [PATCH 7/8] =?UTF-8?q?feat:=20=ED=8C=80=20=EC=82=AC=EC=9D=B4?=
=?UTF-8?q?=EB=93=9C=EB=B0=94=EC=97=90=20=EC=8A=A4=EC=BC=88=EB=A0=88?=
=?UTF-8?q?=ED=86=A4=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../components/skeletons/SkeletonTeamSidebar.tsx | 14 ++++++++++++++
.../layout/sidebar/components/team/ChatServer.tsx | 5 ++++-
src/view/layout/sidebar/team/TeamSidebar.tsx | 6 +++++-
3 files changed, 23 insertions(+), 2 deletions(-)
create mode 100644 src/view/layout/sidebar/components/skeletons/SkeletonTeamSidebar.tsx
diff --git a/src/view/layout/sidebar/components/skeletons/SkeletonTeamSidebar.tsx b/src/view/layout/sidebar/components/skeletons/SkeletonTeamSidebar.tsx
new file mode 100644
index 0000000..8a3f608
--- /dev/null
+++ b/src/view/layout/sidebar/components/skeletons/SkeletonTeamSidebar.tsx
@@ -0,0 +1,14 @@
+const SkeletonTeamSidebar = () => {
+ return (
+
+ );
+};
+
+export default SkeletonTeamSidebar;
diff --git a/src/view/layout/sidebar/components/team/ChatServer.tsx b/src/view/layout/sidebar/components/team/ChatServer.tsx
index 27525c2..904103e 100644
--- a/src/view/layout/sidebar/components/team/ChatServer.tsx
+++ b/src/view/layout/sidebar/components/team/ChatServer.tsx
@@ -23,7 +23,10 @@ export default function ChatServer({
{isAdd ? (
) : (
- !server && me
+ // TODO: 추후 개인 프로필 사진으로 교체
+ !server && (
+
+ )
)}
{server?.iconUrl ? (
diff --git a/src/view/layout/sidebar/team/TeamSidebar.tsx b/src/view/layout/sidebar/team/TeamSidebar.tsx
index 1e0d681..3a2801a 100644
--- a/src/view/layout/sidebar/team/TeamSidebar.tsx
+++ b/src/view/layout/sidebar/team/TeamSidebar.tsx
@@ -2,13 +2,14 @@ import AddTeamModal from '../components/team/AddTeamModal.tsx';
import { useNavigate, useParams } from 'react-router-dom';
import { useTeamListQuery } from '@service/feature/team/hook/query/useTeamServiceQuery.ts';
import ChatServer from '../components/team/ChatServer.tsx';
+import SkeletonTeamSidebar from '../components/skeletons/SkeletonTeamSidebar.tsx';
const TeamSidebar = () => {
const params = useParams();
const channelId = params.serverId;
const navigate = useNavigate();
- const { data: servers } = useTeamListQuery()
+ const { data: servers, isLoading, error } = useTeamListQuery();
const handleChannel = (id: string) => {
if (id === '') {
@@ -18,6 +19,9 @@ const TeamSidebar = () => {
}
};
+ if (isLoading) return ;
+ if (error) return 에러
;
+
return (
{/* 자기 채널 */}
From 5b77bba8e53c046d4c3a735c8112a08d00cc2af8 Mon Sep 17 00:00:00 2001
From: dbswl701
Date: Wed, 18 Jun 2025 18:02:42 +0900
Subject: [PATCH 8/8] =?UTF-8?q?style:=20=EB=A0=88=EC=9D=B4=EC=95=84?=
=?UTF-8?q?=EC=9B=83=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EB=B3=80=EA=B2=BD=20?=
=?UTF-8?q?=EB=B0=8F=20=EC=BB=A4=EC=8A=A4=ED=85=80=20=ED=81=B4=EB=9E=98?=
=?UTF-8?q?=EC=8A=A4=EB=A1=9C=20=EB=B3=80=EA=B2=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../layout/sidebar/components/top/ForYou.tsx | 4 ++--
.../layout/sidebar/components/top/Mention.tsx | 2 +-
.../layout/sidebar/components/top/Message.tsx | 9 ++-------
src/view/layout/LayoutWithSidebar.tsx | 8 ++++----
.../components/skeletons/SkeletonDMList.tsx | 14 +++++++-------
.../components/skeletons/SkeletonTeamSidebar.tsx | 12 ++++++------
src/view/pages/Friends/FriendsPage.tsx | 2 +-
src/view/pages/Friends/components/AddFriend.tsx | 2 +-
src/view/pages/Friends/components/FriendCard.tsx | 12 ++++++------
src/view/pages/Friends/components/MoreMenu.tsx | 8 ++++----
.../components/Skeletons/SkeletonFriendList.tsx | 6 +++---
.../pages/auth/signup/components/SignupPanel.tsx | 2 +-
tailwind.config.js | 1 +
13 files changed, 39 insertions(+), 43 deletions(-)
diff --git a/src/view/components/layout/sidebar/components/top/ForYou.tsx b/src/view/components/layout/sidebar/components/top/ForYou.tsx
index 60c4963..e7dcbbd 100644
--- a/src/view/components/layout/sidebar/components/top/ForYou.tsx
+++ b/src/view/components/layout/sidebar/components/top/ForYou.tsx
@@ -50,11 +50,11 @@ const ForYou = ({
);
diff --git a/src/view/components/layout/sidebar/components/top/Mention.tsx b/src/view/components/layout/sidebar/components/top/Mention.tsx
index 4f93e55..c6f3bf5 100644
--- a/src/view/components/layout/sidebar/components/top/Mention.tsx
+++ b/src/view/components/layout/sidebar/components/top/Mention.tsx
@@ -51,7 +51,7 @@ const Mention = ({
{/* 닫기로 수정 */}