metaforecast/src/web/search/anySearchPage.tsx
2022-04-01 23:24:35 +03:00

104 lines
2.8 KiB
TypeScript

import { GetServerSideProps } from "next";
import { getFrontpage } from "../../backend/frontpage";
import { platforms } from "../../backend/platforms";
import { FrontendForecast, PlatformConfig } from "../platforms";
import searchAccordingToQueryData from "../worker/searchAccordingToQueryData";
/* Common code for / and /capture */
export interface QueryParameters {
query: string;
starsThreshold: number;
forecastsThreshold: number;
forecastingPlatforms: string[]; // platform names
}
export interface Props {
defaultResults: FrontendForecast[];
initialResults: FrontendForecast[];
initialQueryParameters: QueryParameters;
defaultQueryParameters: QueryParameters;
initialNumDisplay: number;
defaultNumDisplay: number;
platformsConfig: PlatformConfig[];
}
export const getServerSideProps: GetServerSideProps<Props> = async (
context
) => {
const urlQuery = context.query;
const platformsConfig = platforms.map((platform) => ({
name: platform.name,
label: platform.label,
color: platform.color,
}));
platformsConfig.push({
name: "guesstimate",
label: "Guesstimate",
color: "223900",
});
const defaultQueryParameters: QueryParameters = {
query: "",
starsThreshold: 2,
forecastsThreshold: 0,
forecastingPlatforms: platforms.map((platform) => platform.name),
};
const initialQueryParameters: QueryParameters = {
...defaultQueryParameters,
};
if (urlQuery.query) {
initialQueryParameters.query = String(urlQuery.query);
}
if (urlQuery.starsThreshold) {
initialQueryParameters.starsThreshold = Number(urlQuery.starsThreshold);
}
if (urlQuery.forecastsThreshold !== undefined) {
initialQueryParameters.forecastsThreshold = Number(
urlQuery.forecastsThreshold
);
}
if (urlQuery.forecastingPlatforms !== undefined) {
initialQueryParameters.forecastingPlatforms = String(
urlQuery.forecastingPlatforms
).split("|");
}
const platformNameToLabel = Object.fromEntries(
platforms.map((platform) => [platform.name, platform.label])
);
const defaultNumDisplay = 21;
const initialNumDisplay = Number(urlQuery.numDisplay) || defaultNumDisplay;
const defaultResults = (await getFrontpage()).map((result) => ({
...result,
platformLabel: platformNameToLabel[result.platform] || result.platform,
}));
const initialResults =
!!initialQueryParameters &&
initialQueryParameters.query != "" &&
initialQueryParameters.query != undefined
? await searchAccordingToQueryData(
initialQueryParameters,
initialNumDisplay
)
: defaultResults;
return {
props: {
initialQueryParameters,
defaultQueryParameters,
initialNumDisplay,
defaultNumDisplay,
initialResults,
defaultResults,
platformsConfig,
},
};
};