@@ -2,34 +2,64 @@ const alertContainer = document.querySelector('#alert-container')
22const template = document . querySelector ( '#dinosaur-item-template' )
33const dinosaurList = document . querySelector ( '#dinosaur-list' )
44
5- fetch ( window . location )
6- . then ( async response => {
7- const topic = response . headers . get ( 'x-mercure-topic' )
8- const hubUrl = response . headers . get ( 'Link' ) . match ( / < ( [ ^ > ] + ) > ; \s + r e l = (?: m e r c u r e | " [ ^ " ] * m e r c u r e [ ^ " ] * " ) / ) [ 1 ]
5+ const displayToast = ( message ) => {
6+ alertContainer . innerHTML = `<div class='alert alert-success'>${ message } </div>`
7+ window . setTimeout ( ( ) => {
8+ const alert = document . querySelector ( '.alert' )
9+ alert . parentNode . removeChild ( alert )
10+ } , 5000 )
11+ }
12+
13+ const createDinosaur = ( name , link ) => {
14+ const clone = template . content . cloneNode ( true )
15+ const dinosaurTemplateNameContainer = clone . querySelector ( '#dinosaur-item-template-name' )
16+ const dinosaurTemplateLinkContainer = clone . querySelector ( '#dinosaur-item-template-link' )
17+
18+ dinosaurTemplateNameContainer . innerHTML = name
19+ dinosaurTemplateLinkContainer . href = link
920
10- const hub = new URL ( hubUrl ) ;
21+ dinosaurList . append ( clone )
1122
12- hub . searchParams . append ( 'topic' , topic )
23+ displayToast ( `Welcome to ${ name } !` )
24+ }
1325
14- const es = new EventSource ( hub )
26+ const removeDinosaur = ( id ) => {
27+ const item = document . querySelector ( `a[data-id="${ id } "]` )
28+ item . remove ( )
1529
16- es . onmessage = e => {
17- const dinosaur = JSON . parse ( e . data )
30+ displayToast ( `A dinosaur has been removed !` )
31+ }
32+
33+ const editDinosaur = ( data ) => {
34+ const item = document . querySelector ( `a[data-id="${ data . id } "]` )
35+ const name = item . querySelector ( 'div' )
36+ name . innerHTML = data . name
37+ }
38+
39+ fetch ( window . location )
40+ . then ( async response => {
41+ const topic = response . headers . get ( 'x-mercure-topic' )
42+ const hubUrl = response . headers . get ( 'Link' ) . match ( / < ( [ ^ > ] + ) > ; \s + r e l = (?: m e r c u r e | " [ ^ " ] * m e r c u r e [ ^ " ] * " ) / ) [ 1 ]
1843
19- const clone = template . content . cloneNode ( true )
20- const dinosaurTemplateNameContainer = clone . querySelector ( '#dinosaur-item-template-name' )
21- const dinosaurTemplateLinkContainer = clone . querySelector ( '#dinosaur-item-template-link' )
44+ const hub = new URL ( hubUrl ) ;
2245
23- dinosaurTemplateNameContainer . innerHTML = dinosaur . name
24- dinosaurTemplateLinkContainer . href = dinosaur . link
46+ hub . searchParams . append ( 'topic' , topic )
2547
26- dinosaurList . append ( clone )
48+ const es = new EventSource ( hub )
2749
28- alertContainer . innerHTML = `<div class='alert alert-success'>Welcome to ${ dinosaur . name } !</div>`
50+ es . onmessage = e => {
51+ const message = JSON . parse ( e . data )
2952
30- window . setTimeout ( ( ) => {
31- const alert = document . querySelector ( '.alert' )
32- alert . parentNode . removeChild ( alert )
33- } , 5000 ) ;
53+ switch ( message . type ) {
54+ case 'create' :
55+ createDinosaur ( message . name , message . link )
56+ break
57+ case 'remove' :
58+ removeDinosaur ( message . id )
59+ break
60+ case 'edit' :
61+ editDinosaur ( message . data )
62+ break
3463 }
64+ }
3565 } )
0 commit comments