Skip to content

Commit 854657d

Browse files
committed
[ts-sdk] Add useSmelter hook to smelter-web-client
1 parent f5d64f2 commit 854657d

File tree

5 files changed

+43
-6
lines changed

5 files changed

+43
-6
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { useEffect, useRef, useState } from 'react';
2+
import Smelter from '../smelter/live';
3+
import type { SmelterInstanceOptions } from '../manager';
4+
5+
export function useSmelter(options: SmelterInstanceOptions): Smelter | undefined {
6+
const [smelter, setSmelter] = useState<Smelter>();
7+
const cleanUpPromise = useRef<Promise<void>>();
8+
9+
useEffect(() => {
10+
const smelter = new Smelter(options);
11+
12+
let cancel = false;
13+
// TODO(noituri): Add smelter.restart()
14+
const promise = (async () => {
15+
await cleanUpPromise.current;
16+
17+
await smelter.init();
18+
await smelter.start();
19+
if (!cancel) {
20+
setSmelter(smelter);
21+
}
22+
})();
23+
24+
return () => {
25+
cancel = true;
26+
cleanUpPromise.current = (async () => {
27+
await promise.catch(() => {});
28+
await smelter.terminate();
29+
})();
30+
};
31+
}, [options]);
32+
33+
return smelter;
34+
}

ts/smelter-web-client/src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import Smelter from './smelter/live';
22
import OfflineSmelter from './smelter/offline';
33

4+
export { useSmelter } from './hooks/useSmelter';
5+
export { SmelterInstanceOptions } from './manager';
46
export { OfflineSmelter };
7+
58
export default Smelter;

ts/smelter-web-client/src/manager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ import { sendRequest, sendMultipartRequest } from './fetch';
99
import { retry, sleep } from './utils';
1010
import { WebSocketConnection } from './ws';
1111

12-
export type InstanceOptions = {
12+
export type SmelterInstanceOptions = {
1313
url: string | URL;
1414
};
1515

1616
class RemoteInstanceManager implements SmelterManager {
1717
private url: URL;
1818
private wsConnection: WebSocketConnection;
1919

20-
constructor(opts: InstanceOptions) {
20+
constructor(opts: SmelterInstanceOptions) {
2121
let url: URL;
2222
if (opts.url instanceof URL) {
2323
url = opts.url;

ts/smelter-web-client/src/smelter/live.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ import { pino } from 'pino';
33
import type { Renderers } from '@swmansion/smelter';
44
import { Smelter as CoreSmelter } from '@swmansion/smelter-core';
55
import type { RegisterInput, RegisterOutput } from '../api';
6-
import type { InstanceOptions } from '../manager';
6+
import type { SmelterInstanceOptions } from '../manager';
77
import RemoteInstanceManager from '../manager';
88

99
export default class Smelter {
1010
private coreSmelter: CoreSmelter;
1111

12-
public constructor(opts: InstanceOptions) {
12+
public constructor(opts: SmelterInstanceOptions) {
1313
const logger = pino({
1414
level: 'warn',
1515
browser: {

ts/smelter-web-client/src/smelter/offline.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ import { OfflineSmelter as CoreSmelter } from '@swmansion/smelter-core';
33
import type { Renderers } from '@swmansion/smelter';
44
import { pino } from 'pino';
55
import type { RegisterInput, RegisterOutput } from '../api';
6-
import type { InstanceOptions } from '../manager';
6+
import type { SmelterInstanceOptions } from '../manager';
77
import RemoteInstanceManager from '../manager';
88

99
export default class OfflineSmelter {
1010
private coreSmelter: CoreSmelter;
1111

12-
public constructor(opts: InstanceOptions) {
12+
public constructor(opts: SmelterInstanceOptions) {
1313
const logger = pino({
1414
level: 'warn',
1515
browser: {

0 commit comments

Comments
 (0)