From 7da92db88546bbda0c6ef527187fcd65fe6f9155 Mon Sep 17 00:00:00 2001 From: Ubinquitous Date: Sun, 15 Oct 2023 15:32:19 +0900 Subject: [PATCH 01/11] =?UTF-8?q?fix(QA):=20=EA=B8=89=EC=8B=9D=20=ED=99=94?= =?UTF-8?q?=EC=82=B4=ED=91=9C=20QA=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- next.config.js | 1 + src/app/layout.tsx | 1 + src/assets/icons/Arrow.tsx | 2 + src/assets/icons/Logo.tsx | 11 +-- src/components/common/Aside/InfomationBox.tsx | 30 ++++--- .../common/Modal/LoginModal/index.tsx | 48 +++++++++++ src/constants/token.constant.ts | 1 + src/templates/forum/layouts/Forum.tsx | 10 +++ src/templates/home/layouts/HomeReserve.tsx | 4 + src/templates/home/layouts/HomeReserveMap.tsx | 8 +- src/templates/meal/index.tsx | 81 +++++++++++++------ src/templates/meal/layouts/MealListItem.tsx | 22 ++++- .../oauth/services/mutation.service.ts | 4 +- 13 files changed, 173 insertions(+), 50 deletions(-) create mode 100644 src/components/common/Modal/LoginModal/index.tsx diff --git a/next.config.js b/next.config.js index 147c47a2..241de61e 100644 --- a/next.config.js +++ b/next.config.js @@ -1,5 +1,6 @@ /** @type {import('next').NextConfig} */ const nextConfig = { + swcMinify: true, images: { domains: [ process.env.NEXT_PUBLIC_DOMAIN, diff --git a/src/app/layout.tsx b/src/app/layout.tsx index e4f6e2b7..33443d15 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,4 +1,5 @@ import Provider from "@/provider/provider.helper"; +import React from "react"; export const metadata = { title: "BSM", diff --git a/src/assets/icons/Arrow.tsx b/src/assets/icons/Arrow.tsx index 34cd4f15..b1bc1717 100644 --- a/src/assets/icons/Arrow.tsx +++ b/src/assets/icons/Arrow.tsx @@ -14,9 +14,11 @@ const Arrow = ({ height = 25, color = "#727272", direction = "bottom", + ...props }: SVGAttribute) => { return ( { +const Logo = ({ ...props }: React.SVGProps) => { return ( { }; const StyledSVG = styled.svg` - width: 40px; - height: 40px; - @media screen and (max-width: 1025px) { width: 34px; height: 34px; diff --git a/src/components/common/Aside/InfomationBox.tsx b/src/components/common/Aside/InfomationBox.tsx index 9663a54d..ad250ef8 100644 --- a/src/components/common/Aside/InfomationBox.tsx +++ b/src/components/common/Aside/InfomationBox.tsx @@ -1,13 +1,15 @@ import styled from "styled-components"; -import Link from "next/link"; import { color, font } from "@/styles"; -import { USER, ROUTER } from "@/constants"; +import { USER } from "@/constants"; import { IUser } from "@/interfaces"; import { Row, Column } from "@/components/Flex"; import { getUserRole } from "@/helpers"; import flex from "@/styles/flex"; import { ImageWithFallback } from "@/components/atoms"; import { defaultProfile } from "@/assets/images"; +import useModal from "@/hooks/useModal"; +import { useRouter } from "next/navigation"; +import LoginModal from "../Modal/LoginModal"; interface IInfomationBoxProps { user: IUser; @@ -15,7 +17,16 @@ interface IInfomationBoxProps { } const InfomationBox = ({ user, isLogined }: IInfomationBoxProps) => { - const ifLoginedStudent = isLogined && user.role === USER.STUDENT; + const router = useRouter(); + const isLoginedStudent = isLogined && user.role === USER.STUDENT; + const { openModal } = useModal(); + + const handleLoginButtonClick = () => { + if (isLogined) router.push("/"); + openModal({ + component: , + }); + }; return ( @@ -29,7 +40,7 @@ const InfomationBox = ({ user, isLogined }: IInfomationBoxProps) => { rounded /> )} - {ifLoginedStudent && ( + {isLoginedStudent && ( <> @@ -42,15 +53,15 @@ const InfomationBox = ({ user, isLogined }: IInfomationBoxProps) => { {getUserRole(user.role)} - 내 정보 + + 내 정보 + )} {!isLogined && ( <> 로그인이 필요해요 - + 로그인 @@ -123,10 +134,11 @@ const UserType = styled.span` } `; -const InfomationButton = styled(Link)` +const InfomationButton = styled.button` ${flex.CENTER}; ${font.btn3}; padding: 4px 10px; + border: none; background-color: ${color.primary_blue}; border-radius: 5px; margin-left: auto; diff --git a/src/components/common/Modal/LoginModal/index.tsx b/src/components/common/Modal/LoginModal/index.tsx new file mode 100644 index 00000000..ee5a90a5 --- /dev/null +++ b/src/components/common/Modal/LoginModal/index.tsx @@ -0,0 +1,48 @@ +import Storage from "@/apis/storage"; +import { Logo } from "@/assets/icons"; +import { ROUTER, TOKEN } from "@/constants"; +import { color, flex, font } from "@/styles"; +import { useRouter } from "next/navigation"; +import React from "react"; +import styled from "styled-components"; + +const LoginModal = () => { + const router = useRouter(); + + const handleLoginButtonClick = () => { + Storage.setItem(TOKEN.PATH, window.location.pathname); + router.push(process.env.NEXT_PUBLIC_OAUTH_URL || ROUTER.HOME); + }; + + return ( + + + + + ); +}; + +const Container = styled.div` + width: fit-content; + height: fit-content; + padding: 40px 30px; + background-color: ${color.white}; + border-radius: 6px; + ${flex.COLUMN_CENTER}; + gap: 5vh; +`; + +const LoginButton = styled.button` + width: fit-content; + border-radius: 4px; + padding: 8px 14px; + background-color: ${color.primary_blue}; + color: ${color.white}; + ${font.btn3}; + + &:after { + content: "BSM 계정으로 로그인"; + } +`; + +export default LoginModal; diff --git a/src/constants/token.constant.ts b/src/constants/token.constant.ts index 958ec543..5f628291 100644 --- a/src/constants/token.constant.ts +++ b/src/constants/token.constant.ts @@ -6,6 +6,7 @@ const TOKEN: IToken = { ACCESS: "access_token", REFRESH: "refresh_token", POST_RENDER_LIMIT: "post_render_limit", + PATH: "path", } as const; export default TOKEN; diff --git a/src/templates/forum/layouts/Forum.tsx b/src/templates/forum/layouts/Forum.tsx index 336e77a2..eab61a47 100644 --- a/src/templates/forum/layouts/Forum.tsx +++ b/src/templates/forum/layouts/Forum.tsx @@ -3,8 +3,11 @@ import styled from "styled-components"; import { useRouter } from "next/navigation"; import { KEY, ROUTER } from "@/constants"; import { Row } from "@/components/Flex"; +import useUser from "@/hooks/useUser"; +import LoginModal from "@/components/common/Modal/LoginModal"; import { useQueryClient } from "@tanstack/react-query"; import { useRecoilValue } from "recoil"; +import useModal from "@/hooks/useModal"; import { color, flex, font } from "@/styles"; import { categoriesStore } from "@/store/categories.store"; import Categories from "./Categories"; @@ -14,10 +17,17 @@ import { usePostListQuery } from "../services/query.service"; const Forum = () => { const queryClient = useQueryClient(); const category = useRecoilValue(categoriesStore); + const { isLogined } = useUser(); + const { openModal } = useModal(); const postListQuery = usePostListQuery({ category }); const router = useRouter(); const handleCreateButtonClick = () => { + if (!isLogined) { + return openModal({ + component: , + }); + } router.push(ROUTER.POST.WRITE); }; diff --git a/src/templates/home/layouts/HomeReserve.tsx b/src/templates/home/layouts/HomeReserve.tsx index 7c68eedf..4261b659 100644 --- a/src/templates/home/layouts/HomeReserve.tsx +++ b/src/templates/home/layouts/HomeReserve.tsx @@ -21,6 +21,10 @@ const Container = styled.div` height: 30vh; background-color: ${color.white}; border-radius: 4px; + + @media screen and (max-width: 1024px) { + display: none; + } `; const ReserveBox = styled.div` diff --git a/src/templates/home/layouts/HomeReserveMap.tsx b/src/templates/home/layouts/HomeReserveMap.tsx index 2648e2c0..b7f09517 100644 --- a/src/templates/home/layouts/HomeReserveMap.tsx +++ b/src/templates/home/layouts/HomeReserveMap.tsx @@ -119,7 +119,7 @@ const CommonRoom = styled.div<{ isClicked?: boolean; isReserved?: boolean }>` `; const LongRoom = styled(CommonRoom)` - width: 100%; + width: 7vw; height: 20vh; `; @@ -166,6 +166,12 @@ const StyledButton = styled.button` content: "예약하기"; } + @media screen and (max-width: 1200px) { + &:after { + content: "예약"; + } + } + &:disabled { background-color: ${color.on_tertiary}; } diff --git a/src/templates/meal/index.tsx b/src/templates/meal/index.tsx index b53e4ddf..6a23b979 100644 --- a/src/templates/meal/index.tsx +++ b/src/templates/meal/index.tsx @@ -1,9 +1,10 @@ import React from "react"; import styled from "styled-components"; import { emptyMealList } from "@/assets/data"; +import { Arrow } from "@/assets/icons"; import { IMealList } from "@/interfaces"; import { color, flex, font } from "@/styles"; -import { Column } from "@/components/Flex"; +import { Column, Row } from "@/components/Flex"; import useDate from "@/hooks/useDate"; import MealListItem from "./layouts/MealListItem"; import { useMealQuery } from "./services/query.service"; @@ -15,20 +16,27 @@ const MealPage = () => { const [mealList, setMealList] = React.useState(emptyMealList); const { refetch } = useMealQuery({ date: currentDate }); - React.useEffect(() => { - const handleSetDateKeyDown = (e: KeyboardEvent) => { - if (e.key === "ArrowLeft") - setCurrentDate((p) => { - if (getDayOfWeek(p) === "월요일") return setMealDate(p, -3); - return setMealDate(p, -1); - }); - if (e.key === "ArrowRight") - setCurrentDate((p) => { - if (getDayOfWeek(p) === "금요일") return setMealDate(p, 3); - return setMealDate(p, 1); - }); - }; + const handleDateChange = ({ op }: { op: "+" | "-" }) => { + if (op === "+") { + setCurrentDate((p) => { + if (getDayOfWeek(p) === "금요일") return setMealDate(p, 3); + return setMealDate(p, 1); + }); + } + if (op === "-") { + setCurrentDate((p) => { + if (getDayOfWeek(p) === "월요일") return setMealDate(p, -3); + return setMealDate(p, -1); + }); + } + }; + const handleSetDateKeyDown = (e: KeyboardEvent) => { + if (e.key === "ArrowLeft") handleDateChange({ op: "-" }); + if (e.key === "ArrowRight") handleDateChange({ op: "+" }); + }; + + React.useEffect(() => { window.addEventListener("keydown", handleSetDateKeyDown); return () => { window.removeEventListener("keydown", handleSetDateKeyDown); @@ -52,18 +60,39 @@ const MealPage = () => { {getMealDateTitle(currentDate)} - - {mealList.keys.map((mealName) => ( - - ))} - {!mealList.keys.length && ( - {getMealDateTitle(currentDate)} - )} - + + handleDateChange({ op: "-" })} + color={color.on_tertiary} + /> + + {mealList.keys.map((mealName) => ( + + ))} + {!mealList.keys.length && ( + {getMealDateTitle(currentDate)} + )} + + handleDateChange({ op: "+" })} + color={color.on_tertiary} + /> + ); diff --git a/src/templates/meal/layouts/MealListItem.tsx b/src/templates/meal/layouts/MealListItem.tsx index 4675d335..2e12eec6 100644 --- a/src/templates/meal/layouts/MealListItem.tsx +++ b/src/templates/meal/layouts/MealListItem.tsx @@ -11,11 +11,24 @@ interface IMealListItemProps { content: string; cal: number; }; + keyLength: number; + handleChange: ({ op }: { op: "+" | "-" }) => void; } -const MealListItem = ({ mealName, meal }: IMealListItemProps) => { +const MealListItem = ({ + mealName, + meal, + handleChange, + keyLength, +}: IMealListItemProps) => { + const handleMealChangeClick = () => { + if (mealName === "MORNING") handleChange({ op: "-" }); + if (mealName === "DINNER") handleChange({ op: "+" }); + if (keyLength === 2 && mealName === "LUNCH") handleChange({ op: "+" }); + }; + return ( - + @@ -31,7 +44,7 @@ const MealListItem = ({ mealName, meal }: IMealListItemProps) => { }; const Container = styled.div` - width: 24vw; + width: 21vw; height: 56vh; border-radius: 12px; background-color: ${color.white}; @@ -40,9 +53,10 @@ const Container = styled.div` transition: ease-in-out; transition-duration: 0.2s; white-space: pre-wrap; + cursor: pointer; &:hover { - width: 26vw; + width: 22vw; height: 58vh; transition: ease-in-out; transition-duration: 0.2s; diff --git a/src/templates/oauth/services/mutation.service.ts b/src/templates/oauth/services/mutation.service.ts index 9ca7b931..9fe9a579 100644 --- a/src/templates/oauth/services/mutation.service.ts +++ b/src/templates/oauth/services/mutation.service.ts @@ -6,8 +6,8 @@ import { KEY, ROUTER, TOKEN } from "@/constants"; import { ILoginParams, login } from "./api.service"; export const useLoginMutation = ({ authCode }: ILoginParams) => { - const router = useRouter(); const queryClient = useQueryClient(); + const router = useRouter(); return useMutation(() => login({ authCode }), { onSuccess: ({ accessToken, refreshToken }) => { @@ -15,7 +15,7 @@ export const useLoginMutation = ({ authCode }: ILoginParams) => { Storage.setItem(TOKEN.REFRESH, refreshToken); queryClient.invalidateQueries([KEY.USER]); - router.push(ROUTER.HOME); + router.push(Storage.getItem(TOKEN.PATH) ?? ROUTER.HOME); }, onError: (err) => { throwAxiosError(err); From 2b4f87270c218357617790746b64b3860b16d7fb Mon Sep 17 00:00:00 2001 From: Ubinquitous Date: Sun, 15 Oct 2023 16:00:03 +0900 Subject: [PATCH 02/11] =?UTF-8?q?fix(QA):=20=EC=8B=9C=EA=B0=84=ED=91=9C=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/Modal/EmojiModal/index.tsx | 15 ++++-- src/provider/layoutProvider.helper.tsx | 18 +++++-- src/templates/timetable/index.tsx | 32 ++++++++++--- .../timetable/layouts/TimeTableBox.tsx | 45 ++++++++++------- .../timetable/layouts/TimeTableCategory.tsx | 38 +++++++++------ .../timetable/layouts/TimeTableTable.tsx | 48 ++++++++++--------- src/types/storageSettingKey.type.ts | 6 ++- 7 files changed, 131 insertions(+), 71 deletions(-) diff --git a/src/components/common/Modal/EmojiModal/index.tsx b/src/components/common/Modal/EmojiModal/index.tsx index b719adaa..524e17ac 100644 --- a/src/components/common/Modal/EmojiModal/index.tsx +++ b/src/components/common/Modal/EmojiModal/index.tsx @@ -1,5 +1,5 @@ import styled, { css } from "styled-components"; -import { color } from "@/styles"; +import { color, flex } from "@/styles"; import ModalList from "./ModalList"; import ModalHeader from "./ModalHeader"; @@ -17,8 +17,13 @@ const EmojiModal = (direction: IEmojiModalProps) => { return ( <> - - + 아직 지원하지 않는 기능이에요. + {false && ( + <> + + + + )} @@ -35,9 +40,9 @@ const Container = styled.div<{ z-index: 10; width: 30vw; border-radius: 12px; + min-height: 20vh; height: fit-content; - display: flex; - flex-direction: column; + ${flex.COLUMN_CENTER}; background-color: ${color.white}; box-shadow: 2px 2px 10px 0 rgba(0, 0, 0, 0.1); ${({ top, right, bottom, left }) => css` diff --git a/src/provider/layoutProvider.helper.tsx b/src/provider/layoutProvider.helper.tsx index c612e43e..b46f74ec 100644 --- a/src/provider/layoutProvider.helper.tsx +++ b/src/provider/layoutProvider.helper.tsx @@ -1,6 +1,5 @@ -import { Column } from "@/components/Flex"; import { Footer, Header, Modal } from "@/components/common"; -import { GlobalStyle } from "@/styles"; +import { GlobalStyle, flex } from "@/styles"; import React from "react"; import { ToastContainer, toast } from "react-toastify"; import styled from "styled-components"; @@ -12,11 +11,11 @@ const LayoutProvider = ({ children }: React.PropsWithChildren) => { - +
- {children} + {children}
-
+ ); }; @@ -28,4 +27,13 @@ const StyledToastify = styled(ToastContainer)` } `; +const Layout = styled.div` + ${flex.COLUMN}; + gap: 6vh; +`; + +const Container = styled.div` + min-height: 80vh; +`; + export default LayoutProvider; diff --git a/src/templates/timetable/index.tsx b/src/templates/timetable/index.tsx index f83f5b40..21089843 100644 --- a/src/templates/timetable/index.tsx +++ b/src/templates/timetable/index.tsx @@ -1,12 +1,33 @@ import styled from "styled-components"; +import { flex } from "@/styles"; +import useUser from "@/hooks/useUser"; +import useModal from "@/hooks/useModal"; +import React from "react"; +import LoginModal from "@/components/common/Modal/LoginModal"; +import { useDidMountEffect } from "@/hooks/useDidMountEffect"; +import Storage from "@/apis/storage"; +import { TOKEN } from "@/constants"; import TimeTableBox from "./layouts/TimeTableBox"; const TimeTablePage = () => { + const { isLogined } = useUser(); + const { openModal } = useModal(); + + useDidMountEffect(() => { + if (!Storage.getItem(TOKEN.ACCESS)) { + openModal({ + component: , + }); + } + }, []); + return ( - - - + {isLogined && ( + + + + )} ); }; @@ -17,9 +38,8 @@ const Layout = styled.div` `; const Container = styled.div` - width: 76%; - display: flex; - justify-content: center; + width: 100%; + ${flex.CENTER} gap: 8px; `; diff --git a/src/templates/timetable/layouts/TimeTableBox.tsx b/src/templates/timetable/layouts/TimeTableBox.tsx index a7923435..ec0c97be 100644 --- a/src/templates/timetable/layouts/TimeTableBox.tsx +++ b/src/templates/timetable/layouts/TimeTableBox.tsx @@ -3,6 +3,7 @@ import styled from "styled-components"; import useDate from "@/hooks/useDate"; import { useQueryClient } from "@tanstack/react-query"; import { KEY } from "@/constants"; +import Storage from "@/apis/storage"; import { emptyTimetable } from "@/assets/data"; import TimeTableBar from "./TimeTableBar"; import { useTimetableListQuery } from "../services/query.service"; @@ -16,7 +17,7 @@ const TimeTableBox = () => { getNowWeekDay({ type: "KOR" }), ); const [timetableType, setTimetableType] = React.useState<"bar" | "table">( - "bar", + (Storage.getItem("timetable_type") as "bar" | "table") ?? "bar", ); const [dayTimeTable, setDayTimeTable] = React.useState(emptyTimetable); @@ -32,21 +33,27 @@ const TimeTableBox = () => { return ( - - {timetableType === "bar" && ( - + - )} - {timetableType === "table" && ( - + + {!!dayTimeTable[translateDay(selectedDay, { to: "ENG_DETAIL" })] && ( + <> + {timetableType === "bar" && ( + + )} + {timetableType === "table" && ( + + )} + )} ); @@ -55,9 +62,15 @@ const TimeTableBox = () => { const Container = styled.div` display: flex; flex-direction: column; - width: 100%; + width: fit-content; justify-content: center; + align-items: center; gap: 4vh; + width: 56%; +`; + +const TimeTableLayoutBox = styled.div` + margin-right: auto; `; export default TimeTableBox; diff --git a/src/templates/timetable/layouts/TimeTableCategory.tsx b/src/templates/timetable/layouts/TimeTableCategory.tsx index 931e4442..52d6e9df 100644 --- a/src/templates/timetable/layouts/TimeTableCategory.tsx +++ b/src/templates/timetable/layouts/TimeTableCategory.tsx @@ -3,6 +3,7 @@ import { Column } from "@/components/Flex"; import { Category } from "@/components/atoms"; import { font } from "@/styles"; import { getTimetableType } from "@/helpers"; +import Storage from "@/apis/storage"; interface ITimeTableCategoryProps { weekdays: Array; @@ -19,9 +20,31 @@ const TimeTableCategory = ({ timetableType, setTimetableType, }: ITimeTableCategoryProps) => { + const handleTimetableTypeChange = ( + e: React.ChangeEvent, + ) => { + setTimetableType(e.target.id as "bar" | "table"); + Storage.setItem("timetable_type", e.target.id); + }; + return ( + + + + {["bar", "table"].map((type) => ( + + ))} + + {timetableType === "bar" && ( @@ -39,21 +62,6 @@ const TimeTableCategory = ({ )} - - - - {["bar", "table"].map((type) => ( - setTimetableType(e.target.id as "bar" | "table")} - name="date" - /> - ))} - - ); }; diff --git a/src/templates/timetable/layouts/TimeTableTable.tsx b/src/templates/timetable/layouts/TimeTableTable.tsx index cb312049..f103441e 100644 --- a/src/templates/timetable/layouts/TimeTableTable.tsx +++ b/src/templates/timetable/layouts/TimeTableTable.tsx @@ -13,32 +13,34 @@ const TimeTableTable = ({ dayTimeTable }: ITimeTableTableProps) => { const { weekdaysENGDetail: weekdays, translateDay } = useDate(); return ( - - - {Array.from({ length: 8 }).map((_, i) => ( - - {i ? `${i}교시` : "교시 \\ 요일"} - - ))} - - {weekdays.map((weekday) => { - if (!dayTimeTable[weekday]) return; - return ( - + !!Object.entries(dayTimeTable).length && ( + + + {Array.from({ length: 8 }).map((_, i) => ( - - {translateDay(weekday, { to: "KOR" })}요일 - + {i ? `${i}교시` : "교시 \\ 요일"} - {dayTimeTable[weekday]?.map((timetable) => ( - - {timetable.subject} + ))} + + {weekdays.map((weekday) => { + if (!dayTimeTable[weekday]) return; + return ( + + + + {translateDay(weekday, { to: "KOR" })}요일 + - ))} - - ); - })} - + {dayTimeTable[weekday]?.map((timetable) => ( + + {timetable.subject} + + ))} + + ); + })} + + ) ); }; diff --git a/src/types/storageSettingKey.type.ts b/src/types/storageSettingKey.type.ts index c020c394..8318ec52 100644 --- a/src/types/storageSettingKey.type.ts +++ b/src/types/storageSettingKey.type.ts @@ -1,3 +1,7 @@ -type StorageSettingKey = "theme" | "viewAllChildComments" | "post_render_limit"; +type StorageSettingKey = + | "theme" + | "viewAllChildComments" + | "post_render_limit" + | "timetable_type"; export default StorageSettingKey; From ab3a10d9984480aa4670616e8091448efe83e1f0 Mon Sep 17 00:00:00 2001 From: Ubinquitous Date: Sun, 15 Oct 2023 17:15:44 +0900 Subject: [PATCH 03/11] =?UTF-8?q?fix(QA):=20QA=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/common/Header/Navigation.tsx | 18 ++- .../common/Header/SubNavigation.tsx | 36 ++++-- src/components/common/Header/index.tsx | 11 +- .../common/Modal/SettingModal/SettingBody.tsx | 118 +++++++++++------- .../common/Modal/SettingModal/index.tsx | 2 +- src/types/storageSettingKey.type.ts | 3 +- 6 files changed, 119 insertions(+), 69 deletions(-) diff --git a/src/components/common/Header/Navigation.tsx b/src/components/common/Header/Navigation.tsx index 8897506c..a891cc8d 100644 --- a/src/components/common/Header/Navigation.tsx +++ b/src/components/common/Header/Navigation.tsx @@ -4,26 +4,34 @@ import { color, flex, font } from "@/styles"; const navigationTypes = [ { name: "학교", + isDisplayNoneAtResponsive: false, }, { name: "기숙사", + isDisplayNoneAtResponsive: false, }, { name: "커뮤니티", + isDisplayNoneAtResponsive: false, }, { name: "기타 목록", + isDisplayNoneAtResponsive: true, }, ]; const Navigation = () => { return ( - {navigationTypes.map((navigation) => ( - - {navigation.name} - - ))} + {navigationTypes.map((navigation) => { + if (navigation.isDisplayNoneAtResponsive && window.innerWidth <= 768) + return; + return ( + + {navigation.name} + + ); + })} ); }; diff --git a/src/components/common/Header/SubNavigation.tsx b/src/components/common/Header/SubNavigation.tsx index d87af9db..e7be8dcf 100644 --- a/src/components/common/Header/SubNavigation.tsx +++ b/src/components/common/Header/SubNavigation.tsx @@ -11,13 +11,15 @@ const navigations = [ { name: "🕐 시간표", href: "/timetable" }, { name: "🗓️ 캘린더", href: "/calender" }, ], + isDisplayNoneAtResponsive: false, }, { key: "기숙사 생활", items: [ - { name: "🚪 입사 체크", href: "https://team-insert.com" }, + { name: "🚪 (미완)", href: "/" }, { name: "☕️ 베르실 예약", href: "/reserve" }, ], + isDisplayNoneAtResponsive: false, }, { key: "커뮤니티", @@ -26,25 +28,31 @@ const navigations = [ { name: "🎋 대나무숲", href: "/bamboo" }, { name: "📊 랭킹(미완)", href: "/rank" }, ], + isDisplayNoneAtResponsive: false, }, { key: "기타", items: [{ name: "💼 외부 서비스", href: "/applications" }], + isDisplayNoneAtResponsive: true, }, ]; const SubNavigation = () => { return ( - {navigations.map((navigation) => ( - - {navigation.items.map((item) => ( - - {item.name} - - ))} - - ))} + {navigations.map((navigation) => { + if (navigation.isDisplayNoneAtResponsive && window.innerWidth <= 768) + return; + return ( + + {navigation.items.map((item) => ( + + {item.name} + + ))} + + ); + })} ); }; @@ -68,6 +76,14 @@ const SubNavigationListItemLink = styled(Link)` font-weight: 500; width: 90px; cursor: pointer; + + @media screen and (max-width: 570px) { + width: 85px; + } + + @media screen and (max-width: 490px) { + width: 80px; + } `; export default SubNavigation; diff --git a/src/components/common/Header/index.tsx b/src/components/common/Header/index.tsx index 81ec75a3..4f3c73b4 100644 --- a/src/components/common/Header/index.tsx +++ b/src/components/common/Header/index.tsx @@ -16,24 +16,24 @@ const Header = () => { >>(null); const handleMouseEnter = () => { - if (isHover) return setIsHover(true); - setDelayHandeler(setTimeout(() => setIsHover(true), 400)); + if (isHover) return setIsHover((prev) => !prev); + setDelayHandeler(setTimeout(() => setIsHover((prev) => !prev), 300)); }; const handleMouseLeave = () => { if (!isHover && delayHandler) return clearTimeout(delayHandler); - setIsHover(false); + setIsHover((prev) => !prev); }; return ( - + openModal({ component: })} /> @@ -46,6 +46,7 @@ const Header = () => { const HeaderLayout = styled.div` ${flex.COLUMN}; + background-color: green; `; const Layout = styled.div` diff --git a/src/components/common/Modal/SettingModal/SettingBody.tsx b/src/components/common/Modal/SettingModal/SettingBody.tsx index 9e8222d5..a3885359 100644 --- a/src/components/common/Modal/SettingModal/SettingBody.tsx +++ b/src/components/common/Modal/SettingModal/SettingBody.tsx @@ -2,6 +2,8 @@ import React from "react"; import styled from "styled-components"; import { color, font } from "@/styles"; import { Switch } from "@/components/atoms"; +import Storage from "@/apis/storage"; +import useModal from "@/hooks/useModal"; const settingOptions = [ { @@ -9,69 +11,37 @@ const settingOptions = [ options: [ { title: "다크 모드 켜기", - isHaveDescription: false, - }, - { - title: "홈에만 커스텀 백그라운드 적용", isHaveDescription: true, - description: - "홈 화면에서만 커스텀으로 설정한 백그라운드를 적용시킬 수 있어요.", - }, - { - title: "디스플레이 배율 설정", - isHaveDescription: false, + description: "다크 모드를 켜요. 디자인 퀄리티가 낮아질 수 있어요.", + type: "bool", }, ], }, { name: "커뮤니티", options: [ - { - title: "익명 모드 켜놓기", - isHaveDescription: true, - description: "익명 모드를 기본값으로 설정할 수 있어요.", - }, { title: "렌더당 렌더링할 게시글 개수", isHaveDescription: true, description: "한 번의 렌더당 몇 개의 게시글을 렌더링할 지 정할 수 있어요.", - }, - { - title: "자세한 시간 표시", - isHaveDescription: true, - description: - "게시글이나 댓글에서 시간, 분, 초 등의 자세한 시간을 표시해요.", - }, - { - title: "모든 답글 표시", - isHaveDescription: true, - description: "모든 답글을 항상 표시해요. 답글이 너무 깊을 수 있어요.", - }, - { - title: "딥웹 모드", - isHaveDescription: true, - description: "예전 BSM의 매운 맛을 즐길 수 있어요.", - }, - ], - }, - { - name: "알림 설정", - options: [ - { - title: "웹 사이트 알림 받기", - isHaveDescription: true, - description: "급식 등의 여러가지 서비스 알림을 구독할 수 있어요.", + type: "input", }, ], }, ]; const SettingBody = () => { - const [isSwitch, setIsSwitch] = React.useState(false); + const { closeModal } = useModal(); + const [darkMode, setDarkMode] = React.useState(!!Storage.getItem("theme")); + const [postLimit, setPostLimit] = React.useState( + Storage.getItem("post_render_limit") || 20, + ); - const handleToggleButton = () => { - setIsSwitch(!isSwitch); + const handleSaveButtonClick = () => { + if (darkMode) Storage.setItem("theme", "dark"); + Storage.setItem("post_render_limit", `${postLimit}`); + closeModal(); }; return ( @@ -89,13 +59,31 @@ const SettingBody = () => { )} - - - + {option.type === "bool" && ( + + setDarkMode((prev) => !prev)} + /> + + )} + {option.type === "input" && ( + + + !Number.isNaN(+e.target.value) && + setPostLimit(e.target.value) + } + /> + + + )} ))} ))} + ); }; @@ -147,4 +135,40 @@ const SwitchBox = styled.div` margin-left: auto; `; +const StyledInputBox = styled.div` + margin-left: auto; + display: flex; + align-items: center; + gap: 6px; +`; + +const StyledInput = styled.input` + max-width: 70px; + text-align: right; + padding: 4px 8px; + background-color: ${color.white}; + ${font.p4}; + box-shadow: 2px 2px 15px 0 rgba(0, 0, 0, 0.1); +`; + +const StyledSummary = styled.span` + ${font.p3}; + &:after { + content: "개"; + } +`; + +const SaveButton = styled.button` + margin-left: auto; + padding: 6px 18px; + background-color: ${color.primary_blue}; + color: ${color.white}; + ${font.p4}; + border-radius: 4px; + + &:after { + content: "저장하기"; + } +`; + export default SettingBody; diff --git a/src/components/common/Modal/SettingModal/index.tsx b/src/components/common/Modal/SettingModal/index.tsx index 7c898568..d0f2abd1 100644 --- a/src/components/common/Modal/SettingModal/index.tsx +++ b/src/components/common/Modal/SettingModal/index.tsx @@ -14,7 +14,7 @@ const SettingModal = () => { const Container = styled.div` width: 40vw; - height: 90vh; + height: fit-content; overflow-y: scroll; background-color: ${color.white}; box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.2); diff --git a/src/types/storageSettingKey.type.ts b/src/types/storageSettingKey.type.ts index 8318ec52..a5a44420 100644 --- a/src/types/storageSettingKey.type.ts +++ b/src/types/storageSettingKey.type.ts @@ -2,6 +2,7 @@ type StorageSettingKey = | "theme" | "viewAllChildComments" | "post_render_limit" - | "timetable_type"; + | "timetable_type" + | "display"; export default StorageSettingKey; From 29f63e21e78c536d99f2f385f90e32b7c39a1871 Mon Sep 17 00:00:00 2001 From: Ubinquitous Date: Sun, 15 Oct 2023 18:22:52 +0900 Subject: [PATCH 04/11] =?UTF-8?q?feat(404):=20not=20found=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/not-found.tsx | 38 ++++++++++++++++++ src/assets/images/index.ts | 1 + src/assets/images/page_not_found.png | Bin 0 -> 58170 bytes .../common/Modal/PlanAddModal/index.tsx | 12 ++++-- src/helpers/checkPostValid.helper.ts | 12 +++--- src/helpers/getPlanType.helper.ts | 14 +++++++ .../calender/layouts/CalenderListItem.tsx | 28 +++++++++++-- .../layouts/PostBody/Comment/CommentList.tsx | 2 +- .../PostBody/Comment/CreateCommentBox.tsx | 2 + .../PostBody/Recomment/CreateRecommentBox.tsx | 2 + .../forum-post/services/mutation.service.ts | 4 ++ 11 files changed, 101 insertions(+), 14 deletions(-) create mode 100644 src/app/not-found.tsx create mode 100644 src/assets/images/page_not_found.png create mode 100644 src/helpers/getPlanType.helper.ts diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx new file mode 100644 index 00000000..79fa4050 --- /dev/null +++ b/src/app/not-found.tsx @@ -0,0 +1,38 @@ +"use client"; + +import { PageNotFound } from "@/assets/images"; +import { Button } from "@/components/atoms"; +import { ROUTER } from "@/constants"; +import { color, flex } from "@/styles"; +import Image from "next/image"; +import { useRouter } from "next/navigation"; +import React from "react"; +import styled from "styled-components"; + +const NotFound = () => { + const router = useRouter(); + return ( + + + + + ); +}; + +const Container = styled.div` + width: 100%; + height: 70vh; + ${flex.COLUMN_CENTER}; +`; + +const StyledImage = styled(Image)` + width: 50%; + height: fit-content; +`; + +export default NotFound; diff --git a/src/assets/images/index.ts b/src/assets/images/index.ts index 712e7b0e..97f03928 100644 --- a/src/assets/images/index.ts +++ b/src/assets/images/index.ts @@ -8,3 +8,4 @@ export { default as ThinkingFace } from "./thinking_face.png"; export { default as HuggingFace } from "./hugging_face.png"; export { default as TestBanner } from "./test_banner.png"; export { default as TestSmallBanner } from "./test_small_banner.png"; +export { default as PageNotFound } from "./page_not_found.png"; diff --git a/src/assets/images/page_not_found.png b/src/assets/images/page_not_found.png new file mode 100644 index 0000000000000000000000000000000000000000..453f1cd0ccb96d31bf13ca48133fe38de18f1028 GIT binary patch literal 58170 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
7|B*?$e`zM`1 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 X{xQ%wYj0O{`p`)4?wzW?oTL8({H1ez literal 0 HcmV?d00001 diff --git a/src/components/common/Modal/PlanAddModal/index.tsx b/src/components/common/Modal/PlanAddModal/index.tsx index 96bceeac..853e88ff 100644 --- a/src/components/common/Modal/PlanAddModal/index.tsx +++ b/src/components/common/Modal/PlanAddModal/index.tsx @@ -7,6 +7,8 @@ import { useAddCalenderPlanMutation } from "@/templates/calender/services/mutati import { color, flex, font } from "@/styles"; import React from "react"; import styled from "styled-components"; +import { toast } from "react-toastify"; +import getPlanType from "@/helpers/getPlanType.helper"; interface IPlanAddModalProps { date: string; @@ -21,12 +23,16 @@ const PlanAddModal = ({ date }: IPlanAddModalProps) => { const textareaRef = React.useRef(null); const handleAddButtonClick = () => { + if (!title.trim()) return toast.error("내용을 입력해주세요!"); + const gradeClassType = planType === "학급 일정" ? "CLASS" : "GRADE"; + const type = planType === "학교 일정" ? "SCHOOL" : gradeClassType; + mutate({ title, priority: 0, date, color: "#000", - type: planType, + type, grade: user.grade, classNumber: user.classNum, }); @@ -56,8 +62,8 @@ const PlanAddModal = ({ date }: IPlanAddModalProps) => {