ember-route-task-helper
Version:
Easily access tasks defined on a route in your templates
40 lines (30 loc) • 1.23 kB
JavaScript
import { getOwner } from '@ember/application';
import { assert } from '@ember/debug';
import { get } from '@ember/object';
import { Task } from 'ember-concurrency/-task-property';
export function routeTaskFromRouterService(router, taskName, ...params) {
const task = findTaskInCurrentRouteHierarchy(router, taskName);
assert(`[ember-route-task-helper] Unable to find task ${taskName}`, task);
if (params.length) {
return task._curry(...params);
}
return task;
}
export default function routeTask(context, taskName, ...params) {
const router = getOwner(context).lookup('service:router');
assert('[ember-route-task-helper] Unable to lookup router service', router);
return routeTaskFromRouterService(router, taskName, ...params);
}
export function findTaskInCurrentRouteHierarchy(router, taskName) {
const owner = getOwner(router);
const routeSegments = get(router, 'currentRouteName').split('.');
for (let i = routeSegments.length; i >= 0; i--) {
const routeName = routeSegments.slice(0, i).join('.') || 'application';
const route = owner.lookup(`route:${routeName}`);
const task = get(route, taskName);
if (task instanceof Task) {
return task;
}
}
return null;
}