22 lines
590 B
JavaScript
22 lines
590 B
JavaScript
// 3rd party.
|
|
import React, {useEffect, useState} from 'react';
|
|
|
|
export function usePropertyChange(object, property, defaultValue, reducer) {
|
|
const [value, setValue] = useState(defaultValue);
|
|
useEffect(() => {
|
|
if (!object) {
|
|
return;
|
|
}
|
|
const onValueChanged = () => {
|
|
const newValue = object[property];
|
|
setValue(reducer ? reducer(newValue) : newValue);
|
|
};
|
|
onValueChanged();
|
|
object.on(`${property}Changed`, onValueChanged);
|
|
return () => {
|
|
object.off(`${property}Changed`, onValueChanged);
|
|
};
|
|
}, [object, value]);
|
|
return value;
|
|
}
|