@nativescript-community/gesturehandler
Version:
Declarative API exposing platform native touch and gesture system to NativeScript.
412 lines • 14.9 kB
JavaScript
import { Utils } from '@nativescript/core';
import { getClass } from '@nativescript/core/utils/types';
import { BaseGestureRootView, BaseNative, GestureHandlerStateEvent, GestureHandlerTouchEvent, GestureState, HandlerType, ManagerBase, ViewDisposeEvent, ViewInitEvent, install as installBase, nativeProperty } from './gesturehandler.common';
import { observe as gestureObserve } from './gestures_override';
export { GestureState, GestureHandlerStateEvent, GestureHandlerTouchEvent, HandlerType, ViewInitEvent, ViewDisposeEvent };
export var FlingDirection;
(function (FlingDirection) {
FlingDirection[FlingDirection["DIRECTION_LEFT"] = 2] = "DIRECTION_LEFT";
FlingDirection[FlingDirection["DIRECTION_UP"] = 4] = "DIRECTION_UP";
FlingDirection[FlingDirection["DIRECTION_DOWN"] = 8] = "DIRECTION_DOWN";
FlingDirection[FlingDirection["DIRECTION_RIGHT"] = 1] = "DIRECTION_RIGHT";
})(FlingDirection || (FlingDirection = {}));
let installed = false;
let installedOverrides = false;
export function install(overrideNGestures = false) {
if (!installed) {
installed = true;
installBase(overrideNGestures);
}
if (overrideNGestures === true && !installedOverrides) {
installedOverrides = true;
const NSView = require('@nativescript/core/ui/core/view').View;
NSView.prototype._observe = function (type, callback, thisArg) {
if (!this._gestureObservers[type]) {
this._gestureObservers[type] = [];
}
this._gestureObservers[type].push(gestureObserve(this, type, callback, thisArg));
// if (type & GestureTypes.touch && this.isLoaded && !this.touchListenerIsSet) {
// this.setOnTouchListener();
// }
};
}
}
function toJsObject(objCObj) {
if (objCObj === null || typeof objCObj !== 'object') {
return objCObj;
}
let node, key, i, l;
const oKeyArr = objCObj.allKeys;
if (oKeyArr === undefined && objCObj.count !== undefined) {
// array
node = [];
for (i = 0, l = objCObj.count; i < l; i++) {
key = objCObj.objectAtIndex(i);
node.push(toJsObject(key));
}
}
else if (oKeyArr !== undefined) {
// object
node = {};
for (i = 0, l = oKeyArr.count; i < l; i++) {
key = oKeyArr.objectAtIndex(i);
const val = objCObj.valueForKey(key);
// Firestore can store nulls
if (val === null) {
node[key] = null;
continue;
}
node[key] = getValueForClass(val);
}
}
else {
node = getValueForClass(objCObj);
}
return node;
}
function getValueForClass(val) {
switch (getClass(val)) {
case 'NSArray':
case 'NSMutableArray':
return toJsObject(val);
case 'NSDictionary':
case 'NSMutableDictionary':
return toJsObject(val);
case 'String':
return String(val);
case 'Boolean':
return val;
case 'Number':
case 'NSDecimalNumber':
return Number(String(val));
case 'Date':
return new Date(val);
default:
console.log("Please report this at https://github.com/farfromrefug/@nativescript-community/gesturehandler/issues: iOS toJsObject is missing a converter for class '" +
getClass(val) +
"'. Casting to String as a fallback.");
return String(val);
}
}
export class GestureRootView extends BaseGestureRootView {
}
var HandlerDelegate = /** @class */ (function (_super) {
__extends(HandlerDelegate, _super);
function HandlerDelegate() {
return _super !== null && _super.apply(this, arguments) || this;
}
HandlerDelegate.new = function () {
return _super.new.call(this);
};
// public initWithOwner(owner: WeakRef<Handler<any, any>>): HandlerDelegate {
// this._owner = owner;
// return this;
// }
HandlerDelegate.initWithOwner = function (owner) {
var impl = HandlerDelegate.new();
impl._owner = owner;
return impl;
};
HandlerDelegate.prototype.gestureHandlerDidChangeStatePrevStateExtraDataView = function (handler, state, prevState, extraData, view) {
var owner = this._owner && this._owner.get();
if (owner) {
owner.notify({
eventName: GestureHandlerStateEvent,
object: owner,
data: {
state: state,
prevState: prevState,
ios: handler,
extraData: toJsObject(extraData),
view: view.nsView ? view.nsView.get() : null
}
});
}
};
HandlerDelegate.prototype.gestureHandlerTouchEventOnViewStateExtraData = function (handler, view, state, extraData) {
var owner = this._owner && this._owner.get();
if (owner) {
owner.notify({
eventName: GestureHandlerTouchEvent,
object: owner,
data: {
state: state,
ios: handler,
extraData: toJsObject(extraData),
view: view.nsView ? view.nsView.get() : null
}
});
}
};
HandlerDelegate.prototype.gestureHandlerShouldActivateForEvent = function (handler, extraData) {
var owner = this._owner && this._owner.get();
if (owner && owner.options && owner.options.shouldStartGesture) {
return owner.options.shouldStartGesture(toJsObject(extraData));
}
return true;
};
HandlerDelegate.ObjCProtocols = [GestureHandlerDelegate];
return HandlerDelegate;
}(NSObject));
export { HandlerDelegate };
export class Handler extends BaseNative {
constructor() {
super(...arguments);
this.nativeGetterKey = 'nativeView';
}
createNative() {
return null;
}
attachToView(view) {
if (view === this.attachedView) {
return;
}
if (this.attachedView) {
this.detachFromView(this.attachedView);
}
this.attachedView = view;
this.delegate = HandlerDelegate.initWithOwner(new WeakRef(this));
this.native.delegate = this.delegate;
this.manager.get().attachGestureHandler(this, view);
}
detachFromView(view) {
if ((view && view !== this.attachedView) || !this.attachedView) {
return;
}
if (!this.attachedView) {
return;
}
const tag = this.native.tag;
this.delegate = this.native.delegate = null;
this.manager.get().detachGestureHandler(tag, this.attachedView);
this.attachedView = null;
}
getTag() {
return this.native.tag;
}
setTag(value) {
// cant change tag on ios
}
getView() {
return this.attachedView;
}
cancel() {
this.native.cancel();
}
}
__decorate([
nativeProperty
], Handler.prototype, "enabled", void 0);
__decorate([
nativeProperty
], Handler.prototype, "shouldCancelWhenOutside", void 0);
export class TapHandler extends Handler {
}
__decorate([
nativeProperty
], TapHandler.prototype, "numberOfTaps", void 0);
__decorate([
nativeProperty
], TapHandler.prototype, "maxDurationMs", void 0);
__decorate([
nativeProperty
], TapHandler.prototype, "maxDelayMs", void 0);
__decorate([
nativeProperty
], TapHandler.prototype, "maxDeltaX", void 0);
__decorate([
nativeProperty
], TapHandler.prototype, "maxDeltaY", void 0);
__decorate([
nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } })
], TapHandler.prototype, "maxDist", void 0);
__decorate([
nativeProperty
], TapHandler.prototype, "minPointers", void 0);
export class PanHandler extends Handler {
}
__decorate([
nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } })
], PanHandler.prototype, "minDist", void 0);
__decorate([
nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } })
], PanHandler.prototype, "activeOffsetXStart", void 0);
__decorate([
nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } })
], PanHandler.prototype, "activeOffsetXEnd", void 0);
__decorate([
nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } })
], PanHandler.prototype, "failOffsetXStart", void 0);
__decorate([
nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } })
], PanHandler.prototype, "failOffsetXEnd", void 0);
__decorate([
nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } })
], PanHandler.prototype, "activeOffsetYStart", void 0);
__decorate([
nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } })
], PanHandler.prototype, "activeOffsetYEnd", void 0);
__decorate([
nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } })
], PanHandler.prototype, "failOffsetYStart", void 0);
__decorate([
nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } })
], PanHandler.prototype, "failOffsetYEnd", void 0);
__decorate([
nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } })
], PanHandler.prototype, "minVelocity", void 0);
__decorate([
nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } })
], PanHandler.prototype, "minVelocityX", void 0);
__decorate([
nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } })
], PanHandler.prototype, "minVelocityY", void 0);
__decorate([
nativeProperty
], PanHandler.prototype, "minPointers", void 0);
__decorate([
nativeProperty
], PanHandler.prototype, "maxPointers", void 0);
__decorate([
nativeProperty({ nativeSetterName: 'setAverageTouches' })
], PanHandler.prototype, "avgTouches", void 0);
__decorate([
nativeProperty
], PanHandler.prototype, "numberOfPointers", void 0);
export class PinchHandler extends Handler {
}
__decorate([
nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } })
], PinchHandler.prototype, "minSpan", void 0);
export class FlingHandler extends Handler {
}
__decorate([
nativeProperty
], FlingHandler.prototype, "numberOfPointers", void 0);
__decorate([
nativeProperty
], FlingHandler.prototype, "direction", void 0);
export class ForceTouchGestureHandler extends Handler {
}
__decorate([
nativeProperty
], ForceTouchGestureHandler.prototype, "minForce", void 0);
__decorate([
nativeProperty
], ForceTouchGestureHandler.prototype, "maxForce", void 0);
export class LongPressHandler extends Handler {
}
__decorate([
nativeProperty
], LongPressHandler.prototype, "minDurationMs", void 0);
__decorate([
nativeProperty({ converter: { fromNative: Utils.layout.toDevicePixels } })
], LongPressHandler.prototype, "maxDist", void 0);
export class RotationHandler extends Handler {
}
export class NativeViewHandler extends Handler {
}
__decorate([
nativeProperty
], NativeViewHandler.prototype, "shouldActivateOnStart", void 0);
__decorate([
nativeProperty
], NativeViewHandler.prototype, "disallowInterruption", void 0);
export class Manager extends ManagerBase {
constructor() {
super(...arguments);
this.viewListeners = new Map();
}
get manager() {
if (!this._manager) {
this._manager = GestureHandlerManager.alloc().init();
}
return this._manager;
}
static getInstance() {
if (!Manager.sManager) {
Manager.sManager = new Manager();
}
return Manager.sManager;
}
createGestureHandler(handlerName, handlerTag, config) {
const nHandler = this.manager.createGestureHandlerTagConfig(handlerName, handlerTag, config ? NSDictionary.dictionaryWithDictionary(config) : null);
let result;
switch (handlerName) {
case 'tap':
result = new TapHandler(config, nHandler);
break;
case 'pan':
result = new PanHandler(config, nHandler);
break;
case 'fling':
result = new FlingHandler(config, nHandler);
break;
case 'longPress':
result = new LongPressHandler(config, nHandler);
break;
case 'nativeView':
result = new NativeViewHandler(config, nHandler);
break;
case 'pinch':
result = new PinchHandler(config, nHandler);
break;
case 'rotation':
result = new RotationHandler(config, nHandler);
break;
case 'forceTouch':
result = new ForceTouchGestureHandler(config, nHandler);
break;
default:
result = new Handler(config, nHandler);
break;
}
result.manager = new WeakRef(this);
return result;
}
attachGestureHandler(handler, view) {
this.manager.registerGestureHandler(handler.native);
const tag = handler.native.tag;
if (view.nativeView) {
this.manager.attachGestureHandlerToView(tag, view[handler.nativeGetterKey]);
}
const onInit = () => {
// we need to ensure the handler is registered
// in case it was dropped in dispose
this.manager.registerGestureHandler(handler.native);
this.manager.attachGestureHandlerToView(tag, view[handler.nativeGetterKey]);
};
const onDispose = () => this.manager.dropGestureHandler(tag);
view.on(ViewInitEvent, onInit, this);
view.on(ViewDisposeEvent, onDispose, this);
let viewListeners = this.viewListeners.get(view);
if (!viewListeners) {
viewListeners = new Map();
this.viewListeners.set(view, viewListeners);
}
viewListeners.set(tag, {
init: onInit,
dispose: onDispose
});
}
detachGestureHandler(handlerTag, view) {
if (view.nativeView) {
this.manager.dropGestureHandler(handlerTag);
}
if (view) {
const viewListeners = this.viewListeners.get(view);
if (viewListeners) {
const listeners = viewListeners.get(handlerTag);
if (listeners) {
view.off(ViewInitEvent, listeners.init, this);
view.off(ViewDisposeEvent, () => listeners.dispose, this);
viewListeners.delete(handlerTag);
if (viewListeners.size === 0) {
this.viewListeners.delete(view);
}
}
}
}
}
}
//# sourceMappingURL=gesturehandler.ios.js.map