-
Notifications
You must be signed in to change notification settings - Fork 30
/
modifier-manager.ts
72 lines (57 loc) · 2.01 KB
/
modifier-manager.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import Ember from 'ember';
import { capabilities } from '@ember/modifier';
import { set } from '@ember/object';
import { schedule } from '@ember/runloop';
import ClassBasedModifier, {
DESTROYING,
DESTROYED,
InTeardown,
} from './modifier';
import { ModifierArgs } from 'ember-modifier/-private/interfaces';
function scheduleDestroy(modifier: ClassBasedModifier, meta: Ember.Meta): void {
if (modifier[DESTROYED]) {
return;
}
Ember.destroy(modifier);
meta.setSourceDestroyed();
modifier[DESTROYED] = true;
}
class ClassBasedModifierManager {
capabilities = capabilities('3.13');
createModifier(
factory: { owner: unknown; class: typeof ClassBasedModifier },
args: ModifierArgs
): ClassBasedModifier {
// TODO: stop getting the owner off the factory like this; it is *not* per
// the spec. See https://github.com/ember-modifier/ember-modifier/issues/25
const { owner, class: modifier } = factory;
return new modifier(owner, args);
}
installModifier(instance: ClassBasedModifier, element: Element): void {
instance.element = element;
instance.didReceiveArguments();
instance.didInstall();
}
updateModifier(instance: ClassBasedModifier, args: ModifierArgs): void {
// TODO: this should be an args proxy
set(instance, 'args', args);
instance.didUpdateArguments();
instance.didReceiveArguments();
}
// Uses `InTeardown<ClassBasedModifier>` to correctly model the type of
// `element` at this point in the lifecycle. This is safe because this manager
// is what *defines* that lifecycle behavior.
destroyModifier(instance: InTeardown<ClassBasedModifier>): void {
instance.willRemove();
instance.element = null;
if (instance[DESTROYING]) {
return;
}
const meta = Ember.meta(instance);
meta.setSourceDestroying();
instance[DESTROYING] = true;
schedule('actions', instance, instance.willDestroy);
schedule('destroy', undefined, scheduleDestroy, instance, meta);
}
}
export default new ClassBasedModifierManager();