Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

[2단계 - 자주 가는 음식점] 해리(최현웅) 미션 제출합니다. #155

Merged
merged 70 commits into from
Mar 20, 2024
Merged
Changes from 1 commit
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
6f0d55a
docs(README.md): 스텝2에서 추가된 요구사항 작성
hwinkr Mar 14, 2024
13e87fa
docs(README.md): 스텝2에서 추가된 요구사항 작성
hwinkr Mar 14, 2024
5eb7e3e
chore(delete js file): 사용하지 않는 js 파일 삭제
hwinkr Mar 15, 2024
ec3f055
feat(Restauran): 추가된 도메인 요구사항 구현
hwinkr Mar 15, 2024
72a62ee
refactor(BaseComponent): TS로 마이그레이션
hwinkr Mar 15, 2024
c09a809
refactor(MenuApp): UI 로직 TS로 마이그레이션
hwinkr Mar 15, 2024
db3dea7
feat(Restaurants): 음식점 도메인 기능 구현 완료
hwinkr Mar 17, 2024
46653ca
feat(style.css): 스타일 추가
hwinkr Mar 17, 2024
41f1b08
feat(RestaurantTab): 모든 음식점, 자주 가는 음식점 구분 컴포넌트 구현
hwinkr Mar 17, 2024
a3b60ad
feat(CategoryImage): 카테고리 이미지 컴포넌트 구현
hwinkr Mar 17, 2024
6d9f200
feat(RestaurantDetail): 음식점 상세 정보 컴포넌트 구현
hwinkr Mar 17, 2024
ecadfc6
docs(README.md): 추가된 기능 요구 사항 구현 완료
hwinkr Mar 17, 2024
b7329e5
chore(assets): 자주 가는 음식점 별 아이콘 이미지 추가
hwinkr Mar 17, 2024
188b413
chore(delete unused files): 폴더 구조 변경으로 인한 사용하지 않는 파일 삭제
hwinkr Mar 17, 2024
f9f8200
refactor(BaseComponent): 점심 뭐 먹지 애플리케이션에서 발생하는 이벤트 타입 네이밍 수정
hwinkr Mar 17, 2024
77b8110
refactor(MenuApp): html 구조 수정
hwinkr Mar 17, 2024
12ebc28
feat(FavoriteIcon): 자주 가는 식당을 추가할 수 있는 별 모양 아이콘 컴포넌트 추가 분리
hwinkr Mar 17, 2024
2d2b05e
feat(Modal): 재사용할 수 있는 모달 컴포넌트 구현
hwinkr Mar 17, 2024
5e184f6
refactor(RestaurantAddForm): 식당 추가 폼 UI TS로 마이그레이션
hwinkr Mar 17, 2024
dbd4317
chore(change directory): 폴더 구조 변경
hwinkr Mar 17, 2024
794955c
refactor(OptionSelector): 식당 목록 필터링, 정렬 컴포넌트 로직 수정
hwinkr Mar 17, 2024
4774765
chore(event constants): 점심 뭐 먹지에서 발생하는 커스텀 이벤트 상수화
hwinkr Mar 17, 2024
6651777
chore(menu constants): 카테고리, 정렬 기준, 탭 메뉴 문자 상수화
hwinkr Mar 17, 2024
d0caaf6
refactor(index.js): 변경된 폴더 구조 반영
hwinkr Mar 17, 2024
5435219
feat(type checker): 타입을 확인하는 유틸 함수 구현
hwinkr Mar 17, 2024
dafd4c6
feat(dom utils): DOM 노드를 찾는 유틸 함수 구현
hwinkr Mar 17, 2024
75ea25d
refactor(OptionSelector): 필터링, 정렬 값의 타입 확인하는 함수 적용
hwinkr Mar 17, 2024
e37988e
feat(Header): 점심 뭐 먹지 헤더 컴포넌트 TS 마이그레이션
hwinkr Mar 17, 2024
a1e1a89
config(types): 점심 뭐 먹지 이벤트, 상수 타입 설정
hwinkr Mar 17, 2024
003fa7c
chore(index.js): 파일명 오타 수정
hwinkr Mar 17, 2024
c0158c9
config(cypress): cypress 테스트 환경 설정
hwinkr Mar 17, 2024
0279431
test(RestaurantAddForm): 음식점 추가 폼 테스트
hwinkr Mar 17, 2024
8ecc48e
test(RestaurantList): 음식점 목록 테스트
hwinkr Mar 17, 2024
e52abc1
test(RestaurantDetail): 음식점 상세 정보 테스트
hwinkr Mar 17, 2024
842dc67
refactor(OptionSelector): 필터링, 정렬 옵션 컴포넌트 리팩터링
hwinkr Mar 17, 2024
f634e1c
chore(RestaurantAddForm): 에러 객체의 메시지 프로퍼티를 alert 함수로 전달하도록 수정
hwinkr Mar 17, 2024
05cbb0a
chore(RestaurantDetail): 상세 정보 컴포넌트 내부 버튼 type 제거
hwinkr Mar 17, 2024
6660602
chore(constants): 음식점 디폴트 데이터 순서 수정
hwinkr Mar 17, 2024
2660380
chore(type): 사용하지 않는 의존성 제거
hwinkr Mar 17, 2024
a695f12
chore(delete unused file): 사용하지 않는 파일 삭제
hwinkr Mar 17, 2024
b7852b8
chore(change file name): 컴포넌트 이름 변경으로 인한 파일 이름 변경 반영
hwinkr Mar 17, 2024
bcb84ad
refactor(RestaurantValidator): 음식점 추가 폼 입력값에 대한 유효성 검증 TS로 마이그레이션
hwinkr Mar 17, 2024
af74fab
refactor(Restaurants): 카테고리, 도보 이동 거리 유효성 검증 로직 수정
hwinkr Mar 17, 2024
b14dedd
refactor(RestaurantAddForm): 음식점 추가 폼 컴포넌트 리팩터링
hwinkr Mar 17, 2024
b4ca733
refactor(ResturantOption): 음식점 옵션 선택 컴포넌트 커스텀 이벤트 이름 수정
hwinkr Mar 17, 2024
eaf0992
feat(RestaurantTextInput): 재사용 가능한 입력 컴포넌트 구현
hwinkr Mar 17, 2024
d73df87
test(RestaurantAddTest): 변경된 id 이름 반영
hwinkr Mar 17, 2024
309dcca
feat(text utils): 문자열 사이의 모든 공백을 제거하는 유틸 함수 분리
hwinkr Mar 18, 2024
fb86be6
chore(change method name): 모달을 여는 이벤트인지 확인하는 메서드 네이밍 수정
hwinkr Mar 18, 2024
c73d982
chore(RestaurantAddForm): restaurant-option 컴포넌트에 전달하는 어트리뷰트 순서 통일
hwinkr Mar 18, 2024
cd60e5f
chore(add dependency): 문자열 사이 모든 공백을 제거하는 함수 의존성 추가
hwinkr Mar 18, 2024
97ceeea
chore(change file name): 파일이름 오타 수정
hwinkr Mar 19, 2024
e58c478
change(change directory): OptionSelectorContainer 파일 경로 수정
hwinkr Mar 19, 2024
7501413
refactor(dom utils): type asseriton 제거
hwinkr Mar 19, 2024
3fb961a
refactor(type utils): 여러 상황에서 범용적으로 사용할 수 있도록 함수명 수정
hwinkr Mar 19, 2024
c3612a2
test(RestaurantDetail): 음식점 상세 모달 테스트 수정
hwinkr Mar 19, 2024
2f2cf84
test(RestaurantList): 음식점 목록 테스트 수정
hwinkr Mar 19, 2024
323add7
test(RestaurantAddTest): 유효하지 않는 상황을 주석으로 설명 추가
hwinkr Mar 19, 2024
8ec47cf
refactor(CategoryImage): 추상화 된 타입 가드 함수를 사용하는 것으로 수정
hwinkr Mar 19, 2024
17691a0
refactor(MenuApp): 모달 컴포넌트에서 사용하지 않는 어트리뷰트 삭제
hwinkr Mar 19, 2024
42d0917
refactor(Modal): 모달 컴포넌트 내부에서 id 어트리뷰트를 사용해서 이벤트를 결정하는 것으로 수정
hwinkr Mar 19, 2024
9e4b00f
refactor(OptionSelector): 추상화된 타입 가드 함수를 사용하는 것으로 수정
hwinkr Mar 19, 2024
1cb1d02
refactor(RestaurantAddForm): 객체 타입 가드 함수 이름 변경 반영
hwinkr Mar 19, 2024
4d0c2f3
refactor(RestaurantDetail): 객체 타입 가드 함수 이름 변경 반영
hwinkr Mar 19, 2024
4599c6c
chore(RestaurantList): 라인 구분 수정
hwinkr Mar 19, 2024
c701028
config: img 파일 타입 설정
hwinkr Mar 19, 2024
c5ade21
chore(change file): 이미지 파일을 관리하는 asset 파일 TS로 확장자 변경
hwinkr Mar 19, 2024
2bebec1
refactor(FavoriteIcon): isFavorite(boolean) 상태 값 결정 로직 삼항 연산자에서 비교 연산…
hwinkr Mar 19, 2024
191f542
chore(Modal): 사용하지 않는 메서드 제거
hwinkr Mar 19, 2024
c818b2d
chore(RestaurantDetail): 참고 링크가 존재하지 않을 경우 보여주는 텍스트 색 수정
hwinkr Mar 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
refactor(Restaurants): 카테고리, 도보 이동 거리 유효성 검증 로직 수정
hwinkr committed Mar 17, 2024
commit af74fab8e24c4491e7e59adc4feb94662642a29a
48 changes: 37 additions & 11 deletions src/domains/Restaurants.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
import { CATEGORIES, DEFAULT_DATA, ERROR_MESSAGES, SORT_TYPE } from "../constants/menu";
import { CategoryString, RestaurantAddItem, RestaurantItem, SortOptionString } from "../types/menu";
import {
CATEGORIES,
DEFAULT_DATA,
ERROR_MESSAGES,
SORT_TYPE,
} from "../constants/menu";
import {
CategoryString,
RestaurantAddItem,
RestaurantItem,
SortOptionString,
} from "../types/menu";
import restaurantValidator from "../validators/restaurantValidator";

const RESTAURANT_KEY = "restaurants";
@@ -14,7 +24,9 @@ const getRestaurantFromStorage = () => {
const isAlreadyExist = (newRestaurantName: string) => {
const storedRestaurants = getRestaurantFromStorage();

return storedRestaurants.some(({ name }) => trimAllSpace(newRestaurantName) === trimAllSpace(name));
return storedRestaurants.some(
({ name }) => trimAllSpace(newRestaurantName) === trimAllSpace(name)
);
};

const sortByName = (restaurants: RestaurantItem[]) => {
@@ -42,13 +54,13 @@ export const initRestaurantStorage = () => {
export const validateRestaurantData = (restaurantInfo: RestaurantAddItem) => {
const { name, category, distance, description, link } = restaurantInfo;

if (!restaurantValidator.isSelected(category)) {
if (!restaurantValidator.isValidCategory(category)) {
throw new Error(ERROR_MESSAGES.invalidCategory);
}
if (!restaurantValidator.isInRange(name, 0, 10)) {
throw new Error(ERROR_MESSAGES.invalidRestaurantName);
}
if (!restaurantValidator.isSelected(distance)) {
if (!restaurantValidator.isValidDistance(distance)) {
throw new Error(ERROR_MESSAGES.invalidDistance);
}
if (description && !restaurantValidator.isInRange(description, 0, 300)) {
@@ -62,9 +74,13 @@ export const validateRestaurantData = (restaurantInfo: RestaurantAddItem) => {
}
};

export const findRestaurantByName = (restaurantName: string): RestaurantItem | null => {
export const findRestaurantByName = (
restaurantName: string
): RestaurantItem | null => {
const storedRestaurants = getRestaurantFromStorage();
const foundRestaurant = storedRestaurants.find(({ name }) => name === restaurantName);
const foundRestaurant = storedRestaurants.find(
({ name }) => name === restaurantName
);

return foundRestaurant ? foundRestaurant : null;
};
@@ -87,7 +103,9 @@ export const toggleFavoriteStateByName = (targetName: string) => {

export const deleteRestaurantByName = (restaurantName: string): void => {
const storedRestaurants = getRestaurantFromStorage();
const filteredRestaurants = storedRestaurants.filter(({ name }) => restaurantName !== name);
const filteredRestaurants = storedRestaurants.filter(
({ name }) => restaurantName !== name
);

localStorage.setItem(RESTAURANT_KEY, JSON.stringify(filteredRestaurants));
};
@@ -104,7 +122,10 @@ export const add = (restaurantInfo: RestaurantAddItem) => {

localStorage.setItem(
RESTAURANT_KEY,
JSON.stringify([...storedRestaurants, { ...restaurantInfo, isFavorite: false }])
JSON.stringify([
...storedRestaurants,
{ ...restaurantInfo, isFavorite: false },
])
);

return true;
@@ -118,8 +139,13 @@ export const filterByCategory = (category: CategoryString) => {
return restaurants.filter((item) => item.category === category);
};

export const sortByType = (category: CategoryString, type: SortOptionString) => {
export const sortByType = (
category: CategoryString,
type: SortOptionString
) => {
const filteredRestaurants = filterByCategory(category);

return type === SORT_TYPE.name ? sortByName(filteredRestaurants) : sortByDistance(filteredRestaurants);
return type === SORT_TYPE.name
? sortByName(filteredRestaurants)
: sortByDistance(filteredRestaurants);
};