Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/#492 가수 검색 기능을 구현한다. #503

Merged
merged 69 commits into from
Oct 17, 2023
Merged
Show file tree
Hide file tree
Changes from 66 commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
d485312
chore: 돋보기 아이콘 추가
Creative-Lee Oct 5, 2023
efc4114
design: 돋보기 아이콘 투명도 제
Creative-Lee Oct 5, 2023
76ee527
feat: 검색 결과 시트 컴포넌트 마크업 및 스타일링 완료
Creative-Lee Oct 5, 2023
a5ea87c
feat: 헤더에 서치바 컴포넌트 추가
Creative-Lee Oct 5, 2023
b3342aa
feat: 서치 바 컴포넌트 기본 동작, 마크업 및 스타일링 완료
Creative-Lee Oct 5, 2023
e9e9282
feat: 검색 쿼리 입력 전체삭제 기능 구현
Creative-Lee Oct 6, 2023
4cfe61c
design: 결과 시트 디자인 수정
Creative-Lee Oct 6, 2023
78c6286
refactor: Flex 컴포넌트 반응형 추가 스타일링을 위한 속성 추가
Creative-Lee Oct 6, 2023
d03635b
design: 테블릿 이하 사이즈부터 결과시트가 화면을 가득 채우도록 변경
Creative-Lee Oct 6, 2023
0e186eb
design: 테블릿 이하 사이즈부터 검색 시 헤더를 덮어쓰도록 변경
Creative-Lee Oct 6, 2023
378e250
design: 검색창 관련 변경된 정책 적용
Creative-Lee Oct 8, 2023
d05a5d5
refactor: 상태명 및 핸들러명 변경으로 의미 개선
Creative-Lee Oct 8, 2023
1448498
chore: 뒤로가기 아이콘 추가
Creative-Lee Oct 8, 2023
d570d64
feat: 테블릿 이하 사이즈에서 검색창을 찾는 뒤로가기 버튼 제공
Creative-Lee Oct 8, 2023
b5c897f
design: 쿼리 리셋 버튼 관련 디자인 수정
Creative-Lee Oct 8, 2023
5151d5a
design: 검색창 열고 닫힘 트렌지션 구현
Creative-Lee Oct 8, 2023
a6441d5
refactor: 웹 접근성 개선
Creative-Lee Oct 8, 2023
0e91005
refactor: 불필요한 css함수 제거
Creative-Lee Oct 8, 2023
0991a57
fix: disable 속성 제거 및 visibility 대체
Creative-Lee Oct 8, 2023
a401565
refactor: jsx를 올바른 DOM 순서로 조정하여 tab 순서를 정렬함
Creative-Lee Oct 9, 2023
20c6842
chore: 디렉터리 명 변경
Creative-Lee Oct 9, 2023
71d35a0
feat: isSearching true 상태일 때 input focus 하는 effect 추가
Creative-Lee Oct 9, 2023
973b3e3
refactor: 로직 커스텀 훅 분리
Creative-Lee Oct 9, 2023
b007896
refactor: DOM 순서에 맞게 스타일 코드 재배치
Creative-Lee Oct 9, 2023
9a4c61c
feat: 검색 기능 관련 remote 함수 및 type 정의
Creative-Lee Oct 10, 2023
9660d05
feat: 검색 기능 관련 msw 핸들러 및 fixture 구현
Creative-Lee Oct 10, 2023
0739545
feat: 검색 함수 적용 및 디바운스 처리
Creative-Lee Oct 10, 2023
8f1f066
refactor: msw fixture 데이터 추가
Creative-Lee Oct 11, 2023
e6cb8c4
refactor: 썸네일 컴포넌트 사이즈 추가
Creative-Lee Oct 11, 2023
36ba66c
refactor: 미리보기 가수 type에 id 필드 추가
Creative-Lee Oct 11, 2023
ef42015
feat: 미리보기 시트 디자인 및 데이터 바인딩
Creative-Lee Oct 11, 2023
e592ff5
feat: useValidSearchParams 훅 구현
Creative-Lee Oct 11, 2023
d4e39cc
feat: 검색 완료 페이지 추가 및 경로 추가
Creative-Lee Oct 11, 2023
04bff52
feat: 검색 함수 구현 및 바인딩
Creative-Lee Oct 11, 2023
7d238a0
style: 함수 순서 변경
Creative-Lee Oct 11, 2023
bc49b86
feat: 가수 상세정보 페이지 추가 및 경로 추가
Creative-Lee Oct 11, 2023
f295f68
refactor: useValidSearchParams return 값 객체로 개선
Creative-Lee Oct 11, 2023
eb0cff6
refactor: 검색 완료 시 input blur 하도록 개선
Creative-Lee Oct 11, 2023
b040457
refactor: 변경된 api 명세 반영
Creative-Lee Oct 11, 2023
6c1186a
refactor: Artist -> singer로 변경
Creative-Lee Oct 11, 2023
4f1ce89
refactor: Artist -> singer로 변경
Creative-Lee Oct 11, 2023
3a45d8f
refactor: 핸들러 함수 useCallback 적용
Creative-Lee Oct 11, 2023
8597f53
feat: 검색 미리보기 결과 클릭시 가수 상세페이지로 이동하는 기능 구현
Creative-Lee Oct 11, 2023
ff2b349
feat: 가수 상세페이지 remote 함수 구현
Creative-Lee Oct 11, 2023
134a10a
refactor: 검색 결과 미리보기 컴포넌트 웹 접근성 개선
Creative-Lee Oct 11, 2023
a50055f
refactor: 구조분해 할당 적용
Creative-Lee Oct 12, 2023
ec2a977
feat: 스크롤 방지 effect 추가
Creative-Lee Oct 12, 2023
dcf0b82
design: Header left 속성 명시
Creative-Lee Oct 12, 2023
9b835fc
config: storybook-addon-react-router-v6 설치
Creative-Lee Oct 12, 2023
0320767
fix: 스토리 정상 표시를 위한 provider, router 적용 및 viewport 정의
Creative-Lee Oct 12, 2023
706f34f
refactor: 팝업 로그인 컨텍스트 내에 잘못 표시된 error 메세지 수정 및 prop 타입 변경
Creative-Lee Oct 12, 2023
b54f41f
test: 서치 바 스토리 추가
Creative-Lee Oct 12, 2023
1eb1384
refactor: handler 관리 방식 변경
Creative-Lee Oct 12, 2023
d104057
config: 스토리북 msw 적용을 위한 패키지 설치
Creative-Lee Oct 12, 2023
5f80ba0
feat: 스토리북에 msw 적용
Creative-Lee Oct 12, 2023
58ecc44
fix: ci unused error fix
Creative-Lee Oct 12, 2023
99cc599
refactor: 검색어 입력 없이 검색할 수 없도록 개선
Creative-Lee Oct 15, 2023
36033b3
fix: 모바일 환경에서 검색버튼을 통한 검색이 되도록 수정
Creative-Lee Oct 15, 2023
3a23ef5
chore: 오타 수정
Creative-Lee Oct 15, 2023
fdf0e29
design: px 단위 제거
Creative-Lee Oct 15, 2023
b2b6734
chore: 컴포넌트, 스타일 컴포넌트 명 변경
Creative-Lee Oct 15, 2023
1bc5f89
refactor: 아티스트 아이템 외의 빈곳 클릭시 검색 종료되는 문제 해결
Creative-Lee Oct 15, 2023
80079d4
feat: 백드롭 추가
Creative-Lee Oct 15, 2023
0b08c70
feat: esc 검색종료 함수 추가
Creative-Lee Oct 15, 2023
8ca98d4
design: 검색창 expand 시 로고 완전히 덮히도록 수정
Creative-Lee Oct 15, 2023
2152aa3
feat: 백드롭 클릭 시 검색종료
Creative-Lee Oct 16, 2023
7365915
refactor: api url 변경 반영
Creative-Lee Oct 17, 2023
19c9bea
refactor: msw 핸들러 고도화 및 픽스쳐 데이터 추가
Creative-Lee Oct 17, 2023
2f418a1
refactor: msw 핸들러 고도화 및 픽스쳐 데이터 수정
Creative-Lee Oct 17, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions frontend/.storybook/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ const config: StorybookConfig = {
'@storybook/addon-links',
'@storybook/addon-essentials',
'@storybook/addon-interactions',
'storybook-addon-react-router-v6',
],
framework: {
name: '@storybook/react-webpack5',
Expand All @@ -15,6 +16,9 @@ const config: StorybookConfig = {
docs: {
autodocs: true,
},

staticDirs: ['../public'],
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

msw worker.js 파일 경로 설정입니다.


webpackFinal: async (config) => {
if (config.resolve) {
config.resolve.plugins = [
Expand Down
85 changes: 81 additions & 4 deletions frontend/.storybook/preview.tsx
Original file line number Diff line number Diff line change
@@ -1,24 +1,101 @@
import { initialize, mswLoader } from 'msw-storybook-addon';
import type { Preview } from '@storybook/react';
import GlobalStyles from '../src/shared/styles/GlobalStyles';
import { ThemeProvider } from 'styled-components';
import theme from '../src/shared/styles/theme';
import { BrowserRouter } from 'react-router-dom';
import AuthProvider from '@/features/auth/components/AuthProvider';
import LoginPopupProvider from '@/features/auth/hooks/LoginPopUpContext';
import handlers from '@/mocks/handlers';

const customViewport = {
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

프로젝트 내부 breakpoint 스팩대로 viewport 추가하였습니다.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍👍 와우 커스텀 뷰포트 추가하는거 좋네요!

xxl: {
name: 'xxl',
styles: {
width: '1440px',
height: '1080px',
},
},

xl: {
name: 'xl',
styles: {
width: '1280px',
height: '720px',
},
},

lg: {
name: 'lg',
styles: {
width: '1024px',
height: '720px',
},
},

md: {
name: 'md',
styles: {
width: '768px',
height: '1024px',
},
},

sm: {
name: 'sm',
styles: {
width: '640px',
height: '768px',
},
},

xs: {
name: 'xs',
styles: {
width: '420px',
height: '768px',
},
},

xxs: {
name: 'xxs',
styles: {
width: '380px',
height: '768px',
},
},
};

initialize();
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

msw 실행 메서드에요


const preview: Preview = {
parameters: {
actions: { argTypesRegex: '^on[A-Z].*' },
viewport: { viewports: customViewport, defaultViewport: 'xs' },
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/,
},
},
msw: {
handlers: [...handlers],
},
},
loaders: [mswLoader],

decorators: [
(Story) => (
<ThemeProvider theme={theme}>
<GlobalStyles />
<Story />
</ThemeProvider>
<AuthProvider>
<LoginPopupProvider>
<ThemeProvider theme={theme}>
<BrowserRouter>
<GlobalStyles />
<Story />
</BrowserRouter>
</ThemeProvider>
</LoginPopupProvider>
</AuthProvider>
),
],
};
Expand Down
50 changes: 50 additions & 0 deletions frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,12 @@
"jest": "^29.6.1",
"jest-environment-jsdom": "^29.6.1",
"msw": "^1.2.3",
"msw-storybook-addon": "^1.9.0",
"postcss-styled-syntax": "^0.4.0",
"prettier": "^3.0.0",
"react-refresh": "^0.14.0",
"storybook": "^7.0.27",
"storybook-addon-react-router-v6": "^2.0.7",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💬 storybook에서 react router가 필요한 이유가 있나요? 🤔
페이지를 넘나드는 단위의 스토리북은 작성하지 않기로 했었던 것 같은데,
필요하다고 생각드신다면 의견 이야기 해주세요! 😊

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

맞아요. '넘나들기 위해서' 라기 보다는 컴포넌트를 보여주기 위해서 사용했습니다.
searchBar 컴포넌트 자체가 라우터를 사용하고 있는 컴포넌트기 때문에, 사용해야 했습니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확인이 끝나고 추후에 삭제...를 해야할까요 ? ㅋㅋㅋㅋㅋ

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

음 일단 제 작업에서 스토리북 수정하면서 useNavigate를 사용한다고 에러가 떴었는데,
BrowserRouter만 감싸줘도 동작이 되었는데요.
해당 라이브러리가 필요한지는 검토해봐야 알 것 같아요

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아하.. 알겠습니당

"stylelint": "^15.10.2",
"stylelint-config-clean-order": "^5.0.1",
"ts-jest": "^29.1.1",
Expand Down
3 changes: 3 additions & 0 deletions frontend/src/assets/icon/left-arrow.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions frontend/src/assets/icon/search.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 2 additions & 1 deletion frontend/src/features/auth/components/AuthProvider.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { createContext, useContext, useMemo, useState } from 'react';
import accessTokenStorage from '@/shared/utils/accessTokenStorage';
import parseJWT from '../utils/parseJWT';
import type { PropsWithChildren } from 'react';

interface User {
memberId: number;
Expand All @@ -23,7 +24,7 @@ export const useAuthContext = () => {

const AuthContext = createContext<AuthContextProps | null>(null);

const AuthProvider = ({ children }: { children: React.ReactElement[] }) => {
const AuthProvider = ({ children }: PropsWithChildren) => {
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

provider 의 type이 []로제한되어 있어서,
단일 children에 에러를 뱉었어요.
스토리북 decorators 설정시 상당히 불편했어서, 기본 타입으로 수정했습니다.

💬 혹시 type으로 단일 children을 제한한 이유가 있을까요?

//  type error!
<AuthProvider>
  <One>
</AuthProvider>

const [accessToken, setAccessToken] = useState(accessTokenStorage.getToken() || '');

const user: User | null = useMemo(() => {
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/features/auth/hooks/LoginPopUpContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const LoginPopUpContext = createContext<LoginPopUpContextProps | null>(null);
export const useLoginPopup = () => {
const contextValue = useContext(LoginPopUpContext);

if (contextValue === null) throw new Error('AuthContext가 null입니다.');
if (contextValue === null) throw new Error('LoginPopUpContext에 값이 제공되지 않았습니다.');
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

동일한 형식의 코드를 복붙할 때는 꼭 확인 부탁드립니다~!
잘못된 error message로 혼동이 와서 시간을 쫌 많이 썼어요 ㅠ


return contextValue;
};
Expand Down
15 changes: 15 additions & 0 deletions frontend/src/features/search/components/SearchBar.stories.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import Header from '@/shared/components/Layout/Header';
import SearchBar from './SearchBar';
import type { Meta, StoryObj } from '@storybook/react';

const meta = {
component: SearchBar,
title: 'SearchBar',
} satisfies Meta<typeof SearchBar>;

export default meta;
type Story = StoryObj<typeof SearchBar>;

export const Default: Story = {
render: () => <Header />,
};
Loading
Loading