Skip to content

Commit

Permalink
Merge branch '818-2024-fall-event-daily-attendance' of https://github…
Browse files Browse the repository at this point in the history
….com/sparcs-kaist/taxi-front into 818-2024-fall-event-daily-attendance
  • Loading branch information
Hyogyeong8 committed Sep 6, 2024
2 parents 8057b57 + c363c3c commit 3e1aab9
Show file tree
Hide file tree
Showing 9 changed files with 614 additions and 258 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ const CreditAmountStatusContainer = ({
{...whiteContainerProps}
>
<div css={{ color: theme.white, ...theme.font16_bold, flexGrow: 1 }}>
{type === "credit" ? "내가 모은 송편" : "일반 / 고급 응모권"}
{type === "credit" ? "내가 모은 송편코인" : "일반 / 고급 응모권"}
</div>
{type === "credit" ? (
<>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import { useEffect, useState } from "react";

import { useIsLogin, useValueRecoilState } from "@/hooks/useFetchRecoilState";
import { useAxios } from "@/hooks/useTaxiAPI";

import Button from "@/components/Button";
import { ModalEvent2024FallShare } from "@/components/ModalPopup";
import WhiteContainer from "@/components/WhiteContainer";

import alertAtom from "@/atoms/alert";
import { useSetRecoilState } from "recoil";

import theme from "@/tools/theme";

const WhiteContainerSuggestShareEvent = () => {
const isLogin = useIsLogin();
const { isAgreeOnTermsOfEvent } =
useValueRecoilState("event2024FallInfo") || {};
const [inviteUrl, setInviteUrl] = useState<string>("");
const [isOpenShare, setIsOpenShare] = useState<boolean>(false);
const axios = useAxios();
const setAlert = useSetRecoilState(alertAtom);

const styleText = {
...theme.font14,
marginBottom: "12px",
};
const styleButton = {
padding: "14px 0 13px",
borderRadius: "12px",
...theme.font14_bold,
};

useEffect(() => {
if (isAgreeOnTermsOfEvent)
axios({
url: `/events/2024fall/invites/create`,
method: "post",
onSuccess: ({ inviteUrl }) => {
setInviteUrl(inviteUrl);
},
onError: () => setAlert("초대 링크를 생성하지 못했습니다."),
});
}, [isAgreeOnTermsOfEvent]);

return (
<>
{isLogin && isAgreeOnTermsOfEvent && (
<WhiteContainer>
<div css={styleText}>
<b>🎊 이벤트 공유하기</b>
</div>
<div css={styleText}>
이벤트를 공유하여 친구가 이벤트에 참여하면, 친구와 함께 송편코인
700개를 받을 수 있어요!
</div>
<Button
type="purple"
css={styleButton}
onClick={() => {
if (inviteUrl) setIsOpenShare(true);
else
setAlert(
"이벤트를 공유하기 위해서는 이벤트에 참여해야 합니다."
);
}}
>
이벤트 공유하기
</Button>
<ModalEvent2024FallShare
isOpen={isOpenShare}
onChangeIsOpen={setIsOpenShare}
inviteUrl={inviteUrl || ""}
/>
</WhiteContainer>
)}
</>
);
};

export default WhiteContainerSuggestShareEvent;
114 changes: 114 additions & 0 deletions packages/web/src/components/ModalPopup/Body/BodyEvent2024FallShare.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
import { useCallback, useEffect, useState } from "react";
import QRCode from "react-qr-code";

import ButtonShare from "@/components/Button/ButtonShare";
import DottedLine from "@/components/DottedLine";
import LinkCopy from "@/components/Link/LinkCopy";
import LinkKakaotalkShare from "@/components/Link/LinkKakaotalkShare";

import { ogServer } from "@/tools/loadenv";
import theme from "@/tools/theme";

import { ReactComponent as KakaoTalkLogo } from "@/static/assets/serviceLogos/KakaoTalkLogo.svg";
import CheckIcon from "@mui/icons-material/Check";
import ContentCopyIcon from "@mui/icons-material/ContentCopy";

export type BodyEvent2024FallShareProps = {
inviteUrl: string;
height?: number;
};

const BodyEvent2024FallShare = ({
height,
inviteUrl,
}: BodyEvent2024FallShareProps) => {
const [isCopied, setIsCopied] = useState(false);
const onCopy = useCallback(() => setIsCopied(true), [setIsCopied]);

useEffect(() => {
if (isCopied) {
const timer = setTimeout(() => setIsCopied(false), 1000);
return () => clearTimeout(timer);
}
}, [isCopied]);

const styleWrapper = height
? {
height,
display: "flex",
flexDirection: "column" as any,
}
: {};

const styleGuide = {
...theme.font12,
color: theme.gray_text,
margin: "0 8px 12px",
};
const styleQRSection = {
marginTop: "12px",
position: "relative" as any,
overflow: "hidden",
textAlign: "center" as any,
};
const styleButtonSection = {
display: "flex",
justifyContent: "center",
gap: "10px",
margin: "12px 0px 0",
};

return (
<div css={styleWrapper}>
<div css={styleGuide}>
이벤트를 다른 사람들에게 공유할 수 있습니다. 이 링크를 통해 다른
사용자가 이벤트에 참여하면, 회원님과 새 참여자 모두{" "}
<b>송편코인 700개</b>를 획득합니다.
</div>
<DottedLine />
<div css={{ flexGrow: 1 }} />
<div css={styleQRSection}>
<QRCode value={inviteUrl} size={120} bgColor="none" />
</div>
<div css={{ flexGrow: 1 }} />
<div css={styleButtonSection}>
<LinkKakaotalkShare
title={"Taxi 추석 이벤트"}
description={`Taxi 추석 이벤트에 참여해 보세요! 이 링크로 참여하면 송편코인 700개를 획득할 수 있어요!`}
imageUrl={
ogServer
? `${ogServer}/eventInvite/${inviteUrl.split("/").pop()}`
: undefined
}
buttonText="확인하기"
buttonTo={new URL(inviteUrl).pathname}
partNum={1}
>
<ButtonShare
text="카카오톡"
icon={<KakaoTalkLogo css={{ width: "22px" }} />}
background="#FFE812"
/>
</LinkKakaotalkShare>
<LinkCopy
value={`🚕 Taxi 추석 이벤트에 참여해 보세요!\n🚕 참여 링크: ${inviteUrl}`}
onCopy={onCopy}
>
<ButtonShare
text="초대 복사"
icon={
isCopied ? (
<CheckIcon style={{ fontSize: "16px" }} />
) : (
<ContentCopyIcon style={{ fontSize: "16px" }} />
)
}
background={theme.gray_background}
/>
</LinkCopy>
</div>
</div>
);
};

export default BodyEvent2024FallShare;
91 changes: 56 additions & 35 deletions packages/web/src/components/ModalPopup/ModalEvent2024FallJoin.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import DottedLine from "@/components/DottedLine";
import Input from "@/components/Input";
import Modal from "@/components/Modal";

import LinkLogin from "../Link/LinkLogin";
import ProfileImage from "../User/ProfileImage";

import alertAtom from "@/atoms/alert";
Expand All @@ -25,6 +26,7 @@ import FestivalRoundedIcon from "@mui/icons-material/FestivalRounded";

type ModalEvent2024FallJoinProps = Parameters<typeof Modal>[0] & {
inviterId?: string;
defaultPhoneNumber?: string;
};

const ModalEvent2024FallJoin = ({
Expand All @@ -43,7 +45,9 @@ const ModalEvent2024FallJoin = ({
const event2024FallQuestComplete = useEvent2024FallQuestComplete();
//#endregion

const [phoneNumber, setPhoneNumber] = useState<string>("");
const [phoneNumber, setPhoneNumber] = useState<string>(
phoneNumberFromLoginInfo || ""
);
const isValidPhoneNumber = useMemo(
() => regExpTest.phoneNumber(phoneNumber),
[phoneNumber]
Expand All @@ -55,6 +59,10 @@ const ModalEvent2024FallJoin = ({
}>();
const isInvited = !!inviterId;

useEffect(() => {
setPhoneNumber(phoneNumberFromLoginInfo || "");
}, [modalProps.isOpen]);

useEffect(() => {
if (isAgreeOnTermsOfEvent || !isInvited) return;
axios({
Expand Down Expand Up @@ -101,20 +109,19 @@ const ModalEvent2024FallJoin = ({
margin: "0 8px",
};
const styleInputWrap = {
margin: "12px 8px",
margin: "0 8px 12px",
display: "flex",
alignItems: "center",
color: theme.gray_text,
whiteSpace: "nowrap",
...theme.font14,
} as const;

// ToDo : 글 작성
return (
<Modal padding="16px 12px 12px" {...modalProps}>
<div css={styleTitle}>
<FestivalRoundedIcon style={styleIcon} />
2024 추석 이벤트 이름 지어줘
Taxi 추석 이벤트
</div>
<div css={styleText}>
• 택시 동승을 하지 않는 사용자는{" "}
Expand All @@ -137,18 +144,18 @@ const ModalEvent2024FallJoin = ({
위 경우, SPARCS Taxi팀 서비스 관리자는 서비스 부정 이용을 방지하기 위해
택시 탑승을 인증할 수 있는{" "}
<b css={{ color: theme.black }}>영수증 또는 카카오T 이용기록</b>
요청할 수 있습니다. 또한, 본 서비스를 부정 이용하는 사용자에게는 택시
요청할 수 있습니다. 또한, 본 서비스를 부정 이용하는 사용자에게는 Taxi
서비스 이용 제한 및 법적 조치를 취할 수 있습니다.
</div>
<div css={{ height: "12px" }} />
<div css={styleText}>
{" "}
<b css={{ color: theme.red_text }}>
입력해주신 연락처로 이벤트 상품을 전달해드립니다.
입력하신 연락처로 이벤트 상품을 전달해 드립니다.
</b>{" "}
또한, 서비스 신고 대응 및 본인 확인을 위해 사용될 수 있습니다.{" "}
<b css={{ color: theme.red_text }}>
입력해주신 연락처는 이후 수정이 불가능합니다.
입력하신 연락처는 이후 수정이 불가능합니다.
</b>
</div>
<div css={{ height: "12px" }} />
Expand All @@ -158,19 +165,20 @@ const ModalEvent2024FallJoin = ({
추천인 이벤트 참여를 위해서는 추천인이 발송한 링크로 이벤트에 참여해야
합니다.
</b>{" "}
추천인을 통해 이벤트에 참여할 시, 참가자와 추천인 모두에게 700
송편코인이 지급됩니다.
추천인을 통해 이벤트에 참여할 시, 참가자와 추천인 모두에게 송편코인
700개가 지급됩니다.
</div>
<div css={{ height: "12px" }} />
<div css={styleText}>
• 본 약관은 동의 이후에도 {'"'}마이페이지{">"}한가위 송편 이벤트 참여
약관{'"'}에서 다시 확인하실 수 있습니다.{" "}
• 본 약관은 동의 이후에도 {'"'}마이페이지{">"}추석 이벤트 참여 약관{'"'}
에서 다시 확인하실 수 있습니다.{" "}
</div>
{isLogin &&
(isAgreeOnTermsOfEvent ? (
<div css={{ height: "12px" }} />
<DottedLine />
<div css={{ height: "12px" }} />
{isLogin ? (
isAgreeOnTermsOfEvent ? (
<>
<div css={{ height: "12px" }} />
<DottedLine />
<div css={styleInputWrap}>
전화번호
<Input
Expand All @@ -193,8 +201,6 @@ const ModalEvent2024FallJoin = ({
</>
) : (
<>
<div css={{ height: "12px" }} />
<DottedLine />
<div css={styleInputWrap}>
전화번호
<Input
Expand All @@ -204,6 +210,27 @@ const ModalEvent2024FallJoin = ({
css={{ width: "100%", marginLeft: "10px" }}
/>
</div>
{isInvited && inviterInfo && (
<div css={styleInputWrap}>
추천인
<div
css={{
width: "24px",
height: "24px",
margin: "0px 10px",
borderRadius: "12px",
overflow: "hidden",
boxShadow: theme.shadow,
flexShrink: 0,
}}
>
<ProfileImage url={inviterInfo?.profileImageUrl} />
</div>
<span css={{ width: "100%", ...theme.ellipsis }}>
{inviterInfo?.nickname}
</span>
</div>
)}
<Button
type="purple_inset"
css={{
Expand All @@ -220,27 +247,21 @@ const ModalEvent2024FallJoin = ({
: "동의 후 이벤트 참여하기"}
</Button>
</>
))}
{isInvited && inviterInfo && (
<div css={styleInputWrap}>
추천인
<div
)
) : (
<LinkLogin>
<Button
type="purple_inset"
css={{
width: "24px",
height: "24px",
margin: "0px 10px",
borderRadius: "12px",
overflow: "hidden",
boxShadow: theme.shadow,
flexShrink: 0,
width: "100%",
padding: "10px 0 9px",
borderRadius: "8px",
...theme.font14_bold,
}}
>
<ProfileImage url={inviterInfo?.profileImageUrl} />
</div>
<span css={{ width: "100%", ...theme.ellipsis }}>
{inviterInfo?.nickname}
</span>
</div>
로그인 후 이벤트 참여하기
</Button>
</LinkLogin>
)}
</Modal>
);
Expand Down
Loading

0 comments on commit 3e1aab9

Please sign in to comment.