Last active
July 28, 2020 19:55
-
-
Save jordpo/94af6f864ffad1928513f123070d039f to your computer and use it in GitHub Desktop.
Ember href-to helper with service:router logic
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Helper from '@ember/component/helper'; | |
import { getOwner } from '@ember/application'; | |
interface QueryParams { | |
isQueryParams: boolean; | |
values: object; | |
} | |
type Param = number | string | QueryParams | object; | |
export function hrefTo(context: Helper, params: Array<Param>) { | |
const router = getOwner(context).lookup('service:router'); | |
if (!router._router || !router._router._routerMicrolib) return ''; | |
return router.urlFor(...getParamsForGenerateURL(params)); | |
} | |
function getParamsForGenerateURL(params: Array<Param>) { | |
params = params.slice(); // Create a copy | |
const targetRouteName = params.shift(); // The first param is always the target route name | |
const lastParam = params[params.length - 1] as QueryParams; // The last param might be queryParams | |
let queryParams; | |
if (lastParam && lastParam.isQueryParams) { | |
queryParams = params.pop()! as QueryParams; | |
queryParams = queryParams.values; | |
} else { | |
queryParams = {}; | |
} | |
const models = params; // The remainder are the models | |
return [ | |
targetRouteName, | |
...models, | |
{ queryParams }, | |
]; | |
} | |
export default Helper.extend({ | |
compute(params: Array<Param>, namedArgs: { params?: Array<Param>}) { | |
if (namedArgs.params) { | |
return hrefTo(this, namedArgs.params); | |
} | |
return hrefTo(this, params); | |
}, | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment