@symbiote-native/angular 0.8.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -10
- package/babel-register-composed.cjs +58 -18
- package/bin/symbiote-angular-dev.cjs +16 -4
- package/build/angular/anchor-host-registry.js +1 -15
- package/build/angular/anchor-host-registry.js.map +1 -1
- package/build/angular/change-detection-flush.d.ts +31 -0
- package/build/angular/change-detection-flush.js +110 -0
- package/build/angular/change-detection-flush.js.map +1 -0
- package/build/angular/components/activity-indicator-props.d.ts +2 -0
- package/build/angular/components/activity-indicator-props.js +2 -0
- package/build/angular/components/activity-indicator-props.js.map +1 -0
- package/build/angular/components/button-props.d.ts +2 -0
- package/build/angular/components/button-props.js +2 -0
- package/build/angular/components/button-props.js.map +1 -0
- package/build/angular/components/flat-list/index.d.ts +2 -1
- package/build/angular/components/flat-list/index.js +22 -10
- package/build/angular/components/flat-list/index.js.map +1 -1
- package/build/angular/components/image-background-props.d.ts +6 -0
- package/build/angular/components/image-background-props.js +2 -0
- package/build/angular/components/image-background-props.js.map +1 -0
- package/build/angular/components/{image/shared.d.ts → image-shared.d.ts} +4 -4
- package/build/angular/components/{image/shared.js → image-shared.js} +39 -28
- package/build/angular/components/image-shared.js.map +1 -0
- package/build/angular/components/input-accessory-view-props.d.ts +7 -0
- package/build/angular/components/input-accessory-view-props.js +9 -0
- package/build/angular/components/input-accessory-view-props.js.map +1 -0
- package/build/angular/components/keyboard-avoiding-view/index.d.ts +2 -1
- package/build/angular/components/keyboard-avoiding-view/index.js +28 -27
- package/build/angular/components/keyboard-avoiding-view/index.js.map +1 -1
- package/build/angular/components/modal/index.d.ts +2 -0
- package/build/angular/components/modal/index.js +33 -20
- package/build/angular/components/modal/index.js.map +1 -1
- package/build/angular/components/pressable-props.d.ts +32 -0
- package/build/angular/components/pressable-props.js +11 -0
- package/build/angular/components/pressable-props.js.map +1 -0
- package/build/angular/components/refresh-control-props.d.ts +16 -0
- package/build/angular/components/refresh-control-props.js +14 -0
- package/build/angular/components/refresh-control-props.js.map +1 -0
- package/build/angular/components/safe-area-view-props.d.ts +7 -0
- package/build/angular/components/safe-area-view-props.js +11 -0
- package/build/angular/components/safe-area-view-props.js.map +1 -0
- package/build/angular/components/scroll-view-props.d.ts +76 -0
- package/build/angular/components/scroll-view-props.js +18 -0
- package/build/angular/components/scroll-view-props.js.map +1 -0
- package/build/angular/components/section-list/index.d.ts +3 -0
- package/build/angular/components/section-list/index.js +10 -1
- package/build/angular/components/section-list/index.js.map +1 -1
- package/build/angular/components/text-input-props.d.ts +45 -0
- package/build/angular/components/text-input-props.js +18 -0
- package/build/angular/components/text-input-props.js.map +1 -0
- package/build/angular/components/touchable-native-feedback/touchable-native-feedback-props.d.ts +6 -0
- package/build/angular/components/touchable-native-feedback/touchable-native-feedback-props.js +2 -0
- package/build/angular/components/touchable-native-feedback/touchable-native-feedback-props.js.map +1 -0
- package/build/angular/components/touchable-props.d.ts +14 -0
- package/build/angular/components/touchable-props.js +13 -0
- package/build/angular/components/touchable-props.js.map +1 -0
- package/build/angular/components/touchable-without-feedback/touchable-without-feedback-props.d.ts +3 -0
- package/build/angular/components/touchable-without-feedback/touchable-without-feedback-props.js +2 -0
- package/build/angular/components/touchable-without-feedback/touchable-without-feedback-props.js.map +1 -0
- package/build/angular/components/virtualized-list/index.d.ts +8 -1
- package/build/angular/components/virtualized-list/index.js +373 -278
- package/build/angular/components/virtualized-list/index.js.map +1 -1
- package/build/angular/components/virtualized-section-list/index.d.ts +3 -0
- package/build/angular/components/virtualized-section-list/index.js +10 -1
- package/build/angular/components/virtualized-section-list/index.js.map +1 -1
- package/build/angular/components.d.ts +21 -27
- package/build/angular/components.js +13 -15
- package/build/angular/components.js.map +1 -1
- package/build/angular/create-portal/index.d.ts +11 -2
- package/build/angular/create-portal/index.js +37 -11
- package/build/angular/create-portal/index.js.map +1 -1
- package/build/angular/create-tunnel/index.js +1 -1
- package/build/angular/element-props.d.ts +53 -0
- package/build/angular/element-props.js +2 -0
- package/build/angular/element-props.js.map +1 -0
- package/build/angular/elements.d.ts +528 -0
- package/build/angular/elements.js +1444 -0
- package/build/angular/elements.js.map +1 -0
- package/build/angular/gate-demand.d.ts +37 -0
- package/build/angular/gate-demand.js +84 -0
- package/build/angular/gate-demand.js.map +1 -0
- package/build/angular/host-instance/index.js +1 -1
- package/build/angular/index.d.ts +5 -2
- package/build/angular/index.js +16 -1
- package/build/angular/index.js.map +1 -1
- package/build/angular/modules/animated/create-animated-component.d.ts +6 -6
- package/build/angular/modules/animated/create-animated-component.js +73 -81
- package/build/angular/modules/animated/create-animated-component.js.map +1 -1
- package/build/angular/modules/animated/index.js +1 -1
- package/build/angular/modules/animated/index.js.map +1 -1
- package/build/angular/modules/image/index.d.ts +3 -0
- package/build/angular/modules/image/index.js +16 -0
- package/build/angular/modules/image/index.js.map +1 -0
- package/build/angular/primitives/index.d.ts +28 -16
- package/build/angular/primitives/index.js +77 -31
- package/build/angular/primitives/index.js.map +1 -1
- package/build/angular/primitives/shared.d.ts +2 -3
- package/build/angular/primitives/shared.js +8 -53
- package/build/angular/primitives/shared.js.map +1 -1
- package/build/angular/register.d.ts +1 -0
- package/build/angular/register.js +16 -0
- package/build/angular/register.js.map +1 -0
- package/build/angular/render/index.js +4 -2
- package/build/angular/render/index.js.map +1 -1
- package/build/angular/renderer/index.js +207 -60
- package/build/angular/renderer/index.js.map +1 -1
- package/build/angular/renderer/value-change.d.ts +2 -0
- package/build/angular/renderer/value-change.js +9 -0
- package/build/angular/renderer/value-change.js.map +1 -0
- package/metro-config.cjs +23 -5
- package/metro-css-parser.cjs +2 -1
- package/package.json +17 -7
- package/src/anchor-host-registry.ts +1 -15
- package/src/change-detection-flush.ts +120 -0
- package/src/components/activity-indicator-props.ts +21 -0
- package/src/components/button-props.ts +26 -0
- package/src/components/flat-list/index.ts +12 -4
- package/src/components/image-background-props.ts +24 -0
- package/src/components/{image/shared.ts → image-shared.ts} +57 -26
- package/src/components/input-accessory-view-props.ts +21 -0
- package/src/components/keyboard-avoiding-view/index.ts +27 -16
- package/src/components/modal/index.ts +32 -11
- package/src/components/pressable-props.ts +73 -0
- package/src/components/refresh-control-props.ts +43 -0
- package/src/components/safe-area-view-props.ts +28 -0
- package/src/components/scroll-view-props.ts +109 -0
- package/src/components/section-list/index.ts +18 -0
- package/src/components/text-input-props.ts +72 -0
- package/src/components/touchable-native-feedback/touchable-native-feedback-props.ts +23 -0
- package/src/components/touchable-props.ts +30 -0
- package/src/components/touchable-without-feedback/touchable-without-feedback-props.ts +21 -0
- package/src/components/virtualized-list/index.ts +254 -153
- package/src/components/virtualized-section-list/index.ts +18 -0
- package/src/components.ts +86 -35
- package/src/create-portal/index.ts +39 -9
- package/src/create-tunnel/index.ts +1 -1
- package/src/diagnostics.ts +1 -1
- package/src/element-props.ts +90 -0
- package/src/elements.ts +919 -0
- package/src/gate-demand.ts +109 -0
- package/src/host-instance/index.ts +1 -1
- package/src/index.ts +54 -15
- package/src/modules/animated/create-animated-component.ts +73 -59
- package/src/modules/animated/index.ts +1 -1
- package/src/modules/image/index.ts +18 -0
- package/src/primitives/index.ts +47 -16
- package/src/primitives/shared.ts +11 -44
- package/src/register.ts +15 -0
- package/src/render/index.ts +4 -2
- package/src/renderer/index.ts +239 -80
- package/src/renderer/value-change.ts +8 -0
- package/build/angular/components/activity-indicator/index.android.d.ts +0 -13
- package/build/angular/components/activity-indicator/index.android.js +0 -29
- package/build/angular/components/activity-indicator/index.android.js.map +0 -1
- package/build/angular/components/activity-indicator/index.d.ts +0 -1
- package/build/angular/components/activity-indicator/index.ios.d.ts +0 -9
- package/build/angular/components/activity-indicator/index.ios.js +0 -26
- package/build/angular/components/activity-indicator/index.ios.js.map +0 -1
- package/build/angular/components/activity-indicator/index.js +0 -4
- package/build/angular/components/activity-indicator/index.js.map +0 -1
- package/build/angular/components/activity-indicator/shared.d.ts +0 -67
- package/build/angular/components/activity-indicator/shared.js +0 -260
- package/build/angular/components/activity-indicator/shared.js.map +0 -1
- package/build/angular/components/button.d.ts +0 -65
- package/build/angular/components/button.js +0 -351
- package/build/angular/components/button.js.map +0 -1
- package/build/angular/components/image/index.android.d.ts +0 -15
- package/build/angular/components/image/index.android.js +0 -91
- package/build/angular/components/image/index.android.js.map +0 -1
- package/build/angular/components/image/index.d.ts +0 -1
- package/build/angular/components/image/index.ios.d.ts +0 -15
- package/build/angular/components/image/index.ios.js +0 -91
- package/build/angular/components/image/index.ios.js.map +0 -1
- package/build/angular/components/image/index.js +0 -3
- package/build/angular/components/image/index.js.map +0 -1
- package/build/angular/components/image/shared.js.map +0 -1
- package/build/angular/components/image-background.d.ts +0 -82
- package/build/angular/components/image-background.js +0 -434
- package/build/angular/components/image-background.js.map +0 -1
- package/build/angular/components/input-accessory-view/index.d.ts +0 -65
- package/build/angular/components/input-accessory-view/index.js +0 -290
- package/build/angular/components/input-accessory-view/index.js.map +0 -1
- package/build/angular/components/pressable/index.d.ts +0 -129
- package/build/angular/components/pressable/index.js +0 -473
- package/build/angular/components/pressable/index.js.map +0 -1
- package/build/angular/components/refresh-control/index.d.ts +0 -90
- package/build/angular/components/refresh-control/index.js +0 -380
- package/build/angular/components/refresh-control/index.js.map +0 -1
- package/build/angular/components/safe-area-view/index.d.ts +0 -62
- package/build/angular/components/safe-area-view/index.js +0 -287
- package/build/angular/components/safe-area-view/index.js.map +0 -1
- package/build/angular/components/scroll-view/index.android.d.ts +0 -20
- package/build/angular/components/scroll-view/index.android.js +0 -262
- package/build/angular/components/scroll-view/index.android.js.map +0 -1
- package/build/angular/components/scroll-view/index.d.ts +0 -3
- package/build/angular/components/scroll-view/index.ios.d.ts +0 -8
- package/build/angular/components/scroll-view/index.ios.js +0 -92
- package/build/angular/components/scroll-view/index.ios.js.map +0 -1
- package/build/angular/components/scroll-view/index.js +0 -6
- package/build/angular/components/scroll-view/index.js.map +0 -1
- package/build/angular/components/scroll-view/projection.d.ts +0 -67
- package/build/angular/components/scroll-view/projection.js +0 -560
- package/build/angular/components/scroll-view/projection.js.map +0 -1
- package/build/angular/components/scroll-view/shared.d.ts +0 -239
- package/build/angular/components/scroll-view/shared.js +0 -832
- package/build/angular/components/scroll-view/shared.js.map +0 -1
- package/build/angular/components/scroll-view/sticky-header.d.ts +0 -40
- package/build/angular/components/scroll-view/sticky-header.js +0 -224
- package/build/angular/components/scroll-view/sticky-header.js.map +0 -1
- package/build/angular/components/switch/index.android.d.ts +0 -24
- package/build/angular/components/switch/index.android.js +0 -112
- package/build/angular/components/switch/index.android.js.map +0 -1
- package/build/angular/components/switch/index.d.ts +0 -1
- package/build/angular/components/switch/index.ios.d.ts +0 -23
- package/build/angular/components/switch/index.ios.js +0 -111
- package/build/angular/components/switch/index.ios.js.map +0 -1
- package/build/angular/components/switch/index.js +0 -4
- package/build/angular/components/switch/index.js.map +0 -1
- package/build/angular/components/switch/shared.d.ts +0 -49
- package/build/angular/components/switch/shared.js +0 -191
- package/build/angular/components/switch/shared.js.map +0 -1
- package/build/angular/components/text-input.d.ts +0 -161
- package/build/angular/components/text-input.js +0 -659
- package/build/angular/components/text-input.js.map +0 -1
- package/build/angular/components/touchable/index.d.ts +0 -276
- package/build/angular/components/touchable/index.js +0 -1422
- package/build/angular/components/touchable/index.js.map +0 -1
- package/build/angular/components/touchable-native-feedback/index.d.ts +0 -86
- package/build/angular/components/touchable-native-feedback/index.js +0 -407
- package/build/angular/components/touchable-native-feedback/index.js.map +0 -1
- package/src/components/activity-indicator/index.android.ts +0 -23
- package/src/components/activity-indicator/index.ios.ts +0 -21
- package/src/components/activity-indicator/index.ts +0 -4
- package/src/components/activity-indicator/shared.ts +0 -225
- package/src/components/button.ts +0 -220
- package/src/components/image/index.android.ts +0 -99
- package/src/components/image/index.ios.ts +0 -99
- package/src/components/image/index.ts +0 -3
- package/src/components/image-background.ts +0 -290
- package/src/components/input-accessory-view/index.ts +0 -240
- package/src/components/pressable/index.ts +0 -462
- package/src/components/refresh-control/index.ts +0 -340
- package/src/components/safe-area-view/index.ts +0 -231
- package/src/components/scroll-view/index.android.ts +0 -205
- package/src/components/scroll-view/index.ios.ts +0 -81
- package/src/components/scroll-view/index.ts +0 -7
- package/src/components/scroll-view/projection.ts +0 -713
- package/src/components/scroll-view/shared.ts +0 -1066
- package/src/components/scroll-view/sticky-header.ts +0 -267
- package/src/components/switch/index.android.ts +0 -113
- package/src/components/switch/index.ios.ts +0 -112
- package/src/components/switch/index.ts +0 -4
- package/src/components/switch/shared.ts +0 -284
- package/src/components/text-input.ts +0 -613
- package/src/components/touchable/index.ts +0 -913
- package/src/components/touchable-native-feedback/index.ts +0 -317
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ChangeDetectorRef,
|
|
3
|
-
Directive,
|
|
4
|
-
EventEmitter,
|
|
5
|
-
Output,
|
|
6
|
-
computed,
|
|
7
|
-
inject,
|
|
8
|
-
signal,
|
|
9
|
-
type OnChanges,
|
|
10
|
-
} from '@angular/core';
|
|
11
|
-
import type { ControlValueAccessor } from '@angular/forms';
|
|
12
|
-
import {
|
|
13
|
-
renderSwitch,
|
|
14
|
-
resolveAccessibilityProps,
|
|
15
|
-
} from '@symbiote-native/components';
|
|
16
|
-
import type {
|
|
17
|
-
ISwitchPlatform,
|
|
18
|
-
ISwitchProps,
|
|
19
|
-
ISwitchState,
|
|
20
|
-
ISwitchTrackColor,
|
|
21
|
-
} from '@symbiote-native/components';
|
|
22
|
-
import {
|
|
23
|
-
createInitialSwitchState,
|
|
24
|
-
shouldSnapBack,
|
|
25
|
-
switchReducer,
|
|
26
|
-
valueFromChange,
|
|
27
|
-
} from '@symbiote-native/components';
|
|
28
|
-
import {
|
|
29
|
-
dispatchViewCommand,
|
|
30
|
-
dlog,
|
|
31
|
-
isSymbioteNode,
|
|
32
|
-
whenCommitted,
|
|
33
|
-
type ISymbioteEvent,
|
|
34
|
-
type ISymbioteNode,
|
|
35
|
-
type IStyleProp,
|
|
36
|
-
type IViewStyle,
|
|
37
|
-
} from '@symbiote-native/engine';
|
|
38
|
-
|
|
39
|
-
export type {
|
|
40
|
-
ISwitchProps,
|
|
41
|
-
ISwitchTrackColor,
|
|
42
|
-
} from '@symbiote-native/components';
|
|
43
|
-
|
|
44
|
-
export type ISwitchInputs = Pick<
|
|
45
|
-
ISwitchProps,
|
|
46
|
-
| 'value'
|
|
47
|
-
| 'disabled'
|
|
48
|
-
| 'trackColor'
|
|
49
|
-
| 'thumbColor'
|
|
50
|
-
| 'ios_backgroundColor'
|
|
51
|
-
| 'style'
|
|
52
|
-
| 'nativeID'
|
|
53
|
-
| 'testID'
|
|
54
|
-
| 'accessibilityLabel'
|
|
55
|
-
| 'accessibilityRole'
|
|
56
|
-
| 'accessibilityState'
|
|
57
|
-
| 'accessibilityValue'
|
|
58
|
-
| 'accessibilityHint'
|
|
59
|
-
| 'accessible'
|
|
60
|
-
| 'role'
|
|
61
|
-
| 'aria-label'
|
|
62
|
-
| 'aria-disabled'
|
|
63
|
-
| 'aria-checked'
|
|
64
|
-
>;
|
|
65
|
-
|
|
66
|
-
type ISwitchHostPlatform = ISwitchPlatform & { snapBackCommand: string };
|
|
67
|
-
|
|
68
|
-
type IHostProps = Record<string, unknown>;
|
|
69
|
-
|
|
70
|
-
function readSwitchNode(value: unknown): ISymbioteNode | null {
|
|
71
|
-
if (isSymbioteNode(value)) return value;
|
|
72
|
-
if (
|
|
73
|
-
typeof value === 'object' &&
|
|
74
|
-
value !== null &&
|
|
75
|
-
'node' in value &&
|
|
76
|
-
isSymbioteNode(value.node)
|
|
77
|
-
) {
|
|
78
|
-
return value.node;
|
|
79
|
-
}
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function isSwitchEvent(event: unknown): event is ISymbioteEvent {
|
|
84
|
-
return (
|
|
85
|
-
typeof event === 'object' &&
|
|
86
|
-
event !== null &&
|
|
87
|
-
'nativeEvent' in event &&
|
|
88
|
-
typeof event.nativeEvent === 'object' &&
|
|
89
|
-
event.nativeEvent !== null
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// @Directive() (no selector) is the Angular-sanctioned decorator for an abstract base whose
|
|
94
|
-
// concrete subclasses are real @Components — ngc's AOT build (NG2007) requires it the moment the
|
|
95
|
-
// base itself carries decorated members (@Output() here), mirroring ScrollViewBase.
|
|
96
|
-
@Directive()
|
|
97
|
-
export abstract class SwitchBase
|
|
98
|
-
implements ISwitchInputs, ControlValueAccessor, OnChanges
|
|
99
|
-
{
|
|
100
|
-
// The value/change lifecycle as real Angular events: `(valueChange)="onToggle($event)"`, not
|
|
101
|
-
// `[onValueChange]="onToggle"` — mirrors Pressable's press/hover @Output() conversion. Unlike
|
|
102
|
-
// Pressable's createPressHandlers, handleChange() below calls `.emit()` unconditionally: it needs
|
|
103
|
-
// no "was this bound" adapter because EventEmitter.emit() is already a safe no-op with no subscribers.
|
|
104
|
-
@Output() readonly valueChange = new EventEmitter<boolean>();
|
|
105
|
-
@Output() readonly change = new EventEmitter<ISymbioteEvent>();
|
|
106
|
-
value: boolean | undefined;
|
|
107
|
-
disabled: boolean | undefined;
|
|
108
|
-
trackColor: ISwitchTrackColor | undefined;
|
|
109
|
-
thumbColor: string | undefined;
|
|
110
|
-
ios_backgroundColor: string | undefined;
|
|
111
|
-
style: IStyleProp<IViewStyle> | undefined;
|
|
112
|
-
nativeID: string | undefined;
|
|
113
|
-
testID: string | undefined;
|
|
114
|
-
accessibilityLabel: string | undefined;
|
|
115
|
-
accessibilityRole: ISwitchInputs['accessibilityRole'];
|
|
116
|
-
accessibilityState: ISwitchInputs['accessibilityState'];
|
|
117
|
-
accessibilityValue: ISwitchInputs['accessibilityValue'];
|
|
118
|
-
accessibilityHint: string | undefined;
|
|
119
|
-
accessible: boolean | undefined;
|
|
120
|
-
role: ISwitchInputs['role'];
|
|
121
|
-
'aria-label': string | undefined;
|
|
122
|
-
'aria-disabled': boolean | undefined;
|
|
123
|
-
'aria-checked': boolean | 'mixed' | undefined;
|
|
124
|
-
|
|
125
|
-
protected abstract readonly platform: ISwitchHostPlatform;
|
|
126
|
-
// NOT a hostProps dependency - only snapBackIfNeeded reads it, and the bag's `value` comes from
|
|
127
|
-
// the @Input, not from this reducer state. So it stays a plain field; if a future change makes
|
|
128
|
-
// the bag read it, it must become a signal first (see inputsRevision's note).
|
|
129
|
-
private switchState: ISwitchState = createInitialSwitchState();
|
|
130
|
-
// Only setDisabledState()/writeValue() need this: @angular/forms mutates `value`/`disabled` from
|
|
131
|
-
// OUTSIDE Angular's own binding path, which doesn't itself schedule a tick under zoneless CD.
|
|
132
|
-
private readonly changeDetector = inject(ChangeDetectorRef);
|
|
133
|
-
|
|
134
|
-
// Bridges the non-reactive @Input fields into the reactive graph so hostProps below can be a
|
|
135
|
-
// memoized computed(). Signal inputs would make this unnecessary, but `input()` is visible only
|
|
136
|
-
// to the AOT compiler and this package's unit suite runs on JIT - see the
|
|
137
|
-
// `angular-adapter-change-detection` skill, §6. `signal()`/`computed()` are plain runtime APIs
|
|
138
|
-
// and need no compiler support, which is what makes this bridge possible at all.
|
|
139
|
-
//
|
|
140
|
-
// Bumped from ngOnChanges (covers every @Input) AND from the two ControlValueAccessor writers
|
|
141
|
-
// below, which assign `value`/`disabled` from OUTSIDE Angular's binding path and so never reach
|
|
142
|
-
// ngOnChanges. ONLY a genuine dependency of the bag may bump it - widening it to "bump on
|
|
143
|
-
// everything" silently un-memoizes the bag and defeats the point. State that is not an @Input
|
|
144
|
-
// and is not one of those two writers needs its OWN signal instead (the platform components'
|
|
145
|
-
// anchor style is exactly that case).
|
|
146
|
-
private readonly inputsRevision = signal(0);
|
|
147
|
-
|
|
148
|
-
ngOnChanges(): void {
|
|
149
|
-
this.inputsRevision.update(revision => revision + 1);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// MEASURED 2026-08-16: as a getter this rebuilt the bag on every refresh of this view, so
|
|
153
|
-
// `[symbioteHostProps]`'s reference check failed every time and every key was re-pushed through
|
|
154
|
-
// Renderer2 -> routeProp - pure waste when nothing changed. computed() returns the SAME object
|
|
155
|
-
// until a tracked dependency actually changes, and the input setter then skips the whole spread.
|
|
156
|
-
//
|
|
157
|
-
// A computed FIELD cannot be overridden by a subclass accessor the way a getter can, so the
|
|
158
|
-
// platform components override buildHostProps() below and this stays the single memoization
|
|
159
|
-
// point for every platform.
|
|
160
|
-
readonly hostProps = computed<IHostProps>(() => {
|
|
161
|
-
this.inputsRevision();
|
|
162
|
-
return this.buildHostProps();
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
protected buildHostProps(): IHostProps {
|
|
166
|
-
const props = resolveAccessibilityProps(this.inputProps());
|
|
167
|
-
const {
|
|
168
|
-
value,
|
|
169
|
-
disabled,
|
|
170
|
-
trackColor,
|
|
171
|
-
thumbColor,
|
|
172
|
-
ios_backgroundColor,
|
|
173
|
-
style,
|
|
174
|
-
onValueChange: _onValueChange,
|
|
175
|
-
...passthrough
|
|
176
|
-
} = props;
|
|
177
|
-
|
|
178
|
-
return renderSwitch(
|
|
179
|
-
{
|
|
180
|
-
value: value === true,
|
|
181
|
-
disabled,
|
|
182
|
-
trackColor,
|
|
183
|
-
thumbColor,
|
|
184
|
-
ios_backgroundColor,
|
|
185
|
-
style,
|
|
186
|
-
passthrough,
|
|
187
|
-
},
|
|
188
|
-
this.platform,
|
|
189
|
-
).props;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
handleChange(event: unknown, node: unknown): void {
|
|
193
|
-
if (!isSwitchEvent(event)) return;
|
|
194
|
-
this.change.emit(event);
|
|
195
|
-
const next = valueFromChange(event);
|
|
196
|
-
dlog(
|
|
197
|
-
`Switch onChange value=${String(next)} eventCount=${String(event.nativeEvent.eventCount)}`,
|
|
198
|
-
);
|
|
199
|
-
if (next === undefined) return;
|
|
200
|
-
|
|
201
|
-
this.valueChange.emit(next);
|
|
202
|
-
this.switchState = switchReducer(this.switchState, {
|
|
203
|
-
type: 'native-reported',
|
|
204
|
-
value: next,
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
const hostNode = readSwitchNode(node);
|
|
208
|
-
if (hostNode === null) return;
|
|
209
|
-
queueMicrotask(() => this.snapBackIfNeeded(hostNode));
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
private snapBackIfNeeded(node: ISymbioteNode): void {
|
|
213
|
-
const fabricValue = this.value === true;
|
|
214
|
-
if (!shouldSnapBack(this.switchState, fabricValue)) {
|
|
215
|
-
dlog(
|
|
216
|
-
`Switch snap-back no-op reported=${String(this.switchState.lastNativeReport)} value=${fabricValue}`,
|
|
217
|
-
);
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
dlog(
|
|
222
|
-
`Switch ${this.platform.snapBackCommand} snap-back reported=${String(this.switchState.lastNativeReport)} value=${fabricValue}`,
|
|
223
|
-
);
|
|
224
|
-
whenCommitted(node, () => {
|
|
225
|
-
dispatchViewCommand(node, this.platform.snapBackCommand, [fabricValue]);
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// ControlValueAccessor — `value` is a plain field feeding `hostProps` on every CD check, no
|
|
230
|
-
// ngOnChanges/stale-safe commit dance to guard (unlike TextInput, a boolean toggle has no
|
|
231
|
-
// keystroke to race), so writeValue()/setDisabledState() can set it straight.
|
|
232
|
-
writeValue(value: boolean | null): void {
|
|
233
|
-
this.value = value ?? false;
|
|
234
|
-
// `value` feeds hostProps but this write bypasses Angular's binding path, so ngOnChanges never
|
|
235
|
-
// fires for it - without the bump the memoized bag would keep reporting the old value and the
|
|
236
|
-
// switch would stop reflecting a form-driven change.
|
|
237
|
-
this.inputsRevision.update(revision => revision + 1);
|
|
238
|
-
this.changeDetector.markForCheck();
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
registerOnChange(fn: (value: boolean) => void): void {
|
|
242
|
-
this.valueChange.subscribe(fn);
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
registerOnTouched(fn: () => void): void {
|
|
246
|
-
// Switch has no blur concept (it's a discrete toggle, not a text field) — `change` is the
|
|
247
|
-
// closest touched signal, same convention Angular's own checkbox CVAs use.
|
|
248
|
-
this.change.subscribe(() => fn());
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
setDisabledState(isDisabled: boolean): void {
|
|
252
|
-
this.disabled = isDisabled;
|
|
253
|
-
// Same reason as writeValue: an @angular/forms write that never reaches ngOnChanges.
|
|
254
|
-
this.inputsRevision.update(revision => revision + 1);
|
|
255
|
-
this.changeDetector.markForCheck();
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
private inputProps(): Partial<ISwitchProps> {
|
|
259
|
-
const props: Partial<ISwitchProps> = {
|
|
260
|
-
value: this.value,
|
|
261
|
-
disabled: this.disabled,
|
|
262
|
-
trackColor: this.trackColor,
|
|
263
|
-
thumbColor: this.thumbColor,
|
|
264
|
-
ios_backgroundColor: this.ios_backgroundColor,
|
|
265
|
-
style: this.style,
|
|
266
|
-
};
|
|
267
|
-
|
|
268
|
-
return {
|
|
269
|
-
...props,
|
|
270
|
-
nativeID: this.nativeID,
|
|
271
|
-
testID: this.testID,
|
|
272
|
-
accessibilityLabel: this.accessibilityLabel,
|
|
273
|
-
accessibilityRole: this.accessibilityRole,
|
|
274
|
-
accessibilityState: this.accessibilityState,
|
|
275
|
-
accessibilityValue: this.accessibilityValue,
|
|
276
|
-
accessibilityHint: this.accessibilityHint,
|
|
277
|
-
accessible: this.accessible,
|
|
278
|
-
role: this.role,
|
|
279
|
-
'aria-label': this['aria-label'],
|
|
280
|
-
'aria-disabled': this['aria-disabled'],
|
|
281
|
-
'aria-checked': this['aria-checked'],
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
}
|