interactive.ts

 1import { DeepPartial } from "utility-types";
 2import merge from "ts-deepmerge"
 3interface Interactive<T> {
 4  default: T,
 5  hover?: T,
 6  clicked?: T,
 7  disabled?: T,
 8}
 9
10// Helper function for creating Interactive<T> objects that works pretty much like Toggle<T>.
11// It takes a object to be used as a value for `default` field and then fills out other fields
12// with fields from either `base` or `modifications`. Notably, it does not touch `hover`, `clicked` and `disabled` if there are no modifications for it.
13export function interactive<T extends Object>(base: T, modifications: DeepPartial<Interactive<T>>): Interactive<T> {
14  let interactiveObj: Interactive<T> = {
15    default: base,
16  };
17  if (modifications.default !== undefined) {
18    interactiveObj.default = merge(interactiveObj.default, modifications.default) as T;
19  }
20  if (modifications.hover !== undefined) {
21    interactiveObj.hover = merge(interactiveObj.default, modifications.hover) as T;
22  }
23
24  if (modifications.clicked !== undefined) {
25    interactiveObj.clicked = merge(interactiveObj.default, modifications.clicked) as T;
26  }
27
28  if (modifications.disabled !== undefined) {
29    interactiveObj.disabled = merge(interactiveObj.default, modifications.disabled) as T;
30  }
31
32  return interactiveObj;
33}