lbry-desktop/ui/util/enhanced-layout.js
2019-12-20 15:03:18 -05:00

156 lines
5 KiB
JavaScript

import { useEffect, useState } from 'react';
export default function useKonamiListener() {
const [isActive, setIsActive] = useState(false);
useEffect(() => {
let listener;
if (!listener) {
listener = new Konami(() => setIsActive(!isActive));
}
return () => {
listener = null;
};
}, [isActive]);
return isActive;
}
/* eslint-disable */
/*
* Konami-JS ~
* :: Now with support for touch events and multiple instances for
* :: those situations that call for multiple easter eggs!
* Code: https://github.com/snaptortoise/konami-js
* Copyright (c) 2009 George Mandis (georgemandis.com, snaptortoise.com)
* Version: 1.6.2 (7/17/2018)
* Licensed under the MIT License (http://opensource.org/licenses/MIT)
* Tested in: Safari 4+, Google Chrome 4+, Firefox 3+, IE7+, Mobile Safari 2.2.1+ and Android
*/
var Konami = function(callback) {
var konami = {
addEvent: function(obj, type, fn, ref_obj) {
if (obj.addEventListener) obj.addEventListener(type, fn, false);
else if (obj.attachEvent) {
// IE
obj['e' + type + fn] = fn;
obj[type + fn] = function() {
obj['e' + type + fn](window.event, ref_obj);
};
obj.attachEvent('on' + type, obj[type + fn]);
}
},
removeEvent: function(obj, eventName, eventCallback) {
if (obj.removeEventListener) {
obj.removeEventListener(eventName, eventCallback);
} else if (obj.attachEvent) {
obj.detachEvent(eventName);
}
},
input: '',
pattern: '38384040373937396665',
keydownHandler: function(e, ref_obj) {
if (ref_obj) {
konami = ref_obj;
} // IE
konami.input += e ? e.keyCode : event.keyCode;
if (konami.input.length > konami.pattern.length) {
konami.input = konami.input.substr(konami.input.length - konami.pattern.length);
}
if (konami.input === konami.pattern) {
konami.code(konami._currentLink);
konami.input = '';
e.preventDefault();
return false;
}
},
load: function(link) {
this._currentLink = link;
this.addEvent(document, 'keydown', this.keydownHandler, this);
this.iphone.load(link);
},
unload: function() {
this.removeEvent(document, 'keydown', this.keydownHandler);
this.iphone.unload();
},
code: function(link) {
window.location = link;
},
iphone: {
start_x: 0,
start_y: 0,
stop_x: 0,
stop_y: 0,
tap: false,
capture: false,
orig_keys: '',
keys: ['UP', 'UP', 'DOWN', 'DOWN', 'LEFT', 'RIGHT', 'LEFT', 'RIGHT', 'TAP', 'TAP'],
input: [],
code: function(link) {
konami.code(link);
},
touchmoveHandler: function(e) {
if (e.touches.length === 1 && konami.iphone.capture === true) {
var touch = e.touches[0];
konami.iphone.stop_x = touch.pageX;
konami.iphone.stop_y = touch.pageY;
konami.iphone.tap = false;
konami.iphone.capture = false;
konami.iphone.check_direction();
}
},
touchendHandler: function() {
konami.iphone.input.push(konami.iphone.check_direction());
if (konami.iphone.input.length > konami.iphone.keys.length) konami.iphone.input.shift();
if (konami.iphone.input.length === konami.iphone.keys.length) {
var match = true;
for (var i = 0; i < konami.iphone.keys.length; i++) {
if (konami.iphone.input[i] !== konami.iphone.keys[i]) {
match = false;
}
}
if (match) {
konami.iphone.code(konami._currentLink);
}
}
},
touchstartHandler: function(e) {
konami.iphone.start_x = e.changedTouches[0].pageX;
konami.iphone.start_y = e.changedTouches[0].pageY;
konami.iphone.tap = true;
konami.iphone.capture = true;
},
load: function(link) {
this.orig_keys = this.keys;
konami.addEvent(document, 'touchmove', this.touchmoveHandler);
konami.addEvent(document, 'touchend', this.touchendHandler, false);
konami.addEvent(document, 'touchstart', this.touchstartHandler);
},
unload: function() {
konami.removeEvent(document, 'touchmove', this.touchmoveHandler);
konami.removeEvent(document, 'touchend', this.touchendHandler);
konami.removeEvent(document, 'touchstart', this.touchstartHandler);
},
check_direction: function() {
var x_magnitude = Math.abs(this.start_x - this.stop_x);
var y_magnitude = Math.abs(this.start_y - this.stop_y);
var x = this.start_x - this.stop_x < 0 ? 'RIGHT' : 'LEFT';
var y = this.start_y - this.stop_y < 0 ? 'DOWN' : 'UP';
var result = x_magnitude > y_magnitude ? x : y;
result = this.tap === true ? 'TAP' : result;
return result;
},
},
};
typeof callback === 'string' && konami.load(callback);
if (typeof callback === 'function') {
konami.code = callback;
konami.load();
}
return konami;
};
/* eslint-enable */