Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Platform pages using Next.js app router #2627

Merged
merged 12 commits into from
Nov 7, 2023
7 changes: 6 additions & 1 deletion .storybook/preview.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import type { Preview } from "@storybook/react"
import { MemoryRouter } from "react-router-dom"

import "../src/index.scss"

Expand All @@ -12,6 +11,12 @@ const preview: Preview = {
date: /Date$/,
},
},
nextjs: {
appDirectory: true,
navigation: {
pathname: "/",
},
},
},
}

Expand Down
2 changes: 1 addition & 1 deletion app/(noMap)/about/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Metadata } from "next"

import { WagtailBlock } from "Features/WagtailApi/WagtailBlock.next"
import { WagtailBlock } from "Features/WagtailApi/WagtailBlock"

export default function About() {
return <WagtailBlock pageId="5" />
Expand Down
3 changes: 3 additions & 0 deletions app/(platformMap)/@belowMap/default.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default function BelowMapDefault() {
return null
}
13 changes: 13 additions & 0 deletions app/(platformMap)/@belowMap/home.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
"use client"
import { usePathname } from "next/navigation"
import { Superlatives } from "Features/ERDDAP/Superlatives/index"

export function HomeSuperlatives() {
const path = usePathname()

if (path === "/") {
return <Superlatives />
}

return null
}
11 changes: 11 additions & 0 deletions app/(platformMap)/@belowMap/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { DehydratedPlatforms } from "Features/ERDDAP/hooks/DehydrateComponent"

import { HomeSuperlatives } from "./home"

export default async function IndexBelowMap() {
return (
<DehydratedPlatforms>
<HomeSuperlatives />
</DehydratedPlatforms>
)
}
3 changes: 3 additions & 0 deletions app/(platformMap)/@bottom/default.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default function CatchAll() {
return null
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
"use client"
import { UsePlatform } from "Features/ERDDAP/hooks"
import { ErddapCurrentPlatformConditions } from "Features/ERDDAP/Platform/Observations/CurrentConditions"

export function CurrentConditions({ platformId }: { platformId: string }) {
return (
<UsePlatform platformId={platformId}>
{({ platform }) => <ErddapCurrentPlatformConditions platform={platform} />}
</UsePlatform>
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
"use client"
import { UsePlatform } from "Features/ERDDAP/hooks"
import { useUnitSystem } from "Features/Units"
import { Forecast } from "Features/ERDDAP/Platform/Forecasts/Page"

export function ForecastChart({ platformId, standardName }: { platformId: string; standardName: string }) {
const unitSystem = useUnitSystem()

return (
<UsePlatform platformId={platformId}>
{({ platform }) => <Forecast platform={platform} forecast_type={standardName} unitSystem={unitSystem} />}
</UsePlatform>
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { DehydratedPlatforms } from "Features/ERDDAP/hooks/DehydrateComponent"

import { ForecastChart } from "./forecast"

export default function ForecastPage({ params }: { params: { platformId: string; standardName: string } }) {
return (
<DehydratedPlatforms>
<ForecastChart {...params} />
</DehydratedPlatforms>
)
}
14 changes: 14 additions & 0 deletions app/(platformMap)/@bottom/platform/[platformId]/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { DehydratedPlatforms } from "Features/ERDDAP/hooks/DehydrateComponent"

import { PlatformTabs } from "./tabs"

export default async function PlatformTabsLayout({ children }: { children: React.ReactNode }) {
return (
<DehydratedPlatforms>
<div style={{ marginTop: "1rem" }}>
<PlatformTabs />
{children}
</div>
</DehydratedPlatforms>
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
"use client"
import { ErddapObservedCondition } from "Features/ERDDAP/Platform/Observations/Condition"
import { UsePlatform } from "Features/ERDDAP/hooks"

export function ObservationChart({ platformId, standardName }: { platformId: string; standardName: string }) {
return (
<UsePlatform platformId={platformId}>
{({ platform }) => <ErddapObservedCondition platform={platform} standardName={standardName} />}
</UsePlatform>
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { DehydratedPlatforms } from "Features/ERDDAP/hooks/DehydrateComponent"

import { ObservationChart } from "./chart"

export default function ObservedPlot({
params: { platformId, standardName },
}: {
params: { platformId: string; standardName: string }
}) {
return (
<DehydratedPlatforms>
<ObservationChart platformId={platformId} standardName={standardName} />
</DehydratedPlatforms>
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
"use client"
import { UsePlatform } from "Features/ERDDAP/hooks"
import { useUnitSystem } from "Features/Units"
import { ErddapAllObservationsTable } from "Features/ERDDAP/Platform/Observations/Table/all"

export function AllObservations({ platformId }: { platformId: string }) {
const unitSystem = useUnitSystem()

return (
<UsePlatform platformId={platformId}>
{({ platform }) => <ErddapAllObservationsTable platform={platform} unitSystem={unitSystem} />}
</UsePlatform>
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { DehydratedPlatforms } from "Features/ERDDAP/hooks/DehydrateComponent"

import { AllObservations } from "./all_observations"

export default function AllObservationsPage({ params: { platformId } }: { params: { platformId: string } }) {
return (
<DehydratedPlatforms>
<AllObservations platformId={platformId} />
</DehydratedPlatforms>
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
"use client"
import { ErddapWindObservedCondition } from "Features/ERDDAP/Platform/Observations/WindCondition"
import { UsePlatform } from "Features/ERDDAP/hooks"

export function WindChart({ platformId }: { platformId: string }) {
return (
<UsePlatform platformId={platformId}>
{({ platform }) => <ErddapWindObservedCondition platform={platform} />}
</UsePlatform>
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { DehydratedPlatforms } from "Features/ERDDAP/hooks/DehydrateComponent"

import { WindChart } from "./chart"

export default function WindPlot({ params: { platformId } }: { params: { platformId: string } }) {
return (
<DehydratedPlatforms>
<WindChart platformId={platformId} />
</DehydratedPlatforms>
)
}
11 changes: 11 additions & 0 deletions app/(platformMap)/@bottom/platform/[platformId]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { DehydratedPlatforms } from "Features/ERDDAP/hooks/DehydrateComponent"

import { CurrentConditions } from "./current_conditions"

export default function CurrentConditionsPage({ params: { platformId } }: { params: { platformId: string } }) {
return (
<DehydratedPlatforms>
<CurrentConditions platformId={platformId} />
</DehydratedPlatforms>
)
}
68 changes: 68 additions & 0 deletions app/(platformMap)/@bottom/platform/[platformId]/tabs.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
"use client"
import Link from "next/link"
import { usePathname, useParams } from "next/navigation"
import * as React from "react"
import { Col, Nav, NavItem, NavLink, Row } from "reactstrap"

import { paths } from "Shared/constants"
import { urlPartReplacer } from "Shared/urlParams"

import { ErddapObservedDropdown } from "Features/ERDDAP/Platform/Observations/Menu"
import { ForecastDropdown } from "Features/ERDDAP/ForecastsMetadata/Menu"
import { ErddapMoreInfoDropdown } from "Features/ERDDAP/Platform/MoreInfoMenu/index"
import { UsePlatform } from "Features/ERDDAP/hooks/BuoyBarnComponents"

export function PlatformTabs() {
const path = usePathname()
const { platformId }: { platformId?: string } = useParams()

if (typeof platformId === "undefined" || !path.startsWith("/platform")) {
return null
}

return (
<UsePlatform platformId={platformId}>
{(platform_props) => (
<React.Fragment>
<Row style={{ paddingBottom: "1rem" }}>
<Col>
<Nav tabs={true}>
<ErddapObservedDropdown {...platform_props} />
<Tab to={paths.platforms.platform} path={path} name="Latest Conditions" id={platformId} />
<ForecastDropdown platformId={platformId} />
<ErddapMoreInfoDropdown {...platform_props} />
</Nav>
</Col>
</Row>
</React.Fragment>
)}
</UsePlatform>
)
}

interface TabProps {
to: string
id: string
name: string
path: string
}

/**
* Mini component for Tabs that are part of the navbar.
*/
// tslint:disable-next-line:max-classes-per-file
function Tab(props: TabProps) {
const { to, name, path, id } = props

return (
<NavItem>
<NavLink
tag={Link}
href={urlPartReplacer(to, ":id", id)}
className={to === path ? "nav-link active" : "nav-link"}
>
{name}
</NavLink>
</NavItem>
)
}
14 changes: 14 additions & 0 deletions app/(platformMap)/@sidebar/default.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
"use client"
import { useParams } from "next/navigation"

import PlatformSidebar from "./platform/[platformId]/page"

export default function SidebarDefault() {
const params = useParams()

if ("platformId" in params) {
return <PlatformSidebar params={params as { platformId: string }} />
}

return null
}
5 changes: 5 additions & 0 deletions app/(platformMap)/@sidebar/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { WagtailBlock } from "Features/WagtailApi/WagtailBlock"

export default function HomeSidebar() {
return <WagtailBlock pageId="4" />
}
13 changes: 13 additions & 0 deletions app/(platformMap)/@sidebar/platform/[platformId]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { DehydratedPlatforms } from "Features/ERDDAP/hooks/DehydrateComponent"

import { PlatformInfo } from "Pages/Platforms/platformInfo"

export default async function PlatformSidebar({ params }: { params: { platformId: string } }) {
const platformId = decodeURIComponent(params.platformId)

return (
<DehydratedPlatforms>
<PlatformInfo id={platformId} />
</DehydratedPlatforms>
)
}
3 changes: 3 additions & 0 deletions app/(platformMap)/@sidebar/platform/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default function PlatformList() {
return <div>List of platforms</div>
}
31 changes: 31 additions & 0 deletions app/(platformMap)/@sidebar/region/[regionId]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { DehydratedPlatforms } from "Features/ERDDAP/hooks/DehydrateComponent"

import { regionList } from "Shared/constants"
import { Region } from "Shared/regions"

import { RegionList } from "./region"

export default async function RegionSidebar({ params }: { params: { regionId: string } }) {
const regionId = decodeURIComponent(params.regionId)

let region: Region | undefined = regionList.find((r) => r.slug === regionId)

if (typeof region === "undefined") {
return null
}

return (
<div>
<h2>Platforms in {region.name}</h2>
<DehydratedPlatforms>
<RegionList region={region} />
</DehydratedPlatforms>
</div>
)
}

export async function generateStaticParams() {
return regionList.map((region) => ({
regionId: region.slug,
}))
}
7 changes: 7 additions & 0 deletions app/(platformMap)/@sidebar/region/[regionId]/region.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
"use client"
import { Region } from "Shared/regions"
import { ErddapPlatformList } from "Features/ERDDAP"

export function RegionList({ region }: { region: Region }) {
return <ErddapPlatformList boundingBox={region.bbox} />
}
41 changes: 41 additions & 0 deletions app/(platformMap)/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
"use client"
import * as React from "react"
import { Col, Row } from "reactstrap"
import { useMeasure } from "react-use"
import { usePathname } from "next/navigation"

import { Map } from "./map"

export default function Layout({
children,
sidebar,
belowMap,
bottom,
}: {
children: React.ReactNode
sidebar: React.ReactNode
bottom: React.ReactNode
belowMap: React.ReactNode
}) {
const [ref, { height }] = useMeasure<HTMLDivElement>()
const path = usePathname()

return (
<React.Fragment>
<Row>
<Col sm={{ size: true, order: 2 }}>
<div ref={ref} style={{ marginBottom: ".5rem" }}>
{sidebar}
</div>
</Col>

<Col sm={{ size: true, order: 1 }}>
<Map height={height} />
{belowMap ?? <React.Fragment>{belowMap}</React.Fragment>}
</Col>
</Row>

{(path.startsWith("/platform") && bottom) ?? <Row>{bottom}</Row>}
</React.Fragment>
)
}