- {[2, 3, 4, 5].map(item => (
+ {PRIZE_VALUES.map(item => (
handleRank(item)}
diff --git a/admin/src/pages/UploadReward/UploadReward.jsx b/admin/src/pages/UploadReward/UploadReward.jsx
index d6661bc..ba602aa 100644
--- a/admin/src/pages/UploadReward/UploadReward.jsx
+++ b/admin/src/pages/UploadReward/UploadReward.jsx
@@ -43,11 +43,9 @@ function UploadReward() {
file: selectedFile,
quizDate: dateInfo,
});
- console.log(body);
try {
setIsLoading(true);
const response = await postQuizReward(body);
- console.log(response);
setOpenModal(false);
if (response.message === 'success') {
setProcessMessage('파일 업로드를 완료했습니다.');
@@ -64,7 +62,6 @@ function UploadReward() {
const handleFileChange = async files => {
if (!files.length) return;
- setModified(true);
setErrorMessage('');
setIsLoading(true);
diff --git a/admin/src/pages/drawCasper/DrawCasper.jsx b/admin/src/pages/drawCasper/DrawCasper.jsx
index f8f17a2..83dd1ff 100644
--- a/admin/src/pages/drawCasper/DrawCasper.jsx
+++ b/admin/src/pages/drawCasper/DrawCasper.jsx
@@ -4,7 +4,7 @@ import BlackButton from '@/components/buttons/BlackButton';
import ModalFrame from '@/components/modal/ModalFrame';
import { draw } from '@/api/DrawCasper/index';
-function DrawCasper() {
+const useDrawCasper = () => {
const [openSubmitModal, setOpenSubmitModal] = useState(false);
const [winner, setWinner] = useState('');
@@ -19,24 +19,36 @@ function DrawCasper() {
}
};
+ return {
+ openSubmitModal,
+ winner,
+ setOpenSubmitModal,
+ handleSubmit,
+ };
+};
+
+function DrawCasper() {
+ const { openSubmitModal, winner, setOpenSubmitModal, handleSubmit } =
+ useDrawCasper();
+
return (
- {winner === '' ? (
+ {winner ? (
+
{winner}
+ ) : (
setOpenSubmitModal(true)}
/>
- ) : (
- {winner}
)}
{openSubmitModal && (
setOpenSubmitModal(false)}
- onClickYes={() => handleSubmit()}
+ onClickYes={handleSubmit}
/>
)}
diff --git a/admin/yarn.lock b/admin/yarn.lock
index 8901578..586d48b 100644
--- a/admin/yarn.lock
+++ b/admin/yarn.lock
@@ -2900,6 +2900,7 @@ fast-glob@^3.3.0:
"@nodelib/fs.walk" "^1.2.3"
glob-parent "^5.1.2"
merge2 "^1.3.0"
+ micromatch "^4.0.4"
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
@@ -3671,10 +3672,13 @@ merge2@^1.3.0:
resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
-micro-slider@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/micro-slider/-/micro-slider-1.1.0.tgz#f664f9fe6e0cf569ff224fd9c07dd95d609716d3"
- integrity sha512-/PQSZMZdjJ8/UCG2B27Jf/WomKxfldZVxb1nr6FJBe+nOU0jt59Z9udu02TtND9/dj/GvxMxS27oGZPAthUMJA==
+micromatch@^4.0.4, micromatch@^4.0.5:
+ version "4.0.7"
+ resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz"
+ integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==
+ dependencies:
+ braces "^3.0.3"
+ picomatch "^2.3.1"
milliparsec@^2.3.0:
version "2.3.0"
@@ -4119,6 +4123,7 @@ react-js-pagination@^3.0.3:
paginator "^1.0.0"
prop-types "15.x.x - 16.x.x"
react "15.x.x - 16.x.x"
+ tar "7.4.3"
react-router-dom@^6.25.1:
version "6.25.1"
@@ -4666,6 +4671,7 @@ tailwindcss@^3.4.6:
is-glob "^4.0.3"
jiti "^1.21.0"
lilconfig "^2.1.0"
+ micromatch "^4.0.5"
normalize-path "^3.0.0"
object-hash "^3.0.0"
picocolors "^1.0.0"
diff --git a/service/package.json b/service/package.json
index d751c87..1e1affd 100644
--- a/service/package.json
+++ b/service/package.json
@@ -15,6 +15,7 @@
"@prerenderer/rollup-plugin": "^0.3.12",
"@svgr/webpack": "^8.1.0",
"autoprefixer": "^10.4.19",
+ "classnames": "^2.5.1",
"dotenv": "^16.4.5",
"eslint-config-airbnb": "^19.0.4",
"eslint-import-resolver-node": "^0.3.9",
@@ -23,7 +24,6 @@
"framer-motion": "^11.3.28",
"js-confetti": "^0.12.0",
"json-server": "^1.0.0-beta.1",
- "micro-slider": "^1.1.0",
"micromatch": "^4.0.7",
"postcss": "^8.4.39",
"prop-types": "^15.8.1",
@@ -33,7 +33,6 @@
"react-helmet-async": "^2.0.5",
"react-js-pagination": "^3.0.3",
"react-router-dom": "^6.25.1",
- "swiper": "^11.1.7",
"tailwindcss": "^3.4.6",
"tar": "^7.4.3",
"vite-plugin-svgr": "^4.2.0"
diff --git a/service/src/components/buttons/BaseButton.jsx b/service/src/components/buttons/BaseButton.jsx
deleted file mode 100644
index 75efd14..0000000
--- a/service/src/components/buttons/BaseButton.jsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import React from 'react';
-import PropTypes from 'prop-types';
-
-function BaseButton({
- value,
- onClickFunc,
- styles = '',
- disabled = false,
- bgColor,
- textColor,
-}) {
- return (
-
- );
-}
-
-BaseButton.propTypes = {
- value: PropTypes.string.isRequired,
- onClickFunc: PropTypes.func.isRequired,
- styles: PropTypes.string,
- disabled: PropTypes.bool,
- bgColor: PropTypes.string.isRequired,
- textColor: PropTypes.string.isRequired,
-};
-
-export default React.memo(BaseButton);
diff --git a/service/src/components/buttons/BlueButton.jsx b/service/src/components/buttons/BlueButton.jsx
index 681c682..85c731d 100644
--- a/service/src/components/buttons/BlueButton.jsx
+++ b/service/src/components/buttons/BlueButton.jsx
@@ -1,14 +1,23 @@
import React from 'react';
-import BaseButton from '@/components/buttons/BaseButton';
+import PropTypes from 'prop-types';
-function BlueButton(props) {
+function BlueButton({ value, styles, onClickFunc, disabled = false }) {
return (
-
+
);
}
+BlueButton.propTypes = {
+ value: PropTypes.string.isRequired,
+ onClickFunc: PropTypes.func.isRequired,
+ styles: PropTypes.string.isRequired,
+ disabled: PropTypes.bool,
+};
+
+//memo를 이용하여 rerender 방지
export default React.memo(BlueButton);
diff --git a/service/src/components/buttons/BluePurpleButton.jsx b/service/src/components/buttons/BluePurpleButton.jsx
index 422bd34..5dfc9c3 100644
--- a/service/src/components/buttons/BluePurpleButton.jsx
+++ b/service/src/components/buttons/BluePurpleButton.jsx
@@ -1,14 +1,23 @@
import React from 'react';
-import BaseButton from '@/components/buttons/BaseButton';
+import PropTypes from 'prop-types';
-function BluePurpleButton(props) {
+function BluePurpleButton({ value, onClickFunc, styles, disabled = false }) {
return (
-
+
);
}
+BluePurpleButton.propTypes = {
+ value: PropTypes.string.isRequired,
+ onClickFunc: PropTypes.func.isRequired,
+ styles: PropTypes.string.isRequired,
+ disabled: PropTypes.bool,
+};
+
export default React.memo(BluePurpleButton);
diff --git a/service/src/components/buttons/WhiteButton.jsx b/service/src/components/buttons/WhiteButton.jsx
index 9536b84..418d00b 100644
--- a/service/src/components/buttons/WhiteButton.jsx
+++ b/service/src/components/buttons/WhiteButton.jsx
@@ -1,14 +1,23 @@
import React from 'react';
-import BaseButton from '@/components/buttons/BaseButton';
+import PropTypes from 'prop-types';
-function WhiteButton(props) {
+function WhiteButton({ value, onClickFunc, styles, disabled = false }) {
return (
-
+
);
}
+WhiteButton.propTypes = {
+ value: PropTypes.string.isRequired,
+ onClickFunc: PropTypes.func.isRequired,
+ styles: PropTypes.string.isRequired,
+ disabled: PropTypes.bool,
+};
+
export default React.memo(WhiteButton);
diff --git a/service/src/pages/eventIntro/EventIntro.jsx b/service/src/pages/eventIntro/EventIntro.jsx
index 0f37176..9aad71c 100644
--- a/service/src/pages/eventIntro/EventIntro.jsx
+++ b/service/src/pages/eventIntro/EventIntro.jsx
@@ -5,25 +5,26 @@ import EventIntroRewards from '@/pages/eventIntro/EventIntroRewards';
import SlideUpMotion from '@/components/SlideUpMotion/SlideUpMotion';
import { Helmet } from 'react-helmet-async';
+const TITLE = '캐스퍼 이벤트 소개';
+const DESCRIPTION =
+ '캐스퍼 EV를 받을 수 있는 이벤트에 대해 자세히 알아보세요. 이벤트 참여 방법과 다양한 보상을 소개합니다.';
+const OG_IMAGE_URL =
+ 'https://softeer4-team8.s3.ap-northeast-2.amazonaws.com/%E1%84%86%E1%85%B5%E1%84%82%E1%85%B5+%E1%84%8F%E1%85%B1%E1%84%8C%E1%85%B3+7.svg';
+
+const HelmetMeta = () => (
+
+ {TITLE}
+
+
+
+
+
+);
+
function EventIntro() {
return (
-
- 캐스퍼 이벤트 소개
-
-
-
-
-
+
diff --git a/service/src/pages/joinEvent/JoinEventIntro.jsx b/service/src/pages/joinEvent/JoinEventIntro.jsx
index 85b2ec3..d79202e 100644
--- a/service/src/pages/joinEvent/JoinEventIntro.jsx
+++ b/service/src/pages/joinEvent/JoinEventIntro.jsx
@@ -7,28 +7,30 @@ import MiniQuiz from '@/pages/joinEvent/MiniQuiz';
import useScroll from '@/hooks/useScroll';
import { Helmet } from 'react-helmet-async';
+const TITLE = '캐스퍼 이벤트 참여';
+const DESCRIPTION =
+ '다양한 게임을 즐기고 응모권을 모아 캐스퍼 EV를 받을 수 있는 기회를 잡아보세요!';
+const OG_IMAGE_URL =
+ 'https://softeer4-team8.s3.ap-northeast-2.amazonaws.com/OGImage.png';
+const OG_URL = 'https://casper-event.store/event';
+
+const HelmetMeta = () => (
+
+ {TITLE}
+
+
+
+
+
+
+);
+
function JoinEventIntro() {
const { refs } = useScroll();
return (
<>
-
- 캐스퍼 이벤트 참여
-
-
-
-
-
-
+
diff --git a/service/src/pages/joinEvent/WorldCup.jsx b/service/src/pages/joinEvent/WorldCup.jsx
index 1f02396..f552f77 100644
--- a/service/src/pages/joinEvent/WorldCup.jsx
+++ b/service/src/pages/joinEvent/WorldCup.jsx
@@ -39,20 +39,20 @@ const WorldCupImages = () => (
className="absolute top-[51px] left-[6px] z-0"
src={worldCupIntro1}
alt="출차 시 고급승용차에 둘러 싸이기"
- style={{ clipPath: 'polygon(0 10%, 100% 0%, 100% 90%, 10% 100%)' }} //clipPath를 이용한 밑줄 삭제
+ style={{ clipPath: 'polygon(0% 18%, 78% 0%, 100% 79%, 22% 100%)' }} //clipPath를 이용한 밑줄 삭제
loading="lazy"
/>
@@ -65,7 +65,7 @@ function WorldCup() {
return (
-
+
diff --git a/service/src/pages/miniquiz/ButtonCases.jsx b/service/src/pages/miniquiz/ButtonCases.jsx
index d86bea0..93882bd 100644
--- a/service/src/pages/miniquiz/ButtonCases.jsx
+++ b/service/src/pages/miniquiz/ButtonCases.jsx
@@ -13,6 +13,8 @@ function ButtonCases({
openOrderModal,
}) {
const { userInfo } = useContext(AuthContext);
+ //showOrderButton은 선착순 수령 대상자인지에 대한 검사(500명 안에 들면 participantId가 defined)
+ //userGotPrize는 선착순 수령 여부 이를 통해 선착순 수령 대상자가 선착순을 수령하면 선착순 버튼을 삭제시키기 위함
const showOrderButton = participantId !== undefined && !userGotPrize;
const showToolBoxButton = isCorrect && !(userInfo.quizParticipated === true); //userInfo.quizParticipated는 undefined일 수 있음
const buttons = [];
diff --git a/service/src/pages/miniquiz/ClickBox.jsx b/service/src/pages/miniquiz/ClickBox.jsx
index d174ee5..73a793b 100644
--- a/service/src/pages/miniquiz/ClickBox.jsx
+++ b/service/src/pages/miniquiz/ClickBox.jsx
@@ -1,26 +1,37 @@
-import React, { useState } from 'react';
+import React from 'react';
import PropTypes from 'prop-types';
+import classnames from 'classnames';
-function ClickBox({ id, value, isChosen, onClick }) {
- let className =
- 'hover-scale-ani set-center text-body-3-semibold min-w-[586px] min-h-[120px] rounded-[15px] border-2 overflow-hidden ';
- if (id === isChosen) {
- className = className + 'bg-background-lightblue gradient-border';
- } else {
- className = className + 'border-op-30-blue bg-neutral-white';
- }
+const ClickBox = ({ id, value, isChosen, onClick }) => {
+ const baseClass =
+ 'hover-scale-ani set-center text-body-3-semibold min-w-[586px] min-h-[120px] rounded-[15px] border-2 overflow-hidden';
+
+ const className = classnames(baseClass, {
+ ' bg-background-lightblue gradient-border': isChosen,
+ ' border-op-30-blue bg-neutral-white': !isChosen,
+ }); //classnames 를 사용하여 가독성 개선
+
+ //이전 코드
+ /* let className =
+ * 'hover-scale-ani set-center text-body-3-semibold min-w-[586px] min-h-[120px] rounded-[15px] border-2 overflow-hidden ';
+ * if (id === isChosen) {
+ * className = className + 'bg-background-lightblue gradient-border';
+ * } else {
+ * className = className + 'border-op-30-blue bg-neutral-white';
+ * }
+ */
return (
);
-}
+};
ClickBox.propTypes = {
- value: PropTypes.string.isRequired,
- isChosen: PropTypes.number.isRequired,
id: PropTypes.number.isRequired,
+ value: PropTypes.string.isRequired,
+ isChosen: PropTypes.bool.isRequired,
onClick: PropTypes.func.isRequired,
};
diff --git a/service/src/pages/miniquiz/LoadingQuiz.jsx b/service/src/pages/miniquiz/LoadingQuiz.jsx
index e0eb906..febabd5 100644
--- a/service/src/pages/miniquiz/LoadingQuiz.jsx
+++ b/service/src/pages/miniquiz/LoadingQuiz.jsx
@@ -1,36 +1,43 @@
-import React, { useEffect, useCallback, useState } from 'react';
+import React, { useEffect, useState } from 'react';
import BlueButton from '@/components/buttons/BlueButton';
import WhiteButton from '@/components/buttons/WhiteButton';
import { useNavigate } from 'react-router-dom';
-function LoadingQuiz() {
- const navigate = useNavigate();
-
- const handleExit = () => {
- navigate('/event');
- };
-
- const handleRefresh = useCallback(() => {
- window.location.reload();
- }, []);
-
- const [loadingText, setLoadingText] = useState('퀴즈 정보를 가져오는 중..!');
+const useLoadingText = (initialText, texts, interval) => {
+ const [loadingText, setLoadingText] = useState(initialText);
useEffect(() => {
- const texts = [
- '퀴즈 정보를 가져오는 중.',
- '퀴즈 정보를 가져오는 중..',
- '퀴즈 정보를 가져오는 중...',
- '퀴즈 정보를 가져오는 중..!',
- ];
let index = 0;
- const interval = setInterval(() => {
+ const textInterval = setInterval(() => {
setLoadingText(texts[index]);
index = (index + 1) % texts.length;
- }, 500);
+ }, interval);
+
+ return () => clearInterval(textInterval);
+ }, [texts, interval]);
- return () => clearInterval(interval);
- }, []);
+ return loadingText;
+}; //loading 시 문자 바뀜
+
+function LoadingQuiz() {
+ const navigate = useNavigate();
+
+ const handleExit = () => navigate('/event');
+
+ const handleRefresh = () => window.location.reload();
+
+ const loadingTexts = [
+ '퀴즈 정보를 가져오는 중.',
+ '퀴즈 정보를 가져오는 중..',
+ '퀴즈 정보를 가져오는 중...',
+ '퀴즈 정보를 가져오는 중..!',
+ ];
+
+ const loadingText = useLoadingText(
+ '퀴즈 정보를 가져오는 중..!',
+ loadingTexts,
+ 500,
+ );
return (
@@ -46,9 +53,8 @@ function LoadingQuiz() {
onClickFunc={handleExit}
styles="px-3000 py-500 text-bold-3-regular"
/>
-
diff --git a/service/src/pages/miniquiz/MiniQuiz.jsx b/service/src/pages/miniquiz/MiniQuiz.jsx
index 9f3f36b..3c942b4 100644
--- a/service/src/pages/miniquiz/MiniQuiz.jsx
+++ b/service/src/pages/miniquiz/MiniQuiz.jsx
@@ -4,6 +4,23 @@ import ExitModal from '@/components/modal/ExitModal';
import MiniQuizMain from '@/pages/miniquiz/MiniQuizMain';
import { Helmet } from 'react-helmet-async';
+const TITLE = '캐스퍼 미니퀴즈';
+const DESCRIPTION = '미니퀴즈을 통해 선착순 경품과 툴박스 아이템을 획득하세요!';
+const OG_IMAGE_URL =
+ 'https://softeer4-team8.s3.ap-northeast-2.amazonaws.com/OGImage.png';
+const OG_URL = 'https://casper-event.store/event/miniquiz';
+
+const HelmetMeta = () => (
+
+ {TITLE}
+
+
+
+
+
+
+);
+
function MiniQuiz() {
const [openExitModal, setOpenExitModal] = useState(false);
@@ -12,26 +29,7 @@ function MiniQuiz() {
return (
<>
-
- 캐스퍼 미니퀴즈
-
-
-
-
-
-
+
(
+ {description}
+);
+
+QuizDescription.propTypes = {
+ description: PropTypes.string.isRequired,
+};
+
+const QuizQuestions = ({ questions, selectedId, onSelect }) => (
+
+ {questions.map(([id, value]) => (
+ onSelect(Number(id))}
+ key={id}
+ />
+ ))}
+
+);
+
+QuizQuestions.propTypes = {
+ questions: PropTypes.arrayOf(PropTypes.array).isRequired,
+ selectedId: PropTypes.number,
+ onSelect: PropTypes.func.isRequired,
+};
function MiniQuizMain() {
const navigate = useNavigate();
const { code, loading, error, data, shuffledQuizQuestion } = useMiniQuiz();
- const { quizDescription, quizId } = data;
- const [isChosen, setIsChosen] = useState(0);
- const [disabled, setDisabled] = useState(true);
+ const [selectedId, setSelectedId] = useState(0);
+ const [isSubmitDisabled, setSubmitDisabled] = useState(true);
useEffect(() => {
if (code === 'NO_QUIZ_CONTENT') {
navigate('/event/noQuiz');
}
- }, [code]);
+ }, [code, navigate]);
- const handleClickBox = id => {
- setIsChosen(id);
- setDisabled(false); // ClickBox가 클릭될 때 SubmitButton 활성화
- };
+ const handleSelect = useCallback(id => {
+ setSelectedId(id);
+ setSubmitDisabled(false);
+ }, []);
- if (error) {
- return Error: {error.message}
;
- } else if (loading) {
- return ;
- }
+ if (loading) return ;
+ if (error) return Error: {error.message}
;
+
+ const { quizDescription, quizId } = data;
return (
월드컵 일일 미니퀴즈
-
- {quizDescription}
-
-
- {shuffledQuizQuestion.map(item => {
- const id = Number(item[0]);
- const value = item[1];
- return (
- handleClickBox(id)}
- key={id}
- />
- );
- })}
-
+
+
);
diff --git a/service/src/pages/miniquiz/NoQuizMain.jsx b/service/src/pages/miniquiz/NoQuizMain.jsx
index e92c172..bd9d2c2 100644
--- a/service/src/pages/miniquiz/NoQuizMain.jsx
+++ b/service/src/pages/miniquiz/NoQuizMain.jsx
@@ -1,4 +1,4 @@
-import React, { useCallback } from 'react';
+import React from 'react';
import WhiteButton from '@/components/buttons/WhiteButton';
import { useNavigate } from 'react-router-dom';
@@ -14,7 +14,7 @@ function NoQuizMain() {
*/
//이런 식으로 하면 되긴 하지만 이 페이지에서는 불필요한 최적화임
- const handleExit = () => navigate('/event');
+ const handleNavigateToEvent = () => navigate('/event');
return (
@@ -26,7 +26,7 @@ function NoQuizMain() {
diff --git a/service/src/pages/miniquiz/miniquizhooks/useMiniQuiz.js b/service/src/pages/miniquiz/miniquizhooks/useMiniQuiz.js
index b28034c..37aa08f 100644
--- a/service/src/pages/miniquiz/miniquizhooks/useMiniQuiz.js
+++ b/service/src/pages/miniquiz/miniquizhooks/useMiniQuiz.js
@@ -1,4 +1,4 @@
-import { useState, useEffect } from 'react';
+import { useState, useEffect, useCallback } from 'react';
import { getMiniQuiz } from '@/api/miniQuiz';
import shuffleArr from '@/utils/shuffleArr';
@@ -13,25 +13,25 @@ const useMiniQuiz = () => {
const fetchMiniQuiz = async () => {
try {
setLoading(true);
- const [data] = await Promise.all([
+ setError('');
+ const [quizData] = await Promise.all([
getMiniQuiz(),
- new Promise(resolve => setTimeout(resolve, 500)),
- ]); //Promise.all을 이용하여 둘 중 오래 걸리는 시간 동안 로딩 화면 보여줌
- const { code } = data;
- if (code === 'NO_QUIZ_CONTENT') {
- setCode(code);
+ new Promise(resolve => setTimeout(resolve, 300)), // 사용자의 경험을 방해하지 않는 선에서 로딩 화면을 보여주기 위한 0.3초
+ ]);
+
+ const { quizCode, quizQuestions } = quizData;
+ if (quizCode === 'NO_QUIZ_CONTENT') {
+ setCode(quizCode);
return;
}
- setData(data);
- setShuffledQuizQuestion(shuffleArr(Object.entries(data.quizQuestions)));
+ setData(quizData);
+ setShuffledQuizQuestion(shuffleArr(Object.entries(quizQuestions)));
} catch (err) {
- setError(err);
- return;
+ setError('퀴즈 로딩에 실패했습니다. 다시 시도 부탁드립니다.');
} finally {
setLoading(false);
}
};
-
fetchMiniQuiz();
}, []);
diff --git a/service/src/pages/newCarIntro/NewCarIntro.jsx b/service/src/pages/newCarIntro/NewCarIntro.jsx
index c0f1483..d05074a 100644
--- a/service/src/pages/newCarIntro/NewCarIntro.jsx
+++ b/service/src/pages/newCarIntro/NewCarIntro.jsx
@@ -4,23 +4,27 @@ import NewCarCarousel from '@/pages/newCarIntro/NewCarCarousel';
import NewCarDetail from '@/pages/newCarIntro/NewCarDetail';
import { Helmet } from 'react-helmet-async';
+const TITLE = '캐스퍼 EV 소개';
+const DESCRIPTION = '캐스퍼 EV에 대해 알아보세요!';
+const OG_IMAGE_URL =
+ 'https://softeer4-team8.s3.ap-northeast-2.amazonaws.com/OGImage.png';
+const OG_URL = 'https://casper-event.store/introd';
+
+const HelmetMeta = () => (
+
+ {TITLE}
+
+
+
+
+
+
+);
+
function NewCarIntro() {
return (
<>
-
- 캐스퍼 EV 소개
-
-
-
-
-
-
+
diff --git a/service/src/pages/worldCup/WorldCupMain.jsx b/service/src/pages/worldCup/WorldCupMain.jsx
index 73eda63..2da0477 100644
--- a/service/src/pages/worldCup/WorldCupMain.jsx
+++ b/service/src/pages/worldCup/WorldCupMain.jsx
@@ -6,6 +6,23 @@ import shuffleArr from '@/utils/shuffleArr';
import { postWorldCupResult } from '@/api/worldCup/index';
import { Helmet } from 'react-helmet-async';
+const TITLE = '캐스퍼 상황 월드컵';
+const DESCRIPTION = '월드컵 게임을 통해 자동차 아이템을 획득하세요!';
+const OG_IMAGE_URL =
+ 'https://softeer4-team8.s3.ap-northeast-2.amazonaws.com/OGImage.png';
+const OG_URL = 'https://casper-event.store/event/worldcup';
+
+const HelmetMeta = () => (
+
+ {TITLE}
+
+
+
+
+
+
+);
+
const WorldCupMain = () => {
const navigate = useNavigate();
const [totalData, setTotalData] = useState(shuffleArr(worldCupData));
@@ -66,26 +83,7 @@ const WorldCupMain = () => {
return (
-
- 캐스퍼 상황 월드컵
-
-
-
-
-
-
+