Skip to content

Commit a8c530d

Browse files
committed
feat: 타이틀 SSR 제거
1 parent 5bbbfeb commit a8c530d

File tree

2 files changed

+46
-47
lines changed

2 files changed

+46
-47
lines changed

apps/tuk-web/src/app/invite/meet/[meetId]/src/components/InviteProposal.tsx

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use client';
22

33
import { QueryErrorResetBoundary } from '@tanstack/react-query';
4-
import { Suspense, useEffect, useState } from 'react';
4+
import { Suspense } from 'react';
55
import { ErrorBoundary } from 'react-error-boundary';
66

77
import GradientBackground from '@/app/invite/meet/[meetId]/src/components/GradientBackground';
@@ -10,52 +10,12 @@ import InviteProposalErrorFallback from '@/app/invite/meet/[meetId]/src/componen
1010
import InviteProposalSkeleton from '@/app/invite/meet/[meetId]/src/components/InviteProposalSkeleton';
1111
import SkeletonGuard from '@/app/invite/meet/[meetId]/src/components/SkeletonGuard';
1212
import { Button } from '@/shared/components';
13-
import AppInstallBanner from '@/shared/components/AppInstallBanner';
14-
import { cn } from '@/shared/lib';
15-
16-
const BANNER_KEY = 'invite-banner-dismissed-at';
17-
const BANNER_RESHOW_MINUTES = 30;
1813

1914
const InviteProposal = () => {
20-
const [showBanner, setShowBanner] = useState(false);
21-
22-
const handleCloseBanner = () => {
23-
localStorage.setItem(BANNER_KEY, Date.now().toString());
24-
setShowBanner(false);
25-
};
26-
27-
useEffect(() => {
28-
const dismissedAt = localStorage.getItem(BANNER_KEY);
29-
const now = Date.now();
30-
31-
if (!dismissedAt) {
32-
setShowBanner(true);
33-
} else {
34-
const dismissedTime = parseInt(dismissedAt, 10);
35-
const thirtyMinutes = BANNER_RESHOW_MINUTES * 60 * 1000;
36-
if (now - dismissedTime > thirtyMinutes) {
37-
setShowBanner(true);
38-
}
39-
}
40-
}, []);
41-
4215
return (
4316
<div className="relative w-full overflow-y-auto overflow-x-hidden bg-gradient-to-b from-white-default to-[#DCC8F8] px-5">
4417
<GradientBackground />
4518

46-
{showBanner && <AppInstallBanner onClose={handleCloseBanner} />}
47-
48-
<h2
49-
className={cn(
50-
'serif-title-22-M font-bold text-gray-900',
51-
showBanner ? 'mt-[6.875rem]' : 'mt-[1.875rem]'
52-
)}
53-
>
54-
보고 싶은 마음이
55-
<br />
56-
도착했어요
57-
</h2>
58-
5919
<QueryErrorResetBoundary>
6020
{({ reset }) => (
6121
<ErrorBoundary onReset={reset} FallbackComponent={InviteProposalErrorFallback}>

apps/tuk-web/src/app/invite/meet/[meetId]/src/components/InviteProposalContent.tsx

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,74 @@
11
import { useSuspenseQuery } from '@tanstack/react-query';
2-
import React, { useEffect, useState } from 'react';
2+
import { useEffect, useState } from 'react';
33

44
import { InviteCard } from '@/app/invite/meet/[meetId]/src/components/InviteProposal';
55
import { proposalAPIService } from '@/app/invite/meet/[meetId]/src/service';
6+
import AppInstallBanner from '@/shared/components/AppInstallBanner';
67
import InviteCardFrame from '@/shared/components/InviteCardFrame';
78
import { useParam } from '@/shared/hooks/useParam';
9+
import { cn } from '@/shared/lib';
10+
11+
const BANNER_KEY = 'invite-banner-dismissed-at';
12+
const BANNER_RESHOW_MINUTES = 30;
813

914
const InviteProposalContent = () => {
1015
const proposalId = Number(useParam('meetId'));
1116

1217
const [animateCardIn, setAnimateCardIn] = useState(false);
1318

19+
const [showBanner, setShowBanner] = useState(false);
20+
1421
const { data: proposalDetail } = useSuspenseQuery({
1522
queryKey: ['getProposalDetail', proposalId],
1623
queryFn: () => proposalAPIService.getProposalDetail(proposalId),
1724
});
1825

26+
const handleCloseBanner = () => {
27+
localStorage.setItem(BANNER_KEY, Date.now().toString());
28+
setShowBanner(false);
29+
};
30+
1931
useEffect(() => {
32+
const dismissedAt = localStorage.getItem(BANNER_KEY);
33+
const now = Date.now();
34+
35+
if (!dismissedAt) {
36+
setShowBanner(true);
37+
} else {
38+
const dismissedTime = parseInt(dismissedAt, 10);
39+
const thirtyMinutes = BANNER_RESHOW_MINUTES * 60 * 1000;
40+
if (now - dismissedTime > thirtyMinutes) {
41+
setShowBanner(true);
42+
}
43+
}
2044
const timeout = setTimeout(() => setAnimateCardIn(true), 100);
2145

2246
return () => clearTimeout(timeout);
2347
}, []);
2448

2549
return (
26-
<div className="relative mt-12 flex justify-center">
27-
<InviteCardFrame proposal={proposalDetail.data} animateCardIn={animateCardIn} />
50+
<>
51+
{showBanner && <AppInstallBanner onClose={handleCloseBanner} />}
52+
53+
<h2
54+
className={cn(
55+
'serif-title-22-M font-bold text-gray-900',
56+
showBanner ? 'mt-[6.875rem]' : 'mt-[1.875rem]'
57+
)}
58+
>
59+
보고 싶은 마음이
60+
<br />
61+
도착했어요
62+
</h2>
63+
64+
<div className="relative mt-12 flex justify-center">
65+
<InviteCardFrame proposal={proposalDetail.data} animateCardIn={animateCardIn} />
2866

29-
<div className="absolute left-1/2 top-12 -translate-x-1/2">
30-
<InviteCard />
67+
<div className="absolute left-1/2 top-12 -translate-x-1/2">
68+
<InviteCard />
69+
</div>
3170
</div>
32-
</div>
71+
</>
3372
);
3473
};
3574

0 commit comments

Comments
 (0)