Skip to content

Commit 336b97a

Browse files
authored
Merge branch 'dev' into main
2 parents 8e6c51a + 72ed6e3 commit 336b97a

File tree

14 files changed

+57
-38
lines changed

14 files changed

+57
-38
lines changed

src/apis/instance.request.ts

+3-6
Original file line numberDiff line numberDiff line change
@@ -79,19 +79,16 @@ export const instance = async <I, R>(
7979
? AbortSignal.timeout(ABORT_MS)
8080
: abortPolyfill(ABORT_MS),
8181
credentials: 'include',
82+
cache: 'no-store',
8283
});
8384

8485
return (data.body as unknown as SuccessType<R>).data;
8586
} catch (err: unknown) {
8687
const context = err as Response;
87-
if (
88-
location &&
89-
!context.ok &&
90-
(context.status === 401 || context.status === 403)
91-
) {
88+
if (location && !context.ok && context.status === 403) {
9289
window.location.replace('/');
9390
}
94-
91+
//context.status === 401 ||
9592
setContext('Request', {
9693
path: context.url,
9794
status: context.status,

src/app/(with-tracker)/(auth-required)/layout.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { Header } from '@/components';
44
import { PATHS } from '@/constants';
55
import { me } from '@/apis';
66
import { getQueryClient } from '@/utils/queryUtil';
7+
import { Header } from '@/components';
78

89
interface IProp {
910
children: ReactElement;

src/app/(with-tracker)/(auth-required)/leaderboards/Content.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const data = [
1616

1717
export const Content = () => {
1818
const width = useResponsive();
19-
const { setSearchParams } = useSearchParam();
19+
const [, setSearchParams] = useSearchParam();
2020

2121
return (
2222
<div className="flex w-full h-full flex-col gap-[30px] overflow-auto items-center max-TBL:gap-5">

src/app/(with-tracker)/(auth-required)/main/Content.tsx

+15-18
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,23 @@
33
import { useInfiniteQuery, useQuery } from '@tanstack/react-query';
44
import { useEffect } from 'react';
55
import { useInView } from 'react-intersection-observer';
6-
import {
7-
Button,
8-
Dropdown,
9-
Section,
10-
Summary,
11-
Check,
12-
OptionType,
13-
} from '@/components';
6+
import { Button, Dropdown, Section, Summary, Check } from '@/components';
147
import { postList, postSummary } from '@/apis';
15-
import { PATHS } from '@/constants';
8+
import { PATHS, SORT_TYPE } from '@/constants';
169
import { useSearchParam } from '@/hooks/useSearchParam';
1710
import { trackUserEvent, MessageEnum } from '@/utils/trackUtil';
11+
import { SortKey, SortValue } from '@/types';
1812

19-
const sorts: Array<OptionType> = [
20-
['작성일순', ''],
21-
['조회순', 'dailyViewCount'],
22-
['좋아요순', 'dailyLikeCount'],
23-
];
13+
const sorts: Array<[SortKey, SortValue]> = Object.entries(SORT_TYPE) as Array<
14+
[SortKey, SortValue]
15+
>;
2416

2517
export const Content = () => {
26-
const { searchParams, setSearchParams } = useSearchParam();
18+
const [searchParams, setSearchParams] = useSearchParam<{
19+
asc: 'true' | 'false';
20+
sort: SortValue;
21+
}>();
22+
2723
const { ref, inView } = useInView();
2824

2925
const { data: posts, fetchNextPage } = useInfiniteQuery({
@@ -83,20 +79,21 @@ export const Content = () => {
8379
onChange={() => {
8480
trackUserEvent(MessageEnum.SORT_INTERACT_MAIN);
8581
setSearchParams({
86-
asc: `${!(searchParams.asc === 'true')}`,
82+
asc: searchParams.asc === 'true' ? 'false' : 'true',
8783
});
8884
}}
8985
checked={searchParams.asc === 'true'}
9086
label="오름차순"
9187
/>
9288
<Dropdown
9389
defaultValue={
94-
sorts.find((i) => i[1] === searchParams.sort) as OptionType
90+
sorts.find((i) => i[1] === searchParams.sort) ??
91+
SORT_TYPE['작성일순']
9592
}
9693
options={sorts}
9794
onChange={(data) => {
9895
trackUserEvent(MessageEnum.SORT_INTERACT_MAIN);
99-
setSearchParams({ sort: encodeURI(data as string) });
96+
setSearchParams({ sort: data as SortValue });
10097
}}
10198
/>
10299
</div>

src/app/(with-tracker)/(login)/Content.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import { useRouter } from 'next/navigation';
44
import { useForm } from 'react-hook-form';
55
import Image from 'next/image';
6-
import { useMutation } from '@tanstack/react-query';
6+
import { useMutation, useQueryClient } from '@tanstack/react-query';
77
import { Input, Button } from '@/components';
88
import { LoginVo } from '@/types';
99
import { login, sampleLogin } from '@/apis';
@@ -14,6 +14,7 @@ const responsiveStyle =
1414

1515
export const Content = () => {
1616
const { replace } = useRouter();
17+
const client = useQueryClient();
1718

1819
const {
1920
register,
@@ -22,6 +23,7 @@ export const Content = () => {
2223
} = useForm<LoginVo>({ mode: 'all' });
2324

2425
const onSuccess = () => {
26+
client.clear();
2527
trackUserEvent(MessageEnum.LOGIN);
2628
replace('/main?asc=false&sort=');
2729
};

src/components/auth-required/header/index.tsx

+7-2
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,13 @@ export const Header = () => {
3232
const path = usePathname();
3333
const router = useRouter();
3434
const width = useResponsive();
35-
const client = useQueryClient();
3635
const barWidth = width < SCREENS.MBI ? 65 : 180;
36+
const client = useQueryClient();
37+
38+
const { data: profiles } = useQuery({
39+
queryKey: [PATHS.ME],
40+
queryFn: me,
41+
});
3742

3843
const { mutate: out } = useMutation({
3944
mutationFn: logout,
@@ -45,7 +50,7 @@ export const Header = () => {
4550
queryKey: [PATHS.ME],
4651
queryFn: me,
4752
});
48-
53+
4954
useEffect(() => {
5055
const handleClickOutside = (e: MouseEvent) =>
5156
open &&

src/components/auth-required/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
export * from './header';
1+
export * from './/header';
22
export * from './main';
33
export * from './leaderboards';

src/constants/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ export * from './colors.constant';
33
export * from './sizes.constant';
44
export * from './paths.constant';
55
export * from './fonts.constant';
6+
export * from './searchParams.constant';
+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export const SORT_TYPE = {
2+
작성일순: '',
3+
조회순: 'dailyViewCount',
4+
좋아요순: 'dailyLikeCount',
5+
} as const;

src/hooks/useSearchParam.ts

+9-7
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,27 @@
11
import { useSearchParams, useRouter, usePathname } from 'next/navigation';
22

3-
export const useSearchParam = () => {
3+
export const useSearchParam = <T extends Record<string, string>>() => {
44
const router = useRouter();
55
const pathname = usePathname();
66
const _searchParams = useSearchParams();
77
const searchParams = new URLSearchParams(_searchParams.toString());
88

9-
const setNewParams = (newParams: Record<string, string>) => {
9+
const setNewParams = (newParams: Partial<T>) => {
1010
for (const [key, value] of Object.entries(newParams)) {
1111
if (value !== undefined && value !== null) searchParams.set(key, value);
1212
else searchParams.delete(key);
1313
}
1414
return searchParams.toString();
1515
};
1616

17-
const setSearchParams = (newParams: Record<string, string>) => {
17+
const setSearchParams = (
18+
newParams: Partial<T>,
19+
isReplace: boolean = false,
20+
) => {
21+
if (isReplace) router.replace(`${pathname}?${setNewParams(newParams)}`);
22+
1823
return router.push(`${pathname}?${setNewParams(newParams)}`);
1924
};
2025

21-
return {
22-
searchParams: Object.fromEntries(searchParams),
23-
setSearchParams,
24-
};
26+
return [Object.fromEntries(searchParams) as T, setSearchParams] as const;
2527
};

src/types/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export * from './dashboard.type';
22
export * from './user.type';
3+
export * from './searchParams.type';

src/types/searchParams.type.ts

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { SORT_TYPE } from '@/constants';
2+
3+
export type SortKey = '작성일순' | '조회순' | '좋아요순';
4+
export type SortValue = (typeof SORT_TYPE)[keyof typeof SORT_TYPE];
5+
6+
export type SortType = Record<SortKey, string>;

src/utils/queryUtil.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ import { toast } from 'react-toastify';
33

44
let localQueryClient: QueryClient | undefined;
55
const STALE_TIME = 1000 * 60 * 3;
6-
const GC_TIME = 1000 * 60 * 30;
6+
const GC_TIME = 1000;
77

88
const createQueryClient = () =>
99
new QueryClient({
1010
defaultOptions: {
1111
queries: {
1212
retry: 1,
13-
refetchOnWindowFocus: false,
13+
refetchOnWindowFocus: true,
14+
refetchOnMount: true,
1415
staleTime: STALE_TIME,
1516
gcTime: GC_TIME,
1617
},

src/utils/trackUtil.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export const trackUserEvent = (event: keyof typeof MessageEnum | number) => {
2828
instance('/event', {
2929
body: { eventType },
3030
method: 'POST',
31+
keepalive: true,
3132
});
3233
}
3334
};

0 commit comments

Comments
 (0)