diff --git a/src/assets/homeIcons/search/nullImg.svg b/src/assets/homeIcons/search/nullImg.svg new file mode 100644 index 00000000..ee839bf9 --- /dev/null +++ b/src/assets/homeIcons/search/nullImg.svg @@ -0,0 +1,3 @@ + diff --git a/src/components/Home/Onboarding/Onboarding.module.scss b/src/components/Home/Onboarding/Onboarding.module.scss index df0c03a7..5fd97b08 100644 --- a/src/components/Home/Onboarding/Onboarding.module.scss +++ b/src/components/Home/Onboarding/Onboarding.module.scss @@ -1,4 +1,4 @@ -@use "@/sass" as *; +@use '@/sass' as *; @mixin keyframes($name) { @keyframes #{$name} { diff --git a/src/components/Home/VoteAtHome/VoteCard/CardHaveVote/CardHaveVote.module.scss b/src/components/Home/VoteAtHome/VoteCard/CardHaveVote/CardHaveVote.module.scss index 9ed15ca3..2b0cbef1 100644 --- a/src/components/Home/VoteAtHome/VoteCard/CardHaveVote/CardHaveVote.module.scss +++ b/src/components/Home/VoteAtHome/VoteCard/CardHaveVote/CardHaveVote.module.scss @@ -1,4 +1,4 @@ -@use "@/sass" as *; +@use '@/sass' as *; .container { @include slide_button_container; @@ -11,11 +11,11 @@ min-height: 16.4rem; background: linear-gradient( - 119deg, - #62aaff 35.27%, - rgba(98, 170, 255, 0.3) 142.38% + 129deg, + #267dff 0.29%, + rgba(98, 170, 255, 0.95) 50.64%, + rgba(142, 255, 144, 0.88) 169.29% ); - border-radius: 1.6rem; box-sizing: border-box; diff --git a/src/components/Home/VoteAtHome/VoteCard/CardNull/CardNull.module.scss b/src/components/Home/VoteAtHome/VoteCard/CardNull/CardNull.module.scss index d8d13830..48e4b258 100644 --- a/src/components/Home/VoteAtHome/VoteCard/CardNull/CardNull.module.scss +++ b/src/components/Home/VoteAtHome/VoteCard/CardNull/CardNull.module.scss @@ -1,4 +1,4 @@ -@use "@/sass" as *; +@use '@/sass' as *; .vote_box { width: 100%; @@ -14,9 +14,10 @@ align-items: center; background: linear-gradient( - 119deg, - #62aaff 35.27%, - rgba(98, 170, 255, 0.3) 142.38% + 129deg, + #267dff 0.29%, + rgba(98, 170, 255, 0.95) 50.64%, + rgba(142, 255, 144, 0.88) 169.29% ); border-radius: 1.6rem; diff --git a/src/components/SearchFromHome/SearchBar/SearchBar.tsx b/src/components/SearchFromHome/SearchBar/SearchBar.tsx index 2fd6207a..378ff283 100644 --- a/src/components/SearchFromHome/SearchBar/SearchBar.tsx +++ b/src/components/SearchFromHome/SearchBar/SearchBar.tsx @@ -34,10 +34,9 @@ function SearchBar({forSearch, setForSearch}: PropsType) { } function search() { - const beforeData = forSearch; - beforeData.keyword = inputValue; - setForSearch(beforeData); - navigate(`/home/search?keyword=${inputValue}&category=0&map=false&location=${forSearch.location}&sort=등록순`); + navigate( + `/home/search?keyword=${inputValue}&category=0&map=false&location=${forSearch.location}&sort=등록순&hot=false`, + ); } function removeValue() { @@ -48,6 +47,7 @@ function SearchBar({forSearch, setForSearch}: PropsType) { setInputValue(''); const beforeData = forSearch; beforeData.keyword = ''; + beforeData.hot = 'false'; setForSearch(beforeData); } } diff --git a/src/components/SearchFromHome/SearchHome/HotItems/HotItem/HotItem.module.scss b/src/components/SearchFromHome/SearchHome/HotItems/HotItem/HotItem.module.scss index 8c2e3964..0121a469 100644 --- a/src/components/SearchFromHome/SearchHome/HotItems/HotItem/HotItem.module.scss +++ b/src/components/SearchFromHome/SearchHome/HotItems/HotItem/HotItem.module.scss @@ -1,4 +1,4 @@ -@use "@/sass" as *; +@use '@/sass' as *; .container { display: flex; @@ -7,9 +7,11 @@ img { min-width: 10.6rem; - min-height: 10.6rem; + height: 10.6rem; border-radius: 1.6rem; + + background-color: $neutral200; } .text_box { display: flex; diff --git a/src/components/SearchFromHome/SearchHome/HotItems/HotItem/HotItem.tsx b/src/components/SearchFromHome/SearchHome/HotItems/HotItem/HotItem.tsx index 531b6e4a..b8512538 100644 --- a/src/components/SearchFromHome/SearchHome/HotItems/HotItem/HotItem.tsx +++ b/src/components/SearchFromHome/SearchHome/HotItems/HotItem/HotItem.tsx @@ -1,25 +1,33 @@ -import { Link } from "react-router-dom"; +import {Link} from 'react-router-dom'; -import styles from "./HotItem.module.scss"; +import styles from './HotItem.module.scss'; -import areas from "@/utils/areas.json"; +import {translateCategoryToStr} from '@/hooks/Search/useSearch'; -import { SearchHotItemType } from "@/types/home"; +import nullImg from '@/assets/homeIcons/search/nullImg.svg'; +import areas from '@/utils/areas.json'; +import titleCaseChange from '@/utils/titleCaseChange'; + +import {SearchHotItemType} from '@/types/home'; interface PropsData { data: SearchHotItemType; } -function HotItem({ data }: PropsData) { - const location = areas.filter((area) => area.areaCode === data.areaCode)[0] - .name; +function HotItem({data}: PropsData) { + const location = areas.filter((area) => area.areaCode === data.areaCode)[0].name; + const category = translateCategoryToStr(data.contentTypeId); + const title = titleCaseChange(data.title); + const imgSrc = data.thumbnail ? data.thumbnail : nullImg; return ( - +
- {data.title} - {location} + {title} + + {category} · {location} +
); diff --git a/src/components/SearchFromHome/SearchHome/HotItems/HotItems.tsx b/src/components/SearchFromHome/SearchHome/HotItems/HotItems.tsx index db7421be..f28f5d81 100644 --- a/src/components/SearchFromHome/SearchHome/HotItems/HotItems.tsx +++ b/src/components/SearchFromHome/SearchHome/HotItems/HotItems.tsx @@ -9,19 +9,19 @@ import SlideButton from '@/components/SlideButton/SlideButton'; import HotItem from './HotItem/HotItem'; -import {SearchHotItemType} from '@/types/home'; +import {Popular, SearchDataType, SearchHotItemType} from '@/types/home'; interface PropsType { type: number; } function HotItems({type}: PropsType) { - const [data, setData] = useState인기 검색 키워드
-최근 30일간 인기 장소
diff --git a/src/components/SearchFromHome/SearchHome/SearchKeyword/SearchKeyword.tsx b/src/components/SearchFromHome/SearchHome/SearchKeyword/SearchKeyword.tsx index 9e28494c..dcb4b35e 100644 --- a/src/components/SearchFromHome/SearchHome/SearchKeyword/SearchKeyword.tsx +++ b/src/components/SearchFromHome/SearchHome/SearchKeyword/SearchKeyword.tsx @@ -1,4 +1,5 @@ -import {useEffect, useState} from 'react'; +import axios from 'axios'; +import {Dispatch, useEffect, useState} from 'react'; import {useNavigate} from 'react-router-dom'; import styles from './SearchKeyword.module.scss'; @@ -7,21 +8,26 @@ import useComponentSize from '@/hooks/useComponetSize'; import SlideButton from '@/components/SlideButton/SlideButton'; -import {getData} from '@/mocks/handlers/home'; +import {Keywords, SearchDataType, SearchKeywordType} from '@/types/home'; -interface Propstype { - setKeywordClick: React.Dispatch{ - setKeywordClick(true); - setTimeout(() => { - setKeywordClick(false); - }, 2000); - navigate(`/home/search?keyword=${keyword.name}&category=0&map=false&location=전국&sort=등록순`); + navigate( + `/home/search?keyword=${keyword.name}&category=0&map=false&location=전국&sort=등록순&hot=true`, + ); }} > {keyword.name} diff --git a/src/components/SearchFromHome/SearchList/DateFilter/DateFilter.module.scss b/src/components/SearchFromHome/SearchList/DateFilter/DateFilter.module.scss index e90ca855..8ecbb00c 100644 --- a/src/components/SearchFromHome/SearchList/DateFilter/DateFilter.module.scss +++ b/src/components/SearchFromHome/SearchList/DateFilter/DateFilter.module.scss @@ -1,6 +1,8 @@ -@use "@/sass" as *; +@use '@/sass' as *; .container { + position: relative; + width: 7.9rem; height: 2.4rem; @@ -17,4 +19,30 @@ width: 2.4rem; height: 2.4rem; } + + .modal { + position: absolute; + top: 32px; + right: 0; + + width: 10.8rem; + + display: flex; + flex-direction: column; + justify-content: space-between; + + padding: 20px 32px; + + border-radius: 16px; + + background-color: $neutral0; + + box-shadow: + 0px 1px 8px 2px rgba(20, 20, 20, 0.1), + 0px 0px 1px 0px rgba(20, 20, 20, 0.04); + + overflow: hidden; + + transition: 0.5s all; + } } diff --git a/src/components/SearchFromHome/SearchList/DateFilter/DateFilter.tsx b/src/components/SearchFromHome/SearchList/DateFilter/DateFilter.tsx index 3db7424d..e26c4bc0 100644 --- a/src/components/SearchFromHome/SearchList/DateFilter/DateFilter.tsx +++ b/src/components/SearchFromHome/SearchList/DateFilter/DateFilter.tsx @@ -1,12 +1,50 @@ -import { BsFilterLeft } from "react-icons/bs"; +import {useEffect, useState} from 'react'; +import {BsFilterLeft} from 'react-icons/bs'; +import {useNavigate} from 'react-router-dom'; -import styles from "./DateFilter.module.scss"; +import styles from './DateFilter.module.scss'; + +import {ForSearchType} from '@/types/home'; + +interface PropsType { + forSearch: ForSearchType; +} + +function DateFilter({forSearch}: PropsType) { + const [click, setClick] = useState(false); + const filterData = ['등록순', '이름순', '인기순']; + const navigate = useNavigate(); + + function handleModal() { + setClick((prev) => !prev); + } + + function selectSort(sort: string) { + navigate( + `/home/search?keyword=${forSearch.keyword}&category=${forSearch.category}&map=${forSearch.map}&location=${forSearch.location}&sort=${sort}&hot=${forSearch.hot}`, + ); + } + + useEffect(() => { + setClick(false); + }, [forSearch.sort]); -function DateFilter() { return ( -
+ +
{data.title}
{category}·{location}
diff --git a/src/components/SearchFromHome/SearchList/Map/MapItems/MapItems.tsx b/src/components/SearchFromHome/SearchList/Map/MapItems/MapItems.tsx
index 60940f27..ef32a661 100644
--- a/src/components/SearchFromHome/SearchList/Map/MapItems/MapItems.tsx
+++ b/src/components/SearchFromHome/SearchList/Map/MapItems/MapItems.tsx
@@ -1,14 +1,14 @@
-import { useEffect, useState } from "react";
+import {useEffect, useState} from 'react';
-import styles from "./MapItems.module.scss";
+import styles from './MapItems.module.scss';
-import useComponentSize from "@/hooks/useComponetSize";
+import useComponentSize from '@/hooks/useComponetSize';
-import SlideButton from "@/components/SlideButton/SlideButton";
+import SlideButton from '@/components/SlideButton/SlideButton';
-import MapItem from "./MapItem/MapItem";
+import MapItem from './MapItem/MapItem';
-import { SearchItemType } from "@/types/home";
+import {SearchItemType} from '@/types/home';
interface PropsType {
data: SearchItemType[];
@@ -32,14 +32,12 @@ function MapItems({
const [throttle, setThrottle] = useState(true);
function setCurrentIndex() {
- const criterion = document.querySelector("#map_slide_container");
- const elements = document.querySelectorAll("#map_slide");
+ const criterion = document.querySelector('#map_slide_container');
+ const elements = document.querySelectorAll('#map_slide');
const childrenArray = Array.from(elements[0].children);
for (const item of childrenArray) {
- const currentLeft =
- criterion &&
- item.getBoundingClientRect().x - criterion.getBoundingClientRect().x;
+ const currentLeft = criterion && item.getBoundingClientRect().x - criterion.getBoundingClientRect().x;
if (currentLeft) {
if (0 < currentLeft && currentLeft < 150) {
const index = childrenArray.indexOf(item);
@@ -65,10 +63,11 @@ function MapItems({
useEffect(() => {
if (size.width < 449) {
- componentRef.current?.scrollTo({ left: 0, behavior: "smooth" });
+ componentRef.current?.scrollTo({left: 0, behavior: 'smooth'});
} else {
setSlideLocation(0);
}
+ console.log(data);
}, [data, size, componentRef]);
useEffect(() => {
@@ -96,7 +95,7 @@ function MapItems({
}, [throttle]);
return (
-
- {data.title}
+
+ {title}
{category}·{location}
diff --git a/src/components/SearchFromHome/SearchList/SearchList.module.scss b/src/components/SearchFromHome/SearchList/SearchList.module.scss
index 5836bbf5..6688c567 100644
--- a/src/components/SearchFromHome/SearchList/SearchList.module.scss
+++ b/src/components/SearchFromHome/SearchList/SearchList.module.scss
@@ -1,8 +1,6 @@
-@use "@/sass" as *;
+@use '@/sass' as *;
.container {
- position: relative;
-
width: 100%;
display: flex;
diff --git a/src/components/SearchFromHome/SearchList/SearchList.tsx b/src/components/SearchFromHome/SearchList/SearchList.tsx
index b27d2703..8de7683e 100644
--- a/src/components/SearchFromHome/SearchList/SearchList.tsx
+++ b/src/components/SearchFromHome/SearchList/SearchList.tsx
@@ -1,9 +1,9 @@
import {useEffect, useState} from 'react';
-import {useNavigate, useSearchParams} from 'react-router-dom';
+import {useNavigate} from 'react-router-dom';
import styles from './SearchList.module.scss';
-import {getData} from '@/mocks/handlers/home';
+import {keywordSearch, search} from '@/hooks/Search/useSearch';
import DateFilter from './DateFilter/DateFilter';
import LocationFilter from './LocationFilter/LocationFilter';
@@ -16,23 +16,21 @@ import {ForSearchType, SearchItemType} from '@/types/home';
interface PropsType {
forSearch: ForSearchType;
- keywordClick: boolean;
}
-function SearchList({forSearch, keywordClick}: PropsType) {
- const [data, setData] = useState
{filterData &&
diff --git a/src/components/SearchFromHome/SearchList/Tabs/Tab/Tab.tsx b/src/components/SearchFromHome/SearchList/Tabs/Tab/Tab.tsx
index f0fdbbdf..5e0a150d 100644
--- a/src/components/SearchFromHome/SearchList/Tabs/Tab/Tab.tsx
+++ b/src/components/SearchFromHome/SearchList/Tabs/Tab/Tab.tsx
@@ -21,7 +21,7 @@ function Tab({forSearch, thisCategory, setCategoryChange}: PropsType) {
setCategoryChange(false);
}, 150);
navigate(
- `/home/search?keyword=${forSearch.keyword}&category=${key}&map=${forSearch.map}&location=${forSearch.location}&sort=${forSearch.sort}`,
+ `/home/search?keyword=${forSearch.keyword}&category=${key}&map=${forSearch.map}&location=${forSearch.location}&sort=${forSearch.sort}&hot=${forSearch.hot}`,
);
}
diff --git a/src/hooks/Search/useSearch.ts b/src/hooks/Search/useSearch.ts
index 5a26a491..4f5dead0 100644
--- a/src/hooks/Search/useSearch.ts
+++ b/src/hooks/Search/useSearch.ts
@@ -1,5 +1,10 @@
-import {getSearchData} from '@/api/search';
+import axios from 'axios';
+import {Dispatch} from 'react';
+
import areaData from '@/utils/areas.json';
+import categoryData from '@/utils/categories.json';
+
+import {SearchItemType} from '@/types/home';
function translateLocation(location: string) {
const searchLocation = location.split(' ');
@@ -92,18 +97,58 @@ export function translateCategoryToStr(category: number) {
return categoryCode;
}
-export function search(keyword: string, location: string, sort: string) {
- const searchLocation = translateLocation(location);
+export function translateCategoryCode(name: string) {
+ const categoryCode = categoryData.filter((data) => data.name === name)[0];
+ return categoryCode.code;
+}
- const searchData = getSearchData(
- 0,
- searchLocation.areaCode,
- searchLocation.sigunguCode,
- 0,
- keyword,
- translateSort(sort),
- 'A05020900',
- );
+export async function search(
+ keyword: string,
+ location: string,
+ sort: string,
+ set: Dispatch