Skip to content

Commit

Permalink
Release client (#139)
Browse files Browse the repository at this point in the history
* [Feat/CK-126] develop-client ๋นŒ๋“œ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค (#57)

* fix: develop-client ๋นŒ๋“œ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

* refactor: id ํƒ€์ž… null์ถ”๊ฐ€

* feat: ๋ฌธ์ž์—ด์—์„œ -(๋Œ€์‹œ) ์‚ญ์ œํ•˜๋Š” ์œ ํ‹ธ ํ•จ์ˆ˜ ๊ตฌํ˜„

* test: ๋Œ€์‹œ ์‚ญ์ œ ์œ ํ‹ธ ํ•จ์ˆ˜ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

* fix: merge conflict resolved

* fix: merge conflicts resolved

* feat: ํˆฌ๋‘ ์ƒ์„ฑ rule ์ •์˜

* feat: modal shadow value theme ์— ์ •์˜

* refactor: useValidateInput generic type ์œผ๋กœ ๋ณ€๊ฒฝ

* design: todo ๋ชจ๋‹ฌ ์Šคํƒ€์ผ ๊ตฌํ˜„

* feat: DialogContent wrapper div ํƒœ๊ทธ ๋Œ€์‹  fragment ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ

* feat: ํˆฌ๋‘ ์ƒ์„ฑ validation ํ›… ๊ตฌํ˜„

* feat: ํˆฌ๋‘๋ฆฌ์ŠคํŠธ ๋ชจ๋‹ฌ ๊ตฌํ˜„

* feat: backdrop style ์„ ์Šคํƒ€์ผ ํŒŒ์ผ๋กœ ์ด๋™

* feat: ํˆฌ๋‘๋ฆฌ์ŠคํŠธ ์ถ”๊ฐ€ ๋กœ์ง ๊ตฌํ˜„ ๋ฐ ์ ์šฉ

* feat: GoalRoomTodoResponse ํƒ€์ž… ์ •์˜

* chore: ๊ณจ๋ฃธ ์ „์ฒด todolist ๋ฐ›๋Š” mocking handler ์ถ”๊ฐ€

* feat: useFetchGoalRoomTodos (๊ณจ๋ฃธ ํˆฌ๋‘๋ฆฌ์ŠคํŠธ fetchin) ํ›… ๊ตฌํ˜„

* feat: spinner loading component ๊ตฌํ˜„ ๋ฐ suspense fallback ์œผ๋กœ ์ ์šฉ

* feat: ํˆฌ๋‘๋ฆฌ์ŠคํŠธ ์ „์ฒด๋ณด๊ธฐ ๋ฐ์ดํ„ฐ ๋งคํ•‘

* feat: request url ์—์„œ prefix api/ ์ œ๊ฑฐ

* feat: Readmap List mock ์š”์ฒญ ๊ตฌํ˜„ ๋ฐ API ๋ช…์„ธ์— ๋งž์ถฐ ํƒ€์ž… ์ˆ˜์ •

* refactor: Readmap List Dummy๋ฐ์ดํ„ฐ ์ œ๊ฑฐ ๋ฐ API ์—ฐ๊ฒฐ

* refactor: Home ํ™”๋ฉด์— Main ์ปดํฌ๋„ŒํŠธ ๋Œ€์‹  Roadmap List ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ• ๋‹น

* feat: ์นดํ…Œ๊ณ ๋ฆฌ ์„ ํƒ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ํ›… ๊ตฌํ˜„

* feat: ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๋กœ๋“œ๋งต์„ ํ•„ํ„ฐ๋ง ํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

* feat: ์ถ”์ฒœ ๋กœ๋“œ๋งต ๋ชฉ๋ก ์ปดํฌ๋„ŒํŠธ ์ œ๊ฑฐ

* feat: "์ „์ฒด" ์นดํ…Œ๊ณ ๋ฆฌ ์ถ”๊ฐ€

* feat: goalroomId prop drilling ํ•ด๊ฒฐํ•˜๊ณ ์ž scoped context api ๊ตฌํ˜„ ๋ฐ ๋ž˜ํ•‘

* feat: ์ธ์ฆํ”ผ๋“œ ์ƒ์„ฑ ํ›… ๊ตฌํ˜„

* design: ์ธ์ฆ ํ”ผ๋“œ ๋ชจ๋‹ฌ ์Šคํƒ€์ผ ๊ตฌํ˜„

* feat: ์ธ์ฆ ํ”ผ๋“œ ์ „์ฒด๋ณด๊ธฐ ๋ชจ๋‹ฌ ๊ตฌํ˜„ ๋ฐ ์ƒ์„ฑ ๋กœ์ง ๋งคํ•‘

* refactor: ๋กœ๋“œ๋งต ๋ชฉ๋ก ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ

* feat: ๋ช…์„ธ ๋ณ€๊ฒฝ์— ๋งž์ถ”์–ด ํƒ€์ž… ๋ณ€๊ฒฝ

* feat: ์š”์ฒญ endpoint ๋ณ€๊ฒฝ

* refactor: ๋ถˆํ•„์š”ํ•œ object wrapping ์ œ๊ฑฐ

* refactor: ๊ฐ ์กฐ๊ฑด๋งˆ๋‹ค boolean return ํ•˜๋„๋ก ๋ฆฌํŒฉํ† ๋ง

* refactor: Axios ์„ค์ • ๋™๊ธฐํ™”

* [feat/CK-45] ๋กœ๋“œ๋งต ์ƒ์„ฑ api๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค (#58)

* feat: ๋กœ๋“œ๋งต ์ƒ์„ฑ api ํ•จ์ˆ˜ & ํ›… ์„ ์–ธ

* fix: interceptor์˜ response ๊ฐ’ ์ˆ˜์ •

* design: ๋‚œ์ด๋„ select ์Šคํƒ€์ผ ๋ณ€๊ฒฝ

* fix: ๋ณธ๋ฌธ์˜ value๊ฐ€ ๊ฐ€์ ธ์™€์ง€์ง€ ์•Š๋Š” ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

* refactor: ์ปดํฌ๋„ŒํŠธ ์—ญ์ „์„ ์œ„ํ•œ ๊ตฌ์กฐ ๋ณ€๊ฒฝ

* design: ๋กœ๋“œ๋งต ์ถ”๊ฐ€ํ•˜๊ธฐ ๋ฒ„ํŠผ ์Šคํƒ€์ผ ์ƒ์„ฑ

* refactor: onclick์‹œ์— ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง ๋ฐฉ์ง€ํ•˜๋Š” ๋กœ์ง ์ถ”๊ฐ€

* feat: ์ž…๋ ฅ๋œ ํƒœ๊ทธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋กœ์ง ๊ตฌํ˜„

* feat: ๋กœ๋“œ๋งต ์ƒ์„ฑ api๋ฅผ ์œ„ํ•œ ํƒ€์ž… ์„ ์–ธ

* refactor: textarea ์—์„œ input ํƒœ๊ทธ๋กœ ๋ณ€๊ฒฝ

* feat: ๋กœ๋“œ๋งต ์ƒ์„ฑ api์—ฐ๊ฒฐ

* feat: form์•ˆ์—์„œ ๊ฐ input๋“ค์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ  ์ œ์ถœํ•˜๋Š” ์ปค์Šคํ…€ ํ›… ์ƒ์„ฑ

* style: ์ฝ”๋“œ ๊ฐœํ–‰ ์ •๋ฆฌ

* [feat/CK-99] ๊ณจ๋ฃจ ๋ชฉ๋ก ์กฐํšŒ์˜ api๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค (#61)

* chore: ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ ์‚ญ์ œ

* feat: ๊ณจ๋ฃธ ๋ชฉ๋ก์กฐํšŒ ํŽ˜์ด์ง€ ๊ฒฝ๋กœ ์„ค์ •

* feat: ๊ณจ๋ฃธ ๋ชฉ๋ก ์กฐํšŒ api ๋กœ์ง ๊ตฌํ˜„

* feat: ๊ณจ๋ฃธ ๋ชฉ๋ก ์กฐํšŒ UI๊ตฌํ˜„

* feat: ์ถฉ๋Œ์‚ฌํ•ญ ํ•ด๊ฒฐ

* feat: ๊ณจ๋ฃธ ๋ชฉ๋ก ํŽ˜์ด์ง€ ๋ผ์šฐํŒ…

* feat: ๊ณจ๋ฃธ๋ชฉ๋ก์กฐํšŒ api ์—ฐ๊ฒฐ

* feat: ๊ณจ๋ฃธ๋ชฉ๋ก์กฐํšŒ api ์—ฐ๊ฒฐ

* fix: response์—์„œ access_token ์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋Š” ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

* feat: ui๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ

* [feat/CK-129] ์˜ค๋ฅ˜ํ•ด๊ฒฐ & ํ†ตํ•ฉํ•œ๋‹ค (#62)

* fix: develop-client ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

* fix: develop-client ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

* feat: user ์ €์žฅ context ๊ตฌํ˜„

* feat: ์œ ์ € ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ณ ๋„ํ™”

* feat: ์œ ์ € ์ •๋ณด ์กด์žฌ validation util ๊ตฌํ˜„

* chore: toast message ์‹œ๊ฐ„ ์ฆ๊ฐ€

* feat: oath ๋ฒ„ํŠผ ์ฃผ์„์ฒ˜๋ฆฌ

* feat: ๋ณ€๊ฒฝ๋œ todo type์— ๋งž๊ฒŒ ์ ์šฉ

* feat: todo ์ƒํƒœ ๋ณ€๊ฒฝ ํ›… ๊ตฌํ˜„

* feat: ํˆฌ๋‘ ์ปดํฌ๋„ŒํŠธ์— ์ƒํƒœ๋ณ€๊ฒฝ ๋กœ์ง ์ ์šฉ

* feat: ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€ ์›น ์ ‘๊ทผ์„ฑ ํ–ฅ์ƒ

* [feat/CK-130] ํŽ˜์ด์ง€ ๋ผ์šฐํŒ…๊ณผ ์ž”์—ฌ ์„œ๋ฒ„ ์—ฐ๊ฒฐ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค (#66)

* feat: ๋ฒ„ํŠผ ๊ณต์šฉ ์ปดํฌ๋„ŒํŠธ์— onclick ์ถ”๊ฐ€

* feat: ๋กœ๋“œ๋งต ๋ชฉ๋ก๊ณผ ๋‹จ์ผ์กฐํšŒ ๋ผ์šฐํŒ… ์—ฐ๊ฒฐ

* refactor: ๋ฐ์ดํ„ฐ ํŒจ์นญ ํ•จ์ˆ˜ & ํƒ€์ž… ๋„ค์ด๋ฐ ๋ณ€๊ฒฝ

* feat: ๋กœ๋“œ๋งต ๋‹จ์ผ์กฐํšŒ ์‹ค์ œ ๋ฐ์ดํ„ฐ ์ ์šฉ

* fix: ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ ๋„ค์ด๋ฐ์ด ๋งž์ง€ ์•Š๋Š” ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

* refactor: ๋”๋ฏธ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ

* refactor: ๋กœ๋“œ๋งต ๋‹จ์ผ์กฐํšŒ ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ ๋„ค์ด๋ฐ ์ˆ˜์ •

* fix: fixture ๋ฐ์ดํ„ฐ ํƒ€์ž… ๋ณ€ํ™˜

* refactor: ํƒ€์ž… ๋ณ€๊ฒฝ

* chore: ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ ์ œ๊ฑฐ

* feat: dialog์ปดํฌ๋„ŒํŠธ์— defaultOpen ์†์„ฑ ์ถ”๊ฐ€

* feat: ๊ณจ๋ฃธ ๋‹จ์ผ์กฐํšŒ UI๊ตฌํ˜„

* design: ๋ชจ๋‹ฌ ๋””์ž์ธ ๋ณ€๊ฒฝ

* feat: ๊ณจ๋ฃธ ๋‹จ์ผ์กฐํšŒ api ๋กœ์ง ๊ตฌํ˜„

* feat: dialog ์ปดํฌ๋„ŒํŠธ ์Šคํฌ๋กค ๋ฐฉ์ง€ ๋กœ์ง ๊ตฌํ˜„

* feat: ๊ณจ๋ฃธ ๋‹จ์ผ ์กฐํšŒ ํƒ€์ž… ์„ ์–ธ

* feat: ๊ณจ๋ฃธ ๋‹จ์ผ ์กฐํšŒ ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ

* design: ๊ณจ๋ฆ„ ๋ชฉ๋ก ๋ฐ˜์‘ํ˜• ui ์ ์šฉ

* design: ๋กœ๋“œ๋งต ์ƒ์„ฑ ui ์ˆ˜์ •

* feat: ๋กœ๋“œ๋งต ์ƒ์„ฑ ํ›„ ๊ฒฝ๋กœ์„ค์ •

* feat: ๊ณจ๋ฃธ ์ƒ์„ฑํ•˜๋Š” ํŽ˜์ด์ง€ ๋ผ์šฐํŒ…

* refactor: node์˜ textarea ์Šคํƒ€์ผ ์ˆ˜์ •

* feat: ํ†ต์‹  ์—๋Ÿฌ ํ•ด๊ฒฐ

* feat: ํ†ต์‹  ์—๋Ÿฌ ํ•ด๊ฒฐ

* fix: ๊ณจ๋ฃธ ์ƒ์„ฑ ์‹œ, ๋กœ๋“œ๋งต ๋…ธ๋“œ์— ๋Œ€ํ•œ ๋‚ ์งœ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* refactor: ๊ณจ๋ฃธ์„ ์ƒ์„ฑํ•˜๋ฉด, ๊ณจ๋ฃธ ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋„๋ก ๋ณ€๊ฒฝ

* refactor: ๊ณจ๋ฃธ ์ƒ์„ฑ ์š”์ฒญ์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์— ์š”์ฒญ ํƒ€์ž…์ด ์ ์šฉ๋œ ๊ฒƒ ์ˆ˜์ •

* refactor: ๊ณจ๋ฃธ์„ ์ƒ์„ฑ ์‹œ, Toast๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ ค์ฃผ๋„๋ก ๋ณ€๊ฒฝ

* refactor: ๊ณจ๋ฃธ ์ƒ์„ฑ ์‘๋‹ต์— ๋Œ€ํ•œ ํ›„ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ๊ณจ๋ฃธ ์ƒ์„ฑ ์š”์ฒญ ํ›… ๋‚ด๋ถ€์—์„œ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ณ€๊ฒฝ

* chore: ๋ฐฐ๊ฒฝ ํˆฌ๋ช…ํ•œ ์•ฝ๊ฐ„ ํŒŒ๋ž€์ƒ‰ ํŒ”๋ ˆํŠธ์— ์ถ”๊ฐ€

* chore: ์„ฑ๋ณ„ ๋ณ„ ์–ผ๊ตด svg icon ์ถ”๊ฐ€

* feat: ๋‚ด๊ฐ€ ์†ํ•œ ๊ณจ๋ฃธ ์กฐํšŒ ํ›… ๊ตฌํ˜„

* feat: ๋งˆ์ด ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„

* refactor: ๋ชจ๋‹ฌ ๋‚ด๋ถ€์—์„œ ์Šคํฌ๋กค Y ์ ์šฉ ๋ฐ ์Šคํฌ๋กค๋ฐ” ์ œ๊ฑฐ

* refactor: on, off ๊ธฐ๋Šฅ์„ useSwitch ํ›…์œผ๋กœ ๋Œ€์ฒด

* refactor: ์ปดํŒŒ์šด๋“œ ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„๋œ ๋ชจ๋‹ฌ์˜ ์ƒํƒœ๊ฐ€ ์™ธ๋ถ€์—์„œ ๋‹ค๋ฃจ์–ด์ง€๊ณ  ์žˆ๋Š” ์ด์Šˆ๋กœ ์ธํ•œ ๋ฒ„๊ทธ ํ•ด๊ฒฐ

* refactor: ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ useNavigate ๋Œ€์‹  Link๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •

* refactor: console ๋ฌธ ์ œ๊ฑฐ ๋ฐ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ UI ์ œ๊ฑฐ

* feat: ์ž…๋ ฅ๋ฐ›์€ ๋‚ ์งœ๊ฐ€ ํ˜„์žฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์œ ํšจํ•œ์ง€ ํŒ๋ณ„ํ•˜๋Š” ํ•จ์ˆ˜ ๊ตฌํ˜„

* feat: ๊ณจ๋ฃธ ์ธ์ฆ ํ”ผ๋“œ ๋„์ถœ hook ๊ตฌํ˜„

* feat: ๊ณจ๋ฃธ ์ธ์ฆํ”ผ๋“œ ๋ชจ๋‹ฌ์— ์ธ์ฆํ”ผ๋“œ ์นด๋“œ ๋ฆฌ์ŠคํŠธ ๋„์ถœ

* feat: ์‚ฌ์šฉ์ž๊ฐ€ ๊ณจ๋ฃธ์— ์ฐธ์—ฌํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ณจ๋ฃธ ์ฐธ์—ฌ๋ฒ„ํŠผ์„ ํ†ตํ•ด ์ฐธ์—ฌ์‹œํ‚ค๊ธฐ

* refactor: ์‚ฌ์šฉ์ž๊ฐ€ ๊ณจ๋ฃธ์— ์ฐธ๊ฐ€์ค‘์ธ์ง€ ์•„๋‹Œ์ง€ ํŒ๋ณ„ํ•˜์ง€ ๋ชปํ–ˆ๋˜ ์ด์Šˆ ํ•ด๊ฒฐ

* refactor: useValidateInput ํ›… ๊ฒ€์ฆ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•˜๋”๋ผ๋„ ์ƒํƒœ๋Š” ๋ฐ”๋€Œ๋„๋ก ๋ณ€๊ฒฝ

* chore: ํ† ์ŠคํŠธ ๋ฉ”์„ธ์ง€ ๋„์›Œ์ง€๋Š” ์‹œ๊ฐ„ ์ฆ๊ฐ€

* feat: ํšŒ์›๊ฐ€์ž… regex, ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ๊ตฌํ˜„

* feat: ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต์‹œ ํ† ์ŠคํŠธ ๋ฉ”์„ธ์ง€์™€ ํ•จ๊ป˜ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ๋กœ์ง ๊ตฌํ˜„

* feat: ํšŒ์›๊ฐ€์ž… ํผ ๊ฒ€์ฆ ํ›… ๊ตฌํ˜„

* refactor: GoalRoomCertificationFeedsResponse type ํƒ€์ž… ์„ ์–ธ ํ˜•์‹ ์ปจ๋ฒค์…˜์— ๋งž์ถ”์–ด ๋ณ€๊ฒฝ

* [feat/CK-136] ๋กœ๊ทธ์ธ ์œ ์ง€์™€ UI ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค (#97)

* fix: ๋กœ๊ทธ์ธ์ด ์œ ์ง€๋˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

* fix: ๋กœ๋“œ๋งต ๋ฆฌ์ŠคํŠธ์˜ ์•„์ดํ…œ์˜ ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

* fix: ๋ชฉ๋ก์กฐํšŒ ํŽ˜์ด์ง€์˜ ๋†’์ด ๋ฌธ์ œ ํ•ด๊ฒฐ

* style: ์ฝ”๋“œ ์Šคํƒ€์ผ ์ •๋ฆฌ

* refactor: unmount๋˜์—ˆ์„ ๋•Œ ๋น„๋™๊ธฐ ์ž‘์—… ์ทจ์†Œ ๋กœ์ง ๊ตฌํ˜„

* feat: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ›… ์ œ๊ฑฐ

* [feat/CK-142] ๋กœ๋“œ๋งต ์ƒ์„ฑํŽ˜์ด์ง€ ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค (#101)

* design: ํƒœ๊ทธ ์‚ญ์ œ๋ฒ„ํŠผ ์ƒ์„ฑ

* feat: ํƒœ๊ทธ ์‚ญ์ œ๋ฒ„ํŠผ ์ƒ์„ฑ & ํƒœ๊ทธ placeholder์ ์šฉ

* feat: ํƒœ๊ทธ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋กœ์ง ๊ตฌํ˜„

* style: ์ฝ”๋“œ ์Šคํƒ€์ผ ์ •๋ฆฌ

* refactor: ํƒœ๊ทธ๋ฅผ ์™„์„ฑํ•˜๋Š” trigger ๋ถ„๋ฆฌ ํ›„ ์ ์šฉ

* fix: ๋กœ๋“œ๋งต ์ž…๋ ฅ๋ถ€๋ถ„ ํฌ๊ธฐ๊ฐ€ ๋งž์ง€ ์•Š๋Š” ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

* fix: ์†Œ๊ฐœ๊ธ€ ์ž…๋ ฅ์ฐฝ์˜ ๋†’์ด๊ฐ€ ๋Š˜์–ด๋‚˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

* refactor: ๋กœ๋“œ๋งต ์ž…๋ ฅ placeholder์ถ”๊ฐ€

* style: ์˜คํƒ€ ์ˆ˜์ •

* feat: onChange๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, onSubmit์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก Hook ํ™•์žฅ

* chore: handleSubmit ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ฃผ์„ ์ถ”๊ฐ€

* feat: ์ฝ”๋ผ๋ฆฌ๋ผ๋ฆฌ InputField ๊ตฌํ˜„

* design: number ํƒ€์ž…์ผ ๋–„์˜ ์Šคํƒ€์ผ ์ถ”๊ฐ€

* design: form์„ section ๋ณ„๋กœ ๋ถ„๋ฆฌ ๋ฐ ์Šคํƒ€์ผ ์žฌ์กฐ์ •

* feat: ๊ฐ์ฒด ๋‚ด๋ถ€์˜ yyyy-mm-dd ํ˜•์‹์˜ ๋ฌธ์ž์—ด์„ yyyymmdd ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ๊ตฌํ˜„

* refactor: ์™ธ๋ถ€์—์„œ handleInputChange ํ•จ์ˆ˜์˜ ํƒ€์ž…๊ณผ ์—๋Ÿฌ ๊ฐ์ฒด์˜ ํƒ€์ž…์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ

* feat: ๋ณ€๋™์‚ฌํ•ญ์— ๋งž๊ฒŒ api fetching spec ๋ณ€๊ฒฝ

* feat: ๋ณ€๋™์‚ฌํ•ญ์— ๋งž๊ฒŒ api fetching spec ๋ณ€๊ฒฝ

* feat: ๋ณ€๋™์‚ฌํ•ญ์— ๋งž๊ฒŒ api fetching spec ๋ณ€๊ฒฝ

* feat: ๋ฌดํ•œ ์Šคํฌ๋กค ์ ์šฉ

* feat: useIntersection hook ๊ตฌํ˜„

* refactor: ๊ฐ Input์˜ validation์„ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•˜๋„๋ก ๋ฆฌํŽ™ํ† ๋ง

* refactor: useFormInput ์ค‘๋ณต ๋กœ์ง ์ œ๊ฑฐ ๋ฆฌํŽ™ํ† ๋ง

* feat: ๋ฌดํ•œ์Šคํฌ๋กค ์ ์šฉ๋œ api๋ช…์„ธ ๋ฐ˜์˜

* feat: render-props๋ฅผ ์ด์šฉํ•œ ํ•„ํ„ฐ๋ง ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„

* design: ํ•„ํ„ฐ๋ง ์ปดํฌ๋„ŒํŠธ ์Šคํƒ€์ผ ์ฝ”๋“œ ์ž‘์„ฑ

* feat: ๊ณจ๋ฃธ ํ•„ํ„ฐ๋ง constants ์ƒ์„ฑ

* feat: Object.hasOwn์˜ ํƒ€์ž… ์ปค์Šคํ…€

* refactor: validation ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ๋ชจ๋“  ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ณ€๊ฒฝ

* design: ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์ž˜๋ฆฌ์ง€ ์•Š๋„๋ก ์Šคํƒ€์ผ ์ˆ˜์ •

* feat: any ํƒ€์ž…์„ ์ตœ์†Œํ™”ํ•˜๋„๋ก ํƒ€์ž… ๋ฆฌํŽ™ํ† ๋ง

* feat: ํšŒ์˜ ์ดํ›„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ธฐ๋กœ ํ•œ Calender ์ปดํฌ๋„ŒํŠธ ์ œ๊ฑฐ

* feat: suspense fallback ์— Spinner ์ปดํฌ๋„ŒํŠธ ํ• ๋‹น

* feat: useInfiniteScroll ํ›… ๊ตฌํ˜„

* feat: ๋กœ๋“œ๋งต ๋ฆฌ์ŠคํŠธ Fetching ํ›…์— ๋ฌดํ•œ ์Šคํฌ๋กค ๋กœ์ง ์ ์šฉ

* feat: ๋กœ๋“œ๋งต ๋ฆฌ์ŠคํŠธ Fetching ํ›…์— ๋ฌดํ•œ ์Šคํฌ๋กค ๋กœ์ง ์ ์šฉ

* feat: RoadmapList  ์ปดํฌ๋„ŒํŠธ์— ๋ฌดํ•œ ์Šคํฌ๋กค ์ ์šฉ

* refactor: validation utils ํ•จ์ˆ˜ ๋ถ„๋ฆฌ ๋ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

* feat: ๊ณจ๋ฃธ ์‚ฌ์šฉ์ž fetching api function ๊ตฌํ˜„

* feat: ๊ณจ๋ฃธ ์ฐธ์—ฌ์ž query hook ๊ตฌํ˜„

* feat: ๋กค๋ฃธ ๋žญํ‚น ๋Œ€์‹œ๋ณด๋“œ ๋ฐ•์Šค ๊ตฌํ˜„

* feat: isValidMaxValue ํ•จ์ˆ˜ ๊ตฌํ˜„ ๋ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

* feat: ์ธ์›์ˆ˜์— ๋Œ€ํ•œ Input ์ถ”๊ฐ€

* refactor: validation์˜ ๋งค์ง๋„˜๋ฒ„์™€ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์ˆ˜ํ™”

* feat: InputField์— textarea ํƒœ๊ทธ๋ฅผ ์กฐ๊ฑด ๋ถ„๊ธฐ๋กœ ์ถ”๊ฐ€

* refactor: ๋กœ๋“œ๋งต Info ๋งตํ•‘

* feat: ์œ ์ € ์ „์ฒด ์กฐํšŒ query ํ›… ๊ตฌํ˜„

* feat: ์œ ์ € ์ „์ฒด๋ณด๊ธฐ ๋ชจ๋‹ฌ ๊ตฌํ˜„

* feat: ๋กœ๋“œ๋งต ๊ฒ€์ƒ‰ ์ปดํฌ๋„ŒํŠธ UI๊ตฌํ˜„

* feat: ๋กœ๋“œ๋งต ๊ฒ€์ƒ‰ api ๋กœ์ง ์ƒ์„ฑ

* feat: hotfix

* feat: hotfix

* [feat/CK-151] Selectbox์˜ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค (#107)

* design: option ๋„“์ด ์ˆ˜์ •

* fix: render props๋ฅผ ๋ฐ›๋Š” ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ์œผ๋กœ ๋‚œ์ด๋„ valueํ‘œ์‹œ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

* fix: render props๋ฅผ ๋ฐ›๋Š” ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ์œผ๋กœ ๋‚œ์ด๋„ valueํ‘œ์‹œ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

* feat: ๋ฆฌํ„ดํ•˜๋Š” ์ƒํƒœ ์ถ”๊ฐ€

* feat: ์‚ฌ์ด๋“œ ๋„ค๋ธŒ๋ฐ”๊ฐ€ ํ•ญ์ƒ ์ตœ์ƒ์œ„ ์š”์†Œ์ด๋„๋ก ์ˆ˜์ •

* refactor: ๊ณจ๋ฃธ ์•„์ดํ…œ์˜ height๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* refactor: ๊ณจ๋ฃธ์„ ์ƒ์„ฑํ•œ ํ›„, ๊ณจ๋ฃธ ๋ชฉ๋ก์„ ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ค๋„๋ก ๊ตฌํ˜„

* refactor: ๊ณจ๋ฃธ ์ƒ์„ฑ ํŽ˜์ด์ง€์— Suspense ์ ์šฉ

* refactor: ๊ณจ๋ฃธ ๋ชจ๋‹ฌ ๋‚ด๋ถ€์˜ ์ปจํ…์ธ ๋ฅผ ๋ˆŒ๋Ÿฌ๋„ ๋ชจ๋‹ฌ์ด ๋‹ซํžˆ๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* design: ๋„ค๋ธŒ๋ฐ” ์Šคํƒ€์ผ ๊ณ ๋„ํ™”

* feat: ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ ๊ตฌํ˜„

* design: ๋กœ๊ทธ์ธ ์‹œ ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ๊ณผ ๋กœ๊ณ ๊ฐ€ ๊ฒน์น˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •

* refactor: ๊ธฐ์กด ๋กœ๊ทธ์ธ form ์„ ํ•ธ๋“ค๋งํ•˜๋ฉด ํ™ˆ์œผ๋กœ ๊ฐ”๋˜ ๋กœ์ง์—์„œ ์‘๋‹ต์ด ์„ฑ๊ณต ์‹œ navigating ํ•˜๋„๋ก ๋ฆฌํŒฉํ† ๋ง

* feat: image src path S3 ์ ์šฉํ•œ path๋กœ ๋ฒˆ๊ฒฝ

* feat: ๋กœ๋“œ๋žฉ ๊ฒ€์ƒ‰๊ฒฐ๊ณผ ์„œ๋ธŒ๋ผ์šฐํŒ…

* feat: ๋กœ๋“œ๋งต ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ api๋กœ์ง ์ƒ์„ฑ

* design: ๊ฒ€์ƒ‰ ์•„์ด์ฝ˜ ์ƒ์„ฑ

* design: ๋กœ๋“œ๋งต ๊ฒ€์ƒ‰ ์Šคํƒ€์ผ ์ฝ”๋“œ ์ž‘์„ฑ

* design: ๋กœ๋“œ๋งต ์ƒ์„ฑ๋ฒ„ํŠผ UI๋ณ€๊ฒฝ

* feat: ๋กœ๋“œ๋งต ๊ฒ€์ƒ‰๋ฐ” ๊ตฌํ˜„

* refactor: ๋ฌดํ•œ ์Šคํฌ๋กค์˜ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ

* feat: ๊ณจ๋ฃธ ๋ฆฌ์ŠคํŠธ ๋ฌดํ•œ ์Šคํฌ๋กค ์ ์šฉ

* feat: ์ฃผ์–ด์ง„ ๋‚ ์งœ string ์ด ์˜ค๋Š˜ ํ˜น์€ ์ดํ›„์ธ์ง€ ํŒ๋ณ„ํ•˜๋Š” ์œ ํ‹ธ ๊ตฌํ˜„

* feat: ์ปดํฌ๋„ŒํŠธ ๋‚ด ํŽ˜์ด์ง€ ์ด๋™์— Link ์‚ฌ์šฉ

* feat: ๊ณจ๋ฃธ ์‹œ์ž‘ ์ฟผ๋ฆฌ ํ•จ์ˆ˜ ๊ตฌํ˜„

* feat: ๊ณจ๋ฃธ ์‹œ์ž‘ ๋ฒ„ํŠผ ์ ์šฉ

* feat: ๊ณจ๋ฃธ ๋Œ€์‹œ๋ณด๋“œ query key ์ƒ์ˆ˜ ์ ์šฉ

* feat: ์ธ์ฆํ”ผ๋“œ ๋“ฑ๋ก ์‹œ invalidate ์ฒ˜๋ฆฌ์™€ Input reset ๋กœ์ง ๊ตฌํ˜„

* feat: ๊ณจ๋ฃธ ์ƒ์„ฑ์ž๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ํˆฌ๋‘ ์ƒ์„ฑ ํผ ๋ณด์ง€ ๋ชปํ•˜๋„๋ก ์ฒ˜๋ฆฌ

* design: ์ธ์ฆํ”ผ๋“œ content min-width ์ ์šฉ

* feat: ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์ฑ„ํŒ… ์„น์…˜ ์ œ๊ฑฐ ํ›„ ์ „์ฒด์ ์ธ ๋ ˆ์ด์•„์›ƒ ๋ฆฌ์‚ฌ์ด์ง•

* feat: ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์ฑ„ํŒ… ์„น์…˜ ์ œ๊ฑฐ ํ›„ ์ „์ฒด์ ์ธ ๋ ˆ์ด์•„์›ƒ ๋ฆฌ์‚ฌ์ด์ง•

* design: paylayout min-height ์ ์šฉ

* feat: query key ์ƒ์ˆ˜ํ™” ๋ฐ dependent ์—˜๋ฆฌ๋จผํŠธ ์ถ”๊ฐ€

* feat: ๋Œ€์‹œ๋ณด๋“œ ํˆฌ๋‘, ์ธ์ฆํ”ผ๋“œ ์ด ๊ฐœ์ˆ˜ ๋„์ถœ ๋กœ์ง ๊ตฌํ˜„

* feat: ๋Œ€์‹œ๋ณด๋“œ ํˆฌ๋‘, ์ธ์ฆํ”ผ๋“œ ์ด ๊ฐœ์ˆ˜ ๋„์ถœ ๋กœ์ง ๊ตฌํ˜„

* fix: merge conflicts resolved

* feat: ๊ณจ๋ฃธ ์œ ์ € ๋žญํ‚น

* feat: ๊ณจ๋ฃธ ๋ณธ์ธ ๋žญํ‚น ๋„์ถœ ๋กœ์ง ๊ตฌํ˜„

* feat: ๊ณจ๋ฃธ ๋ณธ์ธ ๋žญํ‚น ํฐํŠธ ๋ณ€๊ฒฝ

* feat: ๋‚ ์งœ ๋ณ€ํ™˜ ์œ ํ‹ธ ํ•จ์ˆ˜ ๊ตฌํ˜„

* feat: ๋‚˜์˜ ๋กœ๋“œ๋งต ๋ฆฌ์ŠคํŠธ fetching hook ๊ตฌํ˜„

* feat: ๋งˆ์ดํŽ˜์ด์ง€์— ๋‚˜์˜ ๋กœ๋“œ๋งต ํƒญ ์ถ”๊ฐ€

* design: ์ฝ”๋ผ๋ฆฌ ๋กœ๊ณ  ์ค‘์•™์ •๋ ฌ

* design: ๋กœ๋“œ๋งต ๋ฆฌ์ŠคํŠธ ์ปจํ…์ธ  ๊ฐ€์‹œ์„ฑ ๋ฌธ์ œ ๊ฐœ์„ 

* refactor: mainPage ์ œ์ž‘์„ ์œ„ํ•œ ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ

* feat: ๋ฉ”์ธ ํŽ˜์ด์ง€ ๊ตฌํ˜„

* design: ๊ธฐ์กด ๊ถŒ์žฅ ์†Œ์š”๊ธฐ๊ฐ„ days ์—์„œ ์ผ๋กœ ๋ณ€๊ฒฝ

* feat: ๋กœ๋“œ๋งต ์†Œ๊ฐœ ๊ธ€ ์ถ”๊ฐ€

* chore: ์˜คํƒ€ ์ˆ˜์ •

* feat: ๊ธฐ์กด ํ•˜๋‹จ ์ง„ํ–‰์ค‘์ธ ๊ณจ๋ฃธ๋ณด๊ธฐ ๋ฒ„ํŠผ์—์„œ ๊ณจ๋ฃธ ์ƒ์„ฑ ๋ฒ„ํŠผ์œผ๋กœ ๋ณ€๊ฒฝ

* feat: ๋ฉ”์ธ ์ฝ”๋ผ๋ฆฌ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ถ”๊ฐ€

* chore: ํŒŒ๋น„์ฝ˜ ์ถ”๊ฐ€

* feat: ์‘๋‹ต๋ฐ›์€ response ๋ณ€์ˆ˜์˜ ๋„ค์ด๋ฐ์„ ~Response๋กœ ์ผ์น˜์‹œํ‚ค๋„๋ก ๋ณ€๊ฒฝ

* feat: ๋ถˆํ”ผ์š”ํ•œ ์ปดํฌ๋„ŒํŠธ ์ œ๊ฑฐ

* [feat/CK-168] ๋กœ๋“œ๋งต ์ƒ์„ฑ๋ถ€๋ถ„์˜ ๋ณ€๊ฒฝ๋œ api๋ฅผ ๋ฐ˜์˜ํ•œ๋‹ค ( ์‚ฌ์ง„์ถ”๊ฐ€ ๊ธฐ๋Šฅ ) (#122)

* feat: ๋กœ๋“œ๋งต ์ƒ์„ฑ api headers ๋ณ€๊ฒฝ ๋ฐ˜์˜

* design: ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์•„์ด์ฝ˜ ์ƒ์„ฑ

* design: ๋กœ๋“œ๋งต ์ƒ์„ฑ์˜ ์ด๋ฏธ์ง€ ์‚ฝ์ž… UI๊ตฌํ˜„

* feat: ๋กœ๋“œ๋งต ์ƒ์„ฑ api ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž… ๋ณ€๊ฒฝ

* feat: ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๋ฉด preview ์ด๋ฏธ์ง€๊ฐ€ ๋ณด์ด๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

* design: ๋กœ๋“œ๋งต ์ƒ์„ฑํ•˜๊ธฐ ๋ฒ„ํŠผ UI ๋ณ€๊ฒฝ

* feat: ์—…๋กœ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ ์ทจํ•ฉํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

* feat: ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๋Š” ์ปค์Šคํ…€ ํ›… ์ƒ์„ฑ

* feat: ๋กœ๋“œ๋งต ์ƒ์„ฑ ๊ด€๋ จ ํƒ€์ž… ์ˆ˜์ •

* design: ๊ณจ๋ฃธ ์•„์ดํ…œ์˜ ์ „์ฒด์ ์ธ border-radius ์กฐ์ •

* feat: ๊ณจ๋ฃธ ์ •๋ ฌ ๋กœ์ง ์ƒ์ˆ˜ํ™” ๋ฐ API ์ˆ˜์ • ์‚ฌํ•ญ ๋ฐ˜

* feat: ์‹œ์ž‘ํ•˜์ง€ ์•Š์€ ๊ณจ๋ฃธ ๋Œ€์‹œ๋ณด๋“œ ๋งŒ์งˆ ์ˆ˜ ์—†๊ฒŒ ์ฒ˜๋ฆฌ

* feat: ๊ณจ๋ฃธ ๋ฆฌ์ŠคํŠธ ์Šคํƒ€์ผ ๊ณ ๋„ํ™”

* feat: ๊ณจ๋ฃธ ์ƒ์„ฑ ์‹œ, ๋‚ ์งœ์— ๋Œ€ํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ฐ•ํ™”

* feat: ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ ๊ตฌํ˜„ ๋ฐ ์ ์šฉ

* [feat/CK-171] ๋กœ๋“œ๋งต ํ™•์ธํ•˜๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค & ๋กœ๋“œ๋งต ๋ฆฌ์ŠคํŠธ์˜ UI๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค (#127)

* feat: ์ถฉ๋Œํ•ด๊ฒฐ

* fix: merge conflict ํ•ด๊ฒฐ

* design: ๋กœ๋“œ๋งต ๋ฆฌ์ŠคํŠธ ์ •๋ ฌ ๋ณ€๊ฒฝ

* feat: ๋กœ๋“œ๋งต ๋…ธ๋“œ ๋ฆฌ์ŠคํŠธ api ํ•จ์ˆ˜ ์ƒ์„ฑ

* [feat/CK-157] ๋กœ๋“œ๋งต ๋ฆฌ์ŠคํŠธ์˜ ๊ฒ€์ƒ‰๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค (#130)

* fix: mutate์˜ ์ธ์ž ๋ณ€๊ฒฝ

* feat: ๋กœ๋“œ๋งต ๊ฒ€์ƒ‰ api์ˆ˜์ •

* feat: select์ปดํฌ๋„ŒํŠธ์˜ default ์„ ํƒ๊ฐ’์ด ์žˆ๋„๋ก ์ˆ˜์ •

* refactor: ์นดํ…Œ๊ณ ๋ฆฌ ์„ ํƒ์— ๋”ฐ๋ฅธ api์š”์ฒญ์„ query string์„ ์ด์šฉํ•˜๋Š”๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝ

* feat: ๋กœ๋“œ๋งต ๊ฒ€์ƒ‰๊ธฐ๋Šฅ ๊ตฌํ˜„

* fix: ๋กœ๊ทธ์ธ์ด ๋˜์–ด ์žˆ์ง€ ์•Š์„ ๋•Œ, ์ธ์ฆ ํ—ค๋”๋ฅผ ๊ณ„์† ์žฌ์š”์ฒญํ•˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •

* refactor: ๋กœ๋“œ๋งต ์ƒ์„ฑ ์‹œ, ๋กœ๋“œ๋งต ๋ชฉ๋ก์„ refetchํ•˜๋„๋ก ๋ณ€๊ฒฝ

* feat: private router ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ

* design: ๋กœ๋“œ๋งต ์•„์ดํ…œ UI ์œ„์น˜์ˆ˜์ •

* feat: ๊ณจ๋ฃธ ๋Œ€์‹œ๋ณด๋“œ ๋กœ๋“œ๋งต ๊ตฌํ˜„

* fix: ๊ณจ๋ฃธ ๋‹จ์ผ์กฐํšŒ ๋ชจ๋‹ฌ ๋ฐฐ๊ฒฝ z-index ์˜ค๋ฅ˜ ์ˆ˜์ •

* feat: selectBox option์— defaultOption ์†์„ฑ ์ถ”๊ฐ€

* feat: selectBox option์— defaultOption ์†์„ฑ ์ถ”๊ฐ€

* fix: ๋กœ๋“œ๋งต ๋ณธ๋ฌธ์ด ์ €์žฅ๋˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

* design: ๋กœ๋“œ๋งต ์ƒ์„ฑํ•˜๊ธฐ ๋ฒ„ํŠผ UI์ˆ˜์ •

* fix: ์นดํ…Œ๊ณ ๋ฆฌ id ์ˆ˜์ •

* feat: ๋กœ๋“œ๋งต ์ƒ์„ฑ ์‹œ get์„ ๋ฐ›์•„์˜ค๋Š” ๋กœ์ง ์ถ”๊ฐ€

* fix: ๋กœ๋“œ๋งต ๋ณธ๋ฌธ์ด ์ €์žฅ๋˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

* refactor: ์˜คํƒ€ ์ˆ˜์ • ๋ฐ ๊ณจ๋ฃธ ์ƒ์„ฑ ํŽ˜์ด์ง€์˜ ๋…ธํŠธ ์„ค๋ช…์— Y์ถ• ์Šคํฌ๋กค ์ถ”๊ฐ€

* fix: ๊ณจ๋ฃธ์ƒ์„ฑ์˜ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์„ roadmapId์—์„œ content.id๋กœ ์ˆ˜์ •

* feat: ux ๊ฐœ์„ 

* fix: ์—†๋Š” ์นดํ…Œ๊ณ ๋ฆฌ ์‚ญ์ œ (#137)

---------

Co-authored-by: sh981013s <[email protected]>
Co-authored-by: Jungwoo <[email protected]>
Co-authored-by: Woody <[email protected]>
Co-authored-by: Jiwon Lee <[email protected]>
  • Loading branch information
5 people authored Sep 1, 2023
1 parent 5af5d8c commit dd0a222
Show file tree
Hide file tree
Showing 293 changed files with 59,277 additions and 0 deletions.
27 changes: 27 additions & 0 deletions .github/workflows/ci-client-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: client test CI

on:
pull_request:
branches: [ develop-client ]

jobs:
build:

runs-on: ubuntu-latest

strategy:
matrix:
node-version: [18.x]

steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
- run: |
cd client
npm ci
npm run build --if-present
npm run test
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
.vscode
.idea

# test coverage dir
coverage

# misc
.DS_Store
21 changes: 21 additions & 0 deletions client/.babelrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"presets": [
["@babel/preset-env"],
[
"@babel/preset-react",
{
"runtime": "automatic"
}
],
"@babel/preset-typescript"
],
"plugins": [
[
"babel-plugin-styled-components",
{
"displayName": true
}
],
"@babel/plugin-transform-runtime"
]
}
1 change: 1 addition & 0 deletions client/.eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
*.styles.ts
119 changes: 119 additions & 0 deletions client/.eslintrc.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
module.exports = {
ignorePatterns: ['/*', '!/src'],
parser: '@typescript-eslint/parser',
plugins: ['@typescript-eslint', 'react'],
extends: [
'airbnb',
'airbnb/hooks',
'plugin:@typescript-eslint/recommended',
'plugin:prettier/recommended',
'plugin:storybook/recommended',
],
parserOptions: {
ecmaVersion: 2021,
sourceType: 'module',
ecmaFeatures: {
jsx: true,
},
},
env: {
browser: true,
es2021: true,
node: true,
},
settings: {
'import/resolver': {
node: {
extensions: ['.js', '.jsx', '.ts', '.tsx'],
paths: ['src'],
},
alias: {
map: [
['@', './src'],
['@apis', './src/apis'],
['@assets', './src/assets'],
['@components', './src/components'],
['@constants', './src/constants'],
['@hooks', './src/hooks'],
['@mocks', './src/mocks'],
['@pages', './src/pages'],
['@styles', './src/styles'],
['@myTypes', './src/myTypes'],
['@utils', './src/utils'],
],
extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
},
},
},
rules: {
'import/extensions': [
'off',
'ignorePackages',
{
js: 'never',
jsx: 'never',
ts: 'never',
tsx: 'never',
},
],
'prettier/prettier': 'error',
'react/react-in-jsx-scope': 'off',
'@typescript-eslint/explicit-module-boundary-types': 'off',
'react/jsx-filename-extension': [
1,
{
extensions: ['.js', '.jsx', '.ts', '.tsx'],
},
],
'space-before-blocks': ['error', 'always'],
'react/button-has-type': 'off',
'@typescript-eslint/no-unused-vars': [
'warn',
{
argsIgnorePattern: '^_',
},
],
'no-console': [
'warn',
{
allow: ['warn', 'error'],
},
],
'prefer-const': 'warn',
eqeqeq: 'warn',
'prefer-arrow-callback': 'error',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-empty-function': 'off',
'react/function-component-definition': [
2,
{
namedComponents: 'arrow-function',
},
],
'react-hooks/exhaustive-deps': 'off',
'no-shadow': 'off',
'import/prefer-default-export': 'off',
'global-require': 'warn',
'import/no-extraneous-dependencies': 'off',
'no-use-before-define': 'off',
'@typescript-eslint/no-use-before-define': [
'error',
{
ignoreTypeReferences: true,
},
],
'no-plusplus': 'off',
'no-param-reassign': 'off',
'react/require-default-props': 'off',
'react/jsx-no-constructed-context-values': 'off',
'react/jsx-props-no-spreading': 'off',
'import/no-unresolved': 'off',
'import/order': 'off',
'react/jsx-no-constructed-context-values': 'off',
'react/jsx-props-no-spreading': 'off',
'no-nested-ternary': 'off',
'react/jsx-no-useless-fragment': 'off',
'react/no-unescaped-entities': 'off',
'no-else-return': 'off',
},
};
5 changes: 5 additions & 0 deletions client/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
/node_modules

/dist

.env
71 changes: 71 additions & 0 deletions client/.husky/commit-msg
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"


# ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜
# 0. ๊ฒ€์‚ฌ ์˜ˆ์™ธ ์กฐ๊ฑด (์ž๋™ ์ƒ์„ฑ, ์ตœ์ดˆ ์ปค๋ฐ‹)
# - Merge branch*, Merge pull request*, initial*
# 1. ์ ‘๋‘์‚ฌ์˜ ๊ธ€์ž๋Š” ์†Œ๋ฌธ์ž
# 2. ๋งจ ๋งˆ์ง€๋ง‰ ๊ธ€์ž '.' ๋งˆ์นจํ‘œ ๊ธˆ์ง€
# 3. ์ปค๋ฐ‹ ์ ‘๋‘์‚ฌ (๊ทœ์น™: '์ ‘๋‘์‚ฌ' + '์ฝœ๋ก ' + ' ')
# - feat: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
# - fix: ๋ฒ„๊ทธ ์ˆ˜์ •
# - docs: ๋ฌธ์„œ์˜ ์ˆ˜์ •
# - style: (์ฝ”๋“œ์˜ ์ˆ˜์ • ์—†์ด) ์Šคํƒ€์ผ(style)๋งŒ ๋ณ€๊ฒฝ(๋“ค์—ฌ์“ฐ๊ธฐ ๊ฐ™์€ ํฌ๋งท์ด๋‚˜ ์„ธ๋ฏธ์ฝœ๋ก ์„ ๋นผ๋จน์€ ๊ฒฝ์šฐ)
# - refactor: ์ฝ”๋“œ๋ฅผ ๋ฆฌํŽ™ํ† ๋ง
# - test: Test ๊ด€๋ จํ•œ ์ฝ”๋“œ์˜ ์ถ”๊ฐ€, ์ˆ˜์ •
# - chore: (์ฝ”๋“œ์˜ ์ˆ˜์ • ์—†์ด) ์„ค์ •์„ ๋ณ€๊ฒฝ
# - design: css ์ฝ”๋“œ ์ˆ˜์ •

COMMIT_MSG_FILE=$1
FIRST_LINE=`head -n1 ${COMMIT_MSG_FILE}`
RES="needCheck" # needCheck, auto, initial, lintError*, clear

if [[ $FIRST_LINE =~ ^(Merge branch) ]] ||
[[ $FIRST_LINE =~ ^(Merge pull request) ]]; then
RES="auto"
fi

if [[ $FIRST_LINE =~ ^(initial) ]]; then
RES="initial"
fi

if [ $RES == "needCheck" ]; then
if [[ $FIRST_LINE =~ (\.)$ ]]; then
RES="lintError1"
fi

if [[ ! $FIRST_LINE =~ ^(feat: ) ]] &&
[[ ! $FIRST_LINE =~ ^(fix: ) ]] &&
[[ ! $FIRST_LINE =~ ^(docs: ) ]] &&
[[ ! $FIRST_LINE =~ ^(style: ) ]] &&
[[ ! $FIRST_LINE =~ ^(refactor: ) ]] &&
[[ ! $FIRST_LINE =~ ^(test: ) ]] &&
[[ ! $FIRST_LINE =~ ^(design: ) ]] &&
[[ ! $FIRST_LINE =~ ^(build: ) ]] &&
[[ ! $FIRST_LINE =~ ^(chore: ) ]]; then
RES="lintError2"
fi

if [[ ! $RES =~ ^(lintError) ]]; then
RES="clear"
fi
fi

if [[ $RES =~ ^(lintError) ]]; then
if [[ $RES == "lintError1" ]]; then
echo "CommitLint#1: ๋ฌธ์žฅ ๋งˆ์ง€๋ง‰์˜ ('.') ๋งˆ์นจํ‘œ๋ฅผ ์ œ๊ฑฐํ•ด์ฃผ์„ธ์š”."
fi
if [[ $RES == "lintError2" ]]; then
echo "CommitLint#2: ์ ‘๋‘์‚ฌ, ์ฝœ๋ก , ๋„์–ด์“ฐ๊ธฐ ํ˜•ํƒœ๋ฅผ ํ™•์ธํ•˜์„ธ์š”. (feat: , fix: , docs: , style: , refactor: , test: , chore: )"
fi
exit 1
elif [[ $RES == "auto" ]]; then
echo "Automatically generated commit message from git"
elif [[ $RES == "initial" ]]; then
echo "Initial commit"
elif [[ $RES == "clear" ]]; then
echo "Pass commit lint!"
fi

exit 0
4 changes: 4 additions & 0 deletions client/.husky/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

cd client && echo ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ’ปFE ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ’ป pre-commit rules applying... && npm run lint-fix && node checkUtilTests.js && npm test
6 changes: 6 additions & 0 deletions client/.prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"printWidth": 90,
"singleQuote": true,
"jsxSingleQuote": true,
"newline-between-functions": true
}
19 changes: 19 additions & 0 deletions client/.storybook/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import type { StorybookConfig } from '@storybook/react-webpack5';

const config: StorybookConfig = {
stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
addons: [
'@storybook/addon-links',
'@storybook/addon-essentials',
'@storybook/addon-onboarding',
'@storybook/addon-interactions',
],
framework: {
name: '@storybook/react-webpack5',
options: {},
},
docs: {
autodocs: 'tag',
},
};
export default config;
15 changes: 15 additions & 0 deletions client/.storybook/preview.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import type { Preview } from '@storybook/react';

const preview: Preview = {
parameters: {
actions: { argTypesRegex: '^on[A-Z].*' },
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/,
},
},
},
};

export default preview;
5 changes: 5 additions & 0 deletions client/.stylelintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"extends": ["stylelint-config-clean-order"],

"customSyntax": "postcss-styled-syntax"
}
40 changes: 40 additions & 0 deletions client/checkUtilTests.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
const fs = require('fs');
const path = require('path');

const checkDirectory = (dir) => {
fs.readdir(dir, (err, files) => {
if (err) throw err;

files.forEach((file) => {
const filePath = path.join(dir, file);
fs.stat(filePath, (err, stats) => {
if (err) throw err;
if (stats.isDirectory()) {
checkDirectory(filePath);
} else if (filePath.endsWith('.js') || filePath.endsWith('.ts')) {
const baseFileName = file.substring(0, file.length - 3);
const testFile = path.join(
process.cwd(),
'src',
'tests',
'utilTests',
`${baseFileName}.test.ts`
);

if (!fs.existsSync(testFile)) {
console.error(
`${file} <= ์œ ํ‹ธ ํŒŒ์ผ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค. ์„œ์šดํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜ข\n${file.substring(
0,
file.length - 3
)}.test.ts ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”.`
);
process.exit(1);
}
}
});
});
});
};

const utilsDir = path.join(process.cwd(), 'src', 'utils');
checkDirectory(utilsDir);
33 changes: 33 additions & 0 deletions client/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
module.exports = {
clearMocks: true,
collectCoverage: true,
coverageThreshold: {
global: {
branches: 80,
functions: 80,
lines: 80,
statements: 80,
},
},
coverageDirectory: 'coverage',
coverageProvider: 'v8',
coverageReporters: ['text', 'text-summary', 'lcov'],
moduleFileExtensions: ['js', 'mjs', 'cjs', 'jsx', 'ts', 'tsx', 'json', 'node'],
testEnvironment: 'jsdom',
testMatch: [
'<rootDir>/**/*.test.(js|jsx|ts|tsx)',
'<rootDir>/(tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx))',
],
transformIgnorePatterns: ['<rootDir>/node_modules/'],
moduleDirectories: ['node_modules', 'src'],
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1',
'^@utils/(.*)$': '<rootDir>/src/utils/$1',
},
resetMocks: false,
setupFiles: ['dotenv/config'],
setupFilesAfterEnv: ['@testing-library/jest-dom/extend-expect'],
globals: {
PRODUCT_ENV: 'test',
},
};
2 changes: 2 additions & 0 deletions client/jest.setup.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import '@testing-library/jest-dom/extend-expect';
import '@testing-library/jest-dom';
Loading

0 comments on commit dd0a222

Please sign in to comment.