import {Button, Flex, Spinner, Text, Box, Collapsible} from "@chakra-ui/react"; import {useEffect, useMemo, useCallback} from 'react'; import {useDashboardStore} from "@/store/useDashboardStore.jsx"; import VdapApi from '@/hooks/useVdapApi.js'; import useBuildUrl from "@/hooks/useBuildUrl.js"; export default function RemoteSensing({ settings, widgetID }) { console.log("RS settings: ", settings, "RS ID: ", widgetID); const updateSettings = useDashboardStore(state => state.updateWidgetSettings); // Find this specific widgets object in the state list of active & displayed widgets const thisWidget = useDashboardStore(useCallback((state) => state.widgets.find((widget) => widget.id === widgetID), [widgetID] )); // build url, defaults to 7 days past const url = useBuildUrl('/api/v2/remote_sensing', settings?.startDate, settings?.endDate); // VdapApi hook only calls api if the url changes and apiData remains stable since vdapApi uses state to track the data const {data: apiData, isLoading, error} = VdapApi(url); // sort apiData const data = useMemo(() => { if (apiData?.length === 0) return []; const sorts = settings?.activeSorts; if (sorts?.volcanoSort && sorts?.timeSort === "asc") return [...apiData].sort(ascTimeVolcanoSort); else if (sorts?.volcanoSort && sorts?.timeSort === "desc") return [...apiData].sort(descTimeVolcanoSort); else if (sorts?.timeSort === "asc") return [...apiData].sort(ascTimeSort); else return [...apiData].sort(descTimeSort); }, [apiData, settings]); // check if user wants to copy all RS useEffect(() => { if(settings?.copyToClipboard === true) { const dataText = data.map((item) => { return `${item.country}, ${item.volcano_name}\n` + `Report Time: ${item.report_time}\n` + `Sender: ${item.sender}\n` + `Summary:\n${item.summary}\n`; }).join('\n\n'); navigator.clipboard.writeText(dataText) .then(() => { alert('Copied to clipboard!'); }) .catch((err => { console.error('Failed to copy: ', err); })); updateSettings(widgetID, {copyToClipboard: false}); } }, [settings, data, widgetID, updateSettings]); if (isLoading) return ( ); if (error) return ( {error} ); if (data.length === 0) return ( No Remote Sensing data available this week. ); return ( {data.map((item, index) => { if (thisWidget?.size === "large" || thisWidget?.size === "medium") return ( {/* Using context to dynamically change the border radii of the triggers */} {(collapsible) => ( <> {item?.volcano_name} {item?.country} {item?.report_time} {/* This box needs to be at h="100%" for the pdf toolbar to appear */} {item?.summary} Source: {item?.sender} {item?.files?.map((file, index) => { // PDF FILE TYPE if (file?.type === "pdf") return (
{file?.name} PDF Your browser cannot display this PDF directly. Download PDF
); // IMAGE FILE TYPE else if (file?.type === "image") return (
{file?.name} PNG {file?.name}
); // DOWNLOADABLE LINK else if (file?.type === "download") return ( <>
{file?.name} ) })}
)}
) else if (thisWidget?.size === "small") return ( {item?.volcano_name} {item?.country} {item?.report_time} ) })}
); } function ascTimeVolcanoSort(a, b) { if (a.volcano_name < b.volcano_name) return -1 else if (a.volcano_name > b.volcano_name) return 1 else return ascTimeSort(a, b); } function descTimeVolcanoSort(a, b) { if (a.volcano_name < b.volcano_name) return -1 else if (a.volcano_name > b.volcano_name) return 1 else return descTimeSort(a, b); } function ascTimeSort(a, b) { const aTime = new Date(a.report_time); const bTime = new Date(b.report_time); if (aTime > bTime) return 1; if (aTime < bTime) return -1; return 0; } function descTimeSort(a, b) { const aTime = new Date(a.report_time); const bTime = new Date(b.report_time); if (aTime > bTime) return -1; if (aTime < bTime) return 1; return 0; }