From 3771b53e4fe391cc32eba1497c6c343c9974d1cc Mon Sep 17 00:00:00 2001 From: Vyacheslav Matyukhin Date: Wed, 6 Apr 2022 00:02:54 +0300 Subject: [PATCH] fix: platform labels in dashboards --- src/backend/dashboards.ts | 9 +++++++ src/pages/dashboards.tsx | 36 ++++++++++++++++--------- src/pages/secretDashboard.tsx | 2 ++ src/web/platforms.ts | 15 ++++++++++- src/web/search/anySearchPage.tsx | 7 ++--- src/web/worker/getDashboardForecasts.ts | 16 ++++++++--- 6 files changed, 62 insertions(+), 23 deletions(-) create mode 100644 src/backend/dashboards.ts diff --git a/src/backend/dashboards.ts b/src/backend/dashboards.ts new file mode 100644 index 0000000..2ea977c --- /dev/null +++ b/src/backend/dashboards.ts @@ -0,0 +1,9 @@ +export interface DashboardItem { + id: string; + title: string; + description: string; + contents: any; + timestamp: string; + creator: string; + extra: any; +} diff --git a/src/pages/dashboards.tsx b/src/pages/dashboards.tsx index 4aa8f65..b71495b 100644 --- a/src/pages/dashboards.tsx +++ b/src/pages/dashboards.tsx @@ -1,41 +1,49 @@ /* Imports */ import axios from "axios"; -import { GetServerSideProps } from "next"; +import { GetServerSideProps, NextPage } from "next"; import { useRouter } from "next/router"; // https://nextjs.org/docs/api-reference/next/router import { useState } from "react"; +import { DashboardItem } from "../backend/dashboards"; import { DashboardCreator } from "../web/display/dashboardCreator"; import displayForecasts from "../web/display/displayForecasts"; import Layout from "../web/display/layout"; +import { addLabelsToForecasts, FrontendForecast } from "../web/platforms"; import { getDashboardForecastsByDashboardId } from "../web/worker/getDashboardForecasts"; -/* get Props */ +interface Props { + initialDashboardForecasts: FrontendForecast[]; + initialDashboardId?: string; + initialDashboardItem?: DashboardItem; +} -export const getServerSideProps: GetServerSideProps = async (context) => { +export const getServerSideProps: GetServerSideProps = async ( + context +) => { console.log("getServerSideProps: "); - let urlQuery = context.query; // this is an object, not a string which I have to parse!! - // so for instance if the url is metaforecasts.org/dashboards?a=b&c=d - // this returns ({a: "b", c: "d"}}) + let urlQuery = context.query; + console.log(urlQuery); let dashboardId = urlQuery.dashboardId; let props; + if (!!dashboardId) { - console.log(dashboardId); let { dashboardForecasts, dashboardItem } = await getDashboardForecastsByDashboardId({ dashboardId, }); + dashboardForecasts = addLabelsToForecasts(dashboardForecasts); + props = { initialDashboardForecasts: dashboardForecasts, initialDashboardId: urlQuery.dashboardId, initialDashboardItem: dashboardItem, }; } else { - console.log(); props = { initialDashboardForecasts: [], - initialDashboardId: urlQuery.dashboardId || null, - initialDashboardItem: null, + initialDashboardId: urlQuery.dashboardId || undefined, + initialDashboardItem: undefined, }; } return { @@ -44,10 +52,10 @@ export const getServerSideProps: GetServerSideProps = async (context) => { }; /* Body */ -export default function Home({ +const DashboardsPage: NextPage = ({ initialDashboardForecasts, initialDashboardItem, -}) { +}) => { const router = useRouter(); const [dashboardForecasts, setDashboardForecasts] = useState( initialDashboardForecasts @@ -188,4 +196,6 @@ export default function Home({ ); -} +}; + +export default DashboardsPage; diff --git a/src/pages/secretDashboard.tsx b/src/pages/secretDashboard.tsx index 8fbb534..4092237 100644 --- a/src/pages/secretDashboard.tsx +++ b/src/pages/secretDashboard.tsx @@ -5,6 +5,7 @@ import { useRouter } from "next/router"; // https://nextjs.org/docs/api-referenc import { useState } from "react"; import displayForecasts from "../web/display/displayForecasts"; +import { addLabelsToForecasts } from "../web/platforms"; import { getDashboardForecastsByDashboardId } from "../web/worker/getDashboardForecasts"; /* get Props */ @@ -24,6 +25,7 @@ export async function getServerSideProps(context) { await getDashboardForecastsByDashboardId({ dashboardId, }); + dashboardForecasts = addLabelsToForecasts(dashboardForecasts); props = { initialDashboardForecasts: dashboardForecasts, initialDashboardId: urlQuery.dashboardId, diff --git a/src/web/platforms.ts b/src/web/platforms.ts index 15ef1ea..00a8a1d 100644 --- a/src/web/platforms.ts +++ b/src/web/platforms.ts @@ -1,4 +1,4 @@ -import { Forecast } from "../backend/platforms"; +import { Forecast, platforms } from "../backend/platforms"; export interface PlatformConfig { name: string; @@ -10,3 +10,16 @@ export type FrontendForecast = Forecast & { platformLabel: string; visualization?: any; }; + +export const addLabelsToForecasts = ( + forecasts: Forecast[] +): FrontendForecast[] => { + const platformNameToLabel = Object.fromEntries( + platforms.map((platform) => [platform.name, platform.label]) + ); + + return forecasts.map((result) => ({ + ...result, + platformLabel: platformNameToLabel[result.platform] || result.platform, + })); +}; diff --git a/src/web/search/anySearchPage.tsx b/src/web/search/anySearchPage.tsx index bb50f9b..b28223b 100644 --- a/src/web/search/anySearchPage.tsx +++ b/src/web/search/anySearchPage.tsx @@ -2,7 +2,7 @@ import { GetServerSideProps } from "next"; import { getFrontpage } from "../../backend/frontpage"; import { platforms } from "../../backend/platforms"; -import { FrontendForecast, PlatformConfig } from "../platforms"; +import { addLabelsToForecasts, FrontendForecast, PlatformConfig } from "../platforms"; import searchAccordingToQueryData from "../worker/searchAccordingToQueryData"; /* Common code for / and /capture */ @@ -74,10 +74,7 @@ export const getServerSideProps: GetServerSideProps = async ( const defaultNumDisplay = 21; const initialNumDisplay = Number(urlQuery.numDisplay) || defaultNumDisplay; - const defaultResults = (await getFrontpage()).map((result) => ({ - ...result, - platformLabel: platformNameToLabel[result.platform] || result.platform, - })); + const defaultResults = addLabelsToForecasts(await getFrontpage()); const initialResults = !!initialQueryParameters && diff --git a/src/web/worker/getDashboardForecasts.ts b/src/web/worker/getDashboardForecasts.ts index faef9de..a6ca9e8 100644 --- a/src/web/worker/getDashboardForecasts.ts +++ b/src/web/worker/getDashboardForecasts.ts @@ -1,9 +1,17 @@ import axios from "axios"; -export async function getDashboardForecastsByDashboardId({ dashboardId }) { +import { DashboardItem } from "../../backend/dashboards"; +import { Forecast } from "../../backend/platforms"; + +export async function getDashboardForecastsByDashboardId({ + dashboardId, +}): Promise<{ + dashboardForecasts: Forecast[]; + dashboardItem: DashboardItem | string; +}> { console.log("getDashboardForecastsByDashboardId: "); - let dashboardContents = []; - let dashboardItem = null; + let dashboardContents: Forecast[] = []; + let dashboardItem: DashboardItem | any = null; try { let { data } = await axios({ url: `${process.env.NEXT_PUBLIC_SITE_URL}/api/dashboard-by-id`, @@ -14,7 +22,7 @@ export async function getDashboardForecastsByDashboardId({ dashboardId }) { }); console.log(data); dashboardContents = data.dashboardContents; - dashboardItem = data.dashboardItem; + dashboardItem = data.dashboardItem as DashboardItem; } catch (error) { console.log(error); } finally {