Skip to content

Commit e8816b9

Browse files
committed
feat: refactor PodcastsContext, PodcastsHeader, and PodcastsList to consolidate queryParams handling
1 parent 7159735 commit e8816b9

File tree

3 files changed

+31
-36
lines changed

3 files changed

+31
-36
lines changed

src/app/podcasts/PodcastsContext.tsx

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
"use client";
22

3-
import { CategoryMappingKeys, DTOChannel, QueryParamChannels, QueryParamsChannelsSort,
4-
QueryParamsChannelsType, QueryParamsStatsRange } from "podverse-helpers";
3+
import { DTOChannel, QueryParamChannels } from "podverse-helpers";
54
import React, { createContext, useContext, useState, ReactNode } from "react";
65
import { apiRequestService } from "../../factories/apiRequestService";
76
import { useAccount } from "../../contexts/Account";
87
import { useSkipInitialEffect } from "../../hooks/useSkipInitialEffect";
98
import { getCurrentSortAndRange } from "./PodcastsDropdownConfig";
109

11-
interface PodcastsContextType extends QueryParamChannels {
12-
setPage: (page: number) => void;
13-
setType: (type: QueryParamsChannelsType) => void;
14-
setSort: (sort: QueryParamsChannelsSort) => void;
15-
setRange: (range: QueryParamsStatsRange) => void;
16-
setCategory: (category: CategoryMappingKeys | undefined) => void;
10+
interface PodcastsContextType {
11+
queryParams: QueryParamChannels;
12+
setQueryParams: (params: QueryParamChannels) => void;
1713
channels: DTOChannel[];
1814
setChannels: (channels: DTOChannel[]) => void;
1915
totalPages: number;
@@ -32,11 +28,7 @@ export const PodcastsContextProvider = ({ children, initialQueryParams, ssrChann
3228
ssrChannels: DTOChannel[],
3329
ssrTotalPages: number
3430
}) => {
35-
const [page, setPage] = useState(initialQueryParams.page);
36-
const [type, setType] = useState(initialQueryParams.type);
37-
const [sort, setSort] = useState(initialQueryParams.sort);
38-
const [range, setRange] = useState(initialQueryParams.range);
39-
const [category, setCategory] = useState<string | undefined>(initialQueryParams.category);
31+
const [queryParams, setQueryParams] = useState<QueryParamChannels>(initialQueryParams);
4032
const [channels, setChannels] = useState<DTOChannel[]>(ssrChannels || []);
4133
const [totalPages, setTotalPages] = useState<number>(ssrTotalPages || 1);
4234
const [isLoading, setIsLoading] = useState<boolean>(false);
@@ -45,31 +37,28 @@ export const PodcastsContextProvider = ({ children, initialQueryParams, ssrChann
4537

4638
useSkipInitialEffect(() => {
4739
async function fetchChannels() {
48-
if (type === "subscribed") {
40+
if (queryParams.type === "subscribed") {
4941
if (!loggedInAccount) {
5042
setChannels([]);
5143
setShowSubscribeMessage(true);
5244
return;
5345
}
5446
}
55-
47+
5648
setShowSubscribeMessage(false);
5749
setIsLoading(true);
58-
const { currentSort, currentRange } = getCurrentSortAndRange({ type, sort, range });
59-
const channels = await apiRequestService.reqChannelGetMany({ page, type, sort: currentSort, range: currentRange, category });
50+
const { currentSort, currentRange } = getCurrentSortAndRange({ type: queryParams.type, sort: queryParams.sort, range: queryParams.range });
51+
const channels = await apiRequestService.reqChannelGetMany({ ...queryParams, sort: currentSort, range: currentRange });
6052
setChannels(channels.data);
6153
setIsLoading(false);
6254
}
6355
fetchChannels();
64-
}, [page, type, sort, range, category])
56+
}, [queryParams, loggedInAccount]);
6557

6658
return (
6759
<PodcastsContext.Provider value={{
68-
page, setPage,
69-
type, setType,
70-
sort, setSort,
71-
range, setRange,
72-
category, setCategory,
60+
queryParams,
61+
setQueryParams,
7362
channels, setChannels,
7463
totalPages, setTotalPages,
7564
isLoading, setIsLoading,

src/app/podcasts/PodcastsHeader.tsx

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ import { usePodcastsContext } from "./PodcastsContext";
1616
import { getDropdownConfig } from "./PodcastsDropdownConfig";
1717

1818
const PodcastsHeader: React.FC = () => {
19-
const { type, setType, sort, setSort, range, setRange } = usePodcastsContext();
19+
const { queryParams, setQueryParams } = usePodcastsContext();
20+
const { type, sort, range } = queryParams;
2021
const tMedia = useTranslations('media');
2122
const tFilters = useTranslations('filters');
2223
const { typeMenuItems, sortMenuItems, rangeMenuItems, showRangeDropdown
@@ -40,19 +41,23 @@ const PodcastsHeader: React.FC = () => {
4041
key="type"
4142
value={type ?? ""}
4243
menuItems={typeMenuItems}
43-
onChange={v => {
44-
if (isChannelType(v)) {
45-
setType(v);
44+
onChange={value => {
45+
if (isChannelType(value)) {
46+
if (value === "all" || value === "category") {
47+
setQueryParams({ ...queryParams, type: value, sort: "top" });
48+
} else {
49+
setQueryParams({ ...queryParams, type: value });
50+
}
4651
}
4752
}}
4853
/>,
4954
<FilterDropdown
5055
key="sort"
5156
value={sort ?? ""}
5257
menuItems={sortMenuItems}
53-
onChange={v => {
54-
if (isChannelSort(v)) {
55-
setSort(v);
58+
onChange={value => {
59+
if (isChannelSort(value)) {
60+
setQueryParams({ ...queryParams, sort: value });
5661
}
5762
}}
5863
/>,
@@ -61,9 +66,9 @@ const PodcastsHeader: React.FC = () => {
6166
key="range"
6267
value={range ?? ""}
6368
menuItems={rangeMenuItems}
64-
onChange={v => {
65-
if (isStatsRange(v)) {
66-
setRange(v);
69+
onChange={value => {
70+
if (isStatsRange(value)) {
71+
setQueryParams({ ...queryParams, range: value });
6772
}
6873
}}
6974
/>

src/app/podcasts/PodcastsList.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ import { usePodcastsContext } from "./PodcastsContext";
44
import LoadingSpinnerOverlay from "../../components/LoadingSpinner/LoadingSpinnerOverlay";
55

66
const PodcastsList: React.FC = () => {
7-
const { page = 1, setPage, channels, totalPages, isLoading, showSubscribeMessage } = usePodcastsContext();
8-
7+
const { queryParams, setQueryParams, channels, totalPages, isLoading, showSubscribeMessage } = usePodcastsContext();
8+
const { page = 1 } = queryParams;
9+
910
return (
1011
<>
1112
<ChannelList
1213
page={page}
13-
setPage={setPage}
14+
setPage={(page) => setQueryParams({ ...queryParams, page })}
1415
channels={channels}
1516
totalPages={totalPages}
1617
showSubscribeMessage={showSubscribeMessage}

0 commit comments

Comments
 (0)