The communications platform that puts data protection first.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
Rocket.Chat/client/hooks/useReactiveValue.ts

35 lines
848 B

import { Tracker } from 'meteor/tracker';
import { useMemo } from 'react';
import { Subscription, Unsubscribe, useSubscription } from 'use-subscription';
export const useReactiveValue = <T>(computeCurrentValue: () => T): T => {
const subscription: Subscription<T> = useMemo(() => {
const callbacks = new Set<Unsubscribe>();
let currentValue: T;
const computation = Tracker.autorun(() => {
currentValue = computeCurrentValue();
callbacks.forEach((callback) => {
callback();
});
});
return {
getCurrentValue: (): T => currentValue,
subscribe: (callback): Unsubscribe => {
callbacks.add(callback);
return (): void => {
callbacks.delete(callback);
if (callbacks.size === 0) {
computation.stop();
}
};
},
};
}, [computeCurrentValue]);
return useSubscription(subscription);
};