UNPKG

@studiometa/js-toolkit

Version:

A set of useful little bits of JavaScript to boost your project! 🚀

133 lines (132 loc) • 3.37 kB
import { usePointer, useRaf, useResize, useScroll, useKey } from "../../services/index.js"; import { AbstractManager } from "./AbstractManager.js"; import { noop, isFunction, isDefined, isDev } from "../../utils/index.js"; const SERVICES_MAP = { scrolled: useScroll, resized: useResize, ticked: useRaf, moved: usePointer, keyed: useKey }; const SERVICE_NAMES = Object.keys(SERVICES_MAP); class ServicesManager extends AbstractManager { /** * Custom props * @private */ __props = { ...SERVICES_MAP }; /** * Test if the given service is registered. */ has(service) { if (!((isFunction(this.__base[service]) || // @ts-ignore this.__base.__hasEvent(service)) && this.props[service])) { return false; } const { has } = this.props[service](); return has(this.__base.$id); } /** * Get a service props by name. */ get(service) { return this.props[service]().props(); } /** * Init the given service and bind it to the given instance. * * @param {ServiceNames} service The name of the service. * @return {() => void} A function to unbind the service. */ enable(service) { if (this.has(service)) { return this.disable.bind(this, service); } if ( // @ts-ignore !(isFunction(this.__base[service]) || this.__base.__hasEvent(service)) || !this.props[service] ) { return noop; } const serviceInstance = this.props[service](); serviceInstance.add(this.__base.$id, (...args) => this.__base.__callMethod(service, ...args)); return this.disable.bind(this, service); } /** * Enable all services and return methods to disable them. */ enableAll() { return Object.keys(this.props).map((serviceName) => this.enable(serviceName)); } /** * Disable all services. * * @return {void} */ disableAll() { for (const serviceName of Object.keys(this.props)) { this.disable(serviceName); } } /** * Disable a service. */ disable(service) { if (!this.props[service]) { return; } const { remove } = this.props[service](); remove(this.__base.$id); } /** * Toggle a service. */ toggle(service, force) { if (isDefined(force)) { if (force && !this.has(service)) { this.enable(service); } if (!force && this.has(service)) { this.disable(service); } } else if (this.has(service)) { this.disable(service); } else { this.enable(service); } } /** * Register a new service to be enabled/disabled. * * @param {string} name * The name of the service hook. * @param {<T>(...args:unknown[]) => ServiceInterface<T>} useFunction * The `use...` function for the service. */ register(name, useFunction) { this.props[name] = useFunction; this.__base.__addEmits(name); } /** * Unregister a new service to be enabled disabled. * * @param {string} name * The name of the service hook. */ unregister(name) { if (SERVICE_NAMES.includes(name)) { if (isDev) { throw new Error(`[ServicesManager] The \`${name}\` core service can not be unregistered.`); } return; } this.__base.__removeEmits(name); delete this.props[name]; } } export { ServicesManager }; //# sourceMappingURL=ServicesManager.js.map