UNPKG

haystack-react

Version:

Project Haystack utilities for building React applications

57 lines 2.39 kB
/* * Copyright (c) 2021, J2 Innovations. All Rights Reserved */ import { useEffect, useState } from 'react'; import { useClient } from './client'; import { useWatch } from './watch'; /** * A hook to use a record tag from an haystack server as react state. * * IMPORTANT: writing is currently only supported with a FIN 5/SkySpark server. * * IMPORTANT: This hooks requires a ClientContext to work. @see https://github.com/j2inn/haystack-nclient * * @example <caption>Example of usage for a precision tag of type Number.</caption> * * const record = useReadByFilter('precision and point and temp and zone and sp').grid[0] // One-shot reading the first record that matches the filter * const [precision, setPrecision, updatedRecord] = useHaystackRecordTag<HNum>(record, "precision") // Using its tag state * * @param originalRecord record dict used to retrieve id and initial value. * @param tagName name of the tag. * @param pollRate poll rate for the value subscription. Expressed in seconds. * @returns Returns the point value, a function to update it and the point dict. */ export function useHaystackRecordTag(originalRecord, tagName, pollRate = 5) { const [currentValue, setCurrentValue] = useState(); const [tagValue, record] = useReadHaystackRecordTag(originalRecord, tagName, pollRate); const write = useWriteHaystackRecordTag(originalRecord?.id, tagName); const writeFunc = write ? async (val) => { const result = await write?.(val); setCurrentValue(val); return result; } : undefined; useEffect(() => { setCurrentValue(tagValue); }, [tagValue]); return [currentValue, writeFunc, record]; } function useReadHaystackRecordTag(originalRecord, tag = '', pollRate = 5) { const { grid: [record], isLoading, } = useWatch({ ids: originalRecord?.id, pollRate: pollRate, }); return isLoading ? [originalRecord?.get(tag), originalRecord] : [record?.get(tag), record]; } function useWriteHaystackRecordTag(id, tag) { const client = useClient(); return id && tag ? (val) => client.ext.eval(val != null ? `read(id==${id?.toAxon()}).diff({${tag}:${val.toAxon()}}).commit` : `read(id==${id?.toAxon()}).diff({-${tag}}).commit`) : undefined; } //# sourceMappingURL=useHaystackRecordTag.js.map