diff --git a/src/components/upstreamVisitsCard.tsx b/src/components/upstreamVisitsCard.tsx index 1aeb37b..e37bc40 100644 --- a/src/components/upstreamVisitsCard.tsx +++ b/src/components/upstreamVisitsCard.tsx @@ -1,39 +1,124 @@ import { Card, CardBody, Button, CardHeader } from '@chakra-ui/react' +import { useQuery } from '@tanstack/react-query' import { getUpstreamVisits, upstreamDataDownloadRequest } from 'loaders/general' +import { getInstrumentInfo } from 'loaders/general' import React, { useCallback, useEffect } from 'react' import { MdFileDownload } from 'react-icons/md' -interface SessionId { +const InstrumentUpstreamVisitsCard = ({ + sessid, + instrumentName, + displayName, + instrumentVisits, +}: { sessid: number + instrumentName: string + displayName: string + instrumentVisits: Record +}) => { + // Display upstream visits for a single instrument + // Parameters to take: instrument name and upstream visits dict + return ( + + + {displayName} + + + {/* Map each visit to a button */} + {!!Object.keys(instrumentVisits).length ? ( + Object.entries(instrumentVisits).map( + ([visitName, visitPath]: [string, string]) => { + return ( + + ) + } + ) + ) : ( + <>No related visits found + )} + + + ) } -export const UpstreamVisitCard = ({ sessid }: SessionId) => { - const [upstreamVisits, setUpstreamVisits] = React.useState({}) +export const UpstreamVisitsCard = ({ sessid }: { sessid: number }) => { + const [upstreamVisits, setUpstreamVisits] = React.useState< + Record> + >({}) + // Load all visits associated with current session const resolveVisits = useCallback(async () => { const visits = await getUpstreamVisits(sessid) + if (!visits) return // Handle null or false-y cases setUpstreamVisits(visits) - console.log(visits) }, [sessid]) + useEffect(() => { resolveVisits() }, [sessid, resolveVisits]) - return upstreamVisits ? ( - - Upstream Visit Data Download - {Object.keys(upstreamVisits).map((k) => { - return ( - - - - ) - })} + // Set up queryClient to load names of all instruments + type InstrumentInfo = { + instrument_name: string + display_name: string + instrument_url: string + } + const { data: instrumentInfo } = useQuery({ + queryKey: ['instrumentInfo'], + queryFn: getInstrumentInfo, + staleTime: 60000, + }) + + // Set up function to get the corresponding display name of the instrument + const getDisplayName = (instrumentName: string) => { + if (!instrumentInfo) return instrumentName + const result = instrumentInfo.find( + (item) => item.instrument_name === instrumentName + ) + // Use instrument name if no results were found or if display name wasn't set + return result + ? result.display_name + ? result.display_name + : instrumentName + : instrumentName + } + + return !!Object.keys(upstreamVisits).length && !!instrumentInfo ? ( + + + Upstream Visit Data Download + + + {/* Map each instrument to its own card */} + {Object.entries(upstreamVisits).map( + ([instrumentName, instrumentVisits]: [ + string, + Record, + ]) => { + return ( + + ) + } + )} + ) : ( <> diff --git a/src/loaders/general.tsx b/src/loaders/general.tsx index 0997abc..e535b95 100644 --- a/src/loaders/general.tsx +++ b/src/loaders/general.tsx @@ -1,5 +1,15 @@ import { client } from 'utils/api/client' +export const getInstrumentInfo = async () => { + const response = await client.hub_get(`instruments`) + + if (response.status !== 200) { + return null + } + + return response.data +} + export const getInstrumentName = async () => { const response = await client.get( `display/instruments/${sessionStorage.getItem('instrumentName')}/instrument_name` @@ -25,7 +35,9 @@ export const getInstrumentConnectionStatus = async () => { return response.data } -export const getUpstreamVisits = async (sessid: number) => { +export const getUpstreamVisits = async ( + sessid: number +): Promise> | null> => { const response = await client.get( `session_info/correlative/sessions/${sessid}/upstream_visits` ) @@ -37,12 +49,17 @@ export const getUpstreamVisits = async (sessid: number) => { } export const upstreamDataDownloadRequest = async ( + instrumentName: string, + sessid: number, visitName: string, - sessid: number + visitPath: string ) => { const response = await client.post( - `instrument_server/visits/${visitName}/sessions/${sessid}/upstream_tiff_data_request`, - {} + `instrument_server/visits/${visitName}/sessions/${sessid}/upstream_file_data_request`, + { + upstream_instrument: instrumentName, + upstream_visit_path: visitPath, + } ) if (response.status !== 200) { diff --git a/src/loaders/hub.tsx b/src/loaders/hub.tsx index 1ffd0f6..e8cb75b 100644 --- a/src/loaders/hub.tsx +++ b/src/loaders/hub.tsx @@ -1,15 +1,6 @@ import { QueryClient } from '@tanstack/react-query' -import { client } from 'utils/api/client' -const getInstrumentInfo = async () => { - const response = await client.hub_get(`instruments`) - - if (response.status !== 200) { - return null - } - - return response.data -} +import { getInstrumentInfo } from './general' const query = { queryKey: ['instrumentInfo'], diff --git a/src/routes/Session.tsx b/src/routes/Session.tsx index d2a6227..c9b958a 100644 --- a/src/routes/Session.tsx +++ b/src/routes/Session.tsx @@ -27,7 +27,7 @@ import { import { useQuery } from '@tanstack/react-query' import { InstrumentCard } from 'components/instrumentCard' import { RsyncCard } from 'components/rsyncCard' -import { UpstreamVisitCard } from 'components/upstreamVisitsCard' +import { UpstreamVisitsCard } from 'components/upstreamVisitsCard' import { getInstrumentConnectionStatus } from 'loaders/general' import { sessionTokenCheck, sessionHandshake } from 'loaders/jwt' import { getMachineConfigData } from 'loaders/machineConfig' @@ -573,7 +573,7 @@ export const Session = () => { - +