Skip to content

Commit a698060

Browse files
Merge branch 'main' into fix-disconnect
2 parents 7682e08 + 7317e44 commit a698060

File tree

7 files changed

+89
-19
lines changed

7 files changed

+89
-19
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# @viamrobotics/svelte-sdk
22

3+
## 0.2.0
4+
5+
### Minor Changes
6+
7+
- 59452ac: Add CameraImage and CameraStream components
8+
39
## 0.1.4
410

511
### Patch Changes

README.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,53 @@ $inspect(resources.fetching);
217217
</script>
218218
```
219219

220+
## Components
221+
222+
### `<CameraImage>`
223+
224+
Fetches a camera image at a constant interval and displays it in an `<img>` tag.
225+
226+
```svelte
227+
<script lang="ts">
228+
import { CameraImage } from '@viamrobotics/svelte-sdk';
229+
230+
interface Props {
231+
partID: string;
232+
name: string;
233+
}
234+
235+
let { partID, name }: Props = $props();
236+
</script>
237+
238+
<CameraImage
239+
{partID}
240+
{name}
241+
refetchInterval={2000}
242+
/>
243+
```
244+
245+
### `<CameraStream>`
246+
247+
Opens a camera stream and renders it in `<video>` tag.
248+
249+
```svelte
250+
<script lang="ts">
251+
import { CameraStream } from '@viamrobotics/svelte-sdk';
252+
253+
interface Props {
254+
partID: string;
255+
name: string;
256+
}
257+
258+
let { partID, name }: Props = $props();
259+
</script>
260+
261+
<CameraStream
262+
{partID}
263+
{name}
264+
/>
265+
```
266+
220267
## Developing
221268

222269
First install dependencies with `pnpm install`, then start a development server:

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@viamrobotics/svelte-sdk",
33
"description": "Build Svelte apps with Viam",
44
"license": "Apache-2.0",
5-
"version": "0.1.4",
5+
"version": "0.2.0",
66
"scripts": {
77
"dev": "vite dev",
88
"build": "vite build && npm run prepack",
Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,37 @@
11
<script lang="ts">
22
import { createResourceClient, createResourceQuery } from '$lib';
33
import { CameraClient } from '@viamrobotics/sdk';
4+
import type { HTMLImgAttributes } from 'svelte/elements';
45
5-
interface Props {
6+
interface Props extends HTMLImgAttributes {
67
partID: string;
78
name: string;
9+
refetchInterval?: number;
10+
mimeType?: string;
811
}
912
10-
let { partID, name }: Props = $props();
13+
let {
14+
partID,
15+
name,
16+
refetchInterval = 1000,
17+
width = '200',
18+
mimeType = 'image/png',
19+
...rest
20+
}: Props = $props();
1121
1222
const cameraClient = createResourceClient(
1323
CameraClient,
1424
() => partID,
1525
() => name
1626
);
1727
18-
const queryOptions = $state({
19-
refetchInterval: 1000,
20-
});
21-
const query = createResourceQuery(cameraClient, 'getImage', () => queryOptions);
28+
const query = createResourceQuery(cameraClient, 'getImage', () => ({
29+
refetchInterval,
30+
}));
2231
2332
const src = $derived(
2433
query.current.data
25-
? URL.createObjectURL(new Blob([query.current.data], { type: 'image/png' }))
34+
? URL.createObjectURL(new Blob([query.current.data], { type: mimeType }))
2635
: undefined
2736
);
2837
</script>
@@ -32,7 +41,7 @@ const src = $derived(
3241
{:else}
3342
<img
3443
{src}
35-
alt=""
36-
width="200"
44+
{width}
45+
{...rest}
3746
/>
3847
{/if}

src/routes/components/stream.svelte renamed to src/lib/components/stream.svelte

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
<script lang="ts">
22
import { createStreamClient } from '$lib';
3+
import type { HTMLVideoAttributes } from 'svelte/elements';
34
4-
interface Props {
5+
interface Props extends HTMLVideoAttributes {
56
partID: string;
67
name: string;
78
}
89
9-
let { partID, name }: Props = $props();
10+
let { partID, name, ...rest }: Props = $props();
1011
1112
let element: HTMLVideoElement;
1213
@@ -22,8 +23,6 @@ $effect(() => {
2223
$effect(() => {
2324
const [firstResolution] = client.resolutions ?? [];
2425
25-
console.log(firstResolution);
26-
2726
if (firstResolution) {
2827
client.setResolution(firstResolution);
2928
}
@@ -36,4 +35,5 @@ $effect(() => {
3635
controls={false}
3736
playsinline
3837
bind:this={element}
38+
{...rest}
3939
></video>

src/lib/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
export { default as ViamProvider } from './components/provider.svelte';
22

3+
// Components
4+
export { default as CameraImage } from './components/camera.svelte';
5+
export { default as CameraStream } from './components/stream.svelte';
6+
7+
// Hooks
38
export {
49
useConnectionStatus,
510
useRobotClient,

src/routes/components/parts.svelte

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
<script lang="ts">
2-
import { useConnectionStatus, useResourceNames } from '$lib';
2+
import {
3+
useConnectionStatus,
4+
useResourceNames,
5+
CameraImage,
6+
CameraStream,
7+
} from '$lib';
38
import { dialConfigs } from '../configs';
49
import Base from './base.svelte';
5-
import Camera from './camera.svelte';
6-
import Stream from './stream.svelte';
710
import Version from './version.svelte';
811
912
const partIDs = Object.keys(dialConfigs);
@@ -57,12 +60,12 @@ let streaming = true;
5760

5861
{#each cameras.current as { name } (name)}
5962
{#if streaming}
60-
<Stream
63+
<CameraStream
6164
{name}
6265
{partID}
6366
/>
6467
{:else}
65-
<Camera
68+
<CameraImage
6669
{name}
6770
{partID}
6871
/>

0 commit comments

Comments
 (0)