Skip to content

Commit 5cc6927

Browse files
Merge pull request #50 from viamrobotics/refetch-if-empty-2
Only fetch resourceNames if machine status is 'Running'
2 parents 3f3c572 + ea611c1 commit 5cc6927

File tree

3 files changed

+32
-33
lines changed

3 files changed

+32
-33
lines changed

.changeset/major-cooks-read.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@viamrobotics/svelte-sdk': patch
3+
---
4+
5+
Only fetch resourceNames if machine status is 'Running'

src/lib/hooks/resource-names.svelte.ts

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import {
33
queryOptions,
44
type QueryObserverResult,
55
} from '@tanstack/svelte-query';
6-
import { MachineConnectionEvent, type ResourceName } from '@viamrobotics/sdk';
7-
import { getContext, setContext, untrack } from 'svelte';
6+
import type { ResourceName } from '@viamrobotics/sdk';
7+
import { getContext, setContext } from 'svelte';
88
import { fromStore, toStore } from 'svelte/store';
9-
import { useConnectionStatuses, useRobotClients } from './robot-clients.svelte';
9+
import { useRobotClients } from './robot-clients.svelte';
1010
import type { PartID } from '../part';
1111
import { useMachineStatuses } from './machine-status.svelte';
1212
import { useQueryLogger } from '$lib/query-logger';
@@ -16,11 +16,19 @@ const key = Symbol('resources-context');
1616

1717
type Query = QueryObserverResult<ResourceName[], Error>;
1818

19+
/** @todo(mp) Expose in the ts-sdk and remove */
20+
const MachineState = {
21+
Unspecified: 0,
22+
Initializing: 1,
23+
Running: 2,
24+
};
25+
1926
interface QueryContext {
2027
current: ResourceName[];
2128
error: Error | undefined;
2229
fetching: boolean;
2330
loading: boolean;
31+
pending: boolean;
2432
refetch: () => Promise<Query> | Promise<void>;
2533
}
2634

@@ -74,7 +82,6 @@ const sortResourceNames = (resourceNames: ResourceName[]) => {
7482
};
7583

7684
export const provideResourceNamesContext = () => {
77-
const connectionStatuses = useConnectionStatuses();
7885
const machineStatuses = useMachineStatuses();
7986
const clients = useRobotClients();
8087
const debug = useQueryLogger();
@@ -84,9 +91,12 @@ export const provideResourceNamesContext = () => {
8491
const results = [];
8592

8693
for (const partID of partIDs) {
94+
const machineStatus = machineStatuses.current[partID]?.data;
8795
const client = clients.current[partID];
8896
const options = queryOptions({
89-
enabled: client !== undefined,
97+
refetchOnMount: false,
98+
enabled:
99+
client !== undefined && machineStatus?.state === MachineState.Running,
90100
queryKey: [
91101
'viam-svelte-sdk',
92102
'partID',
@@ -147,38 +157,18 @@ export const provideResourceNamesContext = () => {
147157
});
148158

149159
/**
150-
* ResourceNames are not guaranteed on first fetch, refetch until they're populated
160+
* Refetch part resource names based on revision
151161
*/
152162
$effect(() => {
153163
for (const partID of partIDs) {
154-
const status = connectionStatuses.current[partID];
155-
const query = queries.current[partID];
156-
const connected = status === MachineConnectionEvent.CONNECTED;
157-
if (
158-
connected &&
159-
query?.isFetched &&
160-
!query.isLoading &&
161-
query.data?.length === 0
162-
) {
163-
untrack(() => debouncedRefetch[partID]?.());
164-
}
165-
}
166-
});
167-
168-
/**
169-
* Individually refetch part resource names based on revision
170-
*/
171-
$effect(() => {
172-
for (const partID of partIDs) {
173-
const revision =
174-
machineStatuses.current[partID]?.data?.config?.revision ?? '';
164+
const machineStatus = machineStatuses.current[partID]?.data;
165+
const revision = machineStatus?.config?.revision ?? '';
175166
const lastRevision = revisions.get(partID);
176-
revisions.set(partID, revision);
177167

178-
if (!lastRevision) continue;
168+
revisions.set(partID, revision);
179169

180-
if (revision !== lastRevision) {
181-
queries.current[partID]?.refetch();
170+
if (lastRevision && revision !== lastRevision) {
171+
debouncedRefetch[partID]?.();
182172
}
183173
}
184174
});
@@ -196,6 +186,7 @@ export const useResourceNames = (
196186
const error = $derived(query?.error ?? undefined);
197187
const fetching = $derived(query?.isFetching ?? true);
198188
const loading = $derived(query?.isLoading ?? true);
189+
const pending = $derived(query?.isPending ?? true);
199190

200191
const subtype = $derived(
201192
typeof resourceSubtype === 'function' ? resourceSubtype() : resourceSubtype
@@ -228,6 +219,9 @@ export const useResourceNames = (
228219
get loading() {
229220
return loading;
230221
},
222+
get pending() {
223+
return pending;
224+
},
231225
refetch() {
232226
return query?.refetch() ?? Promise.resolve();
233227
},

src/routes/components/parts.svelte

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ let streaming = true;
4242
<h2 class="py-2">Resources</h2>
4343
{#if resources.error}
4444
Error fetching: {resources.error.message}
45-
{:else if resources.fetching}
45+
{:else if resources.pending}
4646
<ul class="text-xs">Fetching...</ul>
47-
{:else if !resources.fetching && resources.current.length === 0}
47+
{:else if !resources.pending && resources.current.length === 0}
4848
No resources
4949
{:else}
5050
<ul class="text-xs">

0 commit comments

Comments
 (0)