2022-05-07 18:48:56 +00:00
|
|
|
import { GetServerSideProps, NextPage } from "next";
|
2022-03-28 17:59:07 +00:00
|
|
|
import React from "react";
|
2022-03-16 21:02:34 +00:00
|
|
|
|
2022-05-20 20:59:33 +00:00
|
|
|
import { getPlatforms, getPlatformsConfig } from "../backend/platforms/registry";
|
2022-05-07 18:48:56 +00:00
|
|
|
import { Layout } from "../web/common/Layout";
|
|
|
|
import { Props, QueryParameters, SearchScreen } from "../web/search/components/SearchScreen";
|
|
|
|
import { FrontpageDocument, SearchDocument } from "../web/search/queries.generated";
|
|
|
|
import { ssrUrql } from "../web/urql";
|
2022-03-16 21:02:34 +00:00
|
|
|
|
2022-05-07 18:48:56 +00:00
|
|
|
export const getServerSideProps: GetServerSideProps<Props> = async (
|
|
|
|
context
|
|
|
|
) => {
|
|
|
|
const [ssrCache, client] = ssrUrql();
|
|
|
|
const urlQuery = context.query;
|
|
|
|
|
2022-05-09 13:49:36 +00:00
|
|
|
const platformsConfig = getPlatformsConfig();
|
2022-05-07 18:48:56 +00:00
|
|
|
|
|
|
|
const defaultQueryParameters: QueryParameters = {
|
|
|
|
query: "",
|
|
|
|
starsThreshold: 2,
|
|
|
|
forecastsThreshold: 0,
|
2022-05-20 20:59:33 +00:00
|
|
|
forecastingPlatforms: getPlatforms().map((platform) => platform.name),
|
2022-05-07 18:48:56 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
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 defaultNumDisplay = 21;
|
|
|
|
const initialNumDisplay = Number(urlQuery.numDisplay) || defaultNumDisplay;
|
|
|
|
|
2022-05-09 19:27:51 +00:00
|
|
|
const response = await client.query(FrontpageDocument).toPromise();
|
|
|
|
if (!response.data) {
|
|
|
|
throw new Error(`GraphQL query failed: ${response.error}`);
|
|
|
|
}
|
|
|
|
const defaultResults = response.data.result;
|
2022-05-07 18:48:56 +00:00
|
|
|
|
|
|
|
if (
|
|
|
|
!!initialQueryParameters &&
|
|
|
|
initialQueryParameters.query != "" &&
|
|
|
|
initialQueryParameters.query != undefined
|
|
|
|
) {
|
|
|
|
// must match the query from CommonDisplay
|
|
|
|
await client
|
|
|
|
.query(SearchDocument, {
|
|
|
|
input: {
|
|
|
|
...initialQueryParameters,
|
2022-05-09 19:27:51 +00:00
|
|
|
limit: initialNumDisplay + 50,
|
2022-05-07 18:48:56 +00:00
|
|
|
},
|
|
|
|
})
|
|
|
|
.toPromise();
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
props: {
|
|
|
|
urqlState: ssrCache.extractData(),
|
|
|
|
initialQueryParameters,
|
|
|
|
defaultQueryParameters,
|
|
|
|
initialNumDisplay,
|
|
|
|
defaultNumDisplay,
|
|
|
|
defaultResults,
|
|
|
|
platformsConfig,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
};
|
2022-03-16 21:02:34 +00:00
|
|
|
|
2022-04-01 20:24:35 +00:00
|
|
|
const IndexPage: NextPage<Props> = (props) => {
|
2022-03-16 21:02:34 +00:00
|
|
|
return (
|
2022-04-18 22:12:15 +00:00
|
|
|
<Layout page="search">
|
2022-05-07 18:48:56 +00:00
|
|
|
<SearchScreen {...props} />
|
2022-03-16 21:02:34 +00:00
|
|
|
</Layout>
|
|
|
|
);
|
2022-03-24 22:51:20 +00:00
|
|
|
};
|
|
|
|
|
2022-03-24 23:45:21 +00:00
|
|
|
export default IndexPage;
|