haystack-react
Version:
Project Haystack utilities for building React applications
57 lines • 2.39 kB
JavaScript
/*
* 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