This commit is contained in:
Mark Nadal 2019-01-02 21:23:04 -08:00
parent 2130460ef7
commit b08eac1a7d
3 changed files with 144 additions and 63 deletions

View File

@ -339,6 +339,7 @@ ul, li {
background: url(https://cdn.jsdelivr.net/npm/gun/examples/pop.png) no-repeat;
background-position: -2800px 0;
pointer-events: none;
z-index: 999999999;
animation: joy 1s steps(28);
}
@keyframes joy {

View File

@ -10,29 +10,97 @@ $(function(){
|| ua.search('iphone') >= 0
|| ua.search('ipad') >= 0)? "ios":false
}
m.key = {ctrl: 17, cmd: 91};
m.key.meta = (m.os.is.win||m.os.is.lin||m.os.is.and)? m.key.ctrl : m.key.cmd;
m.key.on = {};
$(document).on('keydown', function(e){
var k = m.key = {ctrl: 17, cmd: 91};
k.meta = (m.os.is.win||m.os.is.lin||m.os.is.and)? k.ctrl : k.cmd;
k.on = {};
k.down = function(e){ var tmp;
m.e = e;
console.log('keydown', e.keyCode);
m.key.on[e.code = e.keyCode] = !0;
}).on('keyup', function(e){
e.which = e.which || e.keyCode;
if(e.which === k.last){ return }
if(tmp = (k.meta === e.which)){ m.wipe() }
k.on[k.last = e.which] = !0;
$('#debug').val(JSON.stringify(m.key.on, null, 2));
if(tmp){
(tmp = $('#create .menu')).is(':visible')?
tmp.addClass('none') : tmp.removeClass('none');
}
if($('#create .menu').is(':visible')){
(k.combo || (k.combo = [])).push(e.which)
m.check('on', e.which, k.at || (k.at = m.edit));
}
}
k.up = function(e){
m.e = e;
delete m.key.on[e.code = e.keyCode];
}).on('keydown', '[contenteditable=true]', function(e){
return;
var r = monotype();
console.log("keys down", Gun.obj.copy(m.key.on));
$.each(m.edit, function(i,edit){ var tmp = true;
$.each(edit.keys||[''], function(i,k){
if(!m.key.on[k.length? k.charCodeAt(0) : k]){ tmp = false }
});
console.log(tmp, edit);
})
r.restore();
k.last = null;
e.which = e.which || e.keyCode;
delete k.on[e.which];
$('#debug').val(JSON.stringify(k.on, null, 2));
//if(m.key.on[m.key.meta]){ m.check('up') }
if($('#create .menu').is(':visible')){ m.check('up', e.which) }
if(k.meta === e.which){ m.wipe() }
}
m.check = function(how, key, at){
at = k.at || m.edit;
var edit = at[key], tmp;
if(!edit){ return }
if(edit[how]){
edit[how](m.e);
return;
}
at = k.at = edit;
}
m.wipe = function(){
k.at = m.edit;
k.combo = [];
k.on = {};
};
$(document).on('keydown', k.down).on('keyup', k.up);
$(window).on('blur', m.wipe).on('focus', m.wipe);
//.on('keydown', '[contenteditable=true]', function(e){});
meta.edit = function(edit){
var tmp = edit.combow = [];
$.each(edit.combo || (edit.combo = []), function(i,k){
if(!k || !k.length){ return }
tmp.push(k.toUpperCase().charCodeAt(0));
});
var at = meta.edit, l = edit.combo.length;
$.each(tmp, function(i,k){ at = at[k] = (++i >= l)? edit : at[k] || {} });
edit.combow = edit.combow.join(',');
}
// on fires when shortcut keydowns or on touch after command selected and then touchdown
meta.edit({
name: "Bold",
combo: ['B'],
on: function(e){
console.log("OO!!", e);
var r = monotype();
console.log("YAY!");
e.preventDefault();
},
up: function(){
console.log("END!")
}
});
meta.edit({
name: "Italic",
combo: ['I'],
on: function(e){
console.log("YAY!");
e.preventDefault();
},
up: function(){
console.log("END!")
}
});
meta.edit({
name: "Under",
combo: ['U'],
on: function(e){
console.log("YAY!");
e.preventDefault();
},
up: function(){
console.log("END!")
}
});
m.edit.push({keys: ['B'], on: function(){
console.log('hi!');
}})
});

View File

@ -1,60 +1,72 @@
<h1>User</h1>
<form id="sign">
<input id="alias" placeholder="username">
<input id="pass" type="password" placeholder="passphrase">
<input id="in" type="submit" value="sign in">
<input id="up" type="button" value="sign up">
</form>
<h1>Infinite Stream of Tweets/Chats:</h1>
<ul></ul>
<form id="said">
<input id="say">
<input id="speak" type="button" value="speak">
</form>
<div id="latest">while in scroll, latest tweet should show here</div>
Scroll:
<button id="up">UP</button>
<button id="down">DOWN</button>
<script src="../../examples/jquery.js"></script>
<script src="../../gun.js"></script>
<script src="../../sea.js"></script>
<script src="../../lib/open.js"></script>
<script src="../../lib/time.js"></script>
<script>
<script>$(function(){
var gun = Gun();
var user = gun.user();
user.recall({sessionStorage: true});
window.app = {};
$('#up').on('click', function(e){
user.create($('#alias').val(), $('#pass').val());
app.newsfeed = gun.get('some').get('news').get('feed'); // this would be a timegraph
app.modifier = app.newsfeed.time();
var low = -5, top = 0;
app.modifier.range(low, top);
app.modifier.on(function(range){
$('ul').empty(); // bad in theory, but proves out this type of "range" object.
range.forEach(UI);
});
$('#sign').on('submit', function(e){
e.preventDefault();
user.auth($('#alias').val(), $('#pass').val());
$('#up').on('click', function(){
alert('not working...');
app.modifier.range(--low, --top);
});
gun.on('auth', function(ack){
$('#sign').hide();
console.log(window.PUB = ack.pub);
});
function start(pub){
pub = pub || window.PUB;
gun.get(pub+'@time').get('tell').time(UI, {last: 9});
}
$('#said').on('submit', function(e){
e.preventDefault();
if(!user.is){ return }
user.get('said').set($('#say').val());
$('#say').val("");
$('#down').on('click', function(){
alert('not working...');
app.modifier.range(++low, ++top);
});
function UI(say, id){
console.log("***", id, say);
return;
var li = $('#' + id).get(0) || $('<li>').attr('id', id).appendTo('ul');
$(li).text(say);
};
})</script>
<script>
/* FAKE CODE TO GENERATE FAKE TESTS */
/* SHOULD BE REPLACED WITH YOUR OWN */
/* BUT USING THE SAM TYPE OF TEST!! */
/* THIS IS BAD CODE!!!!!! */
/* IT MEMORY LEAKS INFINITELY */
/* JUST FAKING IT TILL API MAKES IT! */
/* ACTUAL CODE SHOULD USE GUN NOT INFINITE */
/* GROWING LOCAL CACHE, GUN ALREADY CACHES */
var i = 0, tweet = "this tweet says ", bad = {leak: []};
setInterval(function(){
app.newsfeed.set(tweet + (++i));
}, 1000);
Gun.chain.time = function(){
var chain = this.map(function(item){
bad.leak.push(item); // bad bad bad bad
return bad.leak.slice(0 - bad.num); // should traverse GUN not slice a memory leak
});
return chain;
}
Gun.chain.range = function(low, top){
bad.low = low;
bad.top = top;
bad.num = top - low;
return this;
}
</script>