Use null handling instead

This commit is contained in:
JC Gurango 2023-07-04 16:28:19 +08:00
parent e815f433f6
commit ff2ca4d038
2 changed files with 34 additions and 42 deletions

View file

@ -114,7 +114,7 @@ interface HomeState {
} }
interface HomeProps { interface HomeProps {
listingType: ListingType; listingType?: ListingType;
dataType: DataType; dataType: DataType;
sort: SortType; sort: SortType;
page: number; page: number;
@ -126,8 +126,8 @@ type HomeData = RouteDataResponse<{
trendingCommunitiesRes: ListCommunitiesResponse; trendingCommunitiesRes: ListCommunitiesResponse;
}>; }>;
function getRss(listingType: ListingType, site: GetSiteResponse) { function getRss(listingType: ListingType) {
const { sort } = getHomeQueryParams(site); const { sort } = getHomeQueryParams();
const auth = myAuth(); const auth = myAuth();
let rss: string | undefined = undefined; let rss: string | undefined = undefined;
@ -163,19 +163,12 @@ function getDataTypeFromQuery(type?: string): DataType {
return type ? DataType[type] : DataType.Post; return type ? DataType[type] : DataType.Post;
} }
function getListingTypeFromQuery( function getListingTypeFromQuery(type?: string): ListingType | undefined {
type?: string,
site?: GetSiteResponse
): ListingType {
const myListingType = const myListingType =
UserService.Instance.myUserInfo?.local_user_view?.local_user UserService.Instance.myUserInfo?.local_user_view?.local_user
?.default_listing_type; ?.default_listing_type;
return ( return type ? (type as ListingType) : myListingType;
(type ? (type as ListingType) : myListingType) ??
site?.site_view.local_site.default_post_listing_type ??
"Local"
);
} }
function getSortTypeFromQuery(type?: string): SortType { function getSortTypeFromQuery(type?: string): SortType {
@ -186,16 +179,13 @@ function getSortTypeFromQuery(type?: string): SortType {
return (type ? (type as SortType) : mySortType) ?? "Active"; return (type ? (type as SortType) : mySortType) ?? "Active";
} }
const getHomeQueryParams = (site: GetSiteResponse) => const getHomeQueryParams = () =>
getQueryParams<HomeProps>( getQueryParams<HomeProps>({
{ sort: getSortTypeFromQuery,
sort: getSortTypeFromQuery, listingType: getListingTypeFromQuery,
listingType: getListingTypeFromQuery, page: getPageFromString,
page: getPageFromString, dataType: getDataTypeFromQuery,
dataType: getDataTypeFromQuery, });
},
site
);
const MobileButton = ({ const MobileButton = ({
textKey, textKey,
@ -324,7 +314,9 @@ export class Home extends Component<any, HomeState> {
site, site,
}: InitialFetchRequest<QueryParams<HomeProps>>): Promise<HomeData> { }: InitialFetchRequest<QueryParams<HomeProps>>): Promise<HomeData> {
const dataType = getDataTypeFromQuery(urlDataType); const dataType = getDataTypeFromQuery(urlDataType);
const type_ = getListingTypeFromQuery(listingType, site); const type_ =
getListingTypeFromQuery(listingType) ??
site.site_view.local_site.default_post_listing_type;
const sort = getSortTypeFromQuery(urlSort); const sort = getSortTypeFromQuery(urlSort);
const page = urlPage ? Number(urlPage) : 1; const page = urlPage ? Number(urlPage) : 1;
@ -630,7 +622,7 @@ export class Home extends Component<any, HomeState> {
listingType: urlListingType, listingType: urlListingType,
page: urlPage, page: urlPage,
sort: urlSort, sort: urlSort,
} = getHomeQueryParams(this.state.siteRes); } = getHomeQueryParams();
const queryParams: QueryParams<HomeProps> = { const queryParams: QueryParams<HomeProps> = {
dataType: getDataTypeString(dataType ?? urlDataType), dataType: getDataTypeString(dataType ?? urlDataType),
@ -653,7 +645,7 @@ export class Home extends Component<any, HomeState> {
} }
get posts() { get posts() {
const { page } = getHomeQueryParams(this.state.siteRes); const { page } = getHomeQueryParams();
return ( return (
<div className="main-content-wrapper"> <div className="main-content-wrapper">
@ -667,7 +659,7 @@ export class Home extends Component<any, HomeState> {
} }
get listings() { get listings() {
const { dataType } = getHomeQueryParams(this.state.siteRes); const { dataType } = getHomeQueryParams();
const siteRes = this.state.siteRes; const siteRes = this.state.siteRes;
if (dataType === DataType.Post) { if (dataType === DataType.Post) {
@ -758,9 +750,7 @@ export class Home extends Component<any, HomeState> {
} }
get selects() { get selects() {
const { listingType, dataType, sort } = getHomeQueryParams( const { listingType, dataType, sort } = getHomeQueryParams();
this.state.siteRes
);
return ( return (
<div className="row align-items-center mb-3 g-3"> <div className="row align-items-center mb-3 g-3">
@ -772,7 +762,10 @@ export class Home extends Component<any, HomeState> {
</div> </div>
<div className="col-auto"> <div className="col-auto">
<ListingTypeSelect <ListingTypeSelect
type_={listingType} type_={
listingType ??
this.state.siteRes.site_view.local_site.default_post_listing_type
}
showLocal={showLocal(this.isoData)} showLocal={showLocal(this.isoData)}
showSubscribed showSubscribed
onChange={this.handleListingTypeChange} onChange={this.handleListingTypeChange}
@ -782,7 +775,10 @@ export class Home extends Component<any, HomeState> {
<SortSelect sort={sort} onChange={this.handleSortChange} /> <SortSelect sort={sort} onChange={this.handleSortChange} />
</div> </div>
<div className="col-auto ps-0"> <div className="col-auto ps-0">
{getRss(listingType, this.state.siteRes)} {getRss(
listingType ??
this.state.siteRes.site_view.local_site.default_post_listing_type
)}
</div> </div>
</div> </div>
); );
@ -802,9 +798,7 @@ export class Home extends Component<any, HomeState> {
async fetchData() { async fetchData() {
const auth = myAuth(); const auth = myAuth();
const { dataType, page, listingType, sort } = getHomeQueryParams( const { dataType, page, listingType, sort } = getHomeQueryParams();
this.state.siteRes
);
if (dataType === DataType.Post) { if (dataType === DataType.Post) {
if (HomeCacheService.active) { if (HomeCacheService.active) {

View file

@ -1,19 +1,17 @@
import { isBrowser } from "@utils/browser"; import { isBrowser } from "@utils/browser";
import { GetSiteResponse } from "lemmy-js-client";
export default function getQueryParams<T extends Record<string, any>>( export default function getQueryParams<
processors: { T extends Record<string, any>
[K in keyof T]: (param: string) => T[K]; >(processors: {
}, [K in keyof T]: (param: string) => T[K];
site?: GetSiteResponse }): T {
): T {
if (isBrowser()) { if (isBrowser()) {
const searchParams = new URLSearchParams(window.location.search); const searchParams = new URLSearchParams(window.location.search);
return Array.from(Object.entries(processors)).reduce( return Array.from(Object.entries(processors)).reduce(
(acc, [key, process]) => ({ (acc, [key, process]) => ({
...acc, ...acc,
[key]: process(searchParams.get(key), site), [key]: process(searchParams.get(key)),
}), }),
{} as T {} as T
); );