Skip to content

Commit 582cdba

Browse files
committed
fix: 모바일 만남 초대장 페이지 ui 수정
1 parent b13e327 commit 582cdba

File tree

8 files changed

+43
-17
lines changed

8 files changed

+43
-17
lines changed

apps/tuk-web/src/app/invite/gathering/[gatheringId]/src/components/InviteGathering.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import { ErrorBoundary } from 'react-error-boundary';
77
import InviteGatheringContent from '@/app/invite/gathering/[gatheringId]/src/components/InviteGatheringContent';
88
import InviteGatheringErrorFallback from '@/app/invite/gathering/[gatheringId]/src/components/InviteGatheringErrorFallback';
99
import InviteGatheringSkeleton from '@/app/invite/gathering/[gatheringId]/src/components/InviteGatheringSkeleton';
10-
import SkeletonGuard from '@/app/invite/meet/[meetId]/src/components/SkeletonGuard';
1110
import { BackgroundTemplate, Button } from '@/shared/components';
11+
import SkeletonGuard from '@/shared/components/SkeletonGuard';
1212
import { useParam } from '@/shared/hooks/useParam';
1313
import { cn } from '@/shared/lib';
1414

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
'use client';
2+
3+
import Image from 'next/image';
4+
5+
export default function Loading() {
6+
return (
7+
<div className="flex h-screen w-full items-center justify-center bg-white-default">
8+
<Image src="/logo.png" alt="App Logo" width={200} height={200} priority />
9+
</div>
10+
);
11+
}
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import InviteProposal from '@/app/invite/meet/[meetId]/src/components/InviteProposal';
2+
import SplashGate from '@/shared/components/SplashGate';
23

34
export default function InviteProposalPage() {
4-
return <InviteProposal />;
5+
return (
6+
<SplashGate minMs={1000} fadeMs={250} logoSrc="/logo.png" logoSize={200}>
7+
<InviteProposal />
8+
</SplashGate>
9+
);
510
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,23 @@ import { ErrorBoundary } from 'react-error-boundary';
77
import InviteProposalContent from '@/app/invite/meet/[meetId]/src/components/InviteProposalContent';
88
import InviteProposalErrorFallback from '@/app/invite/meet/[meetId]/src/components/InviteProposalErrorFallback';
99
import InviteProposalSkeleton from '@/app/invite/meet/[meetId]/src/components/InviteProposalSkeleton';
10-
import SkeletonGuard from '@/app/invite/meet/[meetId]/src/components/SkeletonGuard';
1110
import { BackgroundTemplate, Button } from '@/shared/components';
11+
import SkeletonGuard from '@/shared/components/SkeletonGuard';
1212
import { useParam } from '@/shared/hooks/useParam';
1313

1414
const InviteProposal = () => {
1515
const proposalId = Number(useParam('meetId'));
1616

1717
return (
1818
<BackgroundTemplate>
19-
<BackgroundTemplate.Main className="overflow-y-auto px-5">
20-
<BackgroundTemplate.Gradient />
19+
<BackgroundTemplate.Main className="px-5">
20+
<BackgroundTemplate.Gradient className="pointer-events-none" />
2121

2222
<QueryErrorResetBoundary>
2323
{({ reset }) => (
2424
<ErrorBoundary onReset={reset} FallbackComponent={InviteProposalErrorFallback}>
2525
<SkeletonGuard minMs={250} skeleton={<InviteProposalSkeleton />}>
26-
<Suspense fallback={<InviteProposalSkeleton />}>
26+
<Suspense fallback={null}>
2727
<InviteProposalContent />
2828
</Suspense>
2929
</SkeletonGuard>

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
CardFrame,
88
} from '@/app/proposal/[proposalId]/detail/components/GatheringProposalContent';
99
import AppInstallBanner from '@/shared/components/AppInstallBanner';
10+
import { useSplashGate } from '@/shared/components/SplashGate';
1011
import { useParam } from '@/shared/hooks/useParam';
1112
import { cn } from '@/shared/lib';
1213

@@ -16,6 +17,8 @@ const BANNER_RESHOW_MINUTES = 30;
1617
const InviteProposalContent = () => {
1718
const proposalId = Number(useParam('meetId'));
1819

20+
const { done: splashDone } = useSplashGate();
21+
1922
const [slideDown, setSlideDown] = useState(false);
2023

2124
const [showBanner, setShowBanner] = useState(false);
@@ -50,11 +53,11 @@ const InviteProposalContent = () => {
5053
}, []);
5154

5255
useEffect(() => {
53-
if (!isLoading && !isError) {
56+
if (splashDone && !isLoading && !isError) {
5457
const id = requestAnimationFrame(() => setSlideDown(true));
5558
return () => cancelAnimationFrame(id);
5659
}
57-
}, [isLoading, isError]);
60+
}, [splashDone, isLoading, isError]);
5861

5962
return (
6063
<>
@@ -63,7 +66,7 @@ const InviteProposalContent = () => {
6366
<h2
6467
className={cn(
6568
'serif-title-22-M font-bold text-gray-900',
66-
showBanner ? 'mt-[4.125rem]' : 'mt-[1.875rem]'
69+
showBanner ? 'mt-[calc(70px+env(safe-area-inset-top,0px))]' : 'mt-[1.875rem]'
6770
)}
6871
>
6972
보고 싶은 마음이
@@ -78,8 +81,8 @@ const InviteProposalContent = () => {
7881

7982
<div
8083
className={cn(
81-
'ease-outmotion-reduce:transition-none absolute bottom-[-100px] left-1/2 h-[421px] w-[408px] -translate-x-1/2 transition-transform duration-1000',
82-
slideDown ? 'translate-y-52' : 'translate-y-0'
84+
'ease-outmotion-reduce:transition-none absolute bottom-[-80px] left-1/2 h-[421px] w-[408px] -translate-x-1/2 transition-transform duration-1000',
85+
slideDown ? 'translate-y-56' : 'translate-y-0'
8386
)}
8487
style={{ willChange: 'transform', transitionDelay: '150ms' }}
8588
>

apps/tuk-web/src/app/proposal/[proposalId]/detail/components/GatheringProposal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { QueryErrorResetBoundary } from '@tanstack/react-query';
44
import React, { Suspense } from 'react';
55
import { ErrorBoundary } from 'react-error-boundary';
66

7-
import SkeletonGuard from '@/app/invite/meet/[meetId]/src/components/SkeletonGuard';
7+
import SkeletonGuard from '@/shared/components/SkeletonGuard';
88
import GatheringProposalContent from '@/app/proposal/[proposalId]/detail/components/GatheringProposalContent';
99
import GatheringProposalErrorFallback from '@/app/proposal/[proposalId]/detail/components/GatheringProposalErrorFallback';
1010
import GatheringProposalSkeleton from '@/app/proposal/[proposalId]/detail/components/GatheringProposalSkeleton';

apps/tuk-web/src/app/invite/meet/[meetId]/src/components/SkeletonGuard.tsx renamed to apps/tuk-web/src/shared/components/SkeletonGuard.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,12 @@ export default function SkeletonGuard({
2020

2121
return (
2222
<div className="relative">
23-
{/* 콘텐츠 영역 */}
2423
<div
2524
className={`transition-opacity duration-200 ${showSkeleton ? 'opacity-0' : 'opacity-100'}`}
2625
>
2726
{children}
2827
</div>
2928

30-
{/* 오버레이 스켈레톤: 최소 minMs 동안은 확실히 보이게 */}
3129
{showSkeleton && <div className="absolute inset-0">{skeleton}</div>}
3230
</div>
3331
);

apps/tuk-web/src/shared/components/SplashGate.tsx

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

33
import Image from 'next/image';
4-
import { useEffect, useState } from 'react';
4+
import { createContext, useContext, useEffect, useMemo, useState } from 'react';
55

66
import { cn } from '@/shared/lib';
77

@@ -13,6 +13,13 @@ type SplashGateProps = {
1313
children: React.ReactNode;
1414
};
1515

16+
type SplashGateContextValue = {
17+
done: boolean;
18+
};
19+
20+
const SplashGateContext = createContext<SplashGateContextValue>({ done: false });
21+
export const useSplashGate = () => useContext(SplashGateContext);
22+
1623
export default function SplashGate({
1724
minMs = 1000,
1825
fadeMs = 250,
@@ -38,8 +45,10 @@ export default function SplashGate({
3845
return () => clearTimeout(t);
3946
}, [minMs, fadeMs]);
4047

48+
const ctx = useMemo(() => ({ done: !show }), [show]);
49+
4150
return (
42-
<>
51+
<SplashGateContext.Provider value={ctx}>
4352
{children}
4453

4554
{show && (
@@ -55,6 +64,6 @@ export default function SplashGate({
5564
<Image src={logoSrc} alt="App Logo" width={logoSize} height={logoSize} priority />
5665
</div>
5766
)}
58-
</>
67+
</SplashGateContext.Provider>
5968
);
6069
}

0 commit comments

Comments
 (0)