Skip to content

Commit 2e9e16c

Browse files
committed
feat: refactor PodcastsClient and PodcastsHeader to remove dropdownConfig prop; enhance dropdown configuration handling
1 parent 4f266f9 commit 2e9e16c

File tree

5 files changed

+67
-68
lines changed

5 files changed

+67
-68
lines changed

src/app/podcasts/PodcastsClient.tsx

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,29 @@
11

22
"use client";
33

4+
import { DTOChannel, QueryParamChannels } from "podverse-helpers";
45
import React from "react";
56
import { PodcastsContextProvider } from "./PodcastsContext";
67
import MainWrapper from "../../components/MainWrapper/MainWrapper";
7-
import { DTOChannel, QueryParamChannels } from "podverse-helpers";
8-
import type { MenuItem } from "../../components/FilterDropdown/FilterDropdown";
98
import PodcastsHeader from "./PodcastsHeader";
109
import PodcastsList from "./PodcastsList";
1110

12-
interface DropdownConfig {
13-
typeMenuItems: MenuItem[];
14-
sortMenuItems: MenuItem[];
15-
rangeMenuItems: MenuItem[];
16-
showRangeDropdown: boolean;
17-
}
18-
1911
interface PodcastsClientProps {
2012
initialQueryParams: QueryParamChannels;
2113
ssrChannels: DTOChannel[];
2214
ssrTotalPages: number;
23-
dropdownConfig: DropdownConfig;
2415
}
2516

2617
export default function PodcastsClient(props: PodcastsClientProps) {
27-
const { initialQueryParams, ssrChannels, ssrTotalPages, dropdownConfig } = props;
18+
const { initialQueryParams, ssrChannels, ssrTotalPages } = props;
2819

2920
return (
3021
<PodcastsContextProvider
3122
initialQueryParams={initialQueryParams}
3223
ssrChannels={ssrChannels}
3324
ssrTotalPages={ssrTotalPages}
3425
>
35-
<PodcastsHeader dropdownConfig={dropdownConfig} />
26+
<PodcastsHeader />
3627
<MainWrapper>
3728
<PodcastsList />
3829
</MainWrapper>

src/app/podcasts/PodcastsContext.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import React, { createContext, useContext, useState, ReactNode } from "react";
66
import { apiRequestService } from "../../factories/apiRequestService";
77
import { useAccount } from "../../contexts/Account";
88
import { useSkipInitialEffect } from "../../hooks/useSkipInitialEffect";
9+
import { getCurrentSortAndRange } from "./PodcastsDropdownConfig";
910

1011
interface PodcastsContextType extends QueryParamChannels {
1112
setPage: (page: number) => void;
@@ -53,7 +54,8 @@ export const PodcastsContextProvider = ({ children, initialQueryParams, ssrChann
5354
}
5455

5556
setIsLoading(true);
56-
const channels = await apiRequestService.reqChannelGetMany({ page, type, sort, range, category });
57+
const { currentSort, currentRange } = getCurrentSortAndRange({ type, sort, range });
58+
const channels = await apiRequestService.reqChannelGetMany({ page, type, sort: currentSort, range: currentRange, category });
5759
setChannels(channels.data);
5860
setIsLoading(false);
5961
}
Lines changed: 52 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,65 @@
11
import { QueryParamsChannelsType, QueryParamsChannelsSort, QueryParamsStatsRange } from "podverse-helpers";
22

3-
export const typeDropdownMenuItems = [
4-
{ label: "All", param: "type", value: "all" },
5-
{ label: "Subscribed", param: "type", value: "subscribed" },
6-
{ label: "Category", param: "type", value: "category" }
7-
];
8-
9-
export const sortDropdownMenuItems = [
10-
{ label: "Recent", param: "sort", value: "recent" },
11-
{ label: "Oldest", param: "sort", value: "oldest" },
12-
{ label: "A - Z", param: "sort", value: "alphabetical" },
13-
{ label: "Top", param: "sort", value: "top" },
14-
];
15-
16-
export const rangeDropdownMenuItems = [
17-
{ label: "Day", param: "range", value: "day" },
18-
{ label: "Week", param: "range", value: "week" },
19-
{ label: "Month", param: "range", value: "month" },
20-
{ label: "All Time", param: "range", value: "all-time" },
21-
];
22-
23-
export function getDropdownConfig(type?: QueryParamsChannelsType, sort?: QueryParamsChannelsSort, range?: QueryParamsStatsRange) {
24-
let currentSort = sort;
25-
let currentRange = range;
3+
export function getDropdownConfig({ type, sort, tFilters }: {
4+
sort?: QueryParamsChannelsSort,
5+
type?: QueryParamsChannelsType,
6+
tFilters: (key: string) => string
7+
}) {
8+
const sortTop = { label: tFilters("sort.top"), param: "sort", value: "top" };
9+
10+
let typeDropdownMenuItems = [
11+
{ label: tFilters("type.all"), param: "type", value: "all" },
12+
{ label: tFilters("type.subscribed"), param: "type", value: "subscribed" },
13+
{ label: tFilters("type.category"), param: "type", value: "category" }
14+
];
15+
16+
let sortDropdownMenuItems = [
17+
{ label: tFilters("sort.recent"), param: "sort", value: "recent" },
18+
{ label: tFilters("sort.oldest"), param: "sort", value: "oldest" },
19+
{ label: tFilters("sort.a_z"), param: "sort", value: "alphabetical" },
20+
sortTop
21+
];
22+
23+
let rangeDropdownMenuItems = [
24+
{ label: tFilters("range.day"), param: "range", value: "day" },
25+
{ label: tFilters("range.week"), param: "range", value: "week" },
26+
{ label: tFilters("range.month"), param: "range", value: "month" },
27+
{ label: tFilters("range.all_time"), param: "range", value: "all-time" },
28+
];
29+
30+
if (type === "all" || type === "category") {
31+
sortDropdownMenuItems = [sortTop];
32+
}
33+
2634
let showRangeDropdown = false;
35+
if (sort === "top") {
36+
showRangeDropdown = true;
37+
}
2738

28-
let typeMenuItems = typeDropdownMenuItems;
29-
let sortMenuItems = sortDropdownMenuItems;
30-
let rangeMenuItems = rangeDropdownMenuItems;
39+
return {
40+
typeMenuItems: typeDropdownMenuItems,
41+
sortMenuItems: sortDropdownMenuItems,
42+
rangeMenuItems: rangeDropdownMenuItems,
43+
showRangeDropdown,
44+
};
45+
}
46+
47+
type QueryParamConfig = {
48+
type?: QueryParamsChannelsType;
49+
sort?: QueryParamsChannelsSort;
50+
range?: QueryParamsStatsRange;
51+
}
52+
53+
export function getCurrentSortAndRange({ type, sort, range }: QueryParamConfig) {
54+
let currentSort = sort;
55+
let currentRange = range;
3156

3257
if (type === "all" || type === "category") {
33-
sortMenuItems = [{ label: "Top", param: "sort", value: "top" }];
3458
currentSort = "top";
3559
currentRange = currentRange || "day";
3660
} else if (type === "subscribed") {
37-
sortMenuItems = sortDropdownMenuItems;
3861
currentSort = currentSort || "alphabetical";
3962
}
4063

41-
if (currentSort !== "top") {
42-
showRangeDropdown = false;
43-
rangeMenuItems = [];
44-
} else {
45-
showRangeDropdown = true;
46-
}
47-
48-
return { typeMenuItems, sortMenuItems, rangeMenuItems, currentSort, currentRange, showRangeDropdown };
64+
return { currentSort, currentRange };
4965
}

src/app/podcasts/PodcastsHeader.tsx

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,14 @@ import React from "react";
1313
import FilterDropdown from "../../components/FilterDropdown/FilterDropdown";
1414
import Header from "../../components/Header/Header";
1515
import { usePodcastsContext } from "./PodcastsContext";
16-
import type { MenuItem } from "../../components/FilterDropdown/FilterDropdown";
16+
import { getDropdownConfig } from "./PodcastsDropdownConfig";
1717

18-
interface DropdownConfig {
19-
typeMenuItems: MenuItem[];
20-
sortMenuItems: MenuItem[];
21-
rangeMenuItems: MenuItem[];
22-
showRangeDropdown: boolean;
23-
}
24-
25-
interface PodcastsHeaderProps {
26-
dropdownConfig: DropdownConfig;
27-
}
28-
29-
const PodcastsHeader: React.FC<PodcastsHeaderProps> = ({ dropdownConfig }) => {
18+
const PodcastsHeader: React.FC = () => {
3019
const { type, setType, sort, setSort, range, setRange } = usePodcastsContext();
3120
const tMedia = useTranslations('media');
32-
const { typeMenuItems, sortMenuItems, rangeMenuItems, showRangeDropdown } = dropdownConfig;
21+
const tFilters = useTranslations('filters');
22+
const { typeMenuItems, sortMenuItems, rangeMenuItems, showRangeDropdown
23+
} = getDropdownConfig({ type, sort, tFilters });
3324

3425
function isChannelType(val: string): val is QueryParamsChannelsType {
3526
return QUERY_PARAMS_CHANNELS_TYPE_VALUES.includes(val as QueryParamsChannelsType);

src/app/podcasts/page.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { CATEGORY_MAPPING_KEYS, QUERY_PARAMS_STATS_RANGE_VALUES, QUERY_PARAMS_CH
22
QUERY_PARAMS_CHANNELS_TYPE_VALUES, getTotalPages, QueryParamsChannelsType,
33
QueryParamsChannelsSort, QueryParamsStatsRange } from "podverse-helpers";
44
import { z } from "zod";
5-
import { getDropdownConfig } from "./PodcastsDropdownConfig";
5+
import { getCurrentSortAndRange, getDropdownConfig } from "./PodcastsDropdownConfig";
66
import PodcastsClient from "./PodcastsClient";
77
import { getSSRAuthService } from "../../utils/auth/ssrAuth";
88

@@ -26,16 +26,16 @@ export default async function Podcasts({ searchParams }: { searchParams?: Promis
2626
const params = searchParams ? await searchParams : {};
2727
const { page = 1, sort = defaultValueSort, type = defaultValueType, range = defaultValueRange,
2828
category } = await parseSearchParams(params, isValidAuthSession);
29-
30-
const { typeMenuItems, sortMenuItems, rangeMenuItems, currentSort, currentRange,
31-
showRangeDropdown } = getDropdownConfig(type, sort, range);
29+
30+
const { currentSort, currentRange } = getCurrentSortAndRange({ type, sort, range });
3231

3332
const response = await apiRequestService.reqChannelGetMany({
3433
page,
3534
sort: currentSort,
3635
type,
3736
range: currentRange
3837
});
38+
3939
const ssrChannels = response.data;
4040
const ssrTotalPages = getTotalPages(response.meta.count, response.meta.limit);
4141

@@ -44,7 +44,6 @@ export default async function Podcasts({ searchParams }: { searchParams?: Promis
4444
initialQueryParams={{ page, type, sort, range, category }}
4545
ssrChannels={ssrChannels}
4646
ssrTotalPages={ssrTotalPages}
47-
dropdownConfig={{ typeMenuItems, sortMenuItems, rangeMenuItems, showRangeDropdown }}
4847
/>
4948
);
5049
}

0 commit comments

Comments
 (0)