• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16import {
17    setEventDeliverer, PeerNode, PeerEvent, Properties, SinglePointerPeerEvent, SwiperChangePeerEvent, TabsChangePeerEvent,
18    AppearPeerEvent, DisappearPeerEvent, VisibleAreaChangePeerEvent, ScrollIndexPeerEvent, NavigatorClickPeerEvent, TextInputEvent,
19    GesturePeerEvent, ListScrollPeerEvent, ListScrollIndexPeerEvent, ListScrollStartPeerEvent, ListScrollStopPeerEvent,
20    SwiperAnimationPeerEvent, SliderChangePeerEvent, AreaChangePeerEvent, BlurPeerEvent, HoverPeerEvent, MousePeerEvent, KeyPeerEvent,
21    ImageCompletePeerEvent, ImageErrorPeerEvent, RefreshStateChangePeerEvent, OnRefreshingPeerEvent, OnRadioChangePeerEvent,
22    GridScrollPeerEvent, GridScrollStartPeerEvent, GridScrollStopPeerEvent, SideBarChangePeerEvent, XComponentLoadPeerEvent,
23    XComponentDestroyPeerEvent,
24    CanvasReadyPeerEvent,
25    NavBarStateChangePeerEvent,
26    NavDestinationPeerEvent
27} from "@koalaui/arkoala"
28
29interface EventListenerOptions {
30    capture?: boolean;
31}
32interface AddEventListenerOptions extends EventListenerOptions {
33    once?: boolean;
34    passive?: boolean;
35}
36
37export interface BaseEventTarget {
38    area: Area;
39}
40
41export interface BaseEvent {
42    target: BaseEventTarget;
43    timestamp: number;
44    source: SourceType;
45    pressure: number;
46    tiltX: number;
47    tiltY: number;
48    sourceTool: SourceTool;
49}
50
51export interface EventListener {
52    (evt: BaseEvent): void;
53}
54
55export interface EventListenerObject {
56    handleEvent(object: BaseEvent): void;
57}
58
59type EventListenerOrEventListenerObject = EventListener | EventListenerObject
60
61export class EventTargetImpl implements BaseEventTarget {
62    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions | undefined): void {
63        throw new Error("Method not implemented.")
64    }
65    dispatchEvent(event: BaseEvent): boolean {
66        throw new Error("Method not implemented.")
67    }
68    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions | undefined): void {
69        throw new Error("Method not implemented.")
70    }
71    area: Area
72
73    constructor(area: Area) {
74        this.area = area
75    }
76}
77
78export function makeEventTarget(area: Area): EventTarget {
79    // TODO: type hack, as we leak Node.js DOM types here.
80    // For proper fix make empty types to avoid Node types import in TS compiler root config.
81    return new EventTargetImpl(area) as unknown as EventTarget
82}
83
84setEventDeliverer((node: PeerNode, peerEvent: PeerEvent, props: Partial<Properties>) => {
85    if (props.onClick && peerEvent instanceof SinglePointerPeerEvent) {
86        props.onClick(peerEvent)
87        return
88    }
89    if (props.onSwiperChange && peerEvent instanceof SwiperChangePeerEvent) {
90        props.onSwiperChange(peerEvent.index)
91        return
92    }
93    if (props.onTabsChange && peerEvent instanceof TabsChangePeerEvent) {
94        props.onTabsChange(peerEvent.index)
95        return
96    }
97    if (props.onAppear && peerEvent instanceof AppearPeerEvent) {
98        props.onAppear()
99        return
100    }
101    if (props.onDisappear && peerEvent instanceof DisappearPeerEvent) {
102        props.onDisappear()
103        return
104    }
105    if (props.onVisibleAreaChange && peerEvent instanceof VisibleAreaChangePeerEvent) {
106        props.onVisibleAreaChange(peerEvent.isVisible, peerEvent.currentRatio)
107        return
108    }
109    if (props.onScrollIndex && peerEvent instanceof ScrollIndexPeerEvent) {
110        props.onScrollIndex(peerEvent.first, peerEvent.last)
111        return
112    }
113    if (props.onNavigatorClick && peerEvent instanceof NavigatorClickPeerEvent) {
114        props.onNavigatorClick()
115        return
116    }
117    if (props.onAction && peerEvent instanceof GesturePeerEvent) {
118        props.onAction(peerEvent)
119        return
120    }
121    if (props.onActionStart && peerEvent instanceof GesturePeerEvent) {
122        props.onActionStart(peerEvent)
123        return
124    }
125    if (props.onActionUpdate && peerEvent instanceof GesturePeerEvent) {
126        props.onActionUpdate(peerEvent)
127        return
128    }
129    if (props.onActionEnd && peerEvent instanceof GesturePeerEvent) {
130        props.onActionEnd(peerEvent)
131        return
132    }
133    if (props.onActionCancel) {
134        props.onActionCancel()
135    }
136    if (props.onTextInput && peerEvent instanceof TextInputEvent) {
137        props.onTextInput(peerEvent.text)
138    }
139    if (props.onListScroll && peerEvent instanceof ListScrollPeerEvent) {
140        props.onListScroll(peerEvent.scrollOffset, peerEvent.scrollState)
141        return
142    }
143    if (props.onListScrollIndex && peerEvent instanceof ListScrollIndexPeerEvent) {
144        props.onListScrollIndex(peerEvent.start, peerEvent.end, peerEvent.center)
145        return
146    }
147    if (props.onListScrollStart && peerEvent instanceof ListScrollStartPeerEvent) {
148        props.onListScrollStart()
149        return
150    }
151    if (props.onListScrollStop && peerEvent instanceof ListScrollStopPeerEvent) {
152        props.onListScrollStop()
153        return
154    }
155    if (props.onSwiperAnimationStart && peerEvent instanceof SwiperAnimationPeerEvent) {
156        props.onSwiperAnimationStart(peerEvent.index, peerEvent.targetIndex, peerEvent.currentOffset, peerEvent.targetOffset, peerEvent.velocity)
157        return
158    }
159    if (props.onSwiperAnimationEnd && peerEvent instanceof SwiperAnimationPeerEvent) {
160        props.onSwiperAnimationEnd(peerEvent.index, peerEvent.currentOffset, peerEvent.targetOffset, peerEvent.velocity)
161        return
162    }
163    if (props.onSwiperGestureSwipe && peerEvent instanceof SwiperAnimationPeerEvent) {
164        props.onSwiperGestureSwipe(peerEvent.index, peerEvent.currentOffset, peerEvent.targetOffset, peerEvent.velocity)
165        return
166    }
167    if (props.onSliderChange && peerEvent instanceof SliderChangePeerEvent) {
168        props.onSliderChange(peerEvent.value, peerEvent.mode)
169        return
170    }
171    if (props.onAreaChange && peerEvent instanceof AreaChangePeerEvent) {
172        props.onAreaChange(peerEvent)
173        return
174    }
175    if (props.onBlur && peerEvent instanceof BlurPeerEvent) {
176        props.onBlur()
177        return
178    }
179    if (props.onHover && peerEvent instanceof HoverPeerEvent) {
180        props.onHover(peerEvent.isHover)
181        return
182    }
183    if (props.onKeyEvent && peerEvent instanceof KeyPeerEvent) {
184        props.onKeyEvent(peerEvent)
185        return
186    }
187    if (props.onMouse && peerEvent instanceof MousePeerEvent) {
188        props.onMouse(peerEvent)
189        return
190    }
191    if (props.onImageComplete && peerEvent instanceof ImageCompletePeerEvent) {
192        props.onImageComplete(new ImageCompletePeerEvent(
193            node.getId(),
194            peerEvent.width,
195            peerEvent.height,
196            peerEvent.componentWidth,
197            peerEvent.componentHeight,
198            peerEvent.loadingStatus,
199            peerEvent.contentWidth,
200            peerEvent.contentHeight,
201            peerEvent.contentOffsetX,
202            peerEvent.contentOffsetY))
203        return
204    }
205    if (props.onImageError && peerEvent instanceof ImageErrorPeerEvent) {
206        props.onImageError(new ImageErrorPeerEvent(
207            node.getId(),
208            peerEvent.componentWidth,
209            peerEvent.componentHeight,
210            peerEvent.message))
211        return
212    }
213    if (props.onRefreshStateChange && peerEvent instanceof RefreshStateChangePeerEvent) {
214        props.onRefreshStateChange(peerEvent.state)
215        return
216    }
217    if (props.onRefreshing && peerEvent instanceof OnRefreshingPeerEvent) {
218        props.onRefreshing()
219        return
220    }
221    if (props.onRadioChange && peerEvent instanceof OnRadioChangePeerEvent) {
222        props.onRadioChange(peerEvent.isChecked)
223        return
224    }
225    if (props.onGridScroll && peerEvent instanceof GridScrollPeerEvent) {
226        props.onGridScroll(peerEvent.scrollOffset, peerEvent.scrollState)
227        return
228    }
229    if (props.onGridScrollStart && peerEvent instanceof GridScrollStartPeerEvent) {
230        props.onGridScrollStart()
231        return
232    }
233    if (props.onGridScrollStop && peerEvent instanceof GridScrollStopPeerEvent) {
234        props.onGridScrollStop()
235        return
236    }
237    if  (props.onSideBarChange && peerEvent instanceof SideBarChangePeerEvent){
238        props.onSideBarChange(peerEvent.isChanged)
239        return
240    }
241    if (props.onXComponentLoad && peerEvent instanceof XComponentLoadPeerEvent) {
242        props.onXComponentLoad(peerEvent)
243        return
244    }
245    if (props.onXComponentDestroy && peerEvent instanceof XComponentDestroyPeerEvent) {
246        props.onXComponentDestroy()
247        return
248    }
249    if  (props.onCanvasReady && peerEvent instanceof CanvasReadyPeerEvent){
250        props.onCanvasReady()
251        return
252    }
253    if (props.onNavBarStateChange && peerEvent instanceof NavBarStateChangePeerEvent) {
254        props.onNavBarStateChange(peerEvent.onVisible)
255        return
256    }
257    if (props.navDestination && peerEvent instanceof NavDestinationPeerEvent) {
258        props.navDestination(peerEvent.name, peerEvent.param)
259        return
260    }
261})
262