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