Skip to content

Commit

Permalink
Merge pull request #56 from kde98892/style/mypage
Browse files Browse the repository at this point in the history
💄 design: mypage 프로필, 행사, 아티스트 탭 UI
  • Loading branch information
kde98892 authored Feb 4, 2024
2 parents e564b7c + d2df7ec commit 7ab8ddb
Show file tree
Hide file tree
Showing 18 changed files with 395 additions and 136 deletions.
51 changes: 0 additions & 51 deletions app/(route)/(bottom-nav)/mypage/_components/EventCalendar.tsx

This file was deleted.

10 changes: 5 additions & 5 deletions app/(route)/(bottom-nav)/mypage/_components/UserProfile.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ const UserProfile = ({ data }: Props) => {
const { bottomSheet, openBottomSheet, closeBottomSheet } = useBottomSheet();

return (
<div className="flex items-center justify-between">
<div className="flex items-center gap-8">
<div className="flex items-center justify-between px-20 pt-48">
<div className="flex items-center gap-12">
<Image src={data.profileImg ? data.profileImg : "/icon/no-profile.svg"} alt="이미지 추가 버튼" width={56} height={56} className="rounded-full" priority />
<div>
<p>{data.nickName}</p>
<p>{data.email}</p>
<div className="flex flex-col gap-4">
<p className="text-16 font-600">{data.nickName}</p>
<p className="font-12 font-500 text-gray-400">{data.email}</p>
</div>
</div>
<button onClick={() => openBottomSheet("mypage")}>
Expand Down
13 changes: 6 additions & 7 deletions app/(route)/(bottom-nav)/mypage/_components/tab/ArtistTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,11 @@ const ArtistTab = ({ data }: Props) => {
const router = useRouter();

return (
<>
<div className="flex items-center justify-between py-20">
<p className="text-16 font-700">좋아요한 아티스트</p>
<button onClick={() => router.push("/setting/favorite")}>버튼</button>
</div>
<div className="grid w-fit grid-cols-3 gap-8">
<div className="flex flex-col items-start gap-16 px-20 py-24">
<button className="text-14 font-500 text-blue" onClick={() => router.push("/setting/favorite")}>
팔로우 아티스트 수정하기
</button>
<div className="grid w-fit grid-cols-3 gap-20 pl-8">
{data.map((cardList) => (
<ArtistCard
isSmall
Expand All @@ -32,7 +31,7 @@ const ArtistTab = ({ data }: Props) => {
</ArtistCard>
))}
</div>
</>
</div>
);
};

Expand Down
155 changes: 155 additions & 0 deletions app/(route)/(bottom-nav)/mypage/_components/tab/EventTab.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
import { useEffect, useState } from "react";
import Calendar from "react-calendar";
import "react-calendar/dist/Calendar.css";
import HorizontalEventCard from "@/components/card/HorizontalEventCard";
import ChipButton from "@/components/chip/ChipButton";
import { sortEvents } from "@/utils/sortEventList";
import { MYPAGE_CALENDAR_STYLE } from "@/constants/calendarStyle";
import NextIcon from "@/public/icon/arrow-left_lg.svg";
import PrevIcon from "@/public/icon/arrow-right_lg.svg";
import { ScheduleDataProps } from "../../page";

const EventTab = ({ scheduleData }: { scheduleData: ScheduleDataProps[] }) => {
const [data, setData] = useState(scheduleData);
const [calendarStyle, setCalendarStyle] = useState("");

const tileContent = ({ date }: { date: Date }) => {
const eventsForDate = data.filter((event) => new Date(event.startDate).getTime() <= date.getTime() && new Date(event.endDate).getTime() >= date.getTime());

if (eventsForDate.length > 0) {
const sortedEvents: ScheduleDataProps[] = sortEvents(eventsForDate);

return (
<div>
{sortedEvents.map((event) => {
let type;
if (event.startDate === event.endDate) {
type = SHAPE_TYPE.oneDay;
} else if (new Date(event.startDate).getTime() === date.getTime()) {
type = SHAPE_TYPE.firstDay;
} else if (new Date(event.endDate).getTime() === date.getTime()) {
type = SHAPE_TYPE.lastDay;
} else {
type = SHAPE_TYPE.middleDay;
}
return <span key={event.id} className={`h-4 rounded-sm ${type} ${COLOR_TYPE[(event.id + 1) % 6]}`} />;
})}
</div>
);
}

return null;
};

useEffect(() => {
setCalendarStyle(MYPAGE_CALENDAR_STYLE);
}, []);

const [selectedDate, setSelectedDate] = useState<Date | null>(null);

const handleClickToday = (date: any) => {
if (selectedDate?.getTime() === date.getTime()) {
setSelectedDate(null);
return;
}
setSelectedDate(date);
};

const handleHeartClick = () => {
console.log("내 행사 데이터 다시 받아오기");
};

const [currentLabel, setCurrentLabel] = useState("");

const handleChipClick = (label: "예정" | "진행중" | "종료") => {
const today = new Date();

switch (label) {
case currentLabel:
setData(scheduleData);
setCurrentLabel("");
break;
case "예정":
setData(
scheduleData.filter((event) => {
return new Date(event.startDate) > today;
}),
);
setCurrentLabel(label);
break;
case "종료":
setData(
scheduleData.filter((event) => {
return new Date(event.endDate) < today;
}),
);
setCurrentLabel(label);
break;
case "진행중":
setData(
scheduleData.filter((event) => {
return new Date(event.startDate) <= today && new Date(event.endDate) >= today;
}),
);
setCurrentLabel(label);
break;
}
};

return (
<>
<div className="flex flex-col gap-16 px-20 py-16">
<style>{calendarStyle}</style>
{calendarStyle !== "" && (
<Calendar
locale="ko"
onChange={handleClickToday}
value={selectedDate}
tileContent={tileContent}
nextLabel={<PrevIcon width={16} height={16} viewBox="0 0 24 24" stroke="#A2A5AA" />}
prevLabel={<NextIcon width={16} height={16} viewBox="0 0 24 24" stroke="#A2A5AA" />}
next2Label={null}
prev2Label={null}
formatDay={(locale, date) => date.getDate().toString()}
formatShortWeekday={(locale, date) => {
const shortWeekdays = ["S", "M", "T", "W", "T", "F", "S"];
return shortWeekdays[date.getDay()];
}}
/>
)}
<div>
<div className="flex gap-12">
<ChipButton label="예정" onClick={() => handleChipClick("예정")} selected={currentLabel === "예정"} />
<ChipButton label="진행중" onClick={() => handleChipClick("진행중")} selected={currentLabel === "진행중"} />
<ChipButton label="종료" onClick={() => handleChipClick("종료")} selected={currentLabel === "종료"} />
</div>
<ul>
{data
.filter((event) => !selectedDate || (new Date(event.startDate).getTime() <= selectedDate.getTime() && new Date(event.endDate).getTime() >= selectedDate.getTime()))
.map((event) => (
<HorizontalEventCard key={event.id} data={event} hasHeart onHeartClick={handleHeartClick} />
))}
</ul>
</div>
</div>
</>
);
};

export default EventTab;

const COLOR_TYPE: Record<number, string> = {
1: `bg-sub-pink`,
2: `bg-sub-yellow`,
3: `bg-sub-skyblue`,
4: `bg-sub-blue`,
5: `bg-sub-purple`,
6: `bg-sub-red`,
};

const SHAPE_TYPE = {
oneDay: "w-36",
firstDay: "ml-8 w-44",
lastDay: "mr-8 w-44",
middleDay: "w-52",
};
16 changes: 7 additions & 9 deletions app/(route)/(bottom-nav)/mypage/_components/tab/MyReviewTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,13 @@ import { ReviewType } from "@/types/index";

const MyReviewTab = ({ reviewList }: { reviewList: ReviewType[] }) => {
return (
<div className="h-400 w-full">
<ul className="w-full">
{reviewList.map((data, index) => (
<li key={index}>
<Review data={data} type="myReview" />
</li>
))}
</ul>
</div>
<ul className="w-full pt-8">
{reviewList.map((data, index) => (
<li key={index}>
<Review data={data} type="myReview" />
</li>
))}
</ul>
);
};

Expand Down
82 changes: 48 additions & 34 deletions app/(route)/(bottom-nav)/mypage/page.tsx
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
"use client";

import { MOCK, MOCK_REVIEWS } from "app/_constants/mock";
import Header from "@/components/Header";
import Tabs from "@/components/Tabs";
import UserProfile from "./_components/UserProfile";
import ArtistTab from "./_components/tab/ArtistTab";
import EventTab from "./_components/tab/EventTab";
import MyReviewTab from "./_components/tab/MyReviewTab";

const MyPage = () => {
return (
<div className="flex flex-col gap-24 p-16">
<div className="flex items-center gap-8 self-start pb-20">
<Header />
</div>
<div className="flex w-full flex-col gap-24 pb-72">
<UserProfile data={MOCK_USER_INFO} />
<Tabs names={["아티스트", "내 후기"]}>
<Tabs names={["행사", "아티스트", "후기"]}>
<EventTab scheduleData={mockScheduleData} />
<ArtistTab data={MOCK} />
<MyReviewTab reviewList={MOCK_REVIEWS} />
</Tabs>
Expand All @@ -40,31 +38,47 @@ const MOCK_USER_INFO = {
// }
// // 데이터베이스 구조에 따라 사라질 타입이라 해당 파일에 선언

// const REVIEWS: MyReviewProps[] = [
// {
// place: "지유가오카핫초메 압구정로데오점",
// public: true,
// rate: true,
// description: "메뉴도 진짜 맛있고 특전도 너무 예뻐요. KTX타고 3시간 걸려서 갔는데 후회 없습니다. 3일차 오후라서 포카 없을까봐 걱정했는데 다행히 수량 넉넉해서 다 받았어요.",
// images: [
// "https://thumb.mtstarnews.com/06/2023/09/2023090715013844673_1.jpg/dims/optimize",
// "https://thumb.mtstarnews.com/06/2023/09/2023090715013844673_1.jpg/dims/optimize",
// "https://thumb.mtstarnews.com/06/2023/09/2023090715013844673_1.jpg/dims/optimize",
// "https://thumb.mtstarnews.com/06/2023/09/2023090715013844673_1.jpg/dims/optimize",
// ],
// like: 2,
// },
// {
// place: "앤디스커피 홍대점",
// public: false,
// rate: false,
// description: "사람 너무 많아요 특전 다나갔습니다 가실분들 참고",
// images: [
// "https://thumb.mtstarnews.com/06/2023/09/2023090715013844673_1.jpg/dims/optimize",
// "https://thumb.mtstarnews.com/06/2023/09/2023090715013844673_1.jpg/dims/optimize",
// "https://thumb.mtstarnews.com/06/2023/09/2023090715013844673_1.jpg/dims/optimize",
// "https://thumb.mtstarnews.com/06/2023/09/2023090715013844673_1.jpg/dims/optimize",
// ],
// like: 0,
// },
// ];
export interface ScheduleDataProps {
id: number;
placeName: string;
artists: string[];
eventType: "카페";
address: string;
startDate: string;
endDate: string;
eventImages?: string[];
tags: ["포토카드"];
}

const mockScheduleData: ScheduleDataProps[] = [
{
id: 1,
placeName: "윤정한 카페",
artists: ["윤정한"],
eventType: "카페",
address: "서울특별시 마포구 와우산로 00-00 1층",
startDate: "2024-01-28T00:00:00+09:00",
endDate: "2024-02-01T00:00:00+09:00",
tags: ["포토카드"],
},
{
id: 2,
placeName: "김정우 카페",
artists: ["김정우"],
eventType: "카페",
address: "서울특별시 강남구 와우산로 00-00 1층",
startDate: "2024-01-26T00:00:00+09:00",
endDate: "2024-01-26T00:00:00+09:00",
tags: ["포토카드"],
},
{
id: 3,
placeName: "김민지 카페",
artists: ["김민지"],
eventType: "카페",
address: "서울특별시 강남구 와우산로 00-00 1층",
startDate: "2024-01-26T00:00:00+09:00",
endDate: "2024-01-28T00:00:00+09:00",
tags: ["포토카드"],
},
];
3 changes: 2 additions & 1 deletion app/(route)/(header)/signup/_components/SearchArtist.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { ArtistType, MOCK } from "app/_constants/mock";
import { MOCK } from "app/_constants/mock";
import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import ArtistCard from "@/components/ArtistCard";
import InputText from "@/components/input/InputText";
import ReqNewArtistModal from "@/components/modal/ReqNewArtistModal";
import { useModal } from "@/hooks/useModal";
import { ArtistType } from "@/types/index";

interface Props {
data: ArtistType[];
Expand Down
Loading

0 comments on commit 7ab8ddb

Please sign in to comment.