@nullvoxpopuli/ember-composable-helpers
Version:
Composable helpers for Ember
34 lines (26 loc) • 838 B
text/typescript
import { helper } from '@ember/component/helper';
import { get } from '@ember/object';
import { set } from '@ember/object';
import { isPresent } from '@ember/utils';
function nextIndex(length: number, currentIdx: number) {
if (currentIdx === -1 || currentIdx + 1 === length) {
return 0;
}
return currentIdx + 1;
}
export function toggle<T>([prop, obj, ...values]: [
keyof T,
T,
...T[keyof T][],
]) {
return function () {
const currentValue = get(obj as object, prop as string);
if (isPresent(values)) {
const currentIdx = values.indexOf(currentValue as T[keyof T]);
const nextIdx = nextIndex(values.length, currentIdx);
return set(obj as object, prop as string, values[nextIdx]!);
}
return set(obj as object, prop as string, !currentValue);
};
}
export default helper(toggle);