@@ -96,12 +96,7 @@ <h3>Leave a comment</h3>
96
$ ( "#addComments" ) . submit ( function ( e ) {
96
$ ( "#addComments" ) . submit ( function ( e ) {
97
e . preventDefault ( ) ;
97
e . preventDefault ( ) ;
98
var post = true ;
98
var post = true ;
99
- $ ( '[name="email"]' ) . first ( ) . removeClass ( 'invalid-form-data' ) ;
99
+ $ ( '#addComments' ) [ 0 ] . reset ( ) ;
100
- $ ( '[name="name"]' ) . first ( ) . removeClass ( 'invalid-form-data' ) ;
101
- $ ( '[name="comment"]' ) . first ( ) . removeClass ( 'invalid-form-data' ) ;
102
- //if (grecaptcha) {
103
- $ ( ".g-recaptcha-comment" ) . first ( ) . removeClass ( 'invalid-form-data' ) ;
104
- //}
105
var red = "#F66" ;
100
var red = "#F66" ;
106
if ( ! ( $ ( '[name="email"]' ) [ 0 ] . value . match ( / ^ [ a - z A - Z 0 - 9 - .] + @ [ a - z A - Z 0 - 9 - .] + \. [ a - z A - Z ] { 2 , 6 } $ / gi) ) ) {
101
if ( ! ( $ ( '[name="email"]' ) [ 0 ] . value . match ( / ^ [ a - z A - Z 0 - 9 - .] + @ [ a - z A - Z 0 - 9 - .] + \. [ a - z A - Z ] { 2 , 6 } $ / gi) ) ) {
107
$ ( '[name="email"]' ) . first ( ) . addClass ( 'invalid-form-data' ) ;
102
$ ( '[name="email"]' ) . first ( ) . addClass ( 'invalid-form-data' ) ;
@@ -138,8 +133,10 @@ <h3>Leave a comment</h3>
138
} else {
133
} else {
139
$ ( "#comment-form-result" ) [ 0 ] . style = "background-color:rgb(48, 48, 48);border-radius:5px;padding:10px;margin-bottom:8px;display:inline-block;color:white;" ;
134
$ ( "#comment-form-result" ) [ 0 ] . style = "background-color:rgb(48, 48, 48);border-radius:5px;padding:10px;margin-bottom:8px;display:inline-block;color:white;" ;
140
$ ( "#addComments" ) [ 0 ] . reset ( ) ;
135
$ ( "#addComments" ) [ 0 ] . reset ( ) ;
141
- location . hash = '#comments' ;
136
+ setTimeout ( function ( ) {
142
- location . reload ( ) ;
137
+ location . hash = '#comments' ;
138
+ location . reload ( ) ;
139
+ } , 500 ) ;
143
}
140
}
144
if ( grecaptcha ) {
141
if ( grecaptcha ) {
145
grecaptcha . reset ( ) ;
142
grecaptcha . reset ( ) ;
@@ -301,6 +298,8 @@ <h5 class="modal-title">Reply</h5>
301
}
298
}
302
}
299
}
303
300
301
+ var commentsArray = [ ] ;
302
+
304
function loadComments ( page ) {
303
function loadComments ( page ) {
305
304
306
if ( ! page ) page = 1 ;
305
if ( ! page ) page = 1 ;
@@ -317,170 +316,91 @@ <h5 class="modal-title">Reply</h5>
317
var metadata = data . metadata ;
316
var metadata = data . metadata ;
318
var twcomments = data . data . comments ;
317
var twcomments = data . data . comments ;
319
var replies = data . data . replies ;
318
var replies = data . data . replies ;
319
+
320
+ // Start Preact rewrite
321
+ function Comment ( props ) {
322
+ return html `
323
+ < div data-comment-id ="${ props . id } " class ="${ props . type } ">
324
+ < table >
325
+ < tr >
326
+ < td >
327
+ < img data-email-hash ="${ props . email_hash } " src ="https://www.gravatar.com/avatar/${ props . email_hash } ?s=50&d=identicon " class ="${ props . type } -image " />
328
+ </ td >
329
+ < td >
330
+ < div class ="${ props . type } -name "> ${ props . name } ${ props . isTrueWinter && ( html `< i class =\"the-truewinter fa fa-check-circle \" title =\"This is the real TrueWinter \"> </ i > ` ) } </ div >
331
+ < div class ="${ props . type } -time "> ${ props . time }
332
+ < span class ="comment-reply ">
333
+ < a href ="# " class ="comment-reply-btn " data-tw-crb-id ="${ props . id } " data-tw-crb-type ="${ props . type } "> Reply</ a >
334
+ </ span >
335
+ </ div >
336
+ < div class ="${ props . type } -text "> ${ props . comment } </ div >
337
+ </ td >
338
+ </ tr >
339
+ </ table >
340
+ ${ repliesP ( props . id ) }
341
+ </ div >
342
+ ` ;
343
+ }
320
344
321
- function getReplies ( id ) {
345
+ function repliesP ( id ) {
322
- var r = [ ] ;
346
+
323
- for ( var i = 0 ; i < replies . length ; i ++ ) {
347
+ function getRepliesP ( id ) {
324
- if ( replies [ i ] . in_reply_to === id ) {
348
+ var r = [ ] ;
325
- r . push ( replies [ i ] ) ;
349
+ for ( var i = 0 ; i < replies . length ; i ++ ) {
350
+ if ( replies [ i ] . in_reply_to === id ) {
351
+ r . push ( replies [ i ] ) ;
352
+ }
326
}
353
}
354
+ return r ;
327
}
355
}
328
- return r ;
329
- }
330
356
331
- function createCommentElement ( comment ) {
357
+ var repliesArr = [ ] ;
332
- // Comment
333
- var e = document . createElement ( 'div' ) ;
334
- e . setAttribute ( 'data-comment-id' , comment . id ) ;
335
- e . className = 'comment' ;
336
- var tb = document . createElement ( 'table' ) ;
337
- var tr = document . createElement ( 'tr' ) ;
338
- var td1 = document . createElement ( 'td' ) ;
339
- td1 . className = 'image-td' ;
340
- var td2 = document . createElement ( 'td' ) ;
341
- var ei = document . createElement ( 'img' ) ;
342
- ei . setAttribute ( 'data-email-hash' , comment . email_hash ) ;
343
- ei . src = 'https://www.gravatar.com/avatar/' + comment . email_hash + '?s=50&d=identicon' ;
344
- ei . className = 'comment-image' ;
345
- var n = document . createElement ( 'div' ) ;
346
- if ( comment . isTrueWinter ) {
347
- n . innerHTML = comment . name + "<i class=\"the-truewinter fa fa-check-circle\" title=\"This is the real TrueWinter\"></i>" ;
348
- } else {
349
- n . innerText = comment . name ;
350
- }
351
- n . className = 'comment-name' ;
352
- var t = document . createElement ( 'div' ) ;
353
- t . innerText = comment . time ;
354
- t . className = 'comment-time' ;
355
- var cr = document . createElement ( 'span' ) ;
356
- cr . className = 'comment-reply' ;
357
- var crb = document . createElement ( 'a' ) ;
358
- crb . href = '#' ;
359
- crb . innerText = 'Reply' ;
360
- crb . className = 'comment-reply-btn' ;
361
- crb . setAttribute ( 'data-tw-crb-id' , comment . id ) ;
362
- crb . setAttribute ( 'data-tw-crb-type' , 'comment' ) ;
363
- crb . onclick = replyForm ;
364
- cr . appendChild ( crb ) ;
365
- t . appendChild ( cr ) ;
366
- var c = document . createElement ( 'div' ) ;
367
- c . innerText = comment . comment ;
368
- c . className = 'comment-text' ;
369
- td1 . appendChild ( ei ) ;
370
- td2 . appendChild ( n ) ;
371
- td2 . appendChild ( t ) ;
372
- td2 . appendChild ( c ) ;
373
- tr . appendChild ( td1 ) ;
374
- tr . appendChild ( td2 ) ;
375
- tb . appendChild ( tr ) ;
376
- e . appendChild ( tb ) ;
377
-
378
- document . getElementById ( 'tw-comments' ) . appendChild ( e ) ;
379
-
380
- addReplies ( comment . id ) ;
381
-
382
- }
383
358
384
- function addReplies ( id ) {
359
+ function addRepliesP ( id ) {
385
- var rp = getReplies ( id ) ;
360
+ var rp = getRepliesP ( id ) ;
386
- //console.log(rp);
361
+ //console.log(rp);
387
-
388
- for ( var i = 0 ; i < rp . length ; i ++ ) {
389
- //console.log('reply');
390
- $ ( '[data-comment-id=\'' + id + '\']' ) . append ( createReplyElement ( rp [ i ] ) ) ;
391
-
392
- addReplies ( rp [ i ] . id ) ;
393
-
394
- }
395
- }
396
362
397
- function createReplyElement ( reply ) {
363
+ for ( var i = 0 ; i < rp . length ; i ++ ) {
398
- var e = document . createElement ( 'div' ) ;
364
+ repliesArr . push ( html `< ${ Comment } id =${ rp [ i ] . id } email_hash=${ rp [ i ] . email_hash } name=${ rp [ i ] . name } time=${ rp [ i ] . time } comment=${ rp [ i ] . comment } type="reply" isTrueWinter=${ rp [ i ] . isTrueWinter ? true : false } /> ` ) ;
399
- e . setAttribute ( 'data-comment-id' , reply . id ) ;
365
+ if ( i === rp . length - 1 ) {
400
- e . setAttribute ( 'data-in-reply-to' , reply . in_reply_to ) ;
366
+ return repliesArr ;
401
- e . className = 'reply' ;
367
+ }
402
- var tb = document . createElement ( 'table' ) ;
368
+ }
403
- var tr = document . createElement ( 'tr' ) ;
404
- var td1 = document . createElement ( 'td' ) ;
405
- td1 . className = 'image-td' ;
406
- var td2 = document . createElement ( 'td' ) ;
407
- var ei = document . createElement ( 'img' ) ;
408
- ei . setAttribute ( 'data-email-hash' , reply . email_hash ) ;
409
- ei . src = 'https://www.gravatar.com/avatar/' + reply . email_hash + '?s=50&d=identicon' ;
410
- ei . className = 'reply-image' ;
411
- var n = document . createElement ( 'div' ) ;
412
- if ( reply . isTrueWinter ) {
413
- n . innerHTML = reply . name + "<i class=\"the-truewinter fa fa-check-circle\" title=\"This is the real TrueWinter\"></i>" ;
414
- } else {
415
- n . innerText = reply . name ;
416
}
369
}
417
- n . className = 'reply-name' ;
370
+ return addRepliesP ( id ) ;
418
- var t = document . createElement ( 'div' ) ;
419
- t . innerText = reply . time ;
420
- t . className = 'reply-time' ;
421
- var cr = document . createElement ( 'span' ) ;
422
- cr . className = 'comment-reply' ;
423
- var crb = document . createElement ( 'a' ) ;
424
- crb . href = '#' ;
425
- crb . innerText = 'Reply' ;
426
- crb . className = 'comment-reply-btn' ;
427
- crb . setAttribute ( 'data-tw-crb-id' , reply . id ) ;
428
- crb . setAttribute ( 'data-tw-crb-type' , 'reply' ) ;
429
- crb . onclick = replyForm ;
430
- cr . appendChild ( crb ) ;
431
- t . appendChild ( cr ) ;
432
- var c = document . createElement ( 'div' ) ;
433
- c . innerText = reply . comment ;
434
- c . className = 'reply-text' ;
435
- td1 . appendChild ( ei ) ;
436
- td2 . appendChild ( n ) ;
437
- td2 . appendChild ( t ) ;
438
- td2 . appendChild ( c ) ;
439
- tr . appendChild ( td1 ) ;
440
- tr . appendChild ( td2 ) ;
441
- tb . appendChild ( tr ) ;
442
- e . appendChild ( tb ) ;
443
- return e ;
444
}
371
}
445
372
373
+ const html = htm . bind ( preact . h ) ;
374
+
446
for ( var i = 0 ; i < twcomments . length ; i ++ ) {
375
for ( var i = 0 ; i < twcomments . length ; i ++ ) {
447
- //console.log('Comment:');
376
+ commentsArray . push ( html `< ${ Comment } id =${ twcomments [ i ] . id } email_hash=${ twcomments [ i ] . email_hash } name=${ twcomments [ i ] . name } time=${ twcomments [ i ] . time } comment=${ twcomments [ i ] . comment } type="comment" isTrueWinter=${ twcomments [ i ] . isTrueWinter ? true : false } /> ` ) ;
448
- //console.log(comments[i]);
449
- createCommentElement ( twcomments [ i ] ) ;
450
- //console.log('Replies:');
451
- //console.log(getReplies(comments[i].id));
452
}
377
}
378
+
379
+ preact . render ( commentsArray , $ ( '#tw-comments' ) [ 0 ] ) ;
453
380
454
var replyRecaptchaRendered = false ;
381
var replyRecaptchaRendered = false ;
455
382
456
- function replyForm ( e ) {
383
+ $ ( '.comment-reply-btn' ) . on ( 'click' , function ( e ) {
457
e . preventDefault ( ) ;
384
e . preventDefault ( ) ;
458
385
459
$ ( '#replyTextarea' ) . on ( 'keyup' , function ( ) {
386
$ ( '#replyTextarea' ) . on ( 'keyup' , function ( ) {
460
$ ( '#replyFormCharacterCount' ) . text ( $ ( '#replyTextarea' ) . val ( ) . length ) ;
387
$ ( '#replyFormCharacterCount' ) . text ( $ ( '#replyTextarea' ) . val ( ) . length ) ;
461
} ) ;
388
} ) ;
462
389
463
$ ( '#replyModal' ) . on ( 'hidden.bs.modal' , function ( e ) {
390
$ ( '#replyModal' ) . on ( 'hidden.bs.modal' , function ( e ) {
464
- $ ( '[name="tw-rf-name"]' ) . val ( '' ) ;
465
- $ ( '[name="tw-rf-email"]' ) . val ( '' ) ;
466
- $ ( '[name="tw-rf-comment"]' ) . val ( '' ) ;
467
$ ( '#tw-reply-form-reply-to' ) . val ( '' ) ;
391
$ ( '#tw-reply-form-reply-to' ) . val ( '' ) ;
468
$ ( '#tw-reply-form-reply-type' ) . val ( '' ) ;
392
$ ( '#tw-reply-form-reply-type' ) . val ( '' ) ;
469
$ ( '#tw-reply-form-reply-post' ) . val ( '' ) ;
393
$ ( '#tw-reply-form-reply-post' ) . val ( '' ) ;
470
$ ( '#tw-reply-form-root-comment' ) . val ( '' ) ;
394
$ ( '#tw-reply-form-root-comment' ) . val ( '' ) ;
395
+ $ ( '#comment-reply-form' ) [ 0 ] . reset ( ) ;
471
} ) ;
396
} ) ;
472
397
473
var replyCaptchaComplete = false ;
398
var replyCaptchaComplete = false ;
474
399
475
$ ( "#comment-reply-form" ) . submit ( function ( e ) {
400
$ ( "#comment-reply-form" ) . submit ( function ( e ) {
476
e . preventDefault ( ) ;
401
e . preventDefault ( ) ;
477
var post = true ;
402
var post = true ;
478
- $ ( '[name="tw-rf-email"]' ) . first ( ) . removeClass ( 'invalid-form-data' ) ;
403
+ $ ( '#comment-reply-form' ) . find ( '.invalid-form-data' ) . removeClass ( 'invalid-form-data' ) ;
479
- $ ( '[name="tw-rf-name"]' ) . first ( ) . removeClass ( 'invalid-form-data' ) ;
480
- $ ( '[name="tw-rf-comment"]' ) . first ( ) . removeClass ( 'invalid-form-data' ) ;
481
- //if (recaptcha) {
482
- $ ( ".g-recaptcha-reply" ) . first ( ) . removeClass ( 'invalid-form-data' ) ;
483
- //}
484
var red = "#F66" ;
404
var red = "#F66" ;
485
if ( ! ( $ ( '[name="tw-rf-email"]' ) [ 0 ] . value . match ( / ^ [ a - z A - Z 0 - 9 - .] + @ [ a - z A - Z 0 - 9 - .] + \. [ a - z A - Z ] { 2 , 24 } $ / gi) ) ) {
405
if ( ! ( $ ( '[name="tw-rf-email"]' ) [ 0 ] . value . match ( / ^ [ a - z A - Z 0 - 9 - .] + @ [ a - z A - Z 0 - 9 - .] + \. [ a - z A - Z ] { 2 , 24 } $ / gi) ) ) {
486
$ ( '[name="tw-rf-email"]' ) . first ( ) . addClass ( 'invalid-form-data' ) ;
406
$ ( '[name="tw-rf-email"]' ) . first ( ) . addClass ( 'invalid-form-data' ) ;
@@ -573,7 +493,7 @@ <h5 class="modal-title">Reply</h5>
573
replyCaptchaComplete = false ;
493
replyCaptchaComplete = false ;
574
}
494
}
575
$ ( '#replyModal' ) . modal ( 'show' ) ;
495
$ ( '#replyModal' ) . modal ( 'show' ) ;
576
- }
496
+ } ) ;
577
497
578
//console.log(data);
498
//console.log(data);
579
499
@@ -585,7 +505,39 @@ <h5 class="modal-title">Reply</h5>
585
xhr . send ( ) ;
505
xhr . send ( ) ;
586
}
506
}
587
507
508
+ var preactLoad = false ;
509
+ var htmLoad = false ;
510
+
511
+ var preactAndHTMLoadedEvent = new Event ( 'preactAndHTMLoadedEvent' ) ;
512
+
513
+ function preactLoaded ( ) {
514
+ console . log ( 'Preact loaded' ) ;
515
+ preactLoad = true ;
516
+ if ( preactLoad && htmLoad ) {
517
+ window . dispatchEvent ( preactAndHTMLoadedEvent ) ;
518
+ }
519
+ }
520
+ function htmLoaded ( ) {
521
+ console . log ( 'HTM loaded' ) ;
522
+ htmLoad = true ;
523
+ if ( preactLoad && htmLoad ) {
524
+ window . dispatchEvent ( preactAndHTMLoadedEvent ) ;
525
+ }
526
+ }
527
+
528
+ function loadScript ( url , onloadFn ) {
529
+ var e = document . createElement ( 'script' ) ;
530
+ e . src = url ;
531
+ e . onload = onloadFn ;
532
+ document . body . appendChild ( e ) ;
533
+ }
534
+
588
window . addEventListener ( 'load' , function ( ) {
535
window . addEventListener ( 'load' , function ( ) {
536
+ loadScript ( 'https://cdnjs.cloudflare.com/ajax/libs/preact/10.4.7/preact.min.js' , preactLoaded ) ;
537
+ loadScript ( 'https://cdnjs.cloudflare.com/ajax/libs/htm/3.0.4/htm.min.js' , htmLoaded ) ;
538
+ } ) ;
539
+
540
+ window . addEventListener ( 'preactAndHTMLoadedEvent' , function ( ) {
589
var commentsLoaded = false ;
541
var commentsLoaded = false ;
590
function loadCommentsIfInView ( ) {
542
function loadCommentsIfInView ( ) {
591
if ( commentsLoaded ) return ;
543
if ( commentsLoaded ) return ;
0 commit comments