import { Accessor, Component, createResource } from "solid-js"; import { FETCH_DELAY_MS, apiHost } from "../../consts"; import moment from "moment"; import { CityChart } from "../../components/chart/CityChart"; import { LoadingSpinner } from '../../components/spinner/LoadingSpinner' export const Result: Component<{ getCity: Accessor, getField: Accessor, getStart: Accessor, getEnd: Accessor, }> = (props) => { const queryStart = () => moment(props.getStart()).format("YYYYMMDD_HHmm"); const queryEnd = () => moment(props.getEnd()).format("YYYYMMDD_HHmm"); const fetchList = async ([city, field, getStart, getEnd]: [string | undefined, string, Date, Date]) => { if (city === undefined) return undefined; await new Promise(resolve => setTimeout(resolve, FETCH_DELAY_MS)); const response = await fetch(`${apiHost}/api/query/city/${city}/${queryStart()}-${queryEnd()}/hour/${field}/list`); const json = await response.json(); return json; } const fetchMeteo = async ([city, getStart, getEnd]: [string | undefined, Date, Date]) => { if (city === undefined) return undefined; await new Promise(resolve => setTimeout(resolve, FETCH_DELAY_MS)); const response = await fetch(`${apiHost}/api/query/city/${city}/${queryStart()}-${queryEnd()}/allFields`); const json = await response.json(); return json; } const cityFieldDate = (): [string | undefined, string, Date, Date] => [ props.getCity(), props.getField(), props.getStart(), props.getEnd(), ]; const cityDate = (): [string | undefined, Date, Date] => [ props.getCity(), props.getStart(), props.getEnd(), ] const [listResource] = createResource(cityFieldDate, fetchList); const [meteoResource] = createResource(cityDate, fetchMeteo); return (
{ props.getCity() === undefined &&
Select city!
} { /* City weather field as chart */} { listResource.loading && } { listResource.error && (
Error while querying: ${listResource.error}
)} { listResource() && listResource() instanceof Error &&
{ listResource().message }
} { listResource() && props.getCity() && !listResource.loading &&

{ props.getCity() }: { props.getField() }

listResource().query.cities[0]} data={() => listResource().result[listResource().query.cities[0]] ?? []} query={() => listResource().query} />
} { /* City all weather fields with double values */} { meteoResource.loading && } { meteoResource.error && (
Error while querying: ${meteoResource.error}
)} { meteoResource() && meteoResource() instanceof Error &&
{ meteoResource().message }
} { meteoResource() && props.getCity() && !meteoResource.loading &&
    { Object.entries(meteoResource()) .sort((a, b) => a[0] > b[0] ? 1 : -1) .map(([key, value]: any) =>
  • {key}: {toStringFloat(value)}
  • )}
}
); } function toStringFloat(val: any): string { const numVal = parseFloat(val); if (isNaN(numVal)) return ""; return (Math.round(numVal * 10) / 10) + ""; }