diff --git a/packages/ui-sdk/src/hooks/index.ts b/packages/ui-sdk/src/hooks/index.ts index 131ae81ed..c595ed598 100644 --- a/packages/ui-sdk/src/hooks/index.ts +++ b/packages/ui-sdk/src/hooks/index.ts @@ -2,3 +2,5 @@ export { default as useDevice } from "./useDevice"; export { default as useQueryTelemetry } from "./useQueryTelemetry"; export { default as useQueryTelemetryByDays } from "./useQueryTelemetryByDays"; export { default as useLatestTelemetry } from "./useLatestTelemetry"; +export { default as useStream } from "./useStream"; +export { default as useStreamInTimeRange } from "./useStreamInTimeRange"; diff --git a/packages/ui-sdk/src/hooks/useStream.ts b/packages/ui-sdk/src/hooks/useStream.ts new file mode 100644 index 000000000..b12d78be6 --- /dev/null +++ b/packages/ui-sdk/src/hooks/useStream.ts @@ -0,0 +1,42 @@ +import { Authentication, Fleet } from "@formant/data-sdk"; +import * as React from "react"; + +interface Stream { + currentValue: any; + currentValueTime: string; + deviceId: string; + id: string; + organizationId: string; + streamName: string; + streamType: string; + tags?: any; +} + +const useStream = (streamName: string, deviceName: string) => { + const [stream, setStream] = React.useState(); + + React.useEffect(() => { + getStream(); + }, [stream]); + + const getStream = async () => { + try { + if (await Authentication.waitTilAuthenticated()) { + const _devices = await Fleet.getDevices(); + const _device = _devices.filter((_) => _.name === deviceName)[0]; + const _streams = await _device.getLatestTelemetry(); + const _stream = _streams.filter( + (_: Stream) => _.streamName === streamName + ); + + setStream(_stream[0].currentValue); + } + } catch (err) { + throw new Error(err as string); + } + }; + + return stream; +}; + +export default useStream; diff --git a/packages/ui-sdk/src/hooks/useStreamInTimeRange.ts b/packages/ui-sdk/src/hooks/useStreamInTimeRange.ts new file mode 100644 index 000000000..3a66c57f1 --- /dev/null +++ b/packages/ui-sdk/src/hooks/useStreamInTimeRange.ts @@ -0,0 +1,59 @@ +import { Authentication, Fleet } from "@formant/data-sdk"; +import * as React from "react"; + +type Point = [number, any]; + +interface TelemetryStream { + agentId: string; + deviceId: string; + name: string; + points: Point[]; + tags: any; + type: string; +} + +const useStreamInTimeRange = ( + streamName: string, + deviceName: string, + range?: number +) => { + //Range will be in seconds + const [stream, setStream] = React.useState(); + + React.useEffect(() => { + getStream(); + }, [stream]); + + const timeout = (ms: number) => { + return new Promise((resolve) => setTimeout(resolve, ms)); + }; + + const getStream = async () => { + await timeout(1000); + try { + if (await Authentication.waitTilAuthenticated()) { + const _devices = await Fleet.getDevices(); + const _device = _devices.filter((_) => _.name === deviceName)[0]; + const start = getStartISODate(range); + const end = new Date(); + const _telemetry = await _device.getTelemetry(streamName, start, end); + setStream(_telemetry[0].points); + } + } catch (err) { + throw new Error(err as string); + } + }; + + return stream; +}; + +const getStartISODate = (range: number | undefined) => { + if (range === undefined) range = 1; + let minuteInMilli = 60000; + minuteInMilli = minuteInMilli * range; + let startDate = Date.now(); + startDate = startDate - minuteInMilli; + return new Date(startDate); +}; + +export default useStreamInTimeRange;