Skip to content

Commit b711258

Browse files
authored
Merge pull request #91 from dnd-side-project/v2.0.0
v2
2 parents b85ffeb + 1592423 commit b711258

File tree

24 files changed

+479
-198
lines changed

24 files changed

+479
-198
lines changed

package.json

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@
1212
"make-sprite": "rm public/sprite/sprite.svg && svgstore -o public/sprite/sprite.svg public/sprite/icons/**/*.svg"
1313
},
1414
"dependencies": {
15+
"@notionhq/client": "^3.1.3",
1516
"@suspensive/react": "^1.13.0",
1617
"@suspensive/react-query": "^1.13.0",
1718
"@tanstack/react-query": "^4.32.6",
1819
"axios": "^1.4.0",
1920
"clsx": "^2.0.0",
21+
"dotenv": "^16.5.0",
2022
"es-toolkit": "^1.15.1",
2123
"eslint": "^8.46.0",
2224
"eslint-config-next": "^13.4.12",
@@ -54,5 +56,18 @@
5456
"prettier-plugin-tailwindcss": "^0.4.1",
5557
"svgstore-cli": "^2.0.1",
5658
"tailwindcss": "^3.3.3"
57-
}
59+
},
60+
"description": "<img align=\"left\" width=\"170\" src=\"https://github.com/pose-picker/.github/assets/75469131/012da976-4d52-45e9-abfc-fdd700b927be\" />",
61+
"main": ".eslintrc.js",
62+
"repository": {
63+
"type": "git",
64+
"url": "git+https://github.com/dnd-side-project/dnd-9th-5-frontend.git"
65+
},
66+
"keywords": [],
67+
"author": "",
68+
"license": "ISC",
69+
"bugs": {
70+
"url": "https://github.com/dnd-side-project/dnd-9th-5-frontend/issues"
71+
},
72+
"homepage": "https://github.com/dnd-side-project/dnd-9th-5-frontend#readme"
5873
}

src/apis/apis.ts

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,12 @@ import {
44
PoseDetailResponse,
55
PoseFeedContents,
66
PoseFeedResponse,
7-
PosePickResponse,
8-
PoseTalkResponse,
97
RegisterResponse,
108
} from '.';
119
import privateApi from './config/privateApi';
1210
import publicApi from './config/publicApi';
1311
import { KAKAO_REDIRECT_URI } from '@/constants';
1412

15-
export const getPosePick = (peopleCount: number) =>
16-
publicApi.get<PosePickResponse>(`/pose/pick/${peopleCount}`);
17-
18-
export const getPoseDetail = (poseId: number) =>
19-
privateApi.get<PoseDetailResponse>(`/pose/${poseId}`);
20-
21-
export const getPoseTalk = () => publicApi.get<PoseTalkResponse>('/pose/talk');
22-
23-
export const getPoseFeed = async (
24-
peopleCount: number,
25-
frameCount: number,
26-
tags: string,
27-
pageNumber: number
28-
) =>
29-
await privateApi.get<PoseFeedResponse>(`/pose`, {
30-
params: {
31-
frameCount,
32-
pageNumber,
33-
peopleCount,
34-
tags,
35-
},
36-
});
37-
3813
export const getFilterTag = () => publicApi.get<FilterTagsResponse>('/pose/tags');
3914

4015
export const getRegister = (code: string) =>

src/apis/queries.ts

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -8,56 +8,11 @@ import {
88
import {
99
FilterTagsResponse,
1010
MyposeCountResponse,
11-
PoseDetailResponse,
1211
PoseFeedContents,
13-
PoseFeedResponse,
14-
PosePickResponse,
15-
PoseTalkResponse,
1612
getBookmarkFeed,
1713
getFilterTag,
1814
getMyposeCount,
19-
getPoseDetail,
20-
getPoseFeed,
21-
getPosePick,
22-
getPoseTalk,
2315
} from '.';
24-
import { FilterState } from '@/hooks/useFilterState';
25-
26-
export const usePoseDetailQuery = (
27-
{ poseId }: { poseId: number },
28-
options?: UseQueryOptions<PoseDetailResponse>
29-
) => useQuery<PoseDetailResponse>(['poseId', poseId], () => getPoseDetail(poseId), options);
30-
31-
export const usePosePickQuery = (
32-
peopleCount: number,
33-
options?: UseQueryOptions<PosePickResponse>
34-
) =>
35-
useSuspenseQuery<PosePickResponse>(['posePick', peopleCount], () => getPosePick(peopleCount), {
36-
enabled: false,
37-
...options,
38-
});
39-
40-
export const usePoseTalkQuery = (options?: UseQueryOptions<PoseTalkResponse>) =>
41-
useSuspenseQuery<PoseTalkResponse>(['poseTalk'], getPoseTalk, { enabled: false, ...options });
42-
43-
export const usePoseFeedQuery = (
44-
{ peopleCount, frameCount, tags }: FilterState,
45-
options?: UseInfiniteQueryOptions<PoseFeedResponse>
46-
) => {
47-
return useSuspenseInfiniteQuery<PoseFeedResponse>(
48-
['poseFeed', peopleCount, frameCount, tags],
49-
({ pageParam = 0 }) => getPoseFeed(peopleCount, frameCount, tags.join(','), pageParam),
50-
{
51-
getNextPageParam: (lastPage) => {
52-
const target = lastPage.recommendation
53-
? lastPage.recommendedContents
54-
: lastPage.filteredContents;
55-
return target.last ? undefined : target.number + 1;
56-
},
57-
...options,
58-
}
59-
);
60-
};
6116

6217
export const useBookmarkFeedQuery = (options?: UseInfiniteQueryOptions<PoseFeedContents>) =>
6318
useSuspenseInfiniteQuery<PoseFeedContents>(

src/apis/type.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,6 @@ export interface PoseDetailResponse {
6363
poseInfo: PoseInfo;
6464
}
6565

66-
export interface PoseTalkResponse {
67-
poseWord: {
68-
content: string;
69-
createdAt: string;
70-
updateAt: string;
71-
wordId: number;
72-
};
73-
}
74-
7566
// 로그인
7667
export interface RegisterResponse {
7768
id: number;

src/app/(Main)/feed/FeedContent.tsx

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,37 @@
1+
'use client';
2+
13
import Link from 'next/link';
24

3-
import { usePoseFeedQuery } from '@/apis';
45
import { PrimaryButton } from '@/components/Button';
56
import EmptyCase from '@/components/Feed/EmptyCase';
67
import FeedSection from '@/components/Feed/FeedSection';
78
import { URL } from '@/constants';
89
import { useFilterState } from '@/hooks';
10+
import { useEffect, useState } from 'react';
11+
import { PoseFeedResponseI } from '@/server/type';
12+
import { getPoseFeed } from '@/server/api';
913

1014
export default function FeedContent() {
1115
const { filterState } = useFilterState();
12-
const query = usePoseFeedQuery(filterState);
16+
// const query = usePoseFeedQuery(filterState);
17+
const [data, setData] = useState<PoseFeedResponseI | null>(null);
18+
19+
async function fetchPoseFeed() {
20+
const res = await getPoseFeed(
21+
filterState.peopleCount,
22+
filterState.frameCount,
23+
filterState.tags.join(',')
24+
);
25+
setData(res.data);
26+
}
27+
28+
useEffect(() => {
29+
fetchPoseFeed();
30+
// eslint-disable-next-line react-hooks/exhaustive-deps
31+
}, [filterState]);
1332

1433
return (
15-
<FeedSection query={query}>
34+
<FeedSection data={data}>
1635
<EmptyCase
1736
title={'신비한 포즈를 찾으시는군요!'}
1837
text={'찾고 싶은 포즈를 저희에게 알려주세요.'}

src/app/(Main)/feed/FilterSheet.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { FRAME_COUNT_LIST, PEOPLE_COUNT_LIST } from '@/constants';
1010
import { useBottomSheet, useFilterState } from '@/hooks';
1111

1212
export default function FilterSheet() {
13-
const { data: tagListData } = useFilterTagQuery();
13+
// const { data: tagListData } = useFilterTagQuery();
1414

1515
const { filterState, updateFilterState } = useFilterState();
1616
const { isBottomSheetOpen, closeBottomSheet } = useBottomSheet();
@@ -59,7 +59,7 @@ export default function FilterSheet() {
5959
</div>
6060
<SelectionBasic data={FRAME_COUNT_LIST} state={frameState} setState={setFrameState} />
6161
</section>
62-
<section>
62+
{/* <section>
6363
<div id="subtitle-2" className="mb-8 text-secondary">
6464
태그
6565
</div>
@@ -70,7 +70,7 @@ export default function FilterSheet() {
7070
setState={setTagState}
7171
/>
7272
)}
73-
</section>
73+
</section> */}
7474
</div>
7575
<div className="flex gap-8 px-20 pb-20">
7676
<PrimaryButton

src/app/(Main)/mypose/bookmark/BookmarkSecion.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ import { getClientCookie } from '@/utils';
88

99
export default function BookmarkSecion() {
1010
const accesstoken = getClientCookie(COOKIE_ACCESS_TOKEN);
11-
const query = useBookmarkFeedQuery({ enabled: accesstoken !== '' });
11+
// const query = useBookmarkFeedQuery({ enabled: accesstoken !== '' });
1212

1313
return (
14-
<FeedSection query={query}>
14+
<FeedSection data={null}>
1515
<BookmarkEmpty />
1616
</FeedSection>
1717
);

src/app/(Main)/pick/PickComponent.tsx

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,31 @@ import Lottie from 'react-lottie-player';
66

77
import lottiePick from '#/lotties/pick.json';
88
import { MainFooter } from '../MainFooter';
9-
import { usePosePickQuery } from '@/apis';
109
import { PrimaryButton } from '@/components/Button';
1110
import PoseImage from '@/components/Modal/PoseImage';
1211
import { SelectionBasic } from '@/components/Selection';
1312
import { PEOPLE_COUNT_LIST } from '@/constants';
1413
import { useDidMount } from '@/hooks';
14+
import { getPosePick } from '@/server/api';
1515

16-
const DEFAULT_IMAGE = '/images/image-frame.png';
16+
const DEFAULT_IMAGE = '/images/image-frame.png' as const;
1717

1818
export default function PickComponent() {
1919
const [countState, setCountState] = useState(1);
20+
const [isLoading, setisLoading] = useState(false);
2021
const [isLottiePlaying, setIsLottiePlaying] = useState(true);
21-
const { refetch, data } = usePosePickQuery(countState);
22-
const imageSrc = data?.poseInfo?.imageKey || DEFAULT_IMAGE;
22+
const [imageSrc, setImageSrc] = useState<string>(DEFAULT_IMAGE);
2323

2424
useDidMount(async () => {
2525
await delay(2200);
2626
setIsLottiePlaying(false);
2727
});
2828

2929
const handlePickClick = async () => {
30-
refetch();
30+
setisLoading(true);
3131
setIsLottiePlaying(true);
32-
await delay(900);
32+
const imageUrl = (await getPosePick(countState)).data.imageUrl;
33+
setImageSrc(imageUrl);
3334
setIsLottiePlaying(false);
3435
};
3536

@@ -43,13 +44,13 @@ export default function PickComponent() {
4344
/>
4445
</div>
4546
<div className="relative flex grow">
46-
{isLottiePlaying && (
47+
{(isLottiePlaying || isLoading) && (
4748
<div className="absolute inset-x-0 inset-y-0 z-10 flex justify-center bg-black">
4849
<Lottie animationData={lottiePick} play />
4950
</div>
5051
)}
5152
<div className="absolute inset-x-0 inset-y-0 bg-black">
52-
<PoseImage src={imageSrc} />
53+
<PoseImage src={imageSrc} onLoad={() => setisLoading(false)} />
5354
</div>
5455
</div>
5556
<MainFooter>

src/app/(Main)/talk/TalkSection.tsx

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
'use client';
22

3-
import { delay } from 'es-toolkit';
43
import { useState } from 'react';
54
import Lottie from 'react-lottie-player';
65

76
import lottieTalkAfterClick from '#/lotties/talk_after_click.json';
87
import lottieTalkBeforeClick from '#/lotties/talk_before_click.json';
98
import { MainFooter } from '../MainFooter';
10-
import { usePoseTalkQuery } from '@/apis';
119
import { PrimaryButton } from '@/components/Button';
1210
import { Spacing } from '@/components/Spacing';
11+
import { getPoseTalk } from '@/server/api';
1312

1413
const INITIAL_TALK_WORD = `제시어에 맞춰\n포즈를 취해요!`;
1514

@@ -18,22 +17,16 @@ export default function TalkWordSection() {
1817
const [isLoading, setIsLoading] = useState(true);
1918
const isWordLoaded = talkWord !== INITIAL_TALK_WORD;
2019

21-
const { refetch } = usePoseTalkQuery({
22-
onSuccess: async (data) => {
23-
await delay(1000);
24-
setTalkWord(data.poseWord.content);
25-
setIsLoading(false);
26-
},
27-
});
28-
29-
const handleTalkClick = () => {
20+
const handleTalkClick = async () => {
3021
setIsLoading(true);
31-
refetch();
22+
const keyword = (await getPoseTalk()).data.keyword;
23+
setTalkWord(keyword);
24+
setIsLoading(false);
3225
};
3326

3427
return (
3528
<section className="flex flex-col items-center">
36-
<h1 className="max-w-310 h-100 items-center break-keep text-center">{talkWord}</h1>
29+
<h1 className="h-100 max-w-310 items-center break-keep text-center">{talkWord}</h1>
3730

3831
<Spacing size={10} />
3932

src/app/(Sub)/auth/AuthComponent.tsx

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,23 @@ export default function AuthComponent({ code }: AuthComponentProps) {
1515
const router = useRouter();
1616

1717
useDidMount(async () => {
18-
try {
19-
const {
20-
token: { accessToken },
21-
email,
22-
nickname,
23-
} = await getRegister(code);
24-
25-
setClientCookie(COOKIE_ACCESS_TOKEN, accessToken);
26-
setClientCookie(COOKIE_EMAIL, email);
27-
setClientCookie(COOKIE_NICKNAME, nickname);
28-
29-
alert(`로그인에 성공했어요!`);
30-
router.push('/');
31-
} catch (error) {
32-
router.push('/');
33-
}
18+
// try {
19+
// const {
20+
// token: { accessToken },
21+
// email,
22+
// nickname,
23+
// } = await getRegister(code);
24+
25+
// setClientCookie(COOKIE_ACCESS_TOKEN, accessToken);
26+
// setClientCookie(COOKIE_EMAIL, email);
27+
// setClientCookie(COOKIE_NICKNAME, nickname);
28+
29+
// alert(`로그인에 성공했어요!`);
30+
// router.push('/');
31+
// } catch (error) {
32+
// router.push('/');
33+
// }
34+
alert('로그인 기능은 준비중이에요');
3435
});
3536

3637
return null;

0 commit comments

Comments
 (0)