Skip to content

Commit

Permalink
don't poll on list view, use spinner with tooltip as loading indicator
Browse files Browse the repository at this point in the history
  • Loading branch information
david-crespo committed Aug 16, 2024
1 parent 3ebb3f9 commit 7d11d67
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 28 deletions.
21 changes: 9 additions & 12 deletions app/pages/project/instances/InstancesPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,14 @@ import { createColumnHelper } from '@tanstack/react-table'
import { useMemo } from 'react'
import { useNavigate, type LoaderFunctionArgs } from 'react-router-dom'

import { apiQueryClient, usePrefetchedApiQuery, type Instance } from '@oxide/api'
import {
apiQueryClient,
useApiQueryClient,
usePrefetchedApiQuery,
type Instance,
} from '@oxide/api'
import { Instances16Icon, Instances24Icon } from '@oxide/design-system/icons/react'

import { instanceTransitioning } from '~/api/util'
import { DocsPopover } from '~/components/DocsPopover'
import { RefreshButton } from '~/components/RefreshButton'
import { getProjectSelector, useProjectSelector, useQuickActions } from '~/hooks'
Expand All @@ -26,7 +30,6 @@ import { CreateLink } from '~/ui/lib/CreateButton'
import { EmptyMessage } from '~/ui/lib/EmptyMessage'
import { PageHeader, PageTitle } from '~/ui/lib/PageHeader'
import { TableActions } from '~/ui/lib/Table'
import { useInterval } from '~/ui/lib/use-interval'
import { docLinks } from '~/util/links'
import { pb } from '~/util/path-builder'

Expand All @@ -52,11 +55,12 @@ InstancesPage.loader = async ({ params }: LoaderFunctionArgs) => {
return null
}

const refetchInstances = () => apiQueryClient.invalidateQueries('instanceList')

export function InstancesPage() {
const { project } = useProjectSelector()

const queryClient = useApiQueryClient()
const refetchInstances = () => queryClient.invalidateQueries('instanceList')

const makeActions = useMakeInstanceActions(
{ project },
{ onSuccess: refetchInstances, onDelete: refetchInstances }
Expand All @@ -66,13 +70,6 @@ export function InstancesPage() {
query: { project, limit: PAGE_SIZE },
})

// if any instance in the list is transitioning, poll
// TODO: figure out this logic. polling if any instance is transitioning might be excessive
useInterval({
fn: () => apiQueryClient.invalidateQueries('instanceList'),
delay: instances.items.some(instanceTransitioning) ? 1000 : null,
})

const navigate = useNavigate()
useQuickActions(
useMemo(
Expand Down
40 changes: 24 additions & 16 deletions app/pages/project/instances/instance/InstancePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,9 @@ import { EmptyCell } from '~/table/cells/EmptyCell'
import { DateTime } from '~/ui/lib/DateTime'
import { PageHeader, PageTitle } from '~/ui/lib/PageHeader'
import { PropertiesTable } from '~/ui/lib/PropertiesTable'
import { Spinner } from '~/ui/lib/Spinner'
import { Tooltip } from '~/ui/lib/Tooltip'
import { Truncate } from '~/ui/lib/Truncate'
import { useInterval } from '~/ui/lib/use-interval'
import { docLinks } from '~/util/links'
import { pb } from '~/util/path-builder'

Expand Down Expand Up @@ -96,16 +97,19 @@ export function InstancePage() {
onDelete: () => navigate(pb.instances(instanceSelector)),
})

const { data: instance } = usePrefetchedApiQuery('instanceView', {
path: { instance: instanceSelector.instance },
query: { project: instanceSelector.project },
})
const { data: instance } = usePrefetchedApiQuery(
'instanceView',
{
path: { instance: instanceSelector.instance },
query: { project: instanceSelector.project },
},
{
refetchInterval: ({ state: { data: instance } }) =>
instance && instanceTransitioning(instance) ? 1000 : false,
}
)

const shouldPoll = instanceTransitioning(instance)
useInterval({
fn: () => apiQueryClient.invalidateQueries('instanceView'),
delay: shouldPoll ? 1000 : null,
})
const polling = instanceTransitioning(instance)

const { data: nics } = usePrefetchedApiQuery('instanceNetworkInterfaceList', {
query: {
Expand Down Expand Up @@ -165,12 +169,16 @@ export function InstancePage() {
<span className="ml-1 text-quaternary"> {memory.unit}</span>
</PropertiesTable.Row>
<PropertiesTable.Row label="status">
<InstanceStatusBadge status={instance.runState} />
{shouldPoll && (
<div className="ml-4 flex items-center text-sans-sm text-tertiary">
Polling... (ANIMATE ME INSTEAD)
</div>
)}
<div className="flex">
<InstanceStatusBadge status={instance.runState} />
{polling && (
<Tooltip content="Auto-refreshing while state changes" delay={150}>
<button type="button">
<Spinner className="ml-2" />
</button>
</Tooltip>
)}
</div>
</PropertiesTable.Row>
<PropertiesTable.Row label="vpc">
{vpc ? (
Expand Down
4 changes: 4 additions & 0 deletions app/ui/styles/components/spinner.css
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@
stroke: var(--content-default);
}

.spinner-secondary .path {
stroke: var(--content-secondary);
}

.spinner-primary .bg {
stroke: var(--content-accent);
}
Expand Down

0 comments on commit 7d11d67

Please sign in to comment.