Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* [Feature] - ํ๋ก์ ํธ ํ๊ฒฝ ์ธํ (#4) * chore: ์ด๊ธฐ package.json ์ค์ * chore: .gitignore ์ถ๊ฐ * chore: tsconfig.json ์ด๊ธฐ ์ค์ * chore: react ๋ด webpack ์ธํ 1. webpack ๊ด๋ จ ์์กด์ฑ ์ถ๊ฐ 2. build scrpit ์์ 3. webpack.common.js ์ถ๊ฐ 4. public ๋๋ ํฐ๋ฆฌ ๋ด index.html ์ถ๊ฐ 5. src ๋๋ ํฐ๋ฆฌ ๋ด App.tsx ๋ฐ main.tsx ์ถ๊ฐ * chore: prettier & eslint ์ค์ * chore: emotion ์ค์ * docs: pull request ํ ํ๋ฆฟ ์ถ๊ฐ * chore: package.json ๋ด broswerslist ๋ณ๊ฒฝ 1%์์ 5%๋ก ๋ณ๊ฒฝ(ํฌ๋กฌ, ์ฌํ๋ฆฌ, ์ฃ์ง๋ง ์ ์ ์จ์ด 5% ์ด์์ด๊ธฐ ๋๋ฌธ) ์ฌ์ํ ์ค์ ์ผ๋ก ์ธํด develop์ ๋ฐ๋ก push * [Feature] - stylelint ์ค์ (#51) * chore: stylelint ๊ด๋ จ ์์กด์ฑ ์ถ๊ฐ * chore: stylelint ๊ท์น stylelintrc.json์ ์ถ๊ฐ * chore: vscode ๊ด๋ จ ์ค์ ์ถ๊ฐ * [Feature] - ์ฌํ๊ธฐ ์์ธ ๊ธฐ๋ฅ ๊ตฌํ (#42) * feat: ๊ธฐ๋ณธ ํฐํธ ์ค์ 1. webpack ๋ด asset/resource ์ต์ ์ถ๊ฐ 2. pretendard ํฐํธ ์ถ๊ฐ 3. woff์ ๋ํ ํ์ ์ถ๊ฐ 4. globalStyle ๋ด ๊ธฐ๋ณธ ํฐํธ๋ฅผ pretendard๋ก ๋ณ๊ฒฝ * feat: svg ๋ด asset ์ค์ * feat: ThemeProvider ์ถ๊ฐ 1. theme ๊ด๋ จ declare ํ์ผ ์ถ๊ฐ 2. theme ์ถ๊ฐ 3. theme์ ThemeProvider ์ ์ฉ * feat: svg๋ฅผ ์ปดํฌ๋ํธ ํํ๋ก ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ 1. @svgr/webpack ์์กด์ฑ ์ถ๊ฐ 2. webpack.common.js ๋ด ๊ด๋ จ ์ค์ ์ถ๊ฐ(url, component ๋ชจ๋ ์ฌ์ฉ) 3. svg.d.ts ๋ด svg ๊ด๋ จ ํ์ ์ค์ ์ถ๊ฐ * feat: font ๊ด๋ จ local ํจ์ ์ถ๊ฐ * feat: assets/index.ts ๋ด marker url ์ค์ ์ถ๊ฐ * feat: tanstack query ์์กด์ฑ ์ถ๊ฐ * chore: prettier ๋ด sort ์์ ๋ณ๊ฒฝ * chore: ํ๊ฒฝ ๋ณ์ ์ธํ 1. dotenv-webpack ์์กด์ฑ ์ถ๊ฐ 2. webpack config ํ์ผ ๋ด DotenvWebpack๋ฅผ ํตํด ํ๊ฒฝ๋ณ์ ํ์ผ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ๋๋ก ์ค์ * feat: axios instance ๊ฐ์ฒด ์์ฑ baseUrl ์ง์ * feat: react-query ๋ฐ devtools ์ค์ ์ถ๊ฐ * chore: @apis path alias ์ถ๊ฐ * refactor: theme ๋ด detail์ font-family ์ ๊ฑฐ * feat: Box ์ปดํฌ๋ํธ ๊ตฌํ * feat: Carousel ์ปดํฌ๋ํธ ๊ตฌํ * feat: Header ์ปดํฌ๋ํธ ๊ตฌํ * feat: Tab ์ปดํฌ๋ํธ ๊ตฌํ * feat: TransformBottomSheet ์ปดํฌ๋ํธ ๊ตฌํ * feat: PlaceDetailCard ์ปดํฌ๋ํธ ๊ตฌํ * feat: TravelogueTabContent ์ปดํฌ๋ํธ ๊ตฌํ * feat: GoogleMapView ์ปดํฌ๋ํธ ๊ตฌํ * chore: re-export ๊ด๋ จ ์ค์ ์ถ๊ฐ * feat: ์ด๊ธฐ ์ฌํ๊ธฐ ์์ธ ํ์ด์ง ๊ตฌํ * chore: .gitignore ๋ด .env.development, .env.production๋ง ์ค๋๋ก ๋ณ๊ฒฝ * chore: @react-google-maps/api ์์กด์ฑ ์ถ๊ฐ * fix(Carousel): ์ด๋ฏธ์ง๊ฐ ์ด๋ํ์ง ์๋ ๋ฌธ์ ํด๊ฒฐ max-width ๋์ transform ์์ฑ ์ถ๊ฐ * [Feature] - codeowner ๋ฐ ์๋ ํ ๋น ์ค์ (#59) * chore: codeowners ์ค์ ์ถ๊ฐ * [Feature] - ํ ์คํธ ํ๊ฒฝ ์ค์ ์ถ๊ฐ (#58) * chore: storybook ๊ด๋ จ ์ค์ ์ถ๊ฐ * chore: jest ๊ด๋ จ ์์กด์ฑ ๋ฐ script ์ถ๊ฐ * chore: jest config ํ์ผ ๊ด๋ จ ์์กด์ฑ ์ถ๊ฐ * chore: eslint ํ์ผ ๋ด jest plugin ์ถ๊ฐ * [Feature] Storybook ๋ฐฐํฌ ์ค์ (#61) * chore: chromatic ๋ฐฐํฌ ์ค์ ์ถ๊ฐ * feat: TransformBottomSheet story ํ์ผ ์ถ๊ฐ * chore: chromatic ci/cd ์ค์ ์ถ๊ฐ * [Feature] - react-router-dom ์ค์ (#71) * chore: react-router-dom ์ธํ * chore: createBrowserRouter ์ ์ฉ * chore: @constants path alias ์ถ๊ฐ * feat: AppLayout ์ปดํฌ๋ํธ ์ถ๊ฐ 1. TravelogueDetailPage ๋ด margin-top ์ ๊ฑฐ 2. AppLayout ์ปดํฌ๋ํธ ๊ตฌํ * feat: router path ๊ด๋ จ ์์ ์ถ๊ฐ * refactor: router ์ธํ ๋ณ๊ฒฝ 1. App ๋ด router router.tsx๋ก ์ด๋ 2. router.tsx ๋ด AppLayout ์ถ๊ฐ ๋ฐ router path ์ค์ * chore: storybook-addon-remix-react-router ์์กด์ฑ ์ถ๊ฐ * chore: storybook ๋ด router addon ์ค์ ์ถ๊ฐ --------- Co-authored-by: แแ ฉแซแแ ตแซแแ งแผ <[email protected]> * [Feature] - ์๋น์ค Foundation ์ค์ (#76) * chore: styles ๋ด declare ํ์ผ๋ค types ํด๋๋ก ์ด๋ * chore: foundation ์ ์ 1. color, spacing, typography์ ๋ํ foundation ์ถ๊ฐ 2. global theme ๋ณ๊ฒฝ 3. emotion.d.ts ๋ด declare theme ํ์ ๋ณ๊ฒฝ * refactor: foundation ์ปดํฌ๋ํธ ๋ค์ ์ ์ฉ * chore: stylelint ์ ์ฉ * [Feature] - msw ์ค์ (#73) * chore: msw ์์กด์ฑ ์ถ๊ฐ * fix: msw v2 ๋ด ๋ฐ์ํ๋ ๋ฌธ์ ํด๊ฒฐ์ ์ํ ํด๋ฆฌํ ์ฝ๋ ์ถ๊ฐ ReferenceError: TextEncoder is not defined ์๋ฌ ๋ฐ์ ๋ฐฉ์ง๋ฅผ ์ํด ํด๋ฆฌํ ์ฝ๋ ์ถ๊ฐ 1. package.json ๋ด undici ์์กด์ฑ ์ถ๊ฐ 2. jest.polyfills.js ๋ด ๊ด๋ จ ์ค์ ์ถ๊ฐ 3. jest.config.js ๋ด ํด๋ฆฌํ ๊ด๋ จ ์ค์ ์ถ๊ฐ * chore: @mocks ๊ด๋ จ ์ค์ ์ถ๊ฐ 1. path alias ์ถ๊ฐ(webpack, tsconfig) 2. prettier import sort ๋ด mocks ์ถ๊ฐ * chore: typescript ํ๊ฒฝ์์ jest api๋ฅผ ์ ๊ณตํ๊ธฐ ์ํ ์ค์ ์ถ๊ฐ * chore: msw ๊ธฐ๋ณธ ์ค์ ์ถ๊ฐ * chore: ๋ถํ์ํ chromatic_publish ํ์ผ ์ ๊ฑฐ * chore: msw-storybook-addon ์์กด์ฑ ์ถ๊ฐ * chore: storybook ๋ด msw ์ค์ ์ถ๊ฐ 1. main.ts ๋ด ํ๊ฒฝ ๋ณ์ ์ค์ ์ถ๊ฐ 2. preview.tsx ๋ด initialize & mswLoader ์ค์ , handler ์ถ๊ฐ 3. npx msw init public/ ๋ช ๋ น์ด ์คํ(mockServiceWorker.js & package.json ๋ด msw workerDirectory ์ถ๊ฐ * [Feature] - ์ฌํ๊ธฐ ๋ฑ๋ก ํ์ด์ง์ ํ์ํ ๊ณตํต ์ปดํฌ๋ํธ ๊ตฌํ(์ง๋) (#91) * feat(assets): ํด์งํต ์์ด์ฝ ์ถ๊ฐ * feat(Accordian): ์์ฝ๋์ธ ์ปดํฌ๋ํธ ๊ตฌํ * test(Accordion): ์์ฝ๋์ธ ์ปดํฌ๋ํธ ์คํ ๋ฆฌ๋ถ ์ถ๊ฐ * feat(Button): ๋ฒํผ ์ปดํฌ๋ํธ ๊ตฌํ * test(Button): ๋ฒํผ ์ปดํฌ๋ํธ ์คํ ๋ฆฌ๋ถ ์ถ๊ฐ * test(Accordion): ํ ์คํธ ์ผ์ด์ค ๋ค์ด๋ฐ์ ์์ด๋ก ์์ * feat(asset): asset ์ถ๊ฐ * feat(Icon): ์์ด์ฝ ์ปดํฌ๋ํธ ๊ตฌํ * test(Icon): Icon ์ปดํฌ๋ํธ ์คํ ๋ฆฌ๋ถ ์ถ๊ฐ * feat(IconButton): IconButton ์ปดํฌ๋ํธ ๊ตฌํ * test(IconButton): IconButton ์ปดํฌ๋ํธ ์คํ ๋ฆฌ๋ถ ์ถ๊ฐ * feat(Icon): svg๋ค์ ๋ํ json ํ์ผ ์ถ๊ฐ * feat(Text): Text ์ปดํฌ๋ํธ ๊ตฌํ * test(Text): Text ์ปดํฌ๋ํธ ์คํ ๋ฆฌ๋ถ ์ถ๊ฐ * refactor(preview): ์คํ ๋ฆฌ๋ถ root์ rootStyle ์ถ๊ฐ * test(Text): Overview ์คํ ๋ฆฌ ์ถ๊ฐ * test(preview): ์คํ ๋ฆฌ๋ถ ํ๊ฒฝ root style ๋ณ๊ฒฝ 1. preview.tsx ๋ด rootStyle ๋ณ๊ฒฝ ํ ๋ค๋ฅธ story๋ค์ ์ ์ฉ * refactor(Button): ButtonVariants import ์ type ์ถ๊ฐ * refactor(Text): ๋ณ์ ๋ด์์ export ํ๋๋ก ๋ณ๊ฒฝ * refactor(Icon): type๋ค type.ts๋ก ๋ถ๋ฆฌ * refactor(Icon): import ๋ฐฉ์ ๋ณ๊ฒฝ * [Feature] - ์ฌํ๊ธฐ ๋ฑ๋ก ํ์ด์ง์ ํ์ํ ๊ณตํต ์ปดํฌ๋ํธ ๊ตฌํ(์๋ชจ) (#90) * feat(Input): ์ปดํฌ๋ํธ ๊ตฌํ * feat(InputField): ์ปดํฌ๋ํธ ๊ตฌํ * fix(tsconfig): ๊ฐํ์ผ๋ก ์ธํ ์ค๋ฅ ํด๊ฒฐ * test(Input): ์คํ ๋ฆฌ๋ถ ๊ตฌํ * test(InputField): ์คํ ๋ฆฌ๋ถ ๊ตฌํ * refactor(InputContainer): ํ์ผ๋ช ์์ ๋ฐ count ์ปดํฌ๋ํธ ๋ถ๋ฆฌ * feat(Textarea): ์ปดํฌ๋ํธ ๊ตฌํ * refactor(Textarea): props ๋ฐ css ์์ * test(Textarea): ์คํ ๋ฆฌ๋ถ ๊ตฌํ * refactor(Count): ๋ค์ด๋ฐ ์ง๊ด์ ์ผ๋ก ์์ * refactor(Input): InputContainer๋ฅผ Input์ผ๋ก ๋จ์ผํ * refactor(Textarea): title ์์ * feat(BackDrop): ์ปดํฌ๋ํธ ๊ตฌํ * feat(asset): Tturi svg ์ถ๊ฐ * refactor(BackDrop): position ์์ * feat(asset): close-button svg ์ถ๊ฐ * feat(Button): ์ปดํฌ๋ํธ ๊ตฌํ * feat(ModalContainer): ์ปดํฌ๋ํธ ๊ตฌํ * feat(ModalContent): ์ปดํฌ๋ํธ ๊ตฌํ * feat(ModalFooter): ์ปดํฌ๋ํธ ๊ตฌํ * feat(ModalHeader): ์ปดํฌ๋ํธ ๊ตฌํ * feat(Modal): ์ปดํฌ๋ํธ ๊ตฌํ * test(Modal): ์คํ ๋ฆฌ๋ถ ๊ตฌํ * refactor(asset): close button ์ญ์ * refactor: modalBottomSheet๋ก ๋ค์ด๋ฐ ์์ * refactor(storybook): ๋ชจ๋ฐ์ผ ํ๊ฒฝ์ ์ํ preview ์์ , ๋ถํ์ํ ์คํ ๋ฆฌ๋ถ ํ ์คํธ ์ญ์ ๋ฐ ๋ค์ด๋ฐ ์์ * feat(Container): ์๋๋ฉ์ด์ ์ถ๊ฐ --------- Co-authored-by: jinyoung <[email protected]> * [Feature] - ์ฌํ๊ธฐ ๋ฑ๋ก ํ์ด์ง์ ํ์ํ ๊ณตํต ์ปดํฌ๋ํธ ๊ตฌํ(๋ฆฌ๋ฒ) (#89) * feat: MultiImageUpload ์ปดํฌ๋ํธ ๊ตฌํ * feat: ThumbnailUpload ์ปดํฌ๋ํธ ๊ตฌํ * fix: emotion css๋ฅผ styled๋ก ์์ - storybook์์ emotion css๊ฐ ์ ์ฉ๋์ง ์๋ ๋ฌธ์ ๊ฐ ์์ด์ emotion styled๋ก ์์ * test: ThumnailUpload ์ปดํฌ๋ํธ storybook ์ถ๊ฐ * feat: MultiImageUpload ์ปดํฌ๋ํธ ์ด๋ฏธ์ง ์ญ์ ๊ธฐ๋ฅ ๊ตฌํ * refactor: MultiImageUpload ์ปดํฌ๋ํธ์์ ํจ์๋ช ์ฝ๋ ์ปจ๋ฒค์ ์ ๋ง๊ฒ ์์ * feat: ThumbnailUpload ์ปดํฌ๋ํธ ์ธ๋ค์ผ ์์ ๊ธฐ๋ฅ ๊ตฌํ * feat: ThumbnailUploadButton์ gap ์์ * refactor: ThumbnailUpload ์ปดํฌ๋ํธ์์ ์ค๋ณต ์ ๊ฑฐ * refactor: ThumbnailUpload ์ปดํฌ๋ํธ์์ ํ์ดํ ํจ์๋ก ๋จ์ํ * fix: MulitiImageUpload ์ปดํฌ๋ํธ์์ emotion css๋ฅผ emotion styled๋ก ์์ - storybook์์ emotion css ์ ์ฉ ๋์ง ์๋ ์ด์๋๋ฌธ์ ์์ * refactor: ์ด๋ฏธ์ง ์ ๋ก๋ ๋ก์ง์ useImageUpload๋ก ๋ถ๋ฆฌ * test: MultiImageUpload ์ปดํฌ๋ํธ storybook ์ถ๊ฐ * fix: ThumbnailUpload ์ปดํฌ๋ํธ storybook title ์์ * fix: MultiImageUpload ์ปดํฌ๋ํธ storybook title ์์ * refactor: ThumbnailUpload ์ปดํฌ๋ํธ storybook์์ base64๋ฅผ mageUrl๋ก ์์ -CORS ์ ์ฑ ๋๋ฌธ์ ์ธ๋ถ URL์์ ์ด๋ฏธ์ง๋ฅผ ์ง์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์๋์๋ค. - ์ด ๋๋ฌธ์ imageUrl ๋์ base64๋ฅผ ์ฌ์ฉํ์๋ค - base64 ๊ฐ์ด ๋๋ฌด ๊ธธ๋ค - ๋๋ฌธ์ ๋ฌด๋ฃ CORS ํ๋ก์ ์๋น๋ฅผ ์ฌ์ฉํ์ฌ imageUrl์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์์ * feat: MultiImageUpload ์ปดํฌ๋ํธ์ ์ด๋ฏธ์ง ๋ ๋๋ง ๋ถ๋ถ์ ์คํฌ๋กค ์ถ๊ฐ * test: MultiImageUpload ์ปดํฌ๋ํธ storybook์ ์ด๋ฏธ์ง ๋ง์ด ์ฒจ๋ถํ ๊ฒฝ์ฐ ์ถ๊ฐ * refactor: MultiImageUpload ์ปดํฌ๋ํธ ์ญ์ ๋ฒํผ์ svg ์ฌ์ฉ * refactor: MultiImageUpload ์ปดํฌ๋ํธ์์ styled ์ปดํฌ๋ํธ๋ช ์์ * feat: useDragScroll hook ๊ตฌํ * feat: MultiImageUpload ์ปดํฌ๋ํธ์ ๋๋๊ทธ ์คํฌ๋กค ๊ธฐ๋ฅ ์ถ๊ฐ * feat: MultiImageUpload ์ปดํฌ๋ํธ์ y์ถ ์คํฌ๋กค hidden ์ถ๊ฐ * refactor: MultiImageUpload ์ปดํฌ๋ํธ์์ ์ฌ์ง ์ถ๊ฐ ๋ฒํผ UI ์์ --------- Co-authored-by: jinyoung <[email protected]> * [Feature] - ์ฌํ๊ธฐ ๋ฑ๋ก ๊ธฐ๋ฅ ๊ตฌํ (#115) * feat: types path alias ์ถ๊ฐ * refactor(AccordionRoot): ๋ค๋ฅธ attributes๋ค๋ ๋ฐ์ ์ ์๋๋ก ๋ณ๊ฒฝ * fix(preview): ์คํ ๋ฆฌ๋ถ ์ด๋ฆฌ์ง ์๋ ๋ฌธ์ ํด๊ฒฐ div ํ๊ทธ ์ถ๊ฐ * chore: type, queries, hooks์ ๋ํ type alias ์ถ๊ฐ * feat: DayContent ์ปดํฌ๋ํธ ๊ตฌํ * refactor(GoogleMapView): LoadScript ์ธ๋ถ๋ก ๋ถ๋ฆฌ 1. GoogleMapView์์ LoadScript ์ ๊ฑฐ 2. GoogleMapLoadScript ์ถ๊ฐ * feat(GoogleSearchPopup): GoogleSearchPopup ์ปดํฌ๋ํธ ๊ตฌํ * refactor(ModalBottomSheet): currentY ๊ฐ open์ 0์ด ๋๋๋ก ๋ณ๊ฒฝ * refactor(ModalBottomSheet): stylelint ์ ์ฉ * refactor(MultiImageUpload): useImageUpload ๋ฐํ ๊ฐ์ ์ธ๋ถ์์ ์ฃผ์ ๋ฐ๋๋ก ๋ณ๊ฒฝ * feat(PageInfo): PageInfo ์ปดํฌ๋ํธ ๊ตฌํ * test(PageInfo): PageInfo ์ปดํฌ๋ํธ ์คํ ๋ฆฌ๋ถ ๊ตฌํ * chore: useDragScroll, useImageUpload ๊ฒฝ๋ก ๋ณ๊ฒฝ hooks์ ์์นํ๋๋ก ๋ณ๊ฒฝ * refactor(ThumbnailUpload): useImageUpload ๋ฐํ ๊ฐ์ ์ธ๋ถ์์ ์ฃผ์ ๋ฐ๋๋ก ๋ณ๊ฒฝ * feat(TravelogueMultiImgaeUpload): TravelogueMultiImgaeUpload ์ปดํฌ๋ํธ ๊ตฌํ * feat: register route path ์ถ๊ฐ * feat(useTravelDays): useTravelDays hook ๊ตฌํ * feat: travelogue ๊ณตํต ํ์ ๋ค ์ถ๊ฐ * feat: usePostTrevelogue ๊ตฌํ * feat: usePostUploadImages ๊ตฌํ * chore: reexport ์ถ๊ฐ * feat: ์ฌํ๊ธฐ ๋ฑ๋ก ๊ธฐ๋ฅ ๊ตฌํ 1. router์ ์ถ๊ฐ 2. ์ฌํ๊ธฐ ๋ฑ๋ก ํ์ด์ง ์ถ๊ฐ * feat: ์ฌํ๊ธฐ ๋ฑ๋ก ์๋ฃ ์ ํด๋น ์์ธ ํ์ด์ง๋ก ์ด๋ํ๋ ๊ธฐ๋ฅ ์ถ๊ฐ * [Feature] - ๋ก๊ทธ์ธ ํ์ด์ง ๊ตฌํ (#80) * chore(stylelint): properties ์ถ๊ฐ * refactor(style): ์คํ์ผ๋ฆฐํธ ์ ์ฉ * feat(theme): white ์ปฌ๋ฌ ์ถ๊ฐ * refactor(Header): ์ฌ์ฌ์ฉ์ฑ์ ์ํ ์ปดํฌ๋ํธ ์์ * refactor(style): Header align-items ์ถ๊ฐ * feat(assets): Tturi webp asset ์ถ๊ฐ * feat(Login): ๋ก๊ทธ์ธ ํ์ด์ง ์ปดํฌ๋ํธ ๊ตฌํ * chore: dev ์คํ์ ์ํ dotenv-webpack ์ค์น * feat(assets): kakao symbol ์ถ๊ฐ * feat(theme): yellow color ์ถ๊ฐ * feat(LoginPage): ๋ค์ด๋ฐ ๋ณ๊ฒฝ ๋ฐ ๋ก๊ทธ์ธ ๋ฒํผ UI ์ถ๊ฐ ๊ตฌํ * feat(LoginPage): ์นด์นด์ค ๋ก๊ทธ์ธ ๊ตฌํ * chore(webpack.common.js): publicPath ์ถ๊ฐ * feat: IconButton ๊ตฌํ * refactor(Header): Header ๋ด content๋ฅผ ๋ด๋ถ์ ๋ฃ๋๋ก ๋ณ๊ฒฝ * refactor(ExcitedTturi): tturi์์ ๋ค์ด๋ฐ ์์ * feat(constants): ROUTE_PATHS ์ถ๊ฐ * refactor(LoginPage): ๋ถํ์ํ ์ฃผ์ ์ญ์ ๋ฐ ํธ๋ค๋ฌ ๋ค์ด๋ฐ ์์ * feat(KakaoCallbackPage): ํ์ด์ง ๊ตฌํ * feat(router): kakaoCallbackPage ์ถ๊ฐ * feat(App): useContext ์ถ๊ฐ --------- Co-authored-by: แแ ฉแซแแ ตแซแแ งแผ <[email protected]> Co-authored-by: jinyoung <[email protected]> * [Feature] - ์ฌํ ๊ณํ ๋ฑ๋ก ํ์ด์ง ๊ตฌํ (#125) * chore: react-datepicker ์์๋ก ์ฌ์ฉ(๋ฐ๋ชจ๋ฐ์ด๋ ๋น ๋ฅด๊ฒ ๋ณด์ฌ์ฃผ๊ธฐ ์ํจ) * chore: css-loader, style-loader ์ถ๊ฐ ๋ฐ๋ชจ๋ฐ์ด๋ ์ฌ์ฉํ๋ date-picker๋ฅผ ์ํด ์์๋ก ์ค์น * feat(DateRangePicker): ์์๋ก ์ฌ์ฉํ DateRangePicker ์ปดํฌ๋ํธ ๊ตฌํ * refactor(Input): maxCount, count optional๋ก ๋ณ๊ฒฝ * chore(main): datepicker css ์ถ๊ฐ * refactor: Place ๋ด name์ placeName์ผ๋ก ๋ณ๊ฒฝ * refactor(useTravelDays): onAddDay์ useCallback ์ถ๊ฐ * feat(usePostTravelPlan): ์ฌํ ๊ณํ post ์์ฒญ hook ๊ตฌํ * feat(TravelogueRegisterPage): ์ฌํ ๊ณํ ๋ฑ๋ก ํ์ด์ง ๊ตฌํ * [Feature] - ๋ฉ์ธ ํ์ด์ง ๊ตฌํ (#78) * feat: AvatarCircle ์ปดํฌ๋ํธ ๊ตฌํ * test: AvatarCircle ์ปดํฌ๋ํธ storybook ์ถ๊ฐ * feat: TravelogueCard ์ปดํฌ๋ํธ ๊ตฌํ * test: TravelogueCard ์ปดํฌ๋ํธ storybook ์ถ๊ฐ * feat: MainPage ๊ตฌํ * refactor: AvatarCircle ์ปดํฌ๋ํธ useAvatar๊ฐ undefined์ผ๋๋ ๊ธฐ๋ณธ ์ด๋ฏธ์ง ๋ณด์ด๋๋ก ์์ * feat: TravelCard ์ปดํฌ๋ํธ์์ likes ๊ธฐ๋ณธ๊ฐ 0์ผ๋ก ์ค์ * feat: useIntersectionObserver ํ ๊ตฌํ * feat: useInfiniteTravelogues ๊ตฌํ - 5๊ฐ์ฉ fetchํด์ต๋๋ค. * refactor: ๋ฉ์ธํ์ด์ง์์ useInfiniteTravelogues ์ฌ์ฉํ๋๋ก ์์ * feat: Drawer ์ปดํฌ๋ํธ ๊ตฌํ * feat: Header ์ปดํฌ๋ํธ์ Drawer ์ถ๊ฐ * test: Drawer storybook ์ถ๊ฐ * feat: Drawer ์ปดํฌ๋ํธ style ์์ * refactor: ์๋ชป๋ image url ๋ค๋ฃจ๋ ๋ถ๋ถ useImageError ํ ์ผ๋ก ๋ถ๋ฆฌ * feat: TravelCard ์ปดํฌ๋ํธ์์ ์๋ชป๋ image url ํธ๋ค ์ถ๊ฐ * test: TravelogueCard ์ปดํฌ๋ํธ strorybook์ ์ ์ํ์ง ์์ ์ธ๋ค์ผ ์ผ์ด์ค ์ถ๊ฐ --------- Co-authored-by: jinyoung <[email protected]> * [Feature] - ์ฌํ ๊ณํ ์์ธ์กฐํ ํ์ด์ง ๊ตฌํ (#127) * chore: ์ ๋ฐ์ดํธ๋ ๋ค๋ฅธ ํ์ผ๊ณผ ๋๊ธฐํ * feat(TravelPlansTabContent): ์ปดํฌ๋ํธ ๊ตฌํ * feat(TravelPlansDetail): ์ปดํฌ๋ํธ ๊ตฌํ * refactor(TravelogueDetailPage): ํ์ ๋ถ๋ฆฌ ๋ฐ TransformBottomSheet props ์์ ์ ๋ฐ๋ฅธ ๋ณ๊ฒฝ * refactor: ๋ค์ด๋ฐ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ์์ ๋ฐ ๋ถ ํ์ํ ์ฝ๋ ์ญ์ Co-authored-by: choi river <[email protected]> Co-authored-by: simorimi <[email protected]> * refactor: ์คํ์ผ๋ง ์กฐ์ ๋ฐ stylelint์ ๋ง๊ฒ ์์ ์์ * refactor(storybook): decorator ์์ * chore(createPathElement): ์ค์ * [Feature] - 2์ฐจ ์คํ๋ฆฐํธ QA ์งํ (#141) * refactor: ๋ค์ด๋ฐ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ์์ ๋ฐ ๋ถ ํ์ํ ์ฝ๋ ์ญ์ Co-authored-by: choi river <[email protected]> Co-authored-by: simorimi <[email protected]> * refactor: ์คํ์ผ๋ง ์กฐ์ ๋ฐ stylelint์ ๋ง๊ฒ ์์ ์์ * refactor(storybook): decorator ์์ * chore(createPathElement): ์ค์ * fix(router): router ์์ 1. travelPlans url์ TravelPlansDetailPage ์ถ๊ฐ 2. travelPlansRegister url์ TravelPlanRegisterPage ์ถ๊ฐ * fix(Header): title style ๋ณ๊ฒฝ align-items center ์ถ๊ฐ * fix(Drawer): DrawerHeader ์คํ์ผ ์กฐ์ align-items center ์ถ๊ฐ * fix(TravelogueCard): ์นด๋ ๋์์ธ ์์ ๋ณ๊ฒฝ 1. CardHeader๊ฐ ๋ฐ์ผ๋ก ๊ฐ๋๋ก ๋ณ๊ฒฝ 2. Layout์ animation ์ ๊ฑฐ ํ border ๊ด๋ จ ์คํ์ผ ์ถ๊ฐ * fix(TravelPlansTabContent): name์ placeName์ผ๋ก ๋ณ๊ฒฝ * fix: ROUTE_PATHS ์์ 1. travelPlans ์ถ๊ฐ 2. travelPlansRegister์ url endpoint ๋ณ๊ฒฝ * refactor(TravelPlansTabContent): stylelint ์ ์ฉ * refactor(TravelogueDetailPage): ๋ถํ์ํ import ์ ๊ฑฐ * test(MultiImageUpload): storybook ์ค๋ฅ ์์ * test(ThumbnailUpload): ThumbnailUpload ์คํ ๋ฆฌ๋ถ ์์ * refactor(MainPage): stylelint ์ ์ฉ * fix(TravelPlansDetail): ์ฌํ ๊ณํ api ์ค๋ฅ ์์ 1. headers ์ถ๊ฐ(Authorization) 2. queryKey ๋ณ๊ฒฝ 3. useGetTravelPlan ๋ถ๋ฆฌ * fix(Header): ํค๋ ๊ด๋ จ ์ค๋ฅ ์์ 1. ๋ก๊ทธ์ธ ๋ด click ์ก์ ์ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ํ๋๋ก ์์ 2. access token ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ก๊ทธ์ธ/๋ก๊ทธ์์ ๋ถ๊ธฐ ์ฒ๋ฆฌํ๋๋ก ๋ณ๊ฒฝ 3. HeaderTitle ์ปดํฌ๋ํธ ์ ๊ฑฐ * chore: type ๊ด๋ จ import sort ์ถ๊ฐ * fix: TravelPlanRegisterPage navigate url ์์ * feat(asset): svg-icons.json ๋ด asset ์ถ๊ฐ * feat: MainPage ๋ด FloatingButton ์ถ๊ฐ * refactor(useGetTravelPlan): queryFn ํํ ๋ณ๊ฒฝ * fix(TravelogueDetailPage): margin-top ๋ณ๊ฒฝ * fix(TransformBottomSheet): text-align center ๋ณ๊ฒฝ * refactor: declare file ๊ด๋ฆฌ 1. ๋ถํ์ํ emotion.d.ts ํ์ผ ์ ๊ฑฐ 2. style.d.ts์ ๋ชจ๋ declare type ์ถ๊ฐ * chore: context path alias ์ค์ ์ถ๊ฐ * chore: jest ๋ด moduleNameMapper ์์ * refactor(AvatarCircle): userAvatar props ๋ณ๊ฒฝ profileImageUrl๋ก ๋ณ๊ฒฝ * test(AvatarCircle): argTypes(userAvatar)๋ฅผ profileImageUrl๋ก ๋ณ๊ฒฝ * refactor: App ๋ด Context๋ค UserProvider๋ก ๋ถ๋ฆฌ * refactor: useUser hook ๋ถ๋ฆฌ * style: ๋ถํ์ํ ํ์ผ ์ ๊ฑฐ * fix(Header): ๋ก๊ทธ์ธ ํ๋ฉด์์ ๋ค๋ก๊ฐ๊ธฐ ์์ด์ฝ์ ์์ด ์๋ชป๋ ์ด์ ํด๊ฒฐ * refactor(TravelPlansDetailPage): Context import ๊ฒฝ๋ก ๋ฐ ๋ค์ด๋ฐ ๋ณ๊ฒฝ * refactor(Container): stylelint ์ ์ฉ * refactor(MainPage): TravelogueCard ์ปดํฌ๋ํธ ๋ด key prop ์ถ๊ฐ * fix(LoginPage): ๋๋ฆฌ ์ด๋ฏธ์ง๊ฐ ๋ฐฐํฌ ํ๊ฒฝ์์ ๋ณด์ด์ง ์๋ ๋ฌธ์ ํด๊ฒฐ webp์์ gif ํ์ผ๋ก ๋ณ๊ฒฝ * refactor(KakaoCallbackPage): UseSetUseContext import ๊ฒฝ๋ก ๋ฐ ๋ค์ด๋ฐ ๋ณ๊ฒฝ * refactor(TravelogueCard): AvatarCircle prop name ๋ณ๊ฒฝ * refactor(TravelPlansDetail): stylelint ์ ์ฉ * refactor(PlaceDetailCard): ์ด๋ฏธ์ง๊ฐ 1๊ฐ ์ผ๋ ์บ๋ฌ์ ์ด ์๋ ์ผ๋ฐ ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ๋ณ๊ฒฝ * refactor(TravelogueDetailPage): TitleContainer ์คํ์ผ ๋ณ๊ฒฝ * refactor(TravelogueDetailPage): font title์ด ์๋ subtitle๋ก ๋ณ๊ฒฝ * feat: favicon ์ถ๊ฐ * chore: storybook path alias ์ถ๊ฐ(contexts) * chore: ๋ณ๊ฒฝ์ฌํญ ๋ฐ์ * refactor: queries ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ ๋ณ๊ฒฝ * chore: ๋ถํ์ํ console.log ์ ๊ฑฐ * refactor(useImageUpload): ํด๋น hook ์ ๊ฑฐ local state๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ์๋ ์๋ฒ๋ก ๋ถํฐ ๋ฐ์ url์ ์ปดํฌ๋ํธ์ ์ฃผ์ ํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ * refactor(TravelogueDetailPage): ๋ฆฌ์กํธ ์ฟผ๋ฆฌ hook ๋ก์ง ๋ถ๋ฆฌ useGetTravelogue๋ก ๋ถ๋ฆฌ --------- Co-authored-by: choi river <[email protected]> Co-authored-by: simorimi <[email protected]> * chore: chromatic ๋ฐฐํฌ yml ํ์ผ ์ถ๊ฐ (#117) * [Feature] - CI ์ค์ (#66) * fix: __tests__ ๋ด jest ํ์ ์๋ฌ ํด๊ฒฐ * chore: styled ํ์ผ ๋ด stylelint ์ ์ฉ * chore: ํ๋ก ํธ์๋ ci ์ค์ github actions ์ถ๊ฐ * chore: jest-junit ์์กด์ฑ ์ถ๊ฐ * chore: jest.config.js ๋ด reporters ์ต์ ์ถ๊ฐ * chore: ci ์คํฌ๋ฆฝํธ ๋ด check ์ฝ๋ฉํธ ์ถ๊ฐ * feat: ํต๊ณผ ํ๋ ํ ์คํธ ์ถ๊ฐ * test: ์์ ํ ์คํธ ์ ๊ฑฐ * chore: jest ์ค์ ๋ด --passWithNoTests config ์ถ๊ฐ * [Feature] - 3์ฃผ์ฐจ ์คํ๋ฆฐํธ ๋ฆฌํฉํ ๋ง (#145) * feat: ์์ฝ๋์ธ toggle trigger๋ถ๋ถ์ ํ์ฅ * feat: FloatingButton์ด ๊ฐ๋ ค์ง์ง ์๊ฒ z-index ์ถ๊ฐ * feat: description์ ํฌํจ๋ ๊ฐํ ๋ฌธ์ ์ ์ฉ๋๋๋ก ์์ * feat: tab ์ปดํฌ๋ํธ์์ 3์ผ ์ด์์ธ ๊ฒฝ์ฐ ๋ง์ง๋ง tab์ ๋ฐ๋ง ๋ณด์ด๋๋ก ๊ตฌํ * fix: ์ด๋ฏธ์ง์ ์ปจํ ์ด๋ border๊ฐ ๊ฐ๊ฐ ๋ณด์ด๋ ๋ถ๋ถ ์์ * chore: yarn.lock ์ ๋ฐ์ดํธ * fix: ci ์๋ฌ ํด๊ฒฐ (#150) install --frozen-lockfile ์ ๊ฑฐ * [Feature] - sentry ์ธํ ํ๊ธฐ (#168) * chore: sentry/react ์ค์น * feat: ApiError ๊ฐ์ฒด ๊ตฌํ * feat: sentry ์ด๊ธฐ ์ค์ * fix: ์๋ชป๋ name ์์ * fix: ์กด์ฌํ์ง ์๋ ํจ์ import ์์ * [Feature] - 2์ฐจ ์คํ๋ฆฐํธ ๋ฆฌํฉํ ๋ง (#164) * refactor(useGetTravelogue): queryFn ์์ * chore: datepicker ์ถ๊ฐ์ ๋ฐ๋ฅธ ๋ณ๊ฒฝ * fix(globalStyle): ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์ ์ฃผ์์ฐฝ์ด ์ ์ฒด ํ๋ฉด ํฌ๊ธฐ์ ํฌํจ๋๋ ๋ฌธ์ ํด๊ฒฐ * refactor(Header): ๋ถ ํ์ํ z-index ์ ๊ฑฐ * fix(ModalBottomSheet): useBottomSheet ๋ถ๋ฆฌ ๋ฐ ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์ ์๋ํ๋๋ก ์์ * refactor: z-index ์ถ๊ฐ * refactor(useBottomSheet): ์์ํ * [Feature] - ์ ํ ๊ธฐ๋ฅ ๊ตฌํ (#146) * fix(useGetTravelogue): merge ๊ณผ์ ์์ queryFn ์ฌ๋ผ์ง ์ค๋ฅ ์์ * fix(App): ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ๋๋ก ๋ฐ์ง ๋ชปํ๋ ์ค๋ฅ ์์ App ์ด์ธ ๋ค๋ฅธ ํ์ด์ง์์ ์ ์ ์ ๋ณด๋ฅผ ๋ฐ์์ค์ง ๋ชปํ๋ ์ค๋ฅ ํด๊ฒฐ * fix(useGetTravelogue): ๋ฐํํ๋ ๋ฐ์ดํฐ ํํ๊ฐ ๋ฌ๋ผ ๋ฐํ์ ์๋ฌ ๋ฐ์ ํด๊ฒฐ data return ํํ ๋ณ๊ฒฝ * refactor(Header): useContext๋ก ์ ์ ์ ๋ณด๋ฅผ ๋ฐ๋ ๊ฒ์ด ์๋ useUser hook์ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ * feat: ์ฌํ๊ธฐ - ์ฌํ ๊ณํ ๋ณํ ๊ธฐ๋ฅ ๊ตฌํ 1. TravelogueProvider ๊ตฌํ 2. App ๋ด TravelogueProvider ์ถ๊ฐ 3. TransformBottomSheet ๋ด onTransform prop ์ถ๊ฐ 4. TravelogueDetailPage ๋ด onTransform ๋ก์ง ์ถ๊ฐ 5. TravelPlanRegisterPage ๋ด travelogue ๋ฐ์ดํฐ ์ถ๊ฐ 6. useTravelDays ๋ด days ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋๋ก ๋ณ๊ฒฝ * feat: ์ฌํ๊ณํ - ์ฌํ๊ธฐ ์ ํ ๊ธฐ๋ฅ ๊ตฌํ * refactor: ์ฌํ ๊ณํ - ์ฌํ๊ธฐ ๋ณํ ์ ๊ณตํต๋๋ ๋ถ๋ถ์ TransformDetail๋ก ํต์ผ * refactor: ์ฌํ ๊ณํ ๋ณํ ์ title ์ ๊ฑฐ ๋ณํ ์ title์ด ์๋๋ก ๋ณ๊ฒฝ * refactor(TravelogueProvider): import ๋ด type ์ถ๊ฐ * refactor: import ๋ด type ์ถ๊ฐ * refactor(TravelPlanDetailPage): ์ปดํฌ๋ํธ ๋ช ๋ฐ ๋๋ ํฐ๋ฆฌ ๋ณ๊ฒฝ 1. TravelPlansDetail์์ travelPlanDetail๋ก ๋๋ ํฐ๋ฆฌ ๋ณ๊ฒฝ 2. TravelPlanDetailPage๋ก ์ปดํฌ๋ํธ ๋ค์ด๋ฐ ๋ณ๊ฒฝ 3. ๋ณ๊ฒฝ ์ฌํญ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ค์ ๋ฐ์ * refactor(TravelTransformDetailProvider): ์ฌํ ์ ํ ์ ๋ณด ๋ฐ์ดํฐ๋ฅผ TravelTransformDetail๋ก ๋ณ๊ฒฝ 1. type์ TravelTransformPlaces์ TravelTransformDetail๋ก ๋ณ๊ฒฝ 2. TravelTransformDetailProvider๋ก ๋ค์ด๋ฐ ๋ณ๊ฒฝ * refactor: travelogue ํ์ ํ์ผ ๋ด์์ travelTransform์ผ๋ก ๋ถ๋ฆฌ 1. TravelTransformPlaces์ TravelTransformDetail ํ์ ํ์ผ ๋ถ๋ฆฌ 2. ๋ณ๊ฒฝ ์ฌํญ ์ ์ฉ * chore: utils path alias ์ถ๊ฐ * refactor: onTransformTravelDetail context hook ๋ด๋ถ๋ก ์ด๋ * [Feature] - ์ธ๊ฐ ์ฒ๋ฆฌ ์ถ๊ฐ (#176) * refactor(ApiError): Error ์คํํธ๋ ์ด์ค ์์ AxiosError๊ฐ ์๋ custom name์ด ๋ค์ด๊ฐ๋๋ก ๋ณ๊ฒฝ * feat: ์ ์ญ axios interceptor ์ค์ ์ถ๊ฐ 1. request ์ accessToken ํ์ธ ์ฒ๋ฆฌ ๋ฐ authorization header ๋ด access token ์ถ๊ฐ 2. APIError ๋ฐ์ ์ sentry ์คํํธ๋ ์ด์ ์ถ๊ฐ 3. AxiosError๊ฐ ์๋ APIError๋ฅผ throw * feat(TravelPlanRegisterPage): ์ฌํ ๊ณํ ๋ฑ๋ก ํ์ด์ง ๋ด ์ธ๊ฐ ์ฒ๋ฆฌ ์ถ๊ฐ ์ก์ธ์ค ํ ํฐ์ด ์๋ค๋ฉด login ํ์ด์ง๋ก redirect * feat(TravelogueRegisterPage): ์ฌํ๊ธฐ ๋ฑ๋ก ํ์ด์ง ๋ด ์ธ๊ฐ ์ฒ๋ฆฌ ์ถ๊ฐ ์ก์ธ์ค ํ ํฐ์ด ์๋ค๋ฉด login ํ์ด์ง๋ก redirect * refactor(main): sentry init ์ค์ ๋ณ๊ฒฝ * refactor(useGetTravelPlan): accessToken ์ฒ๋ฆฌ ๋ก์ง ์ ๊ฑฐ * feat(usePostUploadImages): ์ด๋ฏธ์ง ์ ๋ก๋์ ๋ํ ์ธ๊ฐ์ฒ๋ฆฌ ์ถ๊ฐ * refactor(interceptor): ErrorResponse์ ๋ํํ์ ์ถ๊ฐ * feat(usePostTravelPlan): ์ฌํ ๊ณํ ์ถ๊ฐ์ ๋ํ ์ธ๊ฐ ์ฒ๋ฆฌ ์ถ๊ฐ * feat(usePostTravelogue): ์ฌํ๊ธฐ ์ถ๊ฐ์ ๋ํ ์ธ๊ฐ ์ฒ๋ฆฌ ์ถ๊ฐ * refactor(interceptor): import type ๋ณ๊ฒฝ * refactor: error response๊ฐ ์๋ ๊ฒฝ์ฐ์ ๋ํ ๋ถ๊ธฐ ์ฒ๋ฆฌ post query ๋ด cors ์๋ฌ์ ๊ฒฝ์ฐ error response๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด์ ๋ํ ๋ถ๊ธฐ ์ฒ๋ฆฌ ์์ ์ ์ํด union ํ์ ์ผ๋ก ์ค์ * [Feature] - ์์ํ ์์ ์งํ (#188) * refactor: route path ์์ํ ์ถ๊ฐ 1. ์ฌํ ๊ณํ, ์ฌํ๊ธฐ์ ๋ํ route path ํํ ๋ณ๊ฒฝ(optional ํํ๋ก id๋ฅผ ๋ฐ๋ ํจ์ ํํ) 2. navigate ํจ์ ๋ด ํ๋ ์ฝ๋ฉ ๋ url ๊ฐ ์์ํ 3. ROUTE_PATHS_MAP์ผ๋ก ๋ณ๊ฒฝ * refactor: storage key ์์ํ * refactor: api endpoint ์์ํ * refactor: status code ๊ด๋ จ map(record) constants ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ * refactor: ์ฟผ๋ฆฌํค ์์ํ * refactor: api endpoint ๋ด detail ๋ค์ด๋ฐ ๋น ์ง ๋ถ๋ถ ์ถ๊ฐ * refactor: ์๋ฌ ๋ฉ์์ง ์์ํ * [Feature] - ํ์ ๊ตฌ์กฐ ๋ณ๊ฒฝ (#191) * refactor: ํ์ ๊ตฌ์กฐ ๋ณ๊ฒฝ 1. travelogue, travelplan, traveltransformdetail์ ๋ํ ํ์ ์ ๊ตฌ๋ถํ๋ ๊ฒ์ผ๋ก ๋ณ๊ฒฝ 2. ๋ณ๊ฒฝ ์ฌํญ ์ ์ฉ(useTravelogueDays, useTraveloguePlanDays ๋ถ๋ฆฌ) 3. DayContent ์ ๊ฑฐ ํ TravelogueDayAccordion, TravelPlanDayAccordion๊ฐ๊ฐ ์ถ๊ฐ * fix: ์ถฉ๋ ๋ ๋ถ๋ถ ์์ * refactor: DayAccordion๋ค์ ๋ํ interface ๋ถ๋ฆฌ ๊ฐ๊ฐ TravelPlanDayAccordionProps๊ณผ TravelPlanDayAccordionProps๋ก ๋ถ๋ฆฌ * [Feature] - ์ฌํ๊ธฐ ๋ฌดํ ์คํฌ๋กค ๊ด๋ จ ํ ์คํธ ์ถ๊ฐ (#166) * refactor(prettier): queries import order ์์ * fix(jest.config.js): msw๊ฐ ์คํ๋์ง ์๋ ๋ฌธ์ ํด๊ฒฐ setupFilesAfterEnv ๋ด jest-setup.ts ์ถ๊ฐ * test(mainPage): ์ฌํ๊ธฐ ๋ฌดํ ์คํฌ๋กค ํ ์คํธ ๋ก์ง ์ถ๊ฐ 1. ๋ฌดํ์คํฌ๋กค ๊ด๋ จ ํธ๋ค๋ฌ ์ถ๊ฐ 2. ์ฌํ๊ธฐ mock ๋ฐ์ดํฐ ์ถ๊ฐ 3. useInfiniteTravelogue๋ฅผ renderHook์ผ๋ก wrappingํ hook ์ถ๊ฐ(createInfiniteTravelogueHook) 4. ํ ์คํธ ๋ก์ง ์ถ๊ฐ * fix(useGetTravelogue): queryFn ๋ณ๊ฒฝ * [Feature] - ๋ชจ๋ฌ ์ปดํฌ๋ํธ ๊ตฌํ (#200) * fix: ์ฌํ ์ ํ ํ ๋ค๋ฅธ ํ์ด์ง์์ ๋ค์ ๋ฑ๋ก ํ์ด์ง๋ก ์ ๊ทผ ์ ๋ฐ์ดํฐ๊ฐ ๋จ์์๋ ๋ฌธ์ ํด๊ฒฐ (#207) ํ์ด์ง๋ฅผ ๋ฒ์ด๋๋ฉด transformDetail๋ฅผ null๋ก ๋ณ๊ฒฝ * [Fix] - ๋ฑ๋ก ํ์ด์ง์์ ์ ๋ชฉ๊ณผ ์ฌํ ์ฅ์ ์ค๋ช ๋ ํ๊ธ ์ ๋ ฅ์ ์ ํ ๊ธธ์ด๋ณด๋ค 1์ ๋ ์ ๋ ฅ๋๋ ๋ฌธ์ ํด๊ฒฐ (#210) * fix(TravelogueRegisterPage): ํ๊ธ ์ ๋ ฅ์ 21์๊น์ง ์ ๋ ฅ๋๋ ์ค๋ฅ ํด๊ฒฐ * fix(TravelPlanRegisterPage): ํ๊ธ ์ ๋ ฅ์ 21์๊น์ง ์ ๋ ฅ๋๋ ์ค๋ฅ ํด๊ฒฐ * fix(useTravelogueDays): ์ฅ์ ์ค๋ช ๋ ํ๊ธ ์ ๋ ฅ์ 301์๊น์ง ์ ๋ ฅ๋๋ ์ค๋ฅ ํด๊ฒฐ * fix(useTravelPlanDays): ์ฅ์ ์ค๋ช ๋ ํ๊ธ ์ ๋ ฅ์ 301์๊น์ง ์ ๋ ฅ๋๋ ์ค๋ฅ ํด๊ฒฐ * [Feature] - Login ๋ช ์ธ ๋ณ๊ฒฝ (#181) * refactor(KakaoCallbackPage): http method๋ฅผ get์ผ๋ก ๋ณ๊ฒฝ * refactor(KakaoCallbackPage): encoding๋ redirect-uri params์ ์ถ๊ฐ * fix: ๋ก๊ทธ์ธ ๋ช ์ธ ๋ณ๊ฒฝ 1. http method post๋ก ๋ณ๊ฒฝ 2. params์ ์ถ๊ฐํ๋ ๊ฒ์ด ์๋ url๋ด code ๋ฐ redirectUri ์ถ๊ฐ * fix: ci ์คํจ ํ๋ ์์ธ ์์ 1. api endpoint map ๋ด loginOauth ์์ 2. KakaoCallbackPage ๋ด ๋ฐ์ --------- Co-authored-by: simhorim <[email protected]> * [Feature] - ๋ฉ์ธํ์ด์ง skeleton ์์ (#221) * feat: TravelogueCardSkeleton ์ปดํฌ๋ํธ ๊ตฌํ * test: TravelogueCardSkeleton storybook ์ถ๊ฐ * feat: ๋ฉ์ธ ํ์ด์ง์ skeleton UI ์ถ๊ฐ * feat: ์ค์ผ๋ ํค ์ปดํฌ๋ํธ์ key ์ถ๊ฐ * fix: styled ์ปดํฌ๋ํธ ์ด๋ฆ ์ปจ๋ฒค์ ์ ๋ง๋๋ก ์์ * fix: styled ์ปดํฌ๋ํธ ์ด๋ฆ ์ปจ๋ฒค์ ์ ๋ง๋๋ก ์์ * [Feature] - Drawer๊ฐ ์ด๋ ค์ ธ์๋ ๊ฒฝ์ฐ ํ๋ฉด ์คํฌ๋กค ์๋๋๋ก ์์ (#222) * feat: Drawer๊ฐ ์ด๋ ค์ ธ์๋ ๊ฒฝ์ฐ ํ๋ฉด ์คํฌ๋กค ์๋๋๋ก ์์ * refactor: Drawer์์ DrawerProvider๋ฅผ contexts๋ก ๋ถ๋ฆฌ * refactor: useModalControl ํ ์ ์ด์ฉํ์ฌ ๋ฆฌํฉํ ๋ง * [Feature] - user ์ปจํ ์คํธ์ access token๋ง ๋ด๋๋ก ์์ & ๋ก๊ทธ์ธ/๋ก๊ทธ์์ ๋ฒํผ ์์ (#224) * feat: useUserProfile ํ ๊ตฌํ Co-Authored-By: eunjungL <[email protected]> * refactor: UserProvider์ accessToken๋ง ์ ์ฅํ๋๋ก ์์ * feat: ์นด์นด์ค ๋ก๊ทธ์ธ์ accessToken๋ง ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ์ฅํ๋๋ก ์์ * fix: Header์ Drawer์ ๋ก๊ทธ์ธ/๋ก๊ทธ์์ ๋ฒํผ ๋ณํ๋๋ก ์์ * feat: ๋ก๊ทธ์์ ๊ตฌํ --------- Co-authored-by: eunjungL <[email protected]> * [Feature] - ์ฌํ ๊ณํ ๋ฑ๋ก ๊ธฐ๋ฅ ๋ณ๊ฒฝ & ํ ์คํธ ์ถ๊ฐ (#225) * chore: react-datepick ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๊ฑฐ * feat: useCalendar hook ๊ตฌํ * feat: useClickAway hook ๊ตฌํ * feat: Calendar ์ปดํฌ๋ํธ ๊ตฌํ * test: ์บ๋ฆฐ๋ ์ปดํฌ๋ํธ ์คํ ๋ฆฌ๋ถ ์ถ๊ฐ * feat(TravelPlanRegisterPage): ์บ๋ฆฐ๋ ์ปดํฌ๋ํธ ํ์ด์ง ๋ด ์ฐ๊ฒฐ * fix: ์ฌํ ๊ณํ ๋ฐ ์ฌํ๊ธฐ ์์ฝ๋์ธ์ ์ฐ ์ํ์์ ์ญ์ ์ ๋ง์๋๋ก ์ด๋ฆฌ๊ณ ๋ซํ๋ ๋ฌธ์ ์์ value๊ฐ ๋ฐฐ์ด index๋ก ๋์ด์์ด ์ญ์ ํ ๋ ์ธ๋ฑ์ค ๊ฐ์ด ์์ ๋์ด ๋ฐ์ํ๋ ๋ฌธ์ ์ด๋ฏ๋ก place ๋ฐ day๋ฅผ ์ถ๊ฐํ ๋ uuid๋ฅผ id๋ก ํ์ฌ ์ถ๊ฐํ๋๋ก ๋ณ๊ฒฝ * refactor(useTravelPlanDays): onChangePlaceDescription ํจ์ ํ๋ผ๋ฏธํฐ ๋ณ๊ฒฝ event๋ฅผ ๋ฐ๋ ๊ฒ์ด ์๋ description์ ๋ฐ๋๋ก ๋ณ๊ฒฝ * test(travelPlanRegisterPage): ์ฌํ ๊ณํ ๋ฑ๋ก ํ์ด์ง ํ ์คํธ ๊ตฌํ 1. ์ฌํ ๊ณํ ๋ฑ๋ก msw ํธ๋ค๋ฌ ์ถ๊ฐ 2. usePostTravelPlan๋ฅผ wrappingํ createTravelPlanRegisterHook ์ถ๊ฐ 3. ์ฌํ ๊ณํ ๋ฑ๋ก ํ์ด์ง ํ ์คํธ ์ฝ๋ ๊ตฌํ * refactor: px๋จ์ rem์ผ๋ก ๋ณ๊ฒฝ * refactor: StartDate๋ฅผ StartDateLabel๋ก ๋ค์ด๋ฐ ์์ * [Feature] - ์ฌํ ๊ณต์ ํ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ (#226) * feat: ๊ฐ๋ฐ ํ๊ฒฝ์์ browser ๋ชจํน ๊ฐ๋ฅํ๋๋ก ์ค์ * feat: travelPlan mock ๋ฐ์ดํฐ ์ถ๊ฐ * chore: prettier import ์์ ์ถ๊ฐ(contexts, utils) * refactor: url์์ id ๋ถ๋ฆฌํ๋ ์ ํธํจ์ ์ถ๊ฐ * refactor: ์ฌํ๊ธฐ, ์ฌํ ๊ณํ endpoint ๋ด id type์ string์ผ๋ก ๋ณ๊ฒฝ * feat: uuid ๊ฒ์ฆ ํจ์ ๋ฐ ์ ๊ท ํํ์ ์ถ๊ฐ * feat: ํ ์คํธ ํ๊ฒฝ/๋ธ๋ผ์ฐ์ ํ๊ฒฝ ๊ตฌ๋ถํ๊ธฐ ์ํ ๋ณ์ ์ถ๊ฐ * refactor(travelogueInfinteHandler): ํ๊ฒฝ์ ๋ฐ๋ผ request url ๋ค๋ฅด๊ฒ ์ค์ ํ๋๋ก ๋ณ๊ฒฝ * feat: ์ฌํ ๊ณํ mock ํธ๋ค๋ฌ ์ถ๊ฐ * refactor(travelPlan.json): ์ฌํ ๊ณํ ๋ฐ์ดํฐ ๋ด shareKey ์ถ๊ฐ * refactor(travelPlanHandler): 404 httpResponse statusText ๋ณ๊ฒฝ * refactor(usePostTravelPlan): mutationFn variable type ์์ shareKey๋ฅผ ๋บ ํ์ ์ธ TravelPlanPayload ํ์ ์ถ๊ฐ * feat(asset): icon ์ถ๊ฐ * feat(ShareModal): ๊ณต์ ๋ชจ๋ฌ ๊ตฌํ * feat: url ๋ณต์ฌ๋ฅผ ์ํ ํจ์ ๊ตฌํ copyLinkToClipboard ๊ตฌํ * refactor(ROUTE_PATHS_MAP): travelogue ๋ฐ travelPlan์ id variable ํ์ ๋ณ๊ฒฝ uuid์ id ๋ชจ๋ ๋ฐ์ ์ ์๋๋ก ํ์ ๋ณ๊ฒฝ * refactor(colors): green ์ปฌ๋ฌ theme ๋ด ์ถ๊ฐ toast ๊ตฌํ์ ์ํ green ์ปฌ๋ฌ PRIMITIVE_COLORS ๋ด ์ถ๊ฐ * feat: Toast ์ปดํฌ๋ํธ ๊ตฌํ * test: Toast ์ปดํฌ๋ํธ ์คํ ๋ฆฌ๋ถ ์ถ๊ฐ * refactor(Input): forwardRef ์ถ๊ฐ input ๋ด ref๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ์ปดํฌ๋ํธ ๋ด forwardRef wrapping * feat(main): main.tsx ๋ด ToastProvider ์ถ๊ฐ * feat: ๊ณต์ ํ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ 1. ShareModal ๋ด ๋ณต์ฌ ์ toast ์ถ๊ฐ 2. endpoint ์ถ๊ฐ ๋ฐ ๋ณ๊ฒฝ 3. TravelPlanPage ๋ด shareModal ์ฐ๊ฒฐ ๋ฐ icon button(๊ณต์ , ๋๋ณด๊ธฐ) ์ถ๊ฐ * test(Modal): ๋ณต์ฌํ๊ธฐ ๊ธฐ๋ฅ Modal ์ปดํฌ๋ํธ ๋ด ์ถ๊ฐ * refactor(Toast): gap ๋ด spacing ์ ์ฉ * refactor(endpoint): ์ฌํ ๊ณํ ์์ธ ๋ฐ ๊ณต์ ๋ ์ฌํ ๊ณํ ์์ธ prefix(/) ์ถ๊ฐ * refactor: extractId ํจ์ ๊ฐ์ * [Feature] - ๏ฟฝ์ฌํ ๊ณํ & ์ฌํ๊ธฐ ์ญ์ ๊ธฐ๋ฅ ๊ตฌํ (#229) * feat(Dropdown): ์ปดํฌ๋ํธ ๊ตฌํ * test(Dropdown): ์คํ ๋ฆฌ๋ถ ํ ์คํธ ๊ตฌํ * feat(svg-icons): ๋ฐ์ดํฐ ์ถ๊ฐ * feat(useDeleteTravelogue): mutation ํ ๊ตฌํ * feat(useDeleteTravelPlan): mutation ํ ๊ตฌํ * feat(TravelogueDeleteModal): ์ปดํฌ๋ํธ ๊ตฌํ * feat(TravelPlanDeleteModal): ์ปดํฌ๋ํธ ๊ตฌํ * feat(TravelogueDetailPage): Text ์ปดํฌ๋ํธ๋ก ์์ ๋ฐ ๋ถํ์ํ css ์ ๊ฑฐ, Dropdown ๊ธฐ๋ฅ ์ถ๊ฐ * feat(TravelPlanDetailPage): Dropdown ๊ธฐ๋ฅ ์ถ๊ฐ * refactor(Button): ๊ฐํ ์์ * refactor(Dropdown): ์คํ ๋ฆฌ๋ถ ์์ * refactor(Dropdown): ์๋ฏธ์ ๋ช ํ์ฑ์ ์ํด css ๊ฐ์ผ๋ก ๋ณ๊ฒฝ * refactor(Dropdown): import type์ผ๋ก ์์ * refactor(index): Dropdown, Modal index์์ ํธ์ถํ๋๋ก ์์ * refactor(TravelogueDetailPage): style ์์ฑ์ css๋ก ์ผ๊ด์ฑ ์๊ฒ ๋ณ๊ฒฝ, spacing ์ถ๊ฐ ๋ฐ ์๋ฏธ์ ๋ช ํ์ฑ์ ์ํ isOpen ๋ฐ์์ ๋ณด์ด๋๋ก ์์ * refactor(TravelPlanDetailPage): style ์์ฑ์ css๋ก ์ผ๊ด์ฑ ์๊ฒ ๋ณ๊ฒฝ, spacing ์ถ๊ฐ ๋ฐ ์๋ฏธ์ ๋ช ํ์ฑ์ ์ํ isOpen ๋ฐ์์ ๋ณด์ด๋๋ก ์์ * refactor(TravelogueDeleteModal): style ์์ฑ์ css๋ก ์ผ๊ด์ฑ ์๊ฒ ๋ณ๊ฒฝ * refactor(TravelPlanDeleteModal): style ์์ฑ์ css๋ก ์ผ๊ด์ฑ ์๊ฒ ๋ณ๊ฒฝ * refactor: title๊ณผ subtitle์ด ๋ฐ๋์ด์๋ ๋ถ๋ถ ์์ --------- Co-authored-by: แแ ฉแซแแ ตแซแแ งแผ <[email protected]> * [Feature] - ๋ง์ด ํ์ด์ง ๊ตฌํ (#236) * feat: Tab ์ปดํฌ๋ํธ์ ์๋ก๊ณ ์นจํด๋ ์ ํ๋ tab ๊ทธ๋๋ก์ด๋๋ก ์์ * feat: AvatarCircle์ medium ์ฌ์ด์ฆ ์ถ๊ฐ * test: AvatarCircle์ medium ์ฌ์ด์ฆ storybook ์ถ๊ฐ * feat: ๋ง์ดํ์ด์ง route ์ค์ * feat: Header Drawer์ ๋ง์ดํ์ด์ง route ์ฒ๋ฆฌ * feat: ๋ง์ดํ์ด์ง tab content์์ ์ฌ์ฉ๋ TabContent ์ปดํฌ๋ํธ ๊ตฌํ * fix: Tab ์ปดํฌ๋ํธ unmount ๋ ๋ ์ ํ๋ ํญ์ด ์ฒซ๋ฒ์งธ ํญ์ด ๋๋๋ก ์์ * style: ํ์์๋ ์ฃผ์ ์ญ์ * refactor: Tab ์ปดํฌ๋ํธ์ ์๋ก๊ณ ์นจํ ๋ ์ฒ์ ๋ฒํผ์ผ๋ก ๋์๊ฐ๋ค๊ฐ ์ต๊ทผ๊ป๋ก ๋ณด์ด๋๊ฑฐ ์์ * feat: useInfiniteMyTravelPlans ๊ตฌํ * fix: renderItem type ์์ * feat: ๋ ์ง ๋ฌธ์์ด์ ์ซ์๋ก ์ผ์ ๋ํด์ฃผ๋ util ํจ์ ๊ตฌํ * fix: TravelPlanDetail ํ์ด์ง๋ฅผ useGetTravelPlan ๋ฐํ ํ์ ์ ๋ง์ถฐ ์์ * feat: MyTravelPlans ์ปดํฌ๋ํธ ๊ตฌํ * feat: MyTravelogues ์ปดํฌ๋ํธ ๊ตฌํ * feat: ๋ง์ด ํ์ด์ง ๊ตฌํ * fix: ์ฐ์ง ์๋ ๋ณ์๋ค ์ญ์ * fix: type ์ด๋ฆ ์์ * fix: ์ฌํ๊ธฐ ๋ฑ๋กํ์ด์ง์์ type ๋ง์ถฐ์ ์์ * refactor: Tab ์ปดํฌ๋ํธ ์์ ๋ถ๋ฆฌ * refactor: state ์ด๊ธฐ๊ฐ์ localStorage์์ ๊ฐ์ ธ์ค๋๋ก ์์ * style: border css ์์ ์์ * style: ์์ ์ฝ๋ ํ๋์ฝ๋ฉ ๋์ ๋์์ธ ํ ํฐ๊ฐ ์ฌ์ฉ * refactor: MyPage์์ ํ์์๋ useEffect ์ ๊ฑฐ * style: font-weight๊ฐ ์์ * style: ๊ธด css๋ฅผ styled.ts๋ก ๋ถ๋ฆฌ * refactor: TabContent ์ปดํฌ๋ํธ ์ด๋ฆ์ MyPageTapContent๋ก ์์ * refactor: MyTravelogue ํ์ ์ typesํด๋๋ก ์ด๋ * refactor: MyPageTabContent์ props๋ช ์์ * refactor: queries์์ try catch ์ ๊ฑฐ * refactor: data ํํํ๋ฅผ select๋ก ๋ฆฌํฉํ ๋ง * fix: useGetTravelPlan์์ id string๋ง ๋ฐ๋๋ก ์์ --------- Co-authored-by: แแ ฉแซแแ ตแซแแ งแผ <[email protected]> * [Fix] - 3์ฐจ ์คํ๋ฆฐํธ QA ๋ฐ์(๋ฆฌ๋ฒ) (#255) * feat: ์ฌํ ๊ณํ ์์ธ ํ์ด์ง ๋ด์์ ๋ก๊ทธ์์ ํ์ ๋, ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ํ ์ ์๋๋ก ์์ * fix: Tab ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ selected index๋ก ๊ฐ ์ด๊ธฐํ ์๋๋ ์ด์ ์์ * fix: ์ฌํ๊ณํ ์์ธํ์ด์ง, ๋ง์ดํ์ด์ง์์ ๋ก๊ทธ์์ ํ ์, ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ํ๋๋ก ์์ * style: Drawer์ z-index๊ฐ transformbottomsheet๋ณด๋ค ๋๋๋ก ์์ * fix: ์ฌํ๊ธฐ,์ฌํ๊ณํ ์ญ์ ์ ๋ฌดํจํ ์ถ๊ฐ, ์ฌํ๊ธฐ ์์ฑ์ ๋ฌดํจํ ์ถ๊ฐ * fix: ๋ฉ์ธ ํ์ด์ง์์ ์ฌํ๊ธฐ ์์ฑ์๋ค ํ๋กํ ์ด๋ฏธ์ง ๋ณด์ด๋๋ก ์์ * style: zIndex ๋์์ธ ํ ํฐ ์ถ๊ฐ ๋ฐ ์ ์ฉ * feat: Spinner ์ปดํฌ๋ํธ ๊ตฌํ - Icon ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ คํ์ผ๋, Icon ์ปดํฌ๋ํธ ์ฌ์ฉ์ ๋๋ฆฌ ๋์ด ์ฌ๋ผ์ง๋ ์ด์๊ฐ์์ด์ ์ฌ์ฉํ์ง ์์์ต๋๋ค * test: Spinner storybook ์ถ๊ฐ * feat: LoginFallback ์ปดํฌ๋ํธ ๊ตฌํ ๋ฐ ์ ์ฉ * test: LoginFallback storybook ์ถ๊ฐ * feat: ์ฌํ ๊ณํ ์์ธ ํ์ด์ง์ ๋ ์ง ์ ๋ณด ์ถ๊ฐ * fix: Tab ์ปดํฌ๋ํธ์ day๊ฐ 3๊ฐ์ผ ๋ ํญ๋ฒํผ ๊ฐ๋ก ๋์ด ์๋ชป ์ค์ ๋๋๊ฑฐ ์์ * fix: api ๋ช ์ธ ์์ ์ ๋ฐ๋ผ์ ์์ * style: drawerOverlay ๋ฐ๋ก ์ถ๊ฐ * [Fix] - 3์ฐจ ์คํ๋ฆฐํธ QA ๋ฐ์(์ง๋) (#256) * fix(TravelPlanDetailPage): ๊ณต์ url ์ ๊ทผ์ ๋ํ ๋๋ณด๊ธฐ ๋ฒํผ ๋ถ๊ธฐ ์ฒ๋ฆฌ ์ถ๊ฐ * fix(TravelogueDetailPage): ๋ฐํ์ ์๋ฌ ๋ฐ์ ํด๊ฒฐ TravelogueTabContent ๋ด places์ ์ต์ ๋ ์ฒด์ด๋ ์ถ๊ฐ * fix(TravelPlanRegisterPage): ์๋ฌด๊ฒ๋ ์ ๋ ฅํ์ง ์๊ณ ๋ฑ๋ก์ ๋๋ ์ ๋ ์๋ฌด ๊ฒ๋ ์ฒ๋ฆฌ๋์ง ์๋ ๋ฌธ์ ํด๊ฒฐ startDate๊ฐ ์์ ๊ฒฝ์ฐ ๋น ๋ฌธ์์ด๋ก request ๋ ๋ฆฌ๋๋ก ๋ณ๊ฒฝ * fix(TravelPlanRegisterPage): handleAddTravelPlan๋ฅผ mutate๊ฐ ์๋ mutateAsync๋ก ๋ณ๊ฒฝ mutateAsync๋ก ์ธํด ๋ฐํ์ ์๋ฌ ๋ฐ์ํ๋ ๋ถ๋ถ ํด๊ฒฐ * fix(MyPage): ๋ก๊ทธ์ธ ์์ด ๋ง์ดํ์ด์ง๋ก ์ ๊ทผํ ๊ฒฝ์ฐ 2๋ฒ alert๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ํด๊ฒฐ * fix(TravelogueDetailPage): ์ฌํ๊ธฐ ์์ธ ํ์ด์ง ๋ด ์์ฑ์ ๋ฐ ์์ฑ ์ผ์ ์ถ๊ฐ * fix(TravelogueRegisterPage): TravelogueDayAccordion ๋ด key๋ฅผ id ๊ฐ์ผ๋ก ๋ณ๊ฒฝ * feat: ์ฌํ๊ธฐ ์์ธํ์ด์ง ๋ด ์ค์ผ๋ ํค ์ถ๊ฐ 1. GoogleMapLoadScript์์ loadingElement๋ฅผ props๋ก ๋ฐ๋๋ก ๋ณ๊ฒฝ 2. Skeleton ์ปดํฌ๋ํธ ๊ตฌํ 3. ์ฌํ๊ธฐ ์์ธ ์ค์ผ๋ ํค ์ปดํฌ๋ํธ ๊ตฌํ 4. ์ฌํ๊ธฐ ์์ธ ํ์ด์ง์ ์ค์ผ๋ ํค ๋ฐ์ * refactor(Skeleton): ์คํ์ผ ํ์ผ ๋ถ๋ฆฌ * feat: ์ฌํ ๊ณํ ํ์ด์ง ๋ด ์ค์ผ๋ ํค ui ์ถ๊ฐ * feat: ๋ง์ดํ์ด์ง ๋ด ์ค์ผ๋ ํค ui ์ ์ฉ * fix: ์ฌํ๊ธฐ & ์ฌํ ๊ณํ ๋ฑ๋ก ํ์ด์ง ๋ด ๊ตฌ๊ธ ๊ฒ์ ui loading ๊ฐ์ * fix(TravelPlanDetailPage): ์ฌํ ๊ณํ ์์ธ ํ์ด์ง ๋ด ์์ฑ์๊ฐ ์๋ ๊ฒฝ์ฐ ๋ค๋ก ๊ฐ๋๋ก ์ฒ๋ฆฌ * fix(TravelPlanDetailPage): ๋ฐํ์ ์๋ฌ ํด๊ฒฐ ์ต์ ๋ ์ฒด์ด๋ ์ถ๊ฐ * fix(interceptor): ๋ง๋ฃ๋ ํ ํฐ์ ๋ํ ์ฒ๋ฆฌ ์ถ๊ฐ * refactor: ์์ฝ๋์ธ์ ๊ธฐ๋ณธ ์ํ๊ฐ ์ด๋ ค์๋๋ก ๋ณ๊ฒฝ * fix(interceptor): access token ์์ ์ ์ธ์ฆ ํค๋์ ๋น ๊ฐ์ ๋ณด๋ด๋๋ก ๋ณ๊ฒฝ * [Feature] - sentry ์ด๊ธฐ ์ค์ ๋ณ๊ฒฝ & ์์ค๋งต ์ค์ ์ถ๊ฐ (#261) * chore(main): dev ํ๊ฒฝ์์๋ง sentry๊ฐ ๋์ํ๋๋ก ๋ณ๊ฒฝ * chore: @sentry/webpack-plugin ์์กด์ฑ ์ถ๊ฐ * chore: webpack ์ค์ ํ์ผ ๋ด sourcemap ๊ด๋ จ ์ค์ ์ถ๊ฐ * [Fix] - 3์ฐจ ์คํ๋ฆฐํธ QA ๋ฐ์(์๋ชจ) (#262) * refactor(FloatingButton): ๋ถ ํ์ํ ๋ฒํผ๋ค ์ ๊ฑฐ * refactor(Dropdown): dropdown ์ธ๋ถ ํด๋ฆญ์ ๋ซ์น๋๋ก ์์ * refactor(travelogue): ํ์ ์์ * refactor(user): ๊ธ ์์ฑ์์ธ์ง ํ์ ํ๊ธฐ์ํด์ memberId ๋ฅผ ์ ์ญ์ผ๋ก ๊ด๋ฆฌํ๋๋ก ์์ * fix: ์ญ์ ์ ์ฟผ๋ฆฌ ์บ์ฑ ์ต์ ํ๋์ง ์๋ ๋ฌธ์ , error ๊ฐ์ฒด ๊ทธ๋๋ก ๋ฐํํ๋ ๋ฌธ์ , ๊ทธ๋ฆฌ๊ณ navigation route ์์ * fix: ์ญ์ ์ ์ฟผ๋ฆฌ ์บ์ฑ ์ต์ ํ๋์ง ์๋ ๋ฌธ์ ํด๊ฒฐ * fix(TravelogueDetailPage): ci ๋ฌธ์ ํด๊ฒฐ --------- Co-authored-by: แแ ฉแซแแ ตแซแแ งแผ <[email protected]> * [Feature] - ๋ฐฐํฌํ ์๋น์ค๋ฅผ ๋ชจ๋ํฐ๋ง ํ๋ ๋๊ตฌ GA ์ธํ (#263) * chore: react-ga4 ์ค์น * feat(main): ga4 init * chore: ์ ํ ๋ฒํผ ํด๋ฆญ ์ ์ด๋ฒคํธ ์ง๊ณํ๋๋ก ์ค์ --------- Co-authored-by: แแ ฉแซแแ ตแซแแ งแผ <[email protected]> * [Fix] - ํ Day ๋ด ์ค๋ณต๋ ์ฅ์ ์ด๋ฆ์ด ์กด์ฌํ ๊ฒฝ์ฐ ๊ฒ์๋ฌผ์ด ์ง์์ ์ผ๋ก ์๊ธฐ๋ ๋ฌธ์ ํด๊ฒฐ (#266) * fix(TravePlansTabContent): ํ Day ๋ด ์ค๋ณต๋ ์ฅ์ ์ด๋ฆ์ด ์กด์ฌํ ๊ฒฝ์ฐ ๊ฒ์๋ฌผ์ด ์ง์์ ์ผ๋ก ์๊ธฐ๋ ๋ฌธ์ ํด๊ฒฐ ์ค๋ณต๋ key๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์ ์ด๋ฏ๋ก ๊ณ ์ ํ ๊ฐ์ธ id๋ก ๋ณ๊ฒฝ * fix: ์๋ชป๋ key prop ํด๊ฒฐ 1. calendar์ key๋ฅผ index๊ฐ ์๋ date ๊ฐ์ผ๋ก ๋ณ๊ฒฝ 2. CarouselImageItem์ key๋ฅผ imageUrl๋ก ๋ณ๊ฒฝ 3. TravelogueTabContent์ key๋ฅผ place id๋ก ๋ณ๊ฒฝ * [Fix] - 3์ฐจ ์คํ๋ฆฐํธ QA ๋ฐ์ 2์ฐจ (๋ฆฌ๋ฒ) (#276) * style: ํ๋กํ ์ด๋ฏธ์ง ๋ฉ์ํ๊ฒ ๋ณด์ด๋๊ฒ ์์ * style: Drawer์์ ํด๋ฆญ๋์ง ์๋ ๋ถ๋ถ์ ๋ง์ฐ์ค ์ปค์ pointer์ด๋๊ฒ ์์ * feat: Drawer์ ๋ฉ์ธ ํ์ด์ง๋ก ์ด๋ํ๋ ํ ๋ฒํผ ์ถ๊ฐ * [Fix] - 3์ฐจ ์คํ๋ฆฐํธ QA ๋ฐ์ 2์ฐจ (์๋ชจ) (#275) * fix: ์ญ์ ์ดํ ๋ง์ด ํ์ด์ง๋ก ๋์์์ ๋ ์บ์ ์ต์ ํ ๋์ง์๋ ๋ฌธ์ ํด๊ฒฐ * fix(useGetTravelogue): retry 3ํ๋ก ์ง์ฐ๋๋ ํ์ ํด๊ฒฐ * fix: ์กด์ฌํ์ง ์๋ ์์ธ ์กฐํ์ alert ๋์ฐ๊ณ ํ์ด์ง ๋ค๋ก ์ด๋ํ๋๋ก ์์ * refactor(TransformBottomSheet): IconButton์ผ๋ก ์์ , ๋ถ ํ์ํ css ์ ๊ฑฐ ๋ฐ up-arrow layout์ ๋ถ์ ๋ฌธ์ ํด๊ฒฐ * [Fix] - 3์ฐจ ์คํ๋ฆฐํธ QA ๋ฐ์ 2์ฐจ (์ง๋) (#280) * fix: ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์บ๋ฆฐ๋ ๋ฐ์ค ๋ณด์ด๋ ๋ฌธ์ ํด๊ฒฐ meta tag ์ถ๊ฐ * fix(TravelPlansTabContent): ์ฌํ ์์ธ ํ์ด์ง ๋ด ๋ง์ง๋ง ์์๊ฐ ๋ฐํ ์ํธ๋ก ์ธํด ๋ณด์ฌ์ง์ง ์๋ ๋ฌธ์ ํด๊ฒฐ * refactor(TravelPlansTabContent): ์ฌํ ๊ณํ ๋ด description ์ถ๊ฐ * fix(TravelogueMultiImageUpload): ์ฅ์ ๋ณ ์ฌ์ง 10์ฅ ์ดํ๋ก ์ ๋ก๋ ๊ฐ๋ฅํ๋๋ก ๋ณ๊ฒฝ * refactor(GoogleMapView): ๋ง์ปค ๋ด ์์ ํ์ ํ ์คํธ ์ถ๊ฐ * fix(Calendar): key prop ๋ณ๊ฒฝ * refactor(TravelPlanRegisterPage): ์ฃผ์ ์ฒ๋ฆฌ ๋ ๋ถ๋ถ ์์ * refactor: ๋ง์ปค ์์ ๋ณ๊ฒฝ & ์ฌํ๊ธฐ ์์ธ ํ์ด์ง title & subtitle ์์ ๋ณ๊ฒฝ (#283) * refactor: ๋ง์ปค ์์ ๋ณ๊ฒฝ * refactor(TravelogueDetailPage): ์ฌํ๊ธฐ ์์ธ ํ์ด์ง title, subtitle ์์ * [Fix] - ๋ง๋ฃ๋ access token ํธ๋ค๋ง (#292) * fix(interceptor): ๋ง๋ฃ ํ ํฐ ์๋ฌ ์ early return ํ์ฌ error๋ฅผ throw ํ์ง ์๋๋ก ๋ณ๊ฒฝ * fix: onSuccess callback ๋ด์์ ๊ตฌ์กฐ ๋ถํด ํ ๋น์ ํ์ง ์๋๋ก ๋ณ๊ฒฝ * refactor: ์์ ui ์ ๊ฑฐ * [Fix] - ์ญ์ ๋ฐ ๋ฑ๋ก ์ ์ฌ๋ฌ๋ฒ ์์ฒญํ์ง ๋ชปํ๊ฒ ์์ (#295) * feat(useLeadingDebounce): ์ ํ ๋๋ฐ์ด๋ ํ ๊ตฌํ * fix: ์ญ์ ๋ฐ๋ณต ์์ฒญํ์ง ์๋๋ก ์์ * fix: ๋ฑ๋ก ๋ฐ๋ณต ์์ฒญํ์ง ์๋๋ก ์์ * refactor(useLeadingDebounce): ๋ ๋๋ง๊ณผ ๋ฌด๊ดํ๊ธฐ์ useState ์์ useRef๋ก ์์ * [Feature] - refresh token ํด๋ผ์ด์ธํธ ๋ด ์ ์ฉ (#307) * feat: ๋ฆฌํ๋ ์ ํ ํฐ ์ถ๊ฐ 1. ๋ก๊ทธ์์ ์ refresh token empty string์ผ๋ก ๋ณ๊ฒฝ 2. ๋ก๊ทธ์ธ ์ refresh token localstorage ๋ด ์ถ๊ฐ 3. AuthTokenResponse ๋ด refreshToken ์ถ๊ฐ * feat: ๋ฆฌํ๋ ์ ํ ํฐ ํด๋ผ์ด์ธํธ ๋ด ์ ์ฉ 1. handleAPIError ๋ด 401 ์๋ฌ ์ access token ์ฌ๋ฐ๊ธ ๋ก์ง ์ถ๊ฐ 2. ๋ฆฌํ๋ ์ ํ ํฐ ๋ง๋ฃ ์ logout ๋ก์ง ์ถ๊ฐ * [Feature] - TravelogueCard ์ปดํฌ๋ํธ ๋ฆฌํฉํฐ๋ง (#314) * refactor(svg-icons): empty-heart ์์ด์ฝ ๋ณ๊ฒฝ * refactor: travelogue mock data ์์ * refactor(travelogue): TravelogueRepsonse ํ์ ๋ณ๊ฒฝ ํ์ฌ ๋ช ์ธ์ ๋ง๊ฒ ๋ณ๊ฒฝ * test(TravelogueCard): likes ํ๋๋ฅผ likeCount๋ก ๋ณ๊ฒฝ * refactor: TravelogueCard ui ํํ ๋ฆฌํฉํฐ๋ง * refactor: ์ฌํ๊ธฐ mock data ์ถ๊ฐ * refactor: TravelogueOverview ํ์ ์ ๊ฑฐ TravelogueResponse ํ์ ์ Pick ํ๋ ํํ๋ก ๋ณ๊ฒฝ * [Feature] - Input ์ปดํฌ๋ํธ ๋ฆฌํฉํ ๋ง (#310) * feat: Input ์ปดํฌ๋ํธ์ variants ์ถ๊ฐ - border bottom์ด ์๋ input ์ถ๊ฐ - focus ํ์ ๋๋ง border bottom์ด ์๊ธฐ๋ input ์ถ๊ฐ * test: ์ถ๊ฐ๋ Input storybook ์ถ๊ฐ * fix: ์์ฐ๋ import๋ฌธ ์ญ์ * refactor: InputVariants type ์์ * Fix - image error ์ฒ๋ฆฌ ๋๋ฝ, ์ฌํ๊ธฐ ์ญ์ ์ ๋ง์ดํ์ด์ง๋ก ๋์ด๊ฐ ๋ tab ์ด๊ธฐ๊ฐ ์์ , ์ฌํ๊ธฐ ์ธ๋ค์ผ (#296) * fix: PlaceDetailCard์์ ์ด๋ฏธ์ง ์๋ฌ ํธ๋ค๋ง ์ถ๊ฐ * test: PlaceDetailCard storybook ์ถ๊ฐ * fix: ์ฌํ๊ธฐ ์์ธ ์กฐํ ์ธ๋ค์ผ ๊ฐ์ด๋ฐ๊ฐ ์๋๋ผ ์์ชฝ ๋ณด์ด๋ ์ด์ ์์ * fix: ๋ด ์ฌํ๊ธฐ ์ญ์ ํ ๋ง์ดํ์ด์ง ์ด๋์, tab์ด ๋ด ์ฌํ๊ธฐ๋ก ๊ฐ์๋๋ก ์์ * [Fix] - Icon, Icon Button storybook์์ iconType option ์ ์ฉ๋๋๋ก ์์ (#327) * test: Icon storybook iconType option ์ ์ฉ๋๋๋ก ์์ * test: IconButton storybook iconType option ์ ์ฉ๋๋๋ก ์์ * [Feature] - ์ฌํ ๊ณํ TO DO ๊ธฐ๋ฅ ๊ตฌํ (#333) * feat: asset ์ถ๊ฐ(check) * feat: Checkbox ์ปดํฌ๋ํธ ๊ตฌํ * test(Checkbox): ์คํ ๋ฆฌ๋ถ ์ถ๊ฐ * refactor(Input): label๊ณผ count๊ฐ ์์ ๊ฒฝ์ฐ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋๋ก ๋ณ๊ฒฝ * test: Input ์ปดํฌ๋ํธ ๋ณ๊ฒฝ์ผ๋ก ์ธํ Calendar & Modal ์ปดํฌ๋ํธ ์คํ ๋ฆฌ๋ถ ์ ๋ฐ์ดํธ * feat: PlaceTodoListItem ์ปดํฌ๋ํธ ๊ตฌํ * test: PlaceTodoListItem ์คํ ๋ฆฌ๋ถ ์ถ๊ฐ * refactor(Input): Input ์คํ์ผ๋ง ๋ณ๊ฒฝ * refactor(travelPlan): TravelPlanPlace ํ์ ๋ช ์ธ ๋ณ๊ฒฝ 1. todos ํ๋ ์ถ๊ฐ 2. TravelPlanTodo ์ธํฐํ์ด์ค ์ถ๊ฐ * refactor(travelPlan): TravelPlanTodo id ๋ช ์ธ ๋ณ๊ฒฝ * refactor(TravelPlanRegisterPage): description์ด ์๋ todo๋ฅผ ์ถ๊ฐ ๋ฐ ์ญ์ ํ๋๋ก ๋ณ๊ฒฝ * refactor(travelPlan): TravelPlanPlace ๋ด description ํ๋ ์ ๊ฑฐ * refactor: ์ฌํ ๊ณํ mock ๋ฐ์ดํฐ ๋ณ๊ฒฝ๋ ๋ช ์ธ์ ๋ง๊ฒ ์์ * refactor(Checkbox): checked๊ฐ ์๋ defaultChecked๋ก ๋ณ๊ฒฝ ๋ธ๋ผ์ฐ์ warning์ผ๋ก ์ธํ defaultChecked๋ก ๋ณ๊ฒฝ * refactor(endpoint): todo patch ์์ฒญ ๊ด๋ จ endpoint ์ถ๊ฐ * test: ๊ณต์ ๋งํฌ๋ก ์ ์ํ ์ฌํ ๊ณํ msw handler ์ถ๊ฐ * test: ์ฌํ ๊ณํ ์์ธ msw ํธ๋ค๋ฌ ๋ณ๊ฒฝ uuid ํ์ธํ๋ ๋ก์ง ์ ๊ฑฐ * test: ์ฌํ ๊ณํ todo patch ์์ฒญ msw ํธ๋ค๋ฌ ์ถ๊ฐ * feat(usePatchTravelPlanTodo): ์ฌํ ๊ณํ todo patch ์์ฒญ ๊ด๋ จ query ๊ตฌํ * feat: TravelPlanTodoItem ์ปดํฌ๋ํธ ๊ตฌํ * refactor(TravelPlansTabContent): description text๊ฐ ์๋ todo list๋ค์ด ๋ณด์ฌ์ง๋๋ก ๋ณ๊ฒฝ * refactor(useTravelPlanDays): onAddPlaceTodo ๋ด ๋ ผ๋ฆฌ or ์ฐ์ฐ์๊ฐ ์๋ ๋ ๋ณํฉ ์ฐ์ฐ์๋ก ๋ณ๊ฒฝ * test(travelPlanRegisterPage): ์ฌํ ๋ฑ๋ก ํ์ด์ง ํ ์คํธ ๋ด ์ฅ์ ์ค๋ช ๋ณ๊ฒฝ test ์ ๊ฑฐ * fix(TravelPlanTodoItem): ํ์ฌ ์ฌ์ฉ์๊ฐ action์ ์ผ์ผํจ ์ํ๋ก request ๋ ๋ฆฌ๋๋ก ๋ณ๊ฒฝ * fix: ci ๋ฌธ์ ํด๊ฒฐ checkbox index.ts ๋ด default export ์ถ๊ฐ * refactor(TravelPlanTodoItem): gap์ spacing ์ ์ฉ * refactor(PlaceTodoItem): Wrapper๊ฐ ์๋ Container๋ก ๋ณ๊ฒฝ ์ฌ๋ฌ ์์๋ฅผ ๊ฐ์ธ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ปจ๋ฒค์ ์ ๋ฐ๋ผ ๋ณ๊ฒฝ * refactor: ๋ถํ์ํ console.log ์ ๊ฑฐ * refactor(Checkbox): checked, defaultChecked๋ฅผ ์ธ๋ถ์์ ์ฃผ์ ๋ฐ๋๋ก ๋ณ๊ฒฝ ์ ์ด ์ปดํฌ๋ํธ, ๋น์ ์ด ์ปดํฌ๋ํธ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๊ณ ํ๋จ๋์ด ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝ * [Feature] - tag ๊ธฐ๋ฅ ๊ตฌํ (#335) * refactor(TravelogueCard): layout css ์์ * refactor(Text): bodyBold, detailBold ์ถ๊ฐ * feat(Chip): ์ปดํฌ๋ํธ ๊ตฌํ * test(Chip): ์คํ ๋ฆฌ๋ถ ๊ตฌํ * refactor(Chip): isSelected ์ด๊ธฐ๊ฐ ์ค์ ๋ฐ optional๋ก ์์ * feat(travelogue): tag type ์ถ๊ฐ * feat(TravelogueDetailPage): ํ ๊ทธ UI ๊ตฌํ * feat(TravelogueCart): tag UI ์ถ๊ฐ * refactor(Chip): button ์์ li๋ก ๋ณ๊ฒฝ * refactor(useDragScroll): ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ธฐ์ํ์ฌ li๋ก ๋ณ๊ฒฝ ํ ์ ์ฉ * feat(index): Chip ์ถ๊ฐ * refactor: chips ul๋ก ๋ณ๊ฒฝ * feat(tags): tags endpoint ๋ฐ queryKey ์ถ๊ฐ * feat(useGetTags): tags type ์ถ๊ฐ ๋ฐ getTags ๊ตฌํ * feat(TravelogueRegisterPage): ํ๊ทธ UI ๋ฐ ๊ธฐ๋ฅ ๊ตฌํ * feat(TravelogueRegisterPage): ํ๊ทธ UI ๋์ด๊ฐ๋ ํ๋ฉด ๋๊น์ง ๋ฟ๋๋ก ์์ ๋ฐ ํ๊ทธ ์ ํ 3๊ฐ๊น์ง๋ง ํ๋๋ก ์์ * refactor(Tab): no-wrap์ ์๋ ์์ฑ์ด๋ผ nowrap์ผ๋ก ์์ * feat(useInfiniteTravelogues): ํํฐ๋ง ๊ธฐ๋ฅ ์ถ๊ฐ * feat(travelogue): ํ๊ทธ ์ถ๊ฐ์ ๋ฐ๋ฅธ mock data ๋ฐ handler ์์ * feat(MainPage): ํ๊ทธ ํํฐ๋ง ๊ธฐ๋ฅ ๊ตฌํ * refactor(createInfiniteTravelogueHook): ํ๋ผ๋ฏธํฐ ์์ * refactor(chip): ์คํ ๋ฆฌ๋ถ options ์ถ๊ฐ * refactor(Chip): line-height ์ถ๊ฐ * refactor(MultiImageUpload): div๋ก ์์ * refactor: chips๋ฅผ chipsContainer๋ก ์์ * feat(queryKey): travelogue.tag ์ถ๊ฐ * refactor(useDragScroll): ํ์ ์ ์ฐ์ฑ์ ์ํด ์ ๋ค๋ฆญ์ผ๋ก ์์ * feat(condition): condition ์์ํ * refactor(useInfiniteTravelogues): ์์ ์ธ๋ถ๋ก ์ด๋ ๋ฐ queryKey ์์ํ ํ์ฉ * refactor: useDragScroll ์ ๋ค๋ฆญ ์์ ์ ๋ฐ๋ฅธ ๋ณ๊ฒฝ * refactor(TravelPlanRegisterPage): ์์ํ์ ๋ฐ๋ฅธ ์์ * refactor(MainPage): ์์ํ ํ์ฉ, useDragScroll ์ ๋ค๋ฆญ ์ ์ฉ ๋ฐ chipsContainer๋ก ๋ณ๊ฒฝ * feat(useTagSelection): ํ ๊ตฌํ ๋ฐ ์ ์ฉ * refactor(formValidation): condition ๋ค์ด๋ฐ ์์ * [Feature] - ์ฌํ๊ธฐ ์ฅ์ ์ด๋ฏธ์ง ์ ๋ก๋ ์ค์ผ ๊ฒฝ์ฐ, spinner๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ๋ฆฌํฉํฐ๋ง (#332) * refactor(Spinner): Spinner ์ปดํฌ๋ํธ ๋ด variants ๋ฐ size option ์ถ๊ฐ circle spinner ๋ฐ ํ์ฅ์ฑ์ ์ํด ํด๋น option๋ค ์ถ๊ฐ * test: Spinner ์ปดํฌ๋ํธ ์คํ ๋ฆฌ๋ถ ์ถ๊ฐ * refactor(MultiImageUpload): ํด๋น ์ปดํฌ๋ํธ ๋ด image upload ์ค์ผ ์ loading ui๋ฅผ ๋ณด์ฌ์ค ์ ์๋๋ก ์ปดํฌ๋ํธ ๋ฆฌํฉํฐ๋ง * test(MultiImageUpload): ์ปดํฌ๋ํธ ๋ณ๊ฒฝ์ ์ ๋ฐ๋ฅธ ์คํ ๋ฆฌ๋ถ ๋ณ๊ฒฝ * refactor: ๋ถํ์ํ console.log ์ ๊ฑฐ * fix(MultiImageUpload): x ๋ฒํผ์ด ์งค๋ ค์ ๋ณด์ด๋ ๋ฌธ์ ์์ * fix(TravelogueMultiImageUpload): ๊ฐ์ image๋ฅผ ์ฌ๋ฌ ๋ฒ ์ ๋ก๋ ์ ์ ๋ก๋๊ฐ ๋์ง ์๋ ๋ฌธ์ ํด๊ฒฐ fileInputRef๋ฅผ ์ด๊ธฐํ ํ๋๋ก ๋ณ๊ฒฝ * refactor(TravelogueMultiImageUpload): ์ต๋ ์ด๋ฏธ์ง ์ ๋ก๋ ๊ฐฏ์ ์์ํ ๋ฐ ํธ๋ค๋ฌ ํจ์ ๋ค์ด๋ฐ ์์ * refactor(TravelogueMultiImageUpload): newImgUrls๋ฅผ newImageUrls๋ก ๋ณ๊ฒฝ ๋ค๋ฅธ ๋ณ์๋ค์์ image๋ก ์ฌ์ฉํ๊ณ ์๋ ๋งํผ img๊ฐ ์๋ image๋ก ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝ * refactor(TravelogueMultiImageUpload): props interface ๋ถ๋ฆฌ * refactor(TravelogueMultiImageUpload): ๋ด๋ถ ๋ก์ง hook์ผ๋ก ๋ถ๋ฆฌ * refactor: imageStates์ lazy ์ด๊ธฐํ ์ ์ฉ * [Feature] - ์ฌ์ฉ์ ๋๋ค์ ์์ (#317) * feat: ๋๋ค์ ์์ msw ์ถ๊ฐ * feat: ๋๋ค์์์ hook ๊ตฌํ * fix : ๋๋ค์ ์์ api ๋ช ์ธ์ ๋ง์ถฐ์ msw,query,endpoint ์์ * fix: ๋๋ค์ ์์ hook์์ refetchType ์์ * feat : ๋ง์ด ํ์ด์ง์ ํ๋กํ ์์ ๊ธฐ๋ฅ ์ถ๊ฐ * style: ๊ธ์จ ์์ theme color๋ก ์์ * fix: ํจ์๋ช ์ ํ์ผ๋ช ๊ณผ ๋์ผํ๊ฒ ์์ * fix: refetchType ์ญ์ - ์์ ๋ ์๋๊ธฐ์ ์ญ์ ํจ * fix: console.log๋ฅผ alert๋ก ์์ * fix : ref ์ฌ์ฉ, ๋๋ค์์ ๋ค ์ง์ฐ๊ณ ์์ ์๋ํ ๊ฒฝ์ฐ ์๋ ๋๋ค์์ผ๋ก ๋๋๋ก๊ฐ๋๋ก ์์ Co-authored-by: jinyoung <[email protected]> * chore: ์ฌ์ฉ๋์ง ์๋ styled ์ญ์ * fix : ๋น ์นธ์ผ๋ก ์์ ์๋ํ ๊ฒฝ์ฐ ์๋ ๋๋ค์์ผ๋ก ๋๋์๊ฐ๋๋ก ์์ * fix: ๋๋ค์ ์์ ์ ๊น๋นก์ด๋ฉฐ ๋ ๋๋ง ๋๋๊ฒ ์์ , spellcheck false๋ก ์ค์ --------- Co-authored-by: jinyoung <[email protected]> * [Feature] - ๊ฒ์ ๊ตฌํ (#328) * feat: ์ฌํ๊ธฐ ๊ฒ์ ๋ฌดํ์คํฌ๋กค query ๊ตฌํ * chore: ๊ฒ์ ์์ด์ฝ ์ถ๊ฐ * feat: ํค๋์ ๊ฒ์ ์ถ๊ฐ * feat: SearchFallback ์ปดํฌ๋ํธ ์ถ๊ฐ * feat: ๊ฒ์ ๊ฒฐ๊ณผ ํ์ด์ง ๊ตฌํ * feat: ๊ฒ์ ํ์ด์ง ๋ผ์ฐํธ ์ถ๊ฐ * feat: home icon ์ถ๊ฐ * refactor: Header ์ปดํฌ๋ํธ๋ฅผ ๊ธฐ๋ณธ Header์ basic์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๋ฆฌํฉํ ๋ง * feat: HomeHeader ๊ตฌํ * feat: LogoHeader ๊ตฌํ * feat: NavigationHeader ๊ตฌํ * feat: SearchHeader ๊ตฌํ * fix: storybook preview rootStyle์ด common/Header์๋ ๋ค๋ฅด๊ฒ ์ ์ฉ๋๋๋ก ์์ - rootStyle์ ๋ค์ด๊ฐ์๋ padding ๋๋ฌธ์ Header storybook์์ ์ปดํฌ๋ํธ๊ฐ padding๋งํผ ๋ฐ๋ฆฌ๋ ์ด์๊ฐ์์ด์ common/Header์ผ๋๋ padding์ด 0์ด ๋๋๋ก ์์ ํจ * test: Header storybook ์ถ๊ฐ * feat: AppLayout์์ Header๋ฅผ ๋์ ์ผ๋ก ์ถ๊ฐ * refactor: HomeHeader -> HomePageHeader๋ก ์ด๋ฆ ์์ * refactor: ์คํ์ผ๋ ์ปดํฌ๋ํธ ์ด๋ฆ ์์ (wrapper -> container) * refactor: Header Props๋ช ์์ * refactor: ๊ฒ์์ด ์ต์ ๊ธ์์ ์์ํ * refactor: AppLayout์์ pathname ํ์ธ ๋ถ๋ถ ์์ ์ฌ์ฉ * refactor: h1 ํ๊ทธ ๋์ Text ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํด์ ๋ฆฌํฉํ ๋ง * refactor: gap ๊ฐ์ theme spacing์ ์ฌ์ฉ * refactor: gap ๊ฐ์ theme spacing ์ฌ์ฉ * chore: ์ฝ๋ ์ฌ์ด์ ๊ฐํ ์ถ๊ฐ * chore: ๊ฐํ์ถ๊ฐ * refactor: Icon ๋์ IconButton์ ์ฌ์ฉ * refactor: #fff ๋์ primitive white ์ฌ์ฉ * chore: ๋น ํ์ผ ์ญ์ * refactor: dom์ผ๋ก ์ง์ ์ ๊ทผํ๋ ๋ถ๋ถ ref๋ฅผ ์ฌ์ฉํ๋๋ก ์์ * fix: ๊ฒ์์ด์ trim ์ถ๊ฐ ๋ฐ useInfiniteSearchTravelogues ๊ฐ keyword๊ฐ ๋น๊ฐ์ด ์๋๋๋ง ์์ฒญ๋๋๋ก ์์ * refactor: NavigationHeader -> SearchResultPageHeader๋ก ์ด๋ฆ ์์ * fix: Header ์ด๋ฆ ์์ ๊ผฌ์ธ๊ฒ ์์ * refactor: Header ๊ด๋ จ ์ปดํฌ๋ํธ ์ธ๋ฑ์ฑ * fix: ๊ฒ์ ํ์ด์ง์์ ๋ค๋ก๊ฐ๊ธฐ ๋๋ฅผ ๋, query๋ ๊ทธ์ ๊ฒ์์ด์ง๋ง Input value๋ ๊ทธ์ ๊ฒ์์ด๊ฐ ์๋๋ ์ด์ ์์ * storybook: styled์ Input์ด ์๋ ์ง์ง Input.tsx ์ฌ์ฉํ๋๋ก ์์ - ๋ก์ปฌ ํ๊ฒฝ์์๋ ๋ฌธ์ ์์ด ์ ๋ ๋๋ง๋๋, storybook์์๋ ๊ฐ์ ๋ฃ์ง ์์ label,maxcount,count div๊น์ง ๋ง๋๋ ์ด์๊ฐ์์ต๋๋ค. - ์ผ๋จ style๋ก marginbottom์ ์์๋ฅผ ์ค์ ๊ฐ์ด๋ฐ์ ๋ ฌ๋๊ฑฐ์ฒ๋ผ ๋ณด์ด๊ฒ ์์ ์ํด๋จ์ต๋๋ค * fix: build ์๋ฌ ์ก์ * [Feature] - ์ฌํ๊ธฐ ์์ธ๋ณด๊ธฐ ํ์ด์ง์์ ์ง๋ ์์ธ๋ณด๊ธฐ ๊ตฌํ (#334) * feat: ์ง๋ ์์ด์ฝ ์ถ๊ฐ * style: Box ๋์ด ์์ * feat: ์ง๋ ์์ด์ฝ ๋ฒํผ์ ๋๋ฅด๋ฉด ๊ตฌ๊ธ๋งต ์ฌ์ดํธ๋ก ์ด๋ํ๋๋ก ๊ตฌํ - place ๋ฐ์ดํฐ ์์ ๊ตฌ๊ธ๋งต placeId๊ฐ ์์ด ์ผ๋จ lat,lng,placeName์ผ๋ก ๊ตฌํ(์ ํํ ๊ฒฐ๊ณผ ๋์ค์ง ์๋๊ฒ๋ ์์) * fix: Box ์ปดํฌ๋ํธ์์ tag ์ญ์ - Box์์ tag ์์ฐ๊ธฐ๋กํด์ ์ญ์ ํจ * chore: ํ์์๋ ํ๊ทธ ์ญ์ * fix: build ์๋ฌ ์ก๊ธฐ * [Feature] - ์ฌํ๊ธฐ ์ข์์ ๊ธฐ๋ฅ ๊ตฌํ (#342) * feat: asset(heart) ์ถ๊ฐ * refactor(TravelogueDetailPage): ์ข์์ ๋์์ธ ์์ 1. flex-end๊ฐ ์๋ space-between์ผ๋ก ๋ณ๊ฒฝ 2. gap 8px๋ก ๋ณ๊ฒฝ * feat: ์ข์์ ๊ด๋ จ msw ํธ๋ค๋ฌ ์ถ๊ฐ * feat: ์ฌํ๊ธฐ ์์ธ ์กฐํ msw ํธ๋ค๋ฌ ์ถ๊ฐ * refactor: ์ฌํ๊ธฐ mock ๋ฐ์ดํฐ ๋ณ๊ฒฝ isLiked ๋ฐ likeCount ์ถ๊ฐ * refactor: ๋ฉ์ธ ํ์ด์ง ์ฌํ๊ธฐ ํธ๋ค๋ฌ ๋ณ๊ฒฝ request ๊ฐ์ฒด ์์ ๊ฒฝ์ฐ ์์ธ ์ฒ๋ฆฌ ์ถ๊ฐ * refactor(travelogue): TraveloguePayload ๋ฐ TravelogueResponse ํ์ ๋ณ๊ฒฝ 1. TraveloguePayload์ Omit์ด ์๋ Pick์ผ๋ก ๋ณ๊ฒฝ 2. TravelogueResponse ํ์ ๋ด likeCount ๋ฐ isLiked ์ถ๊ฐ * feat(endpoint): ์ฌํ๊ธฐ ์ข์์ endpoint ์ถ๊ฐ * feat: ์ฌํ๊ธฐ active ๋ฐ inactive ๊ด๋ จ query ์ถ๊ฐ * feat(TravelogueDetailPage): ์ฌํ๊ธฐ ์ข์์ ๊ธฐ๋ฅ ๊ตฌํ * refactor(TravelogueDetailPage): ์ฌํ๊ธฐ๋ฅผ ๋ฑ๋กํ ์ฌ๋๋ง ์ข์์๋ฅผ ํ ๊ธํ ์ ์๋๋ก ์์ * refactor(svg-icons): heart, empty-heart์ ๋ํ path ๋ณ๊ฒฝ * refactor(asset): ์ข์์ svg ๋ณ๊ฒฝ * refactor(Icon): icon viewBox๋ฅผ size๋ก ๋ฐ๋๋ก ๋ณ๊ฒฝ * refactor: ์ข์์ icon button ์ฌ์ด์ฆ 16์ผ๋ก ๋ณ๊ฒฝ * refactor: ์ข์์ ์ฟผ๋ฆฌ ๊ด๋ จ refetch type all๋ก ๋ณ๊ฒฝ * refactor(useGetTravelogue): access token์ด ์คํ ๋ฆฌ์ง์ ์์ ๊ฒฝ์ฐ ์์ธ์ ์ผ๋ก ์ธ์ฆ ํค๋ ์ถ๊ฐ ํ๋๋ก ๋ณ๊ฒฝ ๋ฐฑ์๋ ์ธก์์ ์ธ์ฆ ํค๋ ์์ด๋ ์ ์ ์ข์์ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ธฐ ์ด๋ ต๋ค๊ณ ํ์ ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝ * refactor(TravelogueDetailPage): ๋ก๊ทธ์ธ ํ ๊ฒฝ์ฐ ๋ฌด์กฐ๊ฑด ์ข์์๋ฅผ ํ ์ ์๋๋ก ๋ณ๊ฒฝ * refactor(Icon): viewbox๋ฅผ ๋ค์ svg-icons์ width, height๋ก ์ค์ ํ๋๋ก ๋ณ๊ฒฝ * refactor: query ๋ด refetchType ์์ ๋ ๊ฑธ๋ก ๋ณ๊ฒฝ ์์ธ ํ์ด์ง๋ง refetch ํ๋๋ก ๋ณ๊ฒฝ * [Feature] - ์ธ๋ค์ผ ์๋ฌ ๋ฐ์ ์ ์์ธ ์ฒ๋ฆฌ ์ถ๊ฐ (#356) * refactor(TravelogueRegisterPage): ์ธ๋ค์ผ ์๋ฌ ๋ฐ์ ์ ์์ธ ์ฒ๋ฆฌ ์ถ๊ฐ * refactor: api endpoint ์๋๋๋ก ๋ณ๊ฒฝ * [๏ฟฝFeature] - ์ฌํ๊ธฐ ๋ฐ ์ฌํ ๊ณํ ์์ ํ์ด์ง ๊ตฌํ (#348) * refactor(ModalBottomSheet): ์์ ํ์ด์ง์์๋ ์ฌ์ฉํ๋๋ก props ์ ์ฐํ๊ฒ ์์ * feat(route): ์์ ํ์ด์ง route ์ถ๊ฐ * refactor(RegisterPage): modalBottomSheet props ์์ ์ ๋ฐ๋ฅธ ๋ฆฌํฉํ ๋ง * feat(DetailPage): ์์ ๋ฒํผ ํ์ฑํ * feat(TravelogueEditPage): UI ๊ตฌํ * feat(TravelPlanEditPage): UI ๊ตฌํ * refactor(errorMessage): only writer ์์ฑ๋ช ์ ๊ตฌ์ฒด์ ์ผ๋ก ์์ * refactor: state๋ฅผ set ์ํค๋ change ํจ์ ๊ตฌํ ๋ฐ ๋ฐํํ๋๋ก ์์ * feat(TravelogueEditPage): ์ด๊ธฐ๊ฐ ์ค์ , ํ๊ทธ ui ์ถ๊ฐ ๋ฐ ํ ์ฌ์ฉ์๊ฐ ์์ ํ์ง ๋ชปํ๋๋ก ๋ง๋ ๊ธฐ๋ฅ ๊ตฌํ * refactor(router): ์คํ ์์ * refactor(BackDrop): position fixed๋ก ์์ * refactor(useTravelogueDays): change ํจ์๋ช ์์ * refactor(TravelPlanRegisterPage): mutate ๋ค์ด๋ฐ ์์ * feat(errorMessage): errorMessage ์ถ๊ฐ * refactor(PlaceTodoListItem): value ๊ฐ ๋ฐ isChecked ๊ฐ ๋ฐ๋๋ก ์์ * feat(usePutTravelogue): ๊ธฐ๋ฅ ๊ตฌํ * feat(usePutTravelPlan): ๊ธฐ๋ฅ ๊ตฌํ * feat(useTravelPlanDays): onChange ํจ์ ์ถ๊ฐ * feat(TravelPlanEditPage): ๊ฐ ์ด๊ธฐํ, put ์์ฒญ ๋ฐ ์๋ฌ ์ฒ๋ฆฌ ๊ธฐ๋ฅ ๊ตฌํ * refactor: useEffect ์์กด์ฑ ๋ฐฐ์ด๋ก ์ฌ์ฉํ์ฌ useCallback์ผ๋ก ์์ * feat(debouncedTime): ์์ํ * refactor(extractId): ์ฌ์ฌ์ฉ์ฑ์ ์ํ ์์ * feat(extractUTCDate):UTC Date ์ถ์ถ ํจ์ ์ ํธํ * refactor(travelPlan): days ํ์ ์์ * refactor: ๋ถ ํ์ํ css ์ ๊ฑฐ ๋ฐ ์ผ๊ด์ฑ์ ์ํ ์์ * refactor: ๋ช ์ธ isChecked์ checked ๋ถ์ผ์น๋ก ์ธํ ์์ * refactor(TravelogueDetailPage): extractId ์ ์ฉ * refactor: mutate ๋ค์ด๋ฐ, ์์ํ, ์ ํธํจ์, Text ์ปดํฌ๋ํธ ์ ์ฉ * refactor(SearchFallback): ๊ฐ์ด๋ฐ๋ก ์ค๋๋ก ์ ๋ ฌ * refactor(SearchFallback): common์ผ๋ก ๋ถ๋ฆฌ * feat(MainPage): ํ๊ทธ ํํฐ๋ง ๊ฒฐ๊ณผ ์์ ์ SearchFallback ๋ณด์ฌ์ฃผ๋๋ก ๊ตฌํ * refactor(MainPage): ํ๊ทธ ๊ฐฏ์ ์ค์ ์ ๊ดํ ์ค๋ช ์ถ๊ฐ * refactor(extractId): ๋ค์ด๋ฐ ์์ * refactor: extractID ๋ค์ด๋ฐ ์์ * refactor(extractId): extractLastPath ์ ํธํ์ ๋ฐ๋ฅธ ๋ถ๋ฆฌ * fix(ModalBottomSheet): ์๋๋ฉ์ด์ ๋์ง ์๋ ๋ฌธ์ ํด๊ฒฐ * refactor(SearchFallback): ui ์์น ์์ * refactor(TravelogueTabContent): negative margin-top ์ถ๊ฐ * refactor(TravelPlanRegisterPage): ์ฌํ ๊ณํ ๋ฑ๋ก subText ์ถ๊ฐ * refactor(TravelogueDetailPage): ๊ฐํ ์ถ๊ฐ * refactor(TravelogueRegisterPage): mutate ๋ค์ด๋ฐ ์์ * [Feature] - ํ๋กํ ๋ฒํผ์ ์ฌํ ๊ณํ ์์ฑ ์ถ๊ฐ (#368) * refactor(FloatingButton): ์ฌํ ๊ณํ ์์ฑ ์ถ๊ฐ ๋ฐ UI ์์ * refactor(FloatingButton): ์์ฑ ํ์ด์ง ๋ฐ๋๋ก ๊ฐ๊ฒ๋ ๋์ด์๋ ๊ฒ ์์ * refactor(zIndex): ์์ * refactor(FloatingButton): subButtonContainer gap ๋ฐ padding ์์ * [Feature] - required ๊ตฌํ (#361) * feat(Input) : label ์์ฑ ์ญ์ * feat(TextField) : TextField ์ปดํฌ๋ํธ ๊ตฌํ * test(TextField): TextField ์ปดํฌ๋ํธ storybook ์ถ๊ฐ * feat(TravelogueRegisterPage): TextField ์ปดํฌ๋ํธ ์ ์ฉ * feat(TravelPlanRegisterPage): TextField ์ปดํฌ๋ํธ ์ ์ฉ * style(TextField): style ์์ * refactor(TextField): cloneElement ๋์ renderProps๋ฅผ ์ฐ๋๋ก ์์ - cloneElement๋ legacy๋ผ๊ณ ํจ * style: isRequired ์ฌ๋ณผ ์์์ ๋์์ธ ํ ํฐ์ ์ถ๊ฐ ๋ฐ ์ ์ฉ * refactor(TextField): props ์์ * refactor(ThumbnailUpload): id ๋ฐ๋๋ก ์์ - hiddenInput๊ณผ label์ ์ ํํ๊ฒ ์ฐ๊ฒฐ์์ผ์ฃผ๊ธฐ ์ํจ * test(ThumbnailUpload): storybook์ ๋ณ๊ฒฝ๋ props ์ ์ฉ * test(TextField): storybook์ id ์ถ๊ฐ * refactor(TravelogueResisterPage,TravelPlanRegisterPage): TextFiled props์ renderProp ํ์์ผ๋ก ๋๊ฒจ์ฃผ๋๋ก ์์ * test(Header): Header ์ปดํฌ๋ํธ์์ IconButton์ ์ฌ์ฉํ๋๋ก ๋ฆฌํฉํ ๋ง * [Fix] - 4์ฐจ ์คํ๋ฆฐํธ QA ๋ฐ์ 1์ฐจ (์๋ชจ) (#374) * fix(MainPage): ์ฌํ๊ธฐ 1๊ฐ์ผ ๋ ๋ฉ์ธ ํ์ด์ง ์คํ์ผ ๊นจ์ง๋ ๋ฌธ์ ์์ * fix(TransformBottomSheet): ํ์ดํ ์ด์ธ์ ํด๋ฆญ์๋ ๋ซ์น๊ฒ ์์ * fix(TravelogueDetailPage): ๋ด๊ฐ ์์ฑํ ์ฌํ๊ธฐ์ ๊ฒฝ์ฐ ๋ฐํ ์ํธ ์๋ณด์ด๋๋ก ์์ * fix(MyTravelPlans): ์ฌํ ๊ณํ 20์ ๋์ด๊ฐ๋ฉด ... ๋ณด์ด๋๋ก ์์ * fix: ๋น ๊ฐ์ ๊ฒฝ์ฐ []๋ '' ๊ฐ์ผ๋ก ๋ณด๋ด๋๋ก ์์ * fix(travelPlanRegisterPage): ํ ์คํธ ์ค๋ฅ ํด๊ฒฐ * fix(useInfiniteTravelogues): ๋คํธ์ํฌ ์ค๋ฅ ์ฒ๋ฆฌํ๋๋ก isPaused ๋ฐํ * fix(MainPage): ๋คํธ์ํฌ ์ค๋ฅ ๋ฐ ์๋ฒ ์ค๋ฅ ์ alert ๋์ง๋๋ก ์์ * [Fix] - 4์ฐจ ์คํ๋ฆฐํธ QA ๋ฐ์ 1์ฐจ (์ง๋) (#375) * fix(useMultiImageUpload): ์ด๋ฏธ์ง๊ฐ ์๋ ์ํ์์ ๋ค์ค ์ ๋ก๋ ์ ๋ชจ๋ ์ ๋ก๋ ๋๋ ์ด์ ์์ * fix(AccordionTrigger): IconButton์ผ๋ก ๊ต์ฒด svg๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๊ฒ์ IconButton์ผ๋ก ๊ต์ฒด * fix: ์ข์์ ํฌ๊ธฐ ๋ณ๊ฒฝ * refactor(PlaceTodoListItem): input์ autofocus๋ก ์ง์ * fix(MyPage): ๋๋ค์ ๊ธ์์ ์ ํ ์ถ๊ฐ ๋ฐ ๋๋ค์ ๋ฑ๋ก ์ ์ด์ ๋๋ค์์ด ๋ณด์ฌ์ง๋ค ํ์ฌ ๋๋ค์์ผ๋ก ๋ณด์ฌ์ง๋ ๋ฌธ์ ์์ * fix(ShareModal): ๊ณต์ ๋ฒํผ ๊ฐ๊ฒฉ ์กฐ์ * fix: ์ข์์๋ฅผ ๋๋ฅด๋ฉด ๋ก๊ทธ์ธ alert๊ฐ 2๋ฒ ๋จ๋ ๋ฌธ์ ํด๊ฒฐ ์ข์์๋ฅผ ๋๋ ์ ๋ interceptor์ alert์ onError ์ฝ๋ฐฑ์ alert๊ฐ ๊ฒน์ณ 2๋ฒ alert ๋จ๋ ๋ฌธ์ ํด๊ฒฐ * fix(MyPage): input์ด 20์ ๋์ด๊ฐ๋ ๋ฌธ์ ํด๊ฒฐ * refactor(MyPage): ๋๋ค์ request query ํจ์ ๋ค์ด๋ฐ ๊ฐ์ * refactor(ShareModal): spacing ์ ์ฉ * fix: ci ๋ฌธ์ ํด๊ฒฐ * fix: ci ๋ฌธ์ ํด๊ฒฐ * fix: ci ๋ฌธ์ ํด๊ฒฐ * [Feature] - ํ๋ก ํธ์๋ dev, prod ๋ถ๋ฆฌ ์์ (#378) * chore(package.json): babel ์ค์ ์ ์ํ ์์กด์ฑ ์ค์น * chore: babel ๊ด๋ จ config ์ค์ ์ถ๊ฐ * chore: webpack dev, prod ๋ถ๋ฆฌ * chore(.gitignore): .env.local ํ์ผ ์ถ๊ฐ * chore(.storybook/main): importSource ๋ด @emotion/react ์ถ๊ฐ * chore: ci script dev, prod ๋ถ๋ฆฌ * chore(webpack.production): ๋ถํ์ํ ๋ณ์ ์ ๊ฑฐ * chore: ci ์คํฌ๋ฆฝํธ ์์ * chore: yarn.lock ์์ * fix: ci ๋ฌธ์ ํด๊ฒฐ * [Fix] - 4์ฐจ ์คํ๋ฆฐํธ QA ๋ฐ์ 1์ฐจ (๋ฆฌ๋ฒ) (#376) * feat(Input) : label ์์ฑ ์ญ์ * feat(TextField) : TextField ์ปดํฌ๋ํธ ๊ตฌํ * test(TextField): TextField ์ปดํฌ๋ํธ storybook ์ถ๊ฐ * feat(TravelogueRegisterPage): TextField ์ปดํฌ๋ํธ ์ ์ฉ * feat(TravelPlanRegisterPage): TextField ์ปดํฌ๋ํธ ์ ์ฉ * style(TextField): style ์์ * fix(Header): $isRightContentFull ์์ฑ์ด๋ฆ isRightContentFull๋ก ์์ * feat(SearchHeader): SearchHeader์ Home ์์ด์ฝ ๋ฒํผ ์ถ๊ฐ * test(Header): Header ์คํ ๋ฆฌ๋ถ์ SearchHeader ์์ ์ฌํญ ๋ฐ์ * fix(PlaceDetailCard): ์ฌํ์ง ์ด๋ฏธ์ง๊ฐ ์๋ ๊ฒฝ์ฐ FallbackImage๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ์์ * test(PlaceDetailCard): PlaceDetailCard ์คํ ๋ฆฌ๋ถ์ ๋ฑ๋กํ ์ฌํ์ง ์ฌ์ง์ด ์๋ ๊ฒฝ์ฐ ์ถ๊ฐ * fix(useInfiniteSearchTravelogues): ๋ก๊ทธ์ธ ์ํด๋ ๊ฒ์ํ ์ ์๋๋ก ์์ * feat(TravelogueCard): TravelogueCard์์ ์ ๋ชฉ์ด 20์๋ณด๋ค ๊ธธ์ด์ง ๊ฒฝ์ฐ (...)๋ก ์ค์ ์ถ๊ฐ * test(TravelogueCard): TravelogueCard ์คํ ๋ฆฌ๋ถ์ ์ ๋ชฉ์ด 20์๋ณด๋ค ๊ธธ์ด์ง๋ ๊ฒฝ์ฐ ์ถ๊ฐ * fix(TravelogueResisterPage): ์ฌํ๊ธฐ ๋ฑ๋ก์ ์ฌํ๊ธฐ ์ฅ์ ์ฌ์ง ์ถ๊ฐํ์ง ์๋ ๊ฒฝ์ฐ payload์ ๋น ๋ฐฐ์ด ๋ณด๋ด๊ธฐ ์ถ๊ฐ * chore(TravelogueResisterPage): ํ์์๋ ์ฃผ์ ์ญ์ * feat: TextField ์ปดํฌ๋ํธ ์ ์ฉ * [Feature] - 404 NotFound ํ์ด์ง ๊ตฌํ (#380) * feat:404 NotFound ํ์ด์ง ๊ตฌํ * chore(TravelPlanRegisterPage): ์ฌ์ฉ๋์ง์๋ import ๊ตฌ๋ฌธ ์ญ์ * fix(TravelogueEditPage,TravelPlanEditPage): label ์ญ์ * refactor(ThumbnailUpload): id props๋ฅผ ์ต์ ๋๋ก ์์ * fix(TravelPlanRegisterPage): import๋์ด์์ง ์์ ์ปดํฌ๋ํธ import * refactor: ๋ถํ์ํ ๊ฒ ์ ๊ฑฐ --------- Co-authored-by: แแ ฉแซแแ ตแซแแ งแผ <[email protected]> * [Fix] - ๋ก๋ฉ, ์๋ฌ ์ฒ๋ฆฌ ๋ฐ ๋ฉ์ธํ์ด์ง, ๋ก๊ทธ์ธ ์ฝ๋ฐฑ ํ์ด์ง ์ค๋ฅ ์์ (#391) * fix(useMultiImageUpload): ์ด๋ฏธ์ง๊ฐ ์๋ ์ํ์์ ๋ค์ค ์ ๋ก๋ ์ ๋ชจ๋ ์ ๋ก๋ ๋๋ ์ด์ ์์ * fix(AccordionTrigger): IconButton์ผ๋ก ๊ต์ฒด svg๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๊ฒ์ IconButton์ผ๋ก ๊ต์ฒด * fix: ์ข์์ ํฌ๊ธฐ ๋ณ๊ฒฝ * refactor(PlaceTodoListItem): input์ autofocus๋ก ์ง์ * fix(MyPage): ๋๋ค์ ๊ธ์์ ์ ํ ์ถ๊ฐ ๋ฐ ๋๋ค์ ๋ฑ๋ก ์ ์ด์ ๋๋ค์์ด ๋ณด์ฌ์ง๋ค ํ์ฌ ๋๋ค์์ผ๋ก ๋ณด์ฌ์ง๋ ๋ฌธ์ ์์ * fix(ShareModal): ๊ณต์ ๋ฒํผ ๊ฐ๊ฒฉ ์กฐ์ * fix: ์ข์์๋ฅผ ๋๋ฅด๋ฉด ๋ก๊ทธ์ธ alert๊ฐ 2๋ฒ ๋จ๋ ๋ฌธ์ ํด๊ฒฐ ์ข์์๋ฅผ ๋๋ ์ ๋ interceptor์ alert์ onError ์ฝ๋ฐฑ์ alert๊ฐ ๊ฒน์ณ 2๋ฒ alert ๋จ๋ ๋ฌธ์ ํด๊ฒฐ * fix(MainPage): ์ฌํ๊ธฐ 1๊ฐ์ผ ๋ ๋ฉ์ธ ํ์ด์ง ์คํ์ผ ๊นจ์ง๋ ๋ฌธ์ ์์ * fix(TransformBottomSheet): ํ์ดํ ์ด์ธ์ ํด๋ฆญ์๋ ๋ซ์น๊ฒ ์์ * fix(TravelogueDetailPage): ๋ด๊ฐ ์์ฑํ ์ฌํ๊ธฐ์ ๊ฒฝ์ฐ ๋ฐํ ์ํธ ์๋ณด์ด๋๋ก ์์ * fix(MyTravelPlans): ์ฌํ ๊ณํ 20์ ๋์ด๊ฐ๋ฉด ... ๋ณด์ด๋๋ก ์์ * fix: ๋น ๊ฐ์ ๊ฒฝ์ฐ []๋ '' ๊ฐ์ผ๋ก ๋ณด๋ด๋๋ก ์์ * fix(MyPage): input์ด 20์ ๋์ด๊ฐ๋ ๋ฌธ์ ํด๊ฒฐ * fix(travelPlanRegisterPage): ํ ์คํธ ์ค๋ฅ ํด๊ฒฐ * refactor(MyPage): ๋๋ค์ request query ํจ์ ๋ค์ด๋ฐ ๊ฐ์ * refactor(ShareModal): spacing ์ ์ฉ * fix(useInfiniteTravelogues): ๋คํธ์ํฌ ์ค๋ฅ ์ฒ๋ฆฌํ๋๋ก isPaused ๋ฐํ * fix(MainPage): ๋คํธ์ํฌ ์ค๋ฅ ๋ฐ ์๋ฒ ์ค๋ฅ ์ alert ๋์ง๋๋ก ์์ * chore(gitignore): .ene.local ์ถ๊ฐ * fix(LoginFallback): ์ค๋ฐ๋๋ ๋ฌธ์ ํด๊ฒฐ * fix(MainPage): ํ ๋ฉํธ ๋ฐ subTitle ๋ฉ์์ง ๋๋น์ ๋ฐ๋ผ ๋ณํ๋๋ก ์์ * refactor(LoginPage): text ์ปดํฌ๋ํธ ์ ์ฉ ๋ฐ ์คํ์ผ๋ง ์์ * refactor(KakaoCallbackPage): usePostKakaoLogin ํ ๋ถ๋ฆฌ ๋ฐ ๋คํธ์ํฌ ์๋ฌ ์ฒ๋ฆฌ * fix(useTravelogueDays): ์ ํ์ PhotoUrls ๋น๊ฐ์ผ๋ก ์ธํ ์ค๋ฅ ํด๊ฒฐ * refactor(TravelogueDeleteModal): isPending ์ spinner ๋ณด์ฌ์ฃผ๋๋ก ์์ * refactor(TravelogueDetailPage): error ๋ฐ ๋ก๋ฉ ์ฒ๋ฆฌ * fix: ์ฌํ๊ธฐ ์์ธ ํ์ด์ง ์๋ฌ ์์๋ ์ค์ผ๋ ํค์ด ๋ณด์ฌ์ง๋๋ก ๋ณ๊ฒฝ --------- Co-authored-by: แแ ฉแซแแ ตแซแแ งแผ <[email protected]> * [Fix] - ์ฌํ ๊ณํ ์์ , ๋ง์ดํ์ด์ง, ๊ฒ์ ํ์ด์ง ์๋ฌ ํธ๋ค๋ง (#393) * feat(useInfiniteMyTravelogues,MyTravelogues): ๋ด ์ฌํ๊ธฐ ๋ถ๋ฌ์ค๊ธฐ ๋คํธ์ํฌ ์ค๋ฅ ์ฒ๋ฆฌ ์ถ๊ฐ * feat(useInfiniteMyTravelogues,MyTravelogues) : ํ๋กํ ์ ๋ณด๋ฅผ ์ ๊ฐ์ ธ์์ผ ๋ด ์ฌํ๊ธฐ๋ฅผ fetchํ๋๋ก ๊ตฌํ, error ํธ๋ค๋ง ์ถ๊ฐ * feat(MyPage): ๋ด ํ๋กํ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ error ์ฒ๋ฆฌ ์ถ๊ฐ * feat(MyTravelPlans,useInfiniteMyTravelPlans): ๋ด ํ๋กํ ์ ๋ณด๋ฅผ ์ ๊ฐ์ ธ์์ผ ์ฌํ๊ณํ fetchํ๋๋ก ์์ * feat(MyTravelPlan): ์ปค๋ฐ ๋๋ฝ ์ถ๊ฐ * feat(TravelPlanEditPage): ํ์ธ ๋ฒํผ ํด๋ฆญ์ ๋คํธ์ํฌ ์ค๋ฅ๋ฉด alert์ฐฝ ๋จ๋๋ก ์์ * feat: ๊ฒ์ ์๋ฌ์ฒ๋ฆฌ (๋คํธ์ํฌ,์๋ฒ์ค๋ฅ) * feat: Query client retry ํ์ 0์ผ๋ก ์์ * fix: ์คํ ์์ * [Fix] - ์ฌํ๊ธฐ ๋ฑ๋ก & ์์ , ์ฌํ ๊ณํ ๋ฑ๋ก, ์ฌํ ๊ณํ ์์ธ ํ์ด์ง ์์ธ ๋ฐ ๋ก๋ฉ ์ฒ๋ฆฌ (#394) * fix: ์ฌํ๊ธฐ ๋ฑ๋ก & ์์ ํ์ด์ง ๋ก๋ฉ ๋ฐ ์์ธ ์ฒ๋ฆฌ * fix: ์ฌํ ๊ณํธ๊ธฐ ์์ธ ํ์ด์ง ์์ธ ์ฒ๋ฆฌ * fix: ์ฌํ ๊ณํ ๋ฑ๋ก ํ์ด์ง ์์ธ ์ฒ๋ฆฌ * [Fix] - 4์ฐจ ์คํ๋ฆฐํธ QA ๋ฐ์ 2์ฐจ (์๋ชจ) (#400) * fix(FloatingButton): ์ฌํ ๊ณํ ์์ฑ ๊ธ์ ์๋ฆฌ๋ ๋ฌธ์ ํด๊ฒฐ * fix(useTravelPlanDays): todos ๋น ๋ฐฐ์ด๋ก ๋ณด๋ด๋๋ก ์์ * refactor(Button): children ์์น ์ ์ฐํ๊ฒ ๋ฐ๋๋ก ์์ * fix(modalBottomSheet): isPending ์ spinner ๋ณด์ฌ์ฃผ๋๋ก ์์ * fix(debouncedTime): ๋๋ฐ์ด์ค ์๊ฐ 10์ด๋ก ์์ * fix(Button): justify-content ์ ๋จน๋ ๋ฌธ์ ํด๊ฒฐ * [Fix] - 4์ฐจ ์คํ๋ฆฐํธ QA ๋ฐ์ 2์ฐจ (๋ฆฌ๋ฒ) (#401) * refactor(Box): Box ์ปดํฌ๋ํธ props ์์ * feat(TravelPlansTabContent): ์์ธ์ง๋ ๋ณด๊ธฐ ์ถ๊ฐ * refactor(TravelogueCard): title์ Text ์ปดํฌ๋ํธ ์ฌ์ฉ์ผ๋ก ์์ ํ์ฌ ํ ์คํธ ์ ์งค๋ฆผ ํ์ ์์ * fix(useInfiniteSearchTravelogues): api ์ฌ๋ฐ๋ฅด๊ฒ ์์ * refactor(ThumbnailUpload): ์ด๋ฏธ์ง๊ฐ ๋ฑ๋ก ์ค์ผ ๋ ์คํผ๋๊ฐ ๋์ค๋๋ก ๊ตฌํ * feat(TravelogueRegisterPage): ์ธ๋ค์ผ ์ ๋ก๋ ํ ๋ณด์ด๋ ์ญ์ ๋ฒํผ ๊ตฌํ * test(ThumbnailUpload): ๋ก๋ฉ ์ค์ธ ThumbnailUpload storybook ์ถ๊ฐ * feat(TravelogueRegisterPage): ์ธ๋ค์ผ ํ์๊ฐ์ผ๋ก ์์ * refactor(ThumbnailUpload): ThumbnailUpload์์ ์ด๋ฏธ์ง๊ฐ change๋ ๋ isLoading ๋ณํ๊ฒ ์์ , border๋ณด์ด๋ ์กฐ๊ฑด ์์ * fix: ์ธ๋ค์ผ TextField ์ปดํฌ๋ํธ๋ก ๋ณ๊ฒฝ * fix(ThumbnailUpload): ์ค๋ณต๋ z-index ์ ๊ฑฐ * fix: ๊ฒ์ ๊ฒฐ๊ณผ text๊ฐ ์ด์ํ๊ฒ ๋ณด์ด๋ ์ค๋ฅ ํด๊ฒฐ * fix: ์ธ๋ค์ผ require ์๋ ๊ฑธ๋ก ์์ --------- Co-authored-by: แแ ฉแซแแ ตแซแแ งแผ <[email protected]> * [Fix] - 4์ฐจ ์คํ๋ฆฐํธ QA ๋ฐ์ 2์ฐจ (์ง๋) (#402) * fix: ๊ตฌ๊ธ๋งต ๋ง์ปค ํด๋ฆญ ํ์ง ๋ชปํ๋๋ก ๋ณ๊ฒฝ * fix: ๋ง์ดํ์ด์ง alert 2๋ฒ ๋จ๋ ํ์ ๊ฐ์ * fix: ์ฌํ ๊ณํ ๋ณํ ์ todos๊ฐ ์์ ๊ฒฝ์ฐ ๋น๋ฐฐ์ด๋ก ์์ฑ * fix: ๋ก๊ทธ์์ ์ํ์์ ์ข์์ ๋๋ฅผ ๋ alert 2๋ฒ ๋จ๋ ๋ฌธ์ ํด๊ฒฐ * fix: ์ฌํ ๊ณํ date๊ฐ ์ ๋๋ก ๋ณด์ด์ง ์๋ ๋ฌธ์ ํด๊ฒฐ * fix: ๋ฌ ๋ง์ง๋ง ์ผ์ ์์์ผ๋ก ํ ๋ ์ฌํ ๊ณํ Day ์์ฝ๋์ธ ์ถ๊ฐ ์ ๋ค์ ๋ฌ๋ก ๋์ด๊ฐ์ง ์๋ ๋ฌธ์ ํด๊ฒฐ * fix(TravelPlanRegisterPage): subText ์ถ๊ฐ * fix(MyPage): ๋๋ค์ ํ๊ธ๋ก ์ ๋ ฅ ์ 21์๋ก ์ ๋ ฅ๋๋ ๋ฌธ์ ํด๊ฒฐ * fix: to do ์ ๋ ฅ ์ 20์๋ก ์ ํ ํ๋๋ก ๋ณ๊ฒฝ * fix: ์กด์ฌํ์ง ์๋ ์ฌํ ๊ณํ ์ ๋ฉ์ธ ํ์ด์ง๋ก ์ด๋ํ๋๋ก ๋ณ๊ฒฝ * fix: ์ฌํ๊ธฐ ์์ ํ์ด์ง ๋ด ์ธ๋ค์ผ์ด ์์ ๊ฒฝ์ฐ ๋ํดํธ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ ํ๋๋ก ๋ณ๊ฒฝ * fix: ci ๋ฌธ์ ํด๊ฒฐ * fix: ์ฌํ ๊ณํ ์์ธ ํ์ด์ง ๋ด ์์ฑ์ ์๋ ๊ฒ์๋ฌผ ์ ๊ทผ ์ alert๊ฐ 2๋ฒ ๋จ๋ ํ์ ๊ฐ์ (#404) * [Fix] - line height,shareModal ์์ (#407) * fix(shareModal): ์๋ชป๋ ํ ์คํธ ์์ * style(typography): line-height ์์ * v1.0.1 * [Feature] - e2e ํ ์คํธ ์ด๊ธฐ ์ค์ ๋ฐ ์ฌํ ๊ณํ ๋ฑ๋ก, ๋ก๊ทธ์ธ, ๋ฉ์ธ ํ์ด์ง e2e ํ ์คํธ ๊ตฌํ (#412) * chore: cypress & eslint-plugin-cypress ์์กด์ฑ ์ค์น * chore: eslint-plugin-cypress ์ค์ ์ถ๊ฐ * chore: cypress ์ฌ์ ์ธํ ์ถ๊ฐ 1. baseUrl ๋ฐ viewport ์ค์ ์ถ๊ฐ 2. root tsconfig.json ๋ด exclude ์ต์ ์ cypress ์ถ๊ฐ(__tests__ ๋ด ํ ์คํธ๋ค type ๋ณด์ฅ์ ์ํด) 3. cypress ๊ด๋ จ declaration ์ค์ ์ถ๊ฐ 4. cypress ๋ด๋ถ tsconfig.json ์ถ๊ฐ 5. e2e.ts ์ถ๊ฐ * feat: ์ฌํ ๊ณํ ๋ฑ๋ก ํ ์คํธ ์ฝ๋ ๊ตฌํ * feat: ์นด์นด์ค ๋ก๊ทธ์ธ ํ ์คํธ ์ฝ๋ ๊ตฌํ * feat: ๋ฉ์ธ ํ์ด์ง ํ ์คํธ ์ฝ๋ ๊ตฌํ * refactor(travelPlanRegister): path alias ์ ์ฉ * chore: ci e2e ํ ์คํธ ์ถ๊ฐ * fix: ci ์คํฌ๋ฆฝํธ ์์ ci ์คํฌ๋ฆฝํธ์์ e2e ํ ์คํธ ์ ๊ฑฐ(๋ก์ปฌ ํ๊ฒฝ๊ณผ ci ํ๊ฒฝ์์์ ํ ์คํธ ์ฐจ์ด๋ก ์ธํด ์ผ๋จ ๋ณด๋ฅ) * [Feature] - ์ฌํ ๊ณํ ๋ฑ๋ก ํ์ด์ง ๋ฆฌํฉํฐ๋ง (#414) * refactor: ์ฌํ ๊ณํ ๋ฑ๋ก ํ์ด์ง ๋ด ์ํ ์ ๋ฆฌ form, ui, server, authorization, router ์ํ์ ๋ง๊ฒ ์ ๋ฆฌ * chore: immer, use-immer ์์กด์ฑ ์ถ๊ฐ * refactor(useTravelPlanDays): use-immer๋ฅผ ํ์ฉํ์ฌ ์ฝ๋ ๋ฆฌํฉํฐ๋ง * refactor(useTravelPlanDays): travelPlanDays์ ๊ฒ์ผ๋ฅธ ์ด๊ธฐํ ์ ์ฉ * refactor(useTravelPlanDays): ์ฅ์ ๋ด todo ์ถ๊ฐ ์ ๊ธฐ์กด todos์ ์ถ๊ฐ๋ง ํ๋๋ก ๋ณ๊ฒฝ 1. ์ฌํ ๋ณํ, ์์ , ์ถ๊ฐ ๋ชจ๋ todos๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ todos ํ๋ ์ฌ๋ถ๋ฅผ ํ์ธํ์ง ์์๋ ๋์ด ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝ * fix: ํฐํธ import path ์์ (#429) * [Feature] - kakao bundle lazy loading ์ ์ฉ (#430) * refactor(index.html): ์นด์นด์ค sdk script body ํ๊ทธ๋ก ์ด๋ * fix: kakao sdk defer ์ ์ธ defer ์ถ๊ฐ๋ก ์ธํด ์นด์นด์ค ๋ก๊ทธ์ธ ๋ฒํผ์ ๋๋ฅผ ์ ์๋ฌ๊ฐ ๋ฐ์ํ์ฌ ์ ๊ฑฐ * [Feature] - ๋ฐ๋ชจ๋ฐ์ด ํผ๋๋ฐฑ ๋ฐ์(์ง๋) (#418) * refactor(GoogleMapView): ์ฝ๋ ๋ฆฌํฉํฐ๋ง * chore(package.json): test-e2e:run ์คํฌ๋ฆฝํธ ์์ chrome์ด ๊ธฐ๋ณธ ๋ธ๋ผ์ฐ์ ๋ก ํ ์คํธ ๋๋๋ก ์์ * test(travelPlanRegister): force click์ผ๋ก ๋ณ๊ฒฝ * fix(useTravelPlanDays): todo๊ฐ ์ ๋๋ก ์ญ์ ๋์ง ์๋ ๋ฌธ์ ํด๊ฒฐ * fix(Input): ๋ชจ๋ฐ์ผ ํ๋ฉด์์ ํ๋๋๋ ํ์ ํด๊ฒฐ Input font-size๋ฅผ 16px๋ก ๋ณ๊ฒฝ * refactor(Calendar): ์บ๋ฆฐ๋ ui์์ ์ง๋ ๋ ์ง์ ๋ํ ๋ณ๋ ์ฒ๋ฆฌ ์ถ๊ฐ ์ด์ or ๋ค์ ๋ฌ์ ๋ํ ๋ ์ง๋ฅผ ์ ๊ณตํ์ง ์๊ณ ์ค๋ ๊ธฐ์ค ์ด์ ๋ ์ง์ ๋ํด gray text ์ฒ๋ฆฌ ๋ฐ disable ์ฒ๋ฆฌ ํ๋๋ก ๋ณ๊ฒฝ * refactor(GoogleMapView): ๋ถํ์ํ console ์ ๊ฑฐ * test(travelPlanRegister): ๋ถํ์ํ only ์ ๊ฑฐ * [Feature] - webpack ์บ์ ๋ฒ์คํ ์ค์ (#447) * refactor(webpack): ์บ์ ๋ฒ์คํ ์ ์ฉ ๋น๋ ํ ๋๋ง๋ค ๋ฒ๋ค ํ์ผ ์ด๋ฆ์ ๋ณ๊ฒฝ ์์ผ ์บ์ ๋ฌดํจํ ์ํค๋๋ก ๋ณ๊ฒฝ * refactor(webpack): chunkFilename ์ ๊ฑฐ * refactor(webpack): asset๋ค์ ๋ํ ํ์ผ ๊ฒฝ๋ก ๋ฐ ํด์ ๊ฐ ์ค์ ๋ณ๊ฒฝ 1. assets ๋ด ์์น ์ํค๋๋ก ๋ณ๊ฒฝ 2. hash๋ฅผ contenthash๋ก ์ง์ ํ์ฌ ํ์ผ์ด ๋ณ๊ฒฝ๋ ๋๋ง hash ๊ฐ์ด ๋ณ๊ฒฝ๋๋๋ก ์ง์ * [Feature] - ์ฝ๋ ์คํ๋ฆฌํ ์ค์ (#450) * chore: webpack-bundle-analyzer ์์กด์ฑ ์ถ๊ฐ * refactor: ์ฝ๋ ์คํ๋ฆฌํ ์ ์ฉ * refactor: ์ฝ๋ ์คํ๋ฆฌํ ํ์ํ ๋ถ๋ถ๋ง ์ ์ฉํ๋ ๊ฒ์ผ๋ก ๋ณ๊ฒฝ ์ค์ผ๋ ํค์ด ์๋ ํ์ด์ง์ธ ๊ฒ์ ์์ ํ์ด์ง, ์ฌํ๊ธฐ & ์ฌํ ๊ณํ ์์ /๋ฑ๋ก ํ์ด์ง๋ง ์ ์ฉํ๋ ๊ฒ์ผ๋ก ๋ณ๊ฒฝ * refactor: BundleAnalyzerPlugin ์ฃผ์ ์ถ๊ฐ * [Feature] - ์ฌํ ๊ณํ ์์ธ ํ์ด์ง ์ฑ๋ฅ ์ต์ ํ (#453) * refactor(GoogleMapLoadScript): LoadScript ์ฌ์ฉ ๋์ useJsApiLoader๋ก ๋ณ๊ฒฝ * refactor(index.html): google map์ ๋ํ preconnect ๋ฐ dns-prefetch ์ต์ ๊ด๋ จ link ํ๊ทธ ์ถ๊ฐ * refactor: ๋ถํ์ํ ๋น๋ฌธ์์ด ์ ๊ฑฐ * [Feature] - Layout Shift ๊ฐ์ (#454) * refactor(AccordionRoot): gap ๊ฐ ์์ * refactor(TravelogueRegisterPage): layout shift ๋ฌธ์ ํด๊ฒฐ * refactor(TravelogueEditPage): layout shift ๋ฌธ์ ํด๊ฒฐ * refactor(TravelPlanRegisterPage): layout shift ๋ฌธ์ ํด๊ฒฐ * refactor(TravelPlanEditPage): layout shift ๋ฌธ์ ํด๊ฒฐ * refactor(Input): count ์๋ ๊ฒฝ์ฐ ๋ฏธ๋ฆฌ ๊ณต๊ฐ ์ฐจ์งํ๋๋ก ์์ * refactor(Input): input ๋ด๋ถ์ ์๋ characterCount ๋ถ๋ฆฌ * test(Input): input ์์ฑ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ storybook ์์ฑ ์์ * [Feature] - ์ด๋ฏธ์ง ์ต์ ํ (#455) * feat(resizeAndConvertImage): ์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ฆ,ํฌ๋งท ๋ณํ ํด์ฃผ๋ util ํจ์ ๊ตฌํ * feat(TravelogueRegisterPage): ์ธ๋ค์ผ ์ด๋ฏธ์ง ์ ๋ก๋์ ๋ฆฌ์ฌ์ด์ฆ ๋ฐ ๋ณํํ๋๋ก ์์ * feat(useMultiImageUpload): ์ฌํ์ฅ์ ์ด๋ฏธ์ง ์ ๋ก๋์ ์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ฆ ๋ฐ ๋ณํํ๋๋ก ์์ * refactor(resizeAndConvertImage): 2 depth if๋ฌธ ๊ฐ์ * refactor(resizeAndConvertImage): ํจ์ ์ฑ ์ ๋ถ๋ฆฌ * v1.1.0 * [Feature] - ๋ฐ๋ชจ๋ฐ์ด ํผ๋๋ฐฑ ๋ฐ์(์๋ชจ) (#434) * fix(FloatingButton): ํ๋กํ ๋ฒํผ ๊ทผ์ฒ ํด๋ฆญ์ด๋ฒคํธ ๋ฐ์ํ์ง ์๋ ๋ฌธ์ ํด๊ฒฐ * refactor(Chip): isSelected์ ๋ฐ๋ผ textType ๋ฌ๋ผ์ง๋ ์ฝ๋ ๊ฐ๊ฒฐํ๊ฒ ์์ * fix(useSearchPlaceHistory): history api๋ฅผ ์ด์ฉํ์ฌ ์ฅ์ ๊ฒ์ ์ดํ ๋ค๋ก๊ฐ๊ธฐ ํด๋ฆญ ์ ํ์ด์ง ์ด๋ํ๋ ๋ฌธ์ ํด๊ฒฐ * refactor(useSearchPlaceHistory): early return ์ผ๋ก ์์ * refactor(MainPage): theme์ผ๋ก ์์ * refactor(useTagSelection): ํ ์์ sortedTags ๋ฐํํ๋๋ก ์์ * refactor(Chip): ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ธฐ์ํ ์์ * fix(TravelPlanDeleteModal): padding์ ๋ฐ์ดํ ์ ๊ฑฐ * refactor(Modal): ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ธฐ ์ํ ์์ * refactor(useBottomSheet): ์ด๊ธฐ๊ฐ ๋ณ๊ฒฝํ์ฌ modal ์ผ๊ด์ฑ์๊ฒ ์ฌ์ฉํ๋๋ก ์์ * refactor(Modal): ์ฌ์ฌ์ฉ์ฑ์ ๋์ฌ bottomSheet๋ ์ฌ์ฉํ ์ ์๋๋ก ์์ * refactor(DeleteModal): ์ถ์ํ * refactor(EditRegisterModalBottomSheet): ์ถ์ํ * refactor(ShareModal): Modal Props ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ์์ * refactor(FloatingButton): backdropLayout์ผ๋ก ์์ * storybook(Modal): Modal ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ์์ ๋ฐ EditRegisterModalBottomSheet ์คํ ๋ฆฌ๋ถ ๊ตฌํ * feat(SingleSelectionTagModalBottomSheet): ์ปดํฌ๋ํธ ๊ตฌํ * storybook(Modal): SingleSelectionTagModalBottomSheet ์คํ ๋ฆฌ๋ถ ๊ตฌํ * refactor(SingleSelectionTagModalBottom): ๋ถ ํ์ํ props ์ ๊ฑฐ * refactor(Modal): ๋ซ์น ๋๋ ์๋๋ฉ์ด์ ์ ๋ณด์ฌ์ฃผ๋๋ก ์์ * refactor(SingleSelectionTagModalBottomSheet): ๋ฒํผ ๋ผ๋ฒจ ์์ * refactor(useMultiSelectionTag): ๋ค์ด๋ฐ ์์ * feat(useSingleSelectionTag): ํ ๊ตฌํ * feat(MainPage): ์ ๋ ฌ ๋ฐ ์ฌํ๊ธฐ๊ฐ ํํฐ๋ง UI ๋ฐ ๊ธฐ๋ฅ ๊ตฌํ * fix(Chip): tag ์ ํ์ ์๋๋ฉ์ด์ ์ ์ถ๊ฐํ์ฌ ๋ฒ๊ทธ ๊ฐ์ ๋ณด์ด๋ ๋ฌธ์ ํด๊ฒฐ * refactor(createInfiniteTravelogueHandler): ์ธ์ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ์์ * chore: yarn install * refactor(TravelogueRegisterPage): ํ๊ทธ ์๋๋ฉ์ด์ ์ถ๊ฐ * refactor(useInfiniteTravelogues): filter param ๋ค์ด๋ฐ ์์ * refactor(TravelogueEditPage): ํ๊ทธ ์๋๋ฉ์ด์ ์ถ๊ฐ * refactor: ํ๊ทธ ์ปจํ ์ด๋ layoutShift ํด๊ฒฐ * refactor(TransformBottomSheet): UI ์์ ๋ฐ ๋ด์ฉ bottom sheet์ ์ํด ๊ฐ๋ ค์ง๋ ๋ฌธ์ ํด๊ฒฐ * refactor(MainPage): ์๋จ ํํฐ๋ง ๋ถ๋ถ ๋ ์ด์์ ๊ณ ์ * refactor(DeleteModal): ๋ฐ๋ณต๋๋ ํ ์คํธ ๋ถ๋ถ ์ถ์ํ * refactor(Chip): ๊ฐ๋ ์ฑ์ ์ํ ์์ * refactor(TransformFooter): bottom sheet ์์ ๋ค์ด๋ฐ ์์ * refactor(Modal): ์ถ์ํํ ๋ชจ๋ฌ๋ค ๋ชจ๋ฌ ๋ด๋ถ๋ก ์ค๋๋ก ํ์ผ ๊ตฌ์กฐ ์์ * refactor(Modal): props ๋ค์ด๋ฐ ์์ * refactor(Modal): ์ค๋ณต๋ ์์ฑ ์ ๊ฑฐ * refactor(useInfiniteTravelogues): param์ sort ์ถ๊ฐ * refactor(MainPage): ์์ ๋ถ๋ฆฌ * refactor(useInfiniteTravelogues): ์ธ์๋ฅผ ๊ฐ์ฒด๋ก ๋ฐ๋๋ก ์์ * feat(storage): sort, filtering local storage์ ์ ์ฅํด์ ํ์ด์ง ์ด๋์์๋ ๊ธฐ์ตํ๋๋ก ์์ * [Feature] - ๋ฐ๋ชจ๋ฐ์ด ํผ๋๋ฐฑ ๋ฐ์(๋ฆฌ๋ฒ) (#444) * feat(PlaceDetailCard): ์ฌํ๊ธฐ ์ฌ์ง ์์ ๊ฒฝ์ฐ noImage์ด ์๋ ์๋ฌด๊ฒ๋ ์๋์ค๋๋ก ์์ * test(PlaceDetailCard): ์ด๋ฏธ์ง ์๋ ๊ฒฝ์ฐ ํ ์คํธ์ args ์์ * feat(getDaysAndNights): ์ฌํ์ผ์ ํ ์คํธ ์์ฑ util ํจ์ ๊ตฌํ * refactor(TravelogueDetailPage,TravelPlanDetailPage): ์ฌํ ์ผ์ ๊ณ์ฐ util ํจ์ ์ฌ์ฉ * feat(useInitialTripTitle): ์ฌํ๊ธฐ,์ฌํ๊ณํ ์ ๋ชฉ ์ด๊ธฐ๊ฐ ์์ฑ ์ปค์คํ ํ ๊ตฌํ * feat(TravelogueRegisterPage,useTravelPlanForm): ์ฌํ๊ธฐ,์ฌํ๊ณํ ๋ณํ์ ์ ๋ชฉ default๊ฐ ์ ๊ณต * feat(usePreviousPage): ๋ค๋ก๊ฐ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ ํ ๊ตฌํ - ๊ทธ ์ ํ์ด์ง๊ฐ my ํ์ด์ง์ด๊ณ ํ์ฌ ํ์ด์ง๊ฐ login ํ์ด์ง๋ฉด ๋ค๋ก ๊ฐ๊ธฐ ๋๋ฅผ์ ๋ฉ์ธ ํ์ด์ง๋ก ์ด๋ํ๋๋ก ๊ตฌํ * chore(useInitialTripTitle): Trip์ Travel๋ก ์์ * feat(TravelogueRegisterPage): ์ ๋ชฉ input์ placeholder ์ถ๊ฐ * fix(useInitialTravelTitle): ์ ํ์์๋ง default title์ ๋ฐํํ๋๋ก ์์ * fix(interceptor): ๋ฆฌ๋ค์ด๋ ํธ ์ค์ด ์๋ ๋ alert,๋ฆฌ๋ค๋ฆฌ๋ ํธํ๋๋ก ์์ - ์ธ๊ฐ ์ธ์ฆ์ด ํ์ํ ํ์ด์ง์์ ๋ก๊ทธ์์ ํ ๋ค์ ์ธ๊ฐ ์ธ์ฆ์ด ํ์ํ ํ์ด์ง๋ก ์ด๋์ ๋ก๊ทธ์ธ ํ๋ผ๋ alert์ฐฝ์ด 2๋ฒ ๋จ๋ ์ด์๊ฐ ์์๋๋ฐ, ๋ฆฌ๋ค์ด๋ ํธ ์ค์๋ alert ๋ฐ ๋ฆฌ๋ค์ด๋ ํธ๋ฅผ ํ์ง ์๋๋ก ํ์ฌ ์์ ํจ * feat(queryKey): search ์ฟผ๋ฆฌํค์ searchType ์ถ๊ฐ * feat(useInfiniteSearchTravelogue): ์ฌํ๊ธฐ ๊ฒ์ param์ searchType ์ถ๊ฐ * style(Tab): ํ ์คํธ ์ธ๋ก ๊ฐ์ด๋ฐ ์ ๋ ฌ ๋ฐ theme ์ฌ์ฉ ๋ฆฌํฉํ ๋ง * refactor(TravelogueList): ๊ฒ์ ๊ฒฐ๊ณผ ๋ถ๋ถ์ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌ * feat(SearchPage): ๊ฒ์ ํ์ Tab ์ถ๊ฐ * feat(getInitialTravelTitle): ์ ๋ชฉ ์ด๊ธฐ๊ฐ์์ ์ฌ์ฉ์ ๋๋ค์ ์ญ์ - ์ฌ์ฉ์ ๋๋ค์์ ์ญ์ ํ๋ฉด์ ํ ์ด ์๋๊ฒ๋์ด ํจ์์ด๋ฆ์ useInitialTravelTitle์์ getInitialTravelTitle๋ก ์์ ํ๊ณ util ํด๋๋ก ์ด๋ ์์ผฐ์ต๋๋ค. * refactor(usePreviousPage): type์์ interface๋ก ์์ * refactor(usePreviousPage): ํ์์๋ state ์ญ์ ๋ฐ ๊ทธ ์ ํ์ด์ง๋ง ์ ์ฅํ๋๋ก ์์ - ๊ทธ์ ํ์ด์ง๋ง ์๋ฉด๋๋ฏ๋ก ๊ฐ์ฒด๋ก ์ ์ฅํ ํ์๊ฐ ์๊ณ , ๊ทธ์ ํ์ด์ง๋ฅผ state๋ก ๊ด๋ฆฌํ ํ์๊ฐ ์๊ธฐ์ ์์ ํ์ต๋๋ค. * fix(MainPage): ํ ๊ทธ ํํฐ๋ง ์คํฌ๋กค ๋์ง ์๋ ๋ฌธ์ ํด๊ฒฐ (#460) * [Fix] - ๊ฒ์ ํ์ด์ง ํญ๋ฐ width ์์ , ์ฌํ๊ธฐ ์์ ํ์ด์ง์์ ์ด๋ฏธ์ง ์ต์ ํ ์๋จ (#462) * fix(SearchPage): ๊ฒ์ ํ์ด์ง ํญ๋ฐ width ์์ * fix(TravelogueEditPage): ์ฌํ๊ธฐ ์์ ํ์ด์ง์์ ์ธ๋ค์ผ ์ ๋ก๋ ์ต์ ํ ์ถ๊ฐ * fix: ๊ฒ์ ํ์ด์ง๋ ์ฝ๋ ์คํ๋ฆฌํ ์ ํ์ง ์๋ ๊ฒ์ผ๋ก ๋ณ๊ฒฝ (#465) * fix(NotFound): NotFound ๋ฒํผ ํ ์คํธ ์์ (#473) ์ด์ ํ์ด์ง๋ก๋ก ๋์๊ฐ๊ธฐ๋ฅผ ์ด์ ํ์ด์ง๋ก ๋์๊ฐ๊ธฐ๋ก ์์ * [Fix] - tag filter ๋ฐ sort localStorage key ๊ฐ์ด ๊ณต์ ๋๋ ํ์ ํด๊ฒฐ ๋ฐ ํ๊ทธ ๋ณ๊ฒฝ์ ์ต์๋จ์ผ๋ก ์ด๋ํ๋๋ก ์์ (#474) * fix(MainPage): ํ ๊ทธ ํํฐ๋ง ์คํฌ๋กค ๋์ง ์๋ ๋ฌธ์ ํด๊ฒฐ * fix(MainPage): sort, filtering storageKey ๊ณต์ ๋๋ ๋ฌธ์ ํด๊ฒฐ ๋ฐ ํ๊ทธ ๋ณ๊ฒฝ์ ์ ์ผ ์ฒ์ ์ปจํ ํธ ๋ณด์ด๋๋ก ์์ * refactor(useMultiSelection): ์ฝ๋์ ์ด์ํ ๋ถ๋ถ ์์ * [Fix] - ์์ธ๋ณด๊ธฐ์์ ์ข์์ ๋๋ฅผ ๋๋ง๋ค ์ง๋ ์์ง์ด๋ ๋ฌธ์ & ์ฌ์ฉ์๊ฐ ์ง๋๋ฅผ ํ๋ํ์ง ๋ชปํ๋ ๋ฌธ์ ํด๊ฒฐ (#478) * fix(GoogleMapView): ์์ธ๋ณด๊ธฐ์์ ์ข์์ ๋๋ฅผ ๋๋ง๋ค ์ง๋ ์์ง์ด๋ ๋ฌธ์ & ์ฌ์ฉ์๊ฐ ์ง๋๋ฅผ ํ๋ํ์ง ๋ชปํ๋ ๋ฌธ์ ํด๊ฒฐ onBoundsChanged callback ์ฌ์ฉํ๋ ๋์ useEffect๋ฅผ ํตํด places๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ง๋ค zoom level๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉํฅ์ผ๋ก ๋ณ๊ฒฝ * refactor: ์ฌํ ์ฅ์๊ฐ ํ๋์ผ ๋ zoom level ์กฐ์ zoom level์ 9๋ก ๋ณ๊ฒฝ * [Fix] - 5์ฐจ ์คํ๋ฆฐํธ QA ๋ฐ์ 1์ฐจ (๋ฆฌ๋ฒ) (#479) * fix(SearchPage): ํญ๋ฐ๊ฐ ํค๋ ๊ฐ๋ฆฌ๋ ๋ฌธ์ ์์ * fix: ์ข์์ ์,์ต์ ์ ๋ง์ถค๋ฒ ์์ * fix(Header): ๊ฒ์์ฐฝ placeholder ์์ * [Fix] - 5์ฐจ ์คํ๋ฆฐํธ QA ๋ฐ์ 1์ฐจ (์๋ชจ) (#485) * fix(MainPage): ํ ๊ทธ ํํฐ๋ง ์คํฌ๋กค ๋์ง ์๋ ๋ฌธ์ ํด๊ฒฐ * fix(MainPage): sort, filtering storageKey ๊ณต์ ๋๋ ๋ฌธ์ ํด๊ฒฐ ๋ฐ ํ๊ทธ ๋ณ๊ฒฝ์ ์ ์ผ ์ฒ์ ์ปจํ ํธ ๋ณด์ด๋๋ก ์์ * refactor(useMultiSelection): ์ฝ๋์ ์ด์ํ ๋ถ๋ถ ์์ * fix: ์ ์ฒด๋ฅผ ๋ฌดํจํํจ์ผ๋ก ์ธํด api์์ฒญ ์ฌ๋ฌ๋ฒ ๋๊ฐ๋ ๊ฒ ์์ * v1.2.0 * [Refactor] - API ์์ฒญ ๋ฐ ์๋ต ๋ช ์ธ ํต์ผ (#508) * refactor: edit ์๋ต ๋ช ์ธ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ์์ * refactor: ๋ฑ๋ก ํ์ด์ง ์๋ต ๋ช ์ธ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ์์ * refactor: checked ๋ช ์ธ์ ๋ณ๊ฒฝ์ ๋ฐ๋ผ isChecked๋ก ์์ * refactor: useLocation ๋์ useParams ์ฌ์ฉํ๋๋ก ์์ * refactor(TravelPlanTodoItem): as ์์ * [Feature] - Immer์ ์ฌ์ฉํ ์ฝ๋ ๊ตฌ์กฐ ๊ฐ์ (#495) * refactor(useTravelogueDays): immer์ ํ์ฉํ ๋ก์ง ๊ตฌ์กฐ ๊ฐ์ * refactor(useTravelPlanDays): transformTravelPlanDays ๋ฆฌํฉํฐ๋ง * refactor(travelTransform): ์ฌํ๊ธฐ ๋ณํ ํ์ ์์ (TravelTransformDays) * refactor: query ๋ด ์ค์ฒฉ ๊ฐ์ฒด ๊ตฌ์กฐ Immer๋ก ๊ฐ์ * fix(GoogleMapLoadScript): ๊ตฌ๊ธ๋งต์ ํ๊ตญ์ด๋ก ๋ฐ์์ค๋๋ก ์์ (#488) * [Feature] - ์ฌํ ๊ณํ & ์ฌํ๊ธฐ ์์ธ ํ์ด์ง๋ก ์ด๋ ์ scroll ์ต์๋จ์ผ๋ก ์ด๋ ๋๋๋ก ๋ณ๊ฒฝ (#511) * refactor(TravelogueDetailPage): ์ฌํ๊ธฐ ์์ธ ํ์ด์ง ์ด๋ ์ ์ต์๋จ์ผ๋ก ์คํฌ๋กค ๋๋๋ก ๋ณ๊ฒฝ * refactor(TravelPlanDetailPage): ์ฌํ ๊ณํ ์์ธ ํ์ด์ง ์ด๋ ์ ์ต์๋จ์ผ๋ก ์คํฌ๋กค ๋๋๋ก ๋ณ๊ฒฝ * [Feature] - ์ฌํ๊ธฐ & ์ฌํ ๊ณํ ๋ฑ๋ก/์์ ํ์ด์ง ๋ฆฌํฉํฐ๋ง (#520) * refactor(useTravelogueDays): ์ฌํ๊ธฐ ๋ฑ๋ก ํ์ด์ง default export๋ก ๋ณ๊ฒฝ * refactor(useTravelogueForm): ์ฌํ๊ธฐ form์ ๋ํ ์ฑ ์์ useTravelogueForm์ผ๋ก ๋ถ๋ฆฌ 1. ์ฌํ๊ธฐ ์ ๋ชฉ์ ๋ํ ์ฑ ์์ useTravelogueTitle๋ก ๋ถ๋ฆฌ 2. ์ฌํ๊ธฐ ์ธ๋ค์ผ์ ๋ํ ์ฑ ์์ useTravelogueThumbnail๋ก ๋ถ๋ฆฌ 3. ์ฌํ๊ธฐ ๋ฑ๋ก์ ๋ํ ์ฑ ์์ useTravelogueRegister๋ก ๋ถ๋ฆฌ 4. useTravelogueForm ์ถ๊ฐ * refactor(useMultiImageUpload): ๋ค์ค ์ด๋ฏธ์ง ์ ๋ก๋ ๋ก์ง์ ๋ํ ๋ฆฌํฉํฐ๋ง 1. TravelogueDayAccordion๊ณผ TravelogueMultiImageUpload ๋ด isPaused ๋ฐ onRequestAddImage ์ ๊ฑฐ 2. useImageUpload ๋ด props ํํ ๋ณ๊ฒฝ ๋ฐ usePostUploadImages hook์ ๋ด๋ถ์ ์ถ๊ฐ * refactor(TravelogueRegisterPage): ํ์ด์ง ๋ฆฌํฉํฐ๋ง form์ ๋ํ ์ฑ ์์ useTravelogueForm์ ์์ํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ปดํฌ๋ํธ ๋ด ์ ๊ฑฐ * refactor(ThumbnailUpload): fileRef์ click ํธ๋ค๋ฌ๋ฅผ ๋ด๋ถ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ผ๋ก ๋ณ๊ฒฝ * refactor: ์ธ์ฆ๋ ์ฌ์ฉ์๊ฐ ์๋ ๊ฒฝ์ฐ redirect ์ํค๋ hook ๋ถ๋ฆฌ 1. useAuthRedirect hook ๋ถ๋ฆฌ 2. ํด๋น hook์ ์ฌํ๊ธฐ & ์ฌํ ๊ณํ ๋ฑ๋ก ํ์ด์ง ๋ด ์ ์ฉ * refactor: useToggle ํ ์ ํตํด open, close ํ๋๋ก ๋ณ๊ฒฝ 1. open, close์ ๋ํ useToggle hook ์ถ๊ฐ 2. ํด๋น hook์ ์ฌํ๊ธฐ & ์ฌํ ๊ณํ ๋ฑ๋ก ํ์ด์ง ๋ด ์ ์ฉ * refactor(travelTransform): TravelTransformPlace์ ํ์ ์ ์ ํธ๋ฆฌํฐ ํ์ ์ผ๋ก ๊ฐ์ * refactor(TravelogueRegisterPage): useTravelogueForm ํํ ๋ณ๊ฒฝ 1. useTravelogueForm ๋ด submit ํ๋ ๋ก์ง ์ ๊ฑฐ(์์ ํ์ด์ง์์๋ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด) 2. useTravelogueFormState๋ก ๋ค์ด๋ฐ ๋ณ๊ฒฝ 3. TravelogueRegisterPage ๋ด useTravelogueRegister ์์น ์ํค๋๋ก ๋ณ๊ฒฝ * refactor(TravelogueEditPage): ์ฌํ๊ธฐ ์์ ํ์ด์ง ๋ฆฌํฉํฐ๋ง 1. useTravelogueFormState ์ฌ ์ฌ์ฉ 2. useTravelogueEdit ํ ๋ถ๋ฆฌ(์ฌํ๊ธฐ ์์ ์์ฒญ) 3. travelogue ๋ฐ์ดํฐ ์ด๊ธฐํ์ ๋ํ hook ์ถ๊ฐ(useTravelogueInitialization) 4. ์์ฑ์ ์ฌ๋ถ ํ์ธ hook ๋ถ๋ฆฌ(useAuthorCheck) 5. useTravelogueTitle ๋ด onChangeTitle ๋งค๊ฐ๋ณ์ ์์ 6. ์ธ๋ค์ผ hook ๋ด ์ธ๋ค์ผ ์ด๊ธฐํ ์ํค๋ ํธ๋ค๋ฌ ์ถ๊ฐ * refactor(TravelPlanRegisterPage): ์ฌํ ๊ณํ ๋ฑ๋ก์ ๋ํ ์ฑ ์ ๋ถ๋ฆฌ 1. useTravelPlanRegister ํ ๋ฐ๋ก ๋ถ๋ฆฌ 2. TravelPlanRegisterPage์ ๋ฐ์ * refactor(TravelPlanRegisterPage): ์ฌํ ๊ณํ ์์ ํ์ด์ง ๋ฆฌํฉํฐ๋ง 1. ์ฌํ ๊ณํ ์์ ์ ๋ํ ์ฑ ์ ๋ถ๋ฆฌ(useTravelPlanEdit) 2. ์ฌํ ๊ณํ ์ด๊ธฐํ hook ๋ถ๋ฆฌ 3. useTravelPlanFormState๋ก ๋ค์ด๋ฐ ๋ณ๊ฒฝ 4. startDate์ title์ ๋ํ ์ฑ ์์ ๊ฐ๊ฐ ๋ถ๋ฆฌ * refactor: useTravelPlanFormState, useTravelogueFormState ํด๋๊ตฌ์กฐ ๋ณ๊ฒฝ * fix(useTravelogueFormState): ci ๋ฌธ์ ํด๊ฒฐ * refactor: on prefix๋ฅผ handle prefix๋ก ๋ณ๊ฒฝ ์ปดํฌ๋ํธ props ์ด์ธ ํธ๋ค๋ฌ๋ handle prefix๋ฅผ ๋ฐ๋ผ์ผํ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝ * refactor(ThumbnailUpload): ๋ถํ์ํ ์ ๋ค๋ฆญ ์ ๊ฑฐ * refactor(travelTransform): import ์ type ์ถ๊ฐ * refactor(ThumbnailUpload): ๋ถํ์ํ props ๊ฐํ ์ ๊ฑฐ * [Feature] - ํ๋กํ ์ด๋ฏธ์ง ์์ ๊ธฐ๋ฅ ๋ฐ ์ฌํ๊ธฐ ๋ฑ๋ก ์ ์ฌํ ์ฅ์๋ง๋ค ๊ตญ๊ฐ ์ฝ๋ ์ฃผ๋๋ก ๊ตฌํ (#535) * refactor(Drawer): ๊ธฐ์กด ํค๋์ ๋์ด ๋ฌ๋ผ ์ ์์น๊ฐ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ์ * feat: ์ฅ์ ํํฐ๋ง์ ์ํ์ฌ ์ฅ์ ๋ฑ๋ก์ countryCode๋ฅผ ๋ณด๋ด๋๋ก ๊ธฐ๋ฅ ๊ตฌํ * refactor(AvatarCircle): props $๋ค์ด๋ฐ ์์ * refactor(MyTravelogue):$ ์ ๊ฑฐ์ ๋ฐ๋ฅธ ์์ * refactor(usePostUploadImages): resize ์ convert ์ฒ๋ฆฌ ๋ด๋ถ์์ ํ๋๋ก ์์ * refactor(MainPage): div semantic ํ๊ทธ์ธ button์ผ๋ก ์์ * feat(ProfileImageEditModalBottomSheet): ๊ธฐ๋ฅ ๊ตฌํ * feat(usePutProfile): api ๋ช ์ธ ๋ณ๊ฒฝ์ ๋ฐ๋ผ patch๋ฅผ put์ผ๋ก, imageUrl body ๊ฐ์ ๋ถ์ฌ * refactor(AvatarCircle): props ์ ์ฐํ๊ฒ ์์ * feat(useMyPage): ํ ๊ตฌํ * feat(MyPage): ํ๋กํ ์ด๋ฏธ์ง ์์ ๊ธฐ๋ฅ ๊ตฌํ * refactor(MyPage): ๊ธฐ๋ฅ ๋จ์๋ก pr ๋ถ๋ฆฌํ๊ธฐ ์ํ ์์ * refactor(SearchPage): ๊ธฐ๋ฅ ๋จ์๋ก pr ๋ถ๋ฆฌํ๊ธฐ ์ํ ์์ * refactor(useMyPage): useToggle ์ฌ์ฉํ๋๋ก ์์ * refactor(common): ๋ฐ๋ณต๋๋ ํ์ PlaceInfo ํ์ ์ผ๋ก ์ ์ธ ๋ฐ ์์ * refactor(constants): ์์๋ค ํ์ผ๋ก ๋ถ๋ฆฌ * refactor(useMyPage): ์ฑ ์์ ๋ฐ๋ผ ๊ฐ๊ฐ ์ปค์คํ ํ ์ผ๋ก ๋ถ๋ฆฌ * refactor(constants): ์์ ํ์ผ๋ก ๋ถ๋ฆฌ * refactor(usePostUploadImages): max width, height ๊ฐ ๋ฐ์ ์ ์๋๋ก ์์ * refactor(usePostUploadImages): max width, height ๊ฐ ๋ฐ์ ์ ์๋๋ก ์์ * refactor(useProfileInitialization): ์์กด์ฑ ๋ฐฐ์ด ์ถ๊ฐ * refactor: useCallback์ผ๋ก update ํจ์ ๊ฐ์ธ์ฃผ๋๋ก ์์ * [Fix] - 6์ฐจ ํผ๋๋ฐฑ ๋ฐ์(์๋ชจ) (#545) * refactor(MyPage): ์ด๋ชจ์ง ์ถ๊ฐ๋ก ์ฌํ ๊ณํ, ์ฌํ๊ธฐ ๊ตฌ๋ถ ๋ช ํํ ๋๋๋ก ์์ * refactor(Detail): ์ ํ์ด๋ผ๋ ์ฉ์ด ๋ฏ์ค๋ค๋ ํผ๋๋ฐฑ ๋ฐ์ * refactor(Chip): icon ์ปดํฌ๋ํธ ํฌํจํ๋๋ก ์ถ์ํ * feat(useMultiSelectionTag): animationKey ๋ค์ด๋ฐ ์์ ๋ฐ reset ๊ธฐ๋ฅ ๊ตฌํ * feat(useSingleSelectionTag): animationKey ๋ฐ ๋ฆฌ์ ๊ธฐ๋ฅ ๊ตฌํ * feat(MainPage): reset Button ๊ธฐ๋ฅ ๊ตฌํ * feat(assets): ๋ฆฌ์ ๋ฒํผ, ์ ๋ ฌ ๋ฒํผ ์์ด์ฝ ์ถ๊ฐ * refactor: ์ด๊ธฐํ ์ localStorage๋ ์ด๊ธฐํ ํ๋๋ก ์์ * refactor(useTravelogueFormState): animation key ๋ค์ด๋ฐ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ์์ * refactor: ์ ํ ์ฉ์ด ๋ณ๊ฒฝ * refactor: ์ด๋ชจ์ง ์ญ์ * refactor(svg-icons): ๋ฐ์ดํฐ ๋ณ๊ฒฝ * refactor(MainPage): ์์กด์ฑ ๋ฌธ์ ํด๊ฒฐ * refactor(MyPage): ํ๋กํ ์ด๋ฏธ์ง ์์ ๋ชจ๋ฌ ํ ์คํธ ์์ * [Feature] - ๋ฉ์ธ ํ์ด์ง, ๋ก๊ทธ์ธ ํ์ด์ง ์น ์ ๊ทผ์ฑ ๊ฐ์ (#529) * refactor(Header): ํค๋์ ์ฌ์ฉ๋ IconButton๋ค์ aria-label ์ถ๊ฐ * refactor(Drawer): button ํ๊ทธ ์ค์ฒฉ ์ฌ์ฉ ์์ * chore(MainPage): ํ์ ์๋ ๊ณต๋ฐฑ,ํ๊ทธ ์ญ์ * refactor(AvatarCircle): props ์์ * refactor(TravelogueCard): ์น ์ ๊ทผ์ฑ ๊ฐ์ - ์ฅ์ ์ด๋ฏธ์ง์ alt ๋น ๊ฐ ์ถ๊ฐ - ์นด๋ ์ปดํฌ๋ํธ ํ๊ทธ๋ฅผ button ํ๊ทธ๋ก ์์ - aria-label ์ถ๊ฐ * refactor(Chip): as props ์ถ๊ฐ * style(FallbackImage): color contrast ๊ฐ์ * refactor(MainPage): Chip์ button์ผ๋ก ์ฌ์ฉํ๋๋ก ์์ * refactor(FloatingButton): ํ๋กํ ๋ฒํผ title ์ถ๊ฐ * feat(FocusTrap): ํค๋ณด๋ ํธ๋ฉ hook ๊ตฌํ Co-Authored-By: jinyoung <[email protected]> * refactor(Modal): createPortal ์์น๋ฅผ #root์์ body๋ก ๋ณ๊ฒฝ * refactor(FocusTrap): onEscapeFocusTrap์ ์ต์ ๋๋ก ์์ * feat(Header): ํค๋ณด๋ ํธ๋ฉ ์ ์ฉ * refactor(Header): ์๋งจํฑ ํ๊ทธ ์์ * feat(Drawer): esc๋ก ๋ซ๊ธฐ ์ถ๊ฐ ๋ฐ ์ด๋ ค์์ ๊ฒฝ์ฐ์๋ง DrawerContainer๋ ๋๋งํ๋๋ก ์์ - DrawerContainer๋ฅผ ์ฒ์๋ถํฐ ๋ ๋๋ง๋์ด์์ผ๋ฉด ์ด๋๋ถํฐ ์ด๋ฏธ focusTrap๋ ๊ฐ์ด ๋ ๋๋ง๋์ด Drawer๊ฐ ์ด๋ ค์์ง ์์๋ focus trap์ด Drawer content ๋ด๋ถ์ ๊ฐํ๋ ์ด์๊ฐ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค. * feat(FocusTrap): ์ฒซ๋ฒ์งธ ์์์ ์๋ ํฌ์ปค์ค ์ญ์ * feat(Modal): ๋ชจ๋ฌ์ FocusTrap ์ ์ฉ * feat(MainPage): ์๋งจํฑ ํ๊ทธ ๊ฐ์ * feat(MainPage): ๋ชจ๋ฌ ์ด๋ฆผ ๋ซํ ์๋ฆผ ์ถ๊ฐ * feat(removeEmojis): ์ด๋ชจ์ง๋ฅผ ์ง์ฐ๊ณ string๋ง ๋ฐํํ๋ ์ ํธ ํจ์ ์ถ๊ฐ * refactor(TravelogueCard): removeEmojis ์ ํธ ํจ์ ์ฌ์ฉ * refactor(FloatingButton): ํ๋กํ ๋ฒํผ์ focus trap ์ฌ์ฉ * style(FloatingButton): visual hidden ์คํ์ผ ์ถ๊ฐ * feat(VisuallyHidden): Visually hidden ์ปดํฌ๋ํธ ์ถ๊ฐ - ์น ์ ๊ทผ์ฑ ๊ฐ์ ์์ ์ฌ์ฉํ ์ ์๋ ๋ณด์ด์ง ์๋ ์ปดํฌ๋ํธ ์ถ๊ฐํ์ต๋๋ค. * feat(MainPage): ํ๊ทธ ์ ํ,ํด์ ์ ์๋ฆผ ์ถ๊ฐ * feat(MainPage): TravelogueCard ๋ฆฌ์คํธ ์๋งจํฑ ํ๊ทธ ๊ฐ์ * fix(TravelogueCard): aria-live ์์ฑ ์ญ์ - ํํฐ,์ ๋ ฌ๋ ๋ ๋ง๋ค ๋ ๋๋ง๋์ด์๋ ๋ชจ๋ ์นด๋ aria-label์ด ์ฝํ๋ ์ด์๊ฐ ์์ด์ ์ญ์ ํ์ต๋๋ค. * feat(MainPage): ๋ชจ๋ฌ ์ด/๋ซํ ์๋ฆผ์ VisuallyHidden ์ปดํฌ๋ํธ ์ฌ์ฉ * refactor(Drawer): Trigger ์๋งจํฑ ํ๊ทธ ๋ฐ props ์์ - โฆ
- Loading branch information