diff --git a/src/app/message/chat/page.tsx b/src/app/message/chat/page.tsx
new file mode 100644
index 00000000..70146172
--- /dev/null
+++ b/src/app/message/chat/page.tsx
@@ -0,0 +1,17 @@
+import { TabNavigation } from '@/components/shared';
+
+const SOCIAL_TABS = [
+ { label: '팔로잉', value: 'following' },
+ { label: '메세지', value: 'chat' },
+];
+
+export default function ChatPage() {
+ return (
+
+
+
+
+ );
+}
diff --git a/src/app/message/page.tsx b/src/app/message/page.tsx
new file mode 100644
index 00000000..8ae33d94
--- /dev/null
+++ b/src/app/message/page.tsx
@@ -0,0 +1,38 @@
+import { FollowingList, FollowingSearch } from '@/components/pages/message';
+import { TabNavigation } from '@/components/shared';
+
+const SOCIAL_TABS = [
+ { label: '팔로잉', value: 'following' },
+ { label: '메세지', value: 'chat' },
+];
+
+const FOLLOWING_LIST = [
+ {
+ id: 1,
+ name: '신짱구',
+ profileImage: '',
+ profileMessage: '안녕하세요 신짱구입니다',
+ },
+ {
+ id: 2,
+ name: '신짱구',
+ profileImage: '',
+ profileMessage: '안녕하세요 신짱구입니다',
+ },
+ {
+ id: 3,
+ name: '신짱구',
+ profileImage: '',
+ profileMessage: '안녕하세요 신짱구입니다',
+ },
+];
+
+export default function FollowingPage() {
+ return (
+
+
+
+
+
+ );
+}
diff --git a/src/components/pages/message/index.ts b/src/components/pages/message/index.ts
index 508c8ed2..9181d2e2 100644
--- a/src/components/pages/message/index.ts
+++ b/src/components/pages/message/index.ts
@@ -1,3 +1,3 @@
-import FollowingCard from './message-followingCard';
-
-export { FollowingCard };
+export { FollowingCard } from './message-following-card';
+export { FollowingList } from './message-following-list';
+export { FollowingSearch } from './message-following-search';
diff --git a/src/components/pages/message/message-followingCard/index.stories.tsx b/src/components/pages/message/message-following-card/index.stories.tsx
similarity index 99%
rename from src/components/pages/message/message-followingCard/index.stories.tsx
rename to src/components/pages/message/message-following-card/index.stories.tsx
index db97dbd0..74c8975c 100644
--- a/src/components/pages/message/message-followingCard/index.stories.tsx
+++ b/src/components/pages/message/message-following-card/index.stories.tsx
@@ -1,6 +1,6 @@
import type { Meta, StoryObj } from '@storybook/nextjs';
-import FollowingCard from '.';
+import { FollowingCard } from '.';
const meta = {
title: 'Components/Following Card',
diff --git a/src/components/pages/message/message-followingCard/index.test.tsx b/src/components/pages/message/message-following-card/index.test.tsx
similarity index 98%
rename from src/components/pages/message/message-followingCard/index.test.tsx
rename to src/components/pages/message/message-following-card/index.test.tsx
index 7a35b5a6..90d6b288 100644
--- a/src/components/pages/message/message-followingCard/index.test.tsx
+++ b/src/components/pages/message/message-following-card/index.test.tsx
@@ -1,6 +1,6 @@
import { fireEvent, render, screen } from '@testing-library/react';
-import FollowingCard from '.';
+import { FollowingCard } from '.';
describe('FollowingCard 컴포넌트 테스트', () => {
const defaultProps = {
diff --git a/src/components/pages/message/message-followingCard/index.tsx b/src/components/pages/message/message-following-card/index.tsx
similarity index 96%
rename from src/components/pages/message/message-followingCard/index.tsx
rename to src/components/pages/message/message-following-card/index.tsx
index fc6be08a..b557d660 100644
--- a/src/components/pages/message/message-followingCard/index.tsx
+++ b/src/components/pages/message/message-following-card/index.tsx
@@ -12,7 +12,7 @@ interface FollowingCardProps {
onMessageClick?: () => void;
}
-const FollowingCard = ({
+export const FollowingCard = ({
name,
profileImage,
profileMessage,
@@ -67,5 +67,3 @@ const FollowingCard = ({
);
};
-
-export default FollowingCard;
diff --git a/src/components/pages/message/message-following-list/index.test.tsx b/src/components/pages/message/message-following-list/index.test.tsx
new file mode 100644
index 00000000..2426f3ba
--- /dev/null
+++ b/src/components/pages/message/message-following-list/index.test.tsx
@@ -0,0 +1,32 @@
+import { render, screen } from '@testing-library/react';
+
+import { FollowingList } from '.';
+
+const TEST_ITEMS = [
+ {
+ name: '신짱구',
+ profileImage: 'http://test.com',
+ profileMessage: '안녕하세요 신짱구입니다',
+ },
+ {
+ name: '김맹구',
+ profileImage: 'http://test.com',
+ profileMessage: '안녕하세요 김맹구입니다',
+ },
+
+ {
+ name: '흰둥이',
+ profileImage: 'http://test.com',
+ profileMessage: '안녕하세요 흰둥이입니다',
+ },
+];
+
+describe('Following List 컴포넌트 테스트', () => {
+ test('모든 아이템이 렌더링 되는지 테스트', () => {
+ render();
+
+ TEST_ITEMS.forEach((item) => {
+ expect(screen.getByText(item.name)).toBeInTheDocument();
+ });
+ });
+});
diff --git a/src/components/pages/message/message-following-list/index.tsx b/src/components/pages/message/message-following-list/index.tsx
new file mode 100644
index 00000000..ed01e572
--- /dev/null
+++ b/src/components/pages/message/message-following-list/index.tsx
@@ -0,0 +1,30 @@
+'use client';
+
+import { FollowingCard } from '../message-following-card';
+
+interface FollowingItem {
+ id: number;
+ name: string;
+ profileImage: string;
+ profileMessage: string;
+}
+
+interface FollowingListProps {
+ items: FollowingItem[];
+}
+
+export const FollowingList = ({ items }: FollowingListProps) => {
+ return (
+
+ {items.map((item) => (
+
+ ))}
+
+ );
+};
diff --git a/src/components/pages/message/message-following-search/index.test.tsx b/src/components/pages/message/message-following-search/index.test.tsx
new file mode 100644
index 00000000..081fad03
--- /dev/null
+++ b/src/components/pages/message/message-following-search/index.test.tsx
@@ -0,0 +1,31 @@
+import { fireEvent, render, screen } from '@testing-library/react';
+
+import { ModalProvider } from '@/components/ui';
+
+import { FollowingSearch } from '.';
+
+describe('Following Search 테스트', () => {
+ test('Following Search 렌더링 테스트', () => {
+ render(
+
+
+ ,
+ );
+
+ expect(screen.getByText('팔로우 추가')).toBeInTheDocument();
+ });
+
+ test('팔로우 추가 클릭 시 모달 생성', () => {
+ render(
+
+
+ ,
+ );
+
+ expect(screen.queryByText('팔로우 할 닉네임을 입력하세요')).toBeNull();
+
+ fireEvent.click(screen.getByText('팔로우 추가'));
+
+ expect(screen.getByText('팔로우 할 닉네임을 입력하세요')).toBeInTheDocument();
+ });
+});
diff --git a/src/components/pages/message/message-following-search/index.tsx b/src/components/pages/message/message-following-search/index.tsx
new file mode 100644
index 00000000..df443812
--- /dev/null
+++ b/src/components/pages/message/message-following-search/index.tsx
@@ -0,0 +1,54 @@
+'use client';
+import { Icon } from '@/components/icon';
+import { Button, ModalContent, ModalTitle, useModal } from '@/components/ui';
+
+const FollowerModal = () => {
+ const { close } = useModal();
+
+ const handleConfirm = () => {
+ // 유저 팔로우 기능 ...
+ console.log('팔로우 성공');
+ close();
+ };
+
+ // 모달 모양 바뀌면 적용하기!
+ return (
+
+ 팔로우 할 닉네임을 입력하세요
+ {
+ if (e.key === 'Enter') {
+ handleConfirm();
+ }
+ }}
+ />
+
+
+
+
+
+
+ );
+};
+
+export const FollowingSearch = () => {
+ const { open } = useModal();
+ return (
+ open(
)}
+ >
+
+
+
+
+
팔로우 추가
+
+ );
+};