Skip to content

Commit

Permalink
Converted DebounceDecorator to functional component
Browse files Browse the repository at this point in the history
  • Loading branch information
ion-andrusciac-lgp committed Dec 11, 2024
1 parent 5e803d7 commit f4c02d6
Showing 1 changed file with 52 additions and 51 deletions.
103 changes: 52 additions & 51 deletions internal/DebounceDecorator/DebounceDecorator.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import hoc from '@enact/core/hoc';
import {Job} from '@enact/core/util';
import PropTypes from 'prop-types';
import {Component} from 'react';
import {useCallback, useEffect, useMemo} from 'react';

/**
* Default config for {@link sandstone/internal/DebounceDecorator.DebounceDecorator}.
Expand Down Expand Up @@ -60,66 +60,67 @@ const defaultConfig = {
const DebounceDecorator = hoc(defaultConfig, (config, Wrapped) => {
const {cancel, debounce, delay} = config;

return class extends Component {
static displayName = 'DebounceDecorator';

static propTypes = /** @lends sandstone/internal/DebounceDecorator.DebounceDecorator.prototype */ {
/**
* Handler for `onChange` events
*
* `'onChange'` can be changed to a different prop name by specifying the `debounce`
* config option.
*
* @see {@link sandstone/internal/DebounceDecorator.DebounceDecorator.defaultConfig#debounce}
* @name onChange
* @memberof sandstone/internal/DebounceDecorator.DebounceDecorator.prototype
* @type {Function}
* @public
*/
[debounce]: PropTypes.func
};

constructor (props) {
super(props);
this.job = new Job(this.emitEvent.bind(this), delay);
}

componentWillUnmount () {
this.job.stop();
}
const Debounce = (props) => {
let debounceProps = props;

emitEvent (ev) {
if (this.props[debounce]) {
this.props[debounce](ev);
const emitEvent = useCallback((ev) => {
if (props[debounce]) {
props[debounce](ev);
}
}

handleEvent = (ev) => {
this.job.start(ev);
};
}, [props]);

handleCancel = (ev) => {
if (this.props[cancel]) {
this.props[cancel](ev);
}
this.job.stop();
};
const job = useMemo(() => new Job(emitEvent, delay), [emitEvent]);

render () {
let props = this.props;
useEffect(() => {
return () => {
// eslint-disable-next-line react-hooks/exhaustive-deps
job.stop();
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

if (debounce || cancel) {
props = {...props};
const handleEvent = useCallback((ev) => {
job.start(ev);
}, [job]);

if (debounce) props[debounce] = this.handleEvent;
if (cancel) props[cancel] = this.handleCancel;
const handleCancel = useCallback((ev) => {
if (props[cancel]) {
props[cancel](ev);
}
job.stop();
}, [job, props]);

return (
<Wrapped {...props} />
);
if (debounce || cancel) {
debounceProps = {...props};

if (debounce) debounceProps[debounce] = handleEvent;
if (cancel) debounceProps[cancel] = handleCancel;
}

return (
<Wrapped {...debounceProps} />
);
};

Debounce.displayName = 'DebounceDecorator';

Debounce.propTypes = {/** @lends sandstone/internal/DebounceDecorator.DebounceDecorator.prototype */
/**
* Handler for `onChange` events
*
* `'onChange'` can be changed to a different prop name by specifying the `debounce`
* config option.
*
* @see {@link sandstone/internal/DebounceDecorator.DebounceDecorator.defaultConfig#debounce}
* @name onChange
* @memberof sandstone/internal/DebounceDecorator.DebounceDecorator.prototype
* @type {Function}
* @public
*/
[debounce]: PropTypes.func
};

return Debounce;
});

export default DebounceDecorator;
Expand Down

0 comments on commit f4c02d6

Please sign in to comment.