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()} + > +
+ +
+ + 팔로우 추가 +
+ ); +};