Skip to content

Commit 20b7d79

Browse files
committed
fix: 융합 교육원 로그인 시 기능 제한
1 parent fc07d27 commit 20b7d79

File tree

3 files changed

+59
-22
lines changed

3 files changed

+59
-22
lines changed

apps/farminglog/src/components/Header/Header.tsx

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import useMediaQueries from "@/hooks/useMediaQueries";
1313
import Popup from "@/components/Popup/popup";
1414
import { useUserInfoQuery } from "@repo/auth/services/query/useUserInfoQuery";
1515
import { convertTrackToString } from "@/utils/convertTrackToString";
16+
import Cookies from "js-cookie";
1617

1718
const navItems = [
1819
{ label: "홈", path: "/home" },
@@ -32,10 +33,11 @@ export default function Header() {
3233
const { isMobile, isTablet } = useMediaQueries();
3334

3435
const { data: user } = useUserInfoQuery();
36+
const isLimited = Cookies.get("limitWrite") === "true";
3537

36-
const name = user?.name;
37-
const profileImageUrl = user?.profileImageUrl;
38-
const totalSeed = user?.totalSeed;
38+
const name = isLimited ? "" : user?.name;
39+
const profileImageUrl = isLimited ? undefined : user?.profileImageUrl;
40+
const totalSeed = isLimited ? 0 : user?.totalSeed;
3941

4042
const handleNavigation = (path: string) => {
4143
navigate(path);
@@ -64,6 +66,7 @@ export default function Header() {
6466
<S.ProfileContainer
6567
$isMobile={isMobile}
6668
onClick={(e) => {
69+
if (isLimited) return; // 제한 모드에서는 팝업 비활성화
6770
e.stopPropagation();
6871
setProfilePopupOpen(true);
6972
}}
@@ -75,10 +78,12 @@ export default function Header() {
7578
/>
7679
<S.ProfileName $isMobile={isMobile}>{name || ""}</S.ProfileName>
7780
</S.ProfileContainer>
78-
<S.RecordCount $isMobile={isMobile} $isTablet={isTablet}>
79-
<span className="seed-text">내 씨앗</span>
80-
<span className="seed-count">{totalSeed ?? 0}</span>
81-
</S.RecordCount>
81+
{!isLimited && (
82+
<S.RecordCount $isMobile={isMobile} $isTablet={isTablet}>
83+
<span className="seed-text">내 씨앗</span>
84+
<span className="seed-count">{totalSeed ?? 0}</span>
85+
</S.RecordCount>
86+
)}
8287
</S.ProfileAndSeedContainer>
8388
);
8489

@@ -171,19 +176,21 @@ export default function Header() {
171176
</S.HeaderContainer>
172177

173178
{/* 프로필 팝업 */}
174-
<Popup
175-
isOpen={isProfilePopupOpen}
176-
onClose={() => setProfilePopupOpen(false)}
177-
variant="MYPAGE"
178-
userName={user?.name}
179-
generationAndPart={
180-
user?.generation && user?.track
181-
? `${user.generation}${convertTrackToString(user.track)}`
182-
: "기수 정보 없음"
183-
}
184-
profileImg={user?.profileImageUrl}
185-
hasLogout={true}
186-
/>
179+
{!isLimited && (
180+
<Popup
181+
isOpen={isProfilePopupOpen}
182+
onClose={() => setProfilePopupOpen(false)}
183+
variant="MYPAGE"
184+
userName={user?.name}
185+
generationAndPart={
186+
user?.generation && user?.track
187+
? `${user.generation}${convertTrackToString(user.track)}`
188+
: "기수 정보 없음"
189+
}
190+
profileImg={user?.profileImageUrl}
191+
hasLogout={true}
192+
/>
193+
)}
187194
</>
188195
);
189196
}

apps/farminglog/src/pages/home/Harvest/harvest.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { useAttendMutation } from "../../../services/mutation/useAttendMutation"
99
import { useTodaySeedQuery } from "../../../services/query/useTodaySeedQuery";
1010
import Popup from "@/components/Popup/popup";
1111
import Info from "@/assets/Icons/info.png";
12+
import Cookies from "js-cookie";
1213

1314
interface StageProps {
1415
text: string;
@@ -32,6 +33,7 @@ const { data: todaySeed, refetch } = useTodaySeedQuery();
3233
const [isInfoOpen, setInfoOpen] = useState(false);
3334
const [isAlready, setIsAlready] = useState(false);
3435
const [showAnimationAfterModal, setShowAnimationAfterModal] = useState<number | null>(null);
36+
const [isLimitedPopup, setIsLimitedPopup] = useState(false);
3537

3638
const buttonRefs = [
3739
useRef<HTMLDivElement>(null),
@@ -77,6 +79,11 @@ const { data: todaySeed, refetch } = useTodaySeedQuery();
7779
};
7880

7981
const handleButtonClick = async (index: number, link?: string) => {
82+
const isLimited = Cookies.get("limitWrite") === "true";
83+
if (isLimited) {
84+
setIsLimitedPopup(true);
85+
return;
86+
}
8087
const isCompleted = todaySeed
8188
? index === 0
8289
? todaySeed.isAttendance
@@ -257,6 +264,14 @@ const { data: todaySeed, refetch } = useTodaySeedQuery();
257264
subMessage="내일 다시 와주세요!"
258265
confirmLabel="확인"
259266
/>
267+
<Popup
268+
isOpen={isLimitedPopup}
269+
onClose={() => setIsLimitedPopup(false)}
270+
variant="MESSAGE"
271+
mainMessage="제한 계정은 이용할 수 없습니다."
272+
subMessage="관리자에게 문의해주세요."
273+
confirmLabel="확인"
274+
/>
260275
</>
261276
);
262277
}

packages/router/protectedLoader.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,28 @@
11
import { redirect } from "react-router";
22
import { getClientSideTokens } from "../api/utils/getClientSideTokens";
3+
import Cookies from "js-cookie";
34

45
export const protectedLoader = async ({ request }: { request: Request }) => {
56
if (typeof window !== "undefined") {
67
const tokens = getClientSideTokens();
8+
const url = new URL(request.url);
9+
const pathname = url.pathname;
10+
11+
// 제한된 기능(글 작성, 출석/게임 등) 차단
12+
const isLimited = Cookies.get("limitWrite") === "true";
13+
const restrictedPaths = new Set([
14+
"/cheer/write",
15+
"/farminglog/create",
16+
"/farminglog/edit",
17+
"/game",
18+
]);
19+
20+
if (isLimited && restrictedPaths.has(pathname)) {
21+
return redirect("/home");
22+
}
723

824
if (!tokens?.accessToken) {
9-
const url = new URL(request.url);
10-
return redirect(`/?from=${url.pathname}`);
25+
return redirect(`/?from=${pathname}`);
1126
}
1227
}
1328

0 commit comments

Comments
 (0)