Skip to content

Commit

Permalink
feat(signal): addSignalListener
Browse files Browse the repository at this point in the history
  • Loading branch information
AliMD committed Feb 26, 2022
1 parent 36d8a33 commit e7c5742
Showing 1 changed file with 36 additions and 9 deletions.
45 changes: 36 additions & 9 deletions package/signal/src/signal.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {createLogger} from '@vatr/logger';
import type {ListenerOptions, DispatchOptions, ListenerCallback, RequestSignalOptions} from './type';
import {getSignalObject} from './core';
import type {ListenerOptions, DispatchOptions, ListenerCallback, ListenerObject} from './type';

const log = createLogger('vatr/signal');

Expand All @@ -11,17 +12,43 @@ const log = createLogger('vatr/signal');
*/
export function addSignalListener<SignalName extends keyof VatrSignals>(
signalName: SignalName,
signalCallback: ListenerCallback<VatrSignals[SignalName]>,
signalCallback: ListenerCallback<SignalName>,
options?: Partial<ListenerOptions>,
): symbol {
log('addSignalListener: %o', {signalName, options});
log('addSignalListener(`%s`, %o)', signalName, options);

const signal = getSignalObject(signalName);
const listener: ListenerObject<SignalName> = {
id: Symbol('Vatr Signal Listener'),
once: options?.once ?? false,
disabled: options?.disabled ?? false,
callback: signalCallback,
};

if (options?.priority) {
signal.priorityListenerList.push(listener);
} else {
signal.listenerList.push(listener);
}

// Run callback for old dispatch signal
if (!options?.once && 'value' in signal) {
if (options?.receivePrevious === 'Immediate') {
log('addSignalListener(`%s`): run callback(immediately)', signalName);
try {
signalCallback(signal.value);
} catch (err) {
console.error('addSignalListener(`%s`): signalCallback error! %o', signalName, err);
}
} else if (options?.receivePrevious === true) {
requestAnimationFrame(() => {
log('addSignalListener: run callback(delay): %s', signalName);
signalCallback(signal.value);
});
}
}

// return _addSignalListener(signalName, signalCallback as ListenerCallback, {
// once: false,
// capture: false,
// disabled: false,
// ...options,
// });
return listener.id;
}

/**
Expand Down

0 comments on commit e7c5742

Please sign in to comment.