Files
WeatherTool/web/src/harmonie/Harmonie.tsx
T

79 lines
3.1 KiB
TypeScript
Raw Normal View History

2025-02-02 23:33:15 +02:00
import { Component, createSignal } from 'solid-js'
import { apiHost } from '../consts'
2025-02-02 23:33:15 +02:00
import styles from './harmonie.module.css'
import { GribFile } from './GribFile'
import { LoadingSpinner } from '../components/LoadingSpinner'
import { GribMessage } from './interfaces'
import { fetchJson } from '../helpers/fetch'
import { getFakeWindDirection, isWindSpeed } from './draw/windDirection'
2025-02-14 22:35:02 +02:00
import { getFakeHourPrecipitation, isPrecipitation } from './draw/precipitation'
2025-02-02 23:33:15 +02:00
export const Harmonie: Component<{}> = () => {
const [getFileList, setFileList] = createSignal<string[]>([])
2025-02-03 23:33:28 +02:00
const [getCanvas, setCanvas] = createSignal<HTMLCanvasElement>()
const [getIsLoading, setIsLoading] = createSignal(true)
2025-02-04 22:12:03 +02:00
const [getIsCrop, setIsCrop] = createSignal(true)
const [getGribList, setGribList] = createSignal<GribMessage[]>([])
2025-02-02 23:33:15 +02:00
fetchJson(`${apiHost}/api/show/grib-list`)
2025-02-02 23:33:15 +02:00
.then(fileList => {
fileList.sort((a: string, b: string) => a < b ? 1 : -1)
setFileList(fileList)
})
.finally(() => setIsLoading(false))
2025-02-02 23:33:15 +02:00
function onGribMessageClick(fileName: string) {
if(!getGribList().length) {
setIsLoading(true)
fetchJson(`${apiHost}/api/show/grib-all-structure`)
.then((gribList: GribMessage[]) => {
setGribList([
...gribList,
...gribList.filter(isWindSpeed).map(getFakeWindDirection),
2025-02-14 22:35:02 +02:00
...gribList.filter(isPrecipitation).map(getFakeHourPrecipitation),
].sort((a, b) => a.title > b.title ? 1 : -1))
})
.finally(() => setIsLoading(false))
}
}
function getCurrentGribList(fileName: string): GribMessage[] {
const [referenceTime, forecastTime] = fileName.replace('harmonie_', '')
.replace('.grib', '')
.split('_')
if (!referenceTime || ! forecastTime) return []
return getGribList().filter(g =>
g.time.referenceTime === referenceTime
&& g.time.forecastTime === forecastTime
)
}
2025-02-03 20:24:20 +02:00
return <div class={styles.container}>
<div class={styles.column}>
2025-02-04 22:12:03 +02:00
<label>
Crop Latvia
<input type='checkbox' checked={getIsCrop()} onChange={()=>setIsCrop(!getIsCrop())} />
</label>
2025-02-03 20:24:20 +02:00
<ul class={styles.fileList}>
{getFileList().map(fileName =>
<GribFile
name={fileName}
2025-02-03 23:33:28 +02:00
getCanvas={getCanvas}
setIsLoading={setIsLoading}
2025-02-14 22:35:02 +02:00
getFileGribList={() => getCurrentGribList(fileName)}
getAllGribLists={getGribList}
2025-02-04 22:12:03 +02:00
getIsCrop={getIsCrop}
onClick={() => onGribMessageClick(fileName)}
2025-02-03 20:24:20 +02:00
/>
)}
</ul>
</div>
2025-02-03 23:33:28 +02:00
<div class={styles.column}>
{ getIsLoading() && <LoadingSpinner text='' />}
<canvas ref={setCanvas} style={{ display: getIsLoading() ? 'none' : 'block' }} />
2025-02-03 23:33:28 +02:00
</div>
2025-02-02 23:33:15 +02:00
</div>
}