diff --git a/web/src/harmonie/GribFile.tsx b/web/src/harmonie/GribFile.tsx index 5a8dc10..e471067 100644 --- a/web/src/harmonie/GribFile.tsx +++ b/web/src/harmonie/GribFile.tsx @@ -1,4 +1,4 @@ -import { Accessor, Component, createSignal, Setter } from 'solid-js' +import { Accessor, Component, createEffect, createMemo, createSignal, Setter } from 'solid-js' import styles from './harmonie.module.css' import { apiHost } from '../consts' @@ -14,16 +14,17 @@ export const GribFile: Component<{ isActive: Accessor, getCanvas: Accessor, setIsLoading: Setter, + getIsCrop: Accessor, onClick: (name: string) => void, }> = ({ name, isActive, getCanvas, setIsLoading, + getIsCrop, onClick, }) => { const [getGribList, setGribList] = createSignal([]) - const isCrop = createSignal(false) function onFileClick() { onClick(name) @@ -39,6 +40,16 @@ export const GribFile: Component<{ let cachedBuffers: Uint8Array[] = [] let cachedBitmasks: Uint8Array[] = [] + createEffect(async () => { + setIsLoading(true) + const cropBounds = getIsCrop() ? CROP_BOUNDS : undefined + // hack to show loading spinner + await new Promise(resolve => setTimeout(resolve, 100)) + if (cachedMessages.length === 0) return; + drawGrib(getCanvas()!, cachedMessages, cachedBuffers, cachedBitmasks, cropBounds) + setIsLoading(false) + }) + function onParamClick(paramId: number) { setIsLoading(true); const grib = getGribList()[paramId] @@ -66,7 +77,7 @@ export const GribFile: Component<{ cachedMessages = messages cachedBuffers = binaryBuffers.map(b => new Uint8Array(b)) cachedBitmasks = bitmasks.map(b => new Uint8Array(b)) - const cropBounds = isCrop[0]() ? CROP_BOUNDS : undefined + const cropBounds = getIsCrop() ? CROP_BOUNDS : undefined drawGrib(getCanvas()!, cachedMessages, cachedBuffers, cachedBitmasks, cropBounds) }) .catch(err => console.warn(err.message)) diff --git a/web/src/harmonie/Harmonie.tsx b/web/src/harmonie/Harmonie.tsx index 14ada65..e5b230f 100644 --- a/web/src/harmonie/Harmonie.tsx +++ b/web/src/harmonie/Harmonie.tsx @@ -10,6 +10,7 @@ export const Harmonie: Component<{}> = () => { const [getActiveGrib, setActiveGrib] = createSignal('') const [getCanvas, setCanvas] = createSignal() const [getIsLoading, setIsLoading] = createSignal(true) + const [getIsCrop, setIsCrop] = createSignal(true) fetch(`${apiHost}/api/show/grib-list`) .then(re => re.json()) @@ -21,6 +22,10 @@ export const Harmonie: Component<{}> = () => { return
+
    {getFileList().map(fileName => = () => { isActive={() => getActiveGrib() === fileName} getCanvas={getCanvas} setIsLoading={setIsLoading} + getIsCrop={getIsCrop} onClick={() => setActiveGrib(fileName)} /> )}