@@ -19,7 +19,8 @@ options.forEach(opt => {
1919} ) ;
2020
2121// Handle form submit
22- const clearForm = data => Object . entries ( data ) . forEach ( ( [ key , value ] ) => Boolean ( value ) === false && delete data [ key ] ) ;
22+ const clearForm = data => Object . entries ( data ) . forEach ( ( [ key , value ] ) => ( Boolean ( value ) === false || value < 1 ) && delete data [ key ] ) ;
23+ const extractGroup = ( text , regex ) => [ ...text . matchAll ( regex ) ] . map ( match => match [ 1 ] ) . join ( "\n" ) ;
2324function read ( ...files ) {
2425 let reads = [ ] ;
2526 files . forEach ( file => {
@@ -33,21 +34,62 @@ function read(...files) {
3334 return Promise . all ( reads ) ;
3435} ;
3536
37+ const loader = {
38+ show : ( ) => {
39+ let container = document . createElement ( "div" ) ;
40+ container . classList . add ( "loader" ) ;
41+ container . innerHTML = `
42+ <div class="spinner">
43+ <div></div>
44+ <div></div>
45+ <div></div>
46+ <div></div>
47+ <div></div>
48+ <div></div>
49+ </div>
50+ <div class="text">
51+ <span>Rendering...</span>
52+ </div>
53+ ` ;
54+
55+ document . body . appendChild ( container ) ;
56+ } ,
57+ hide : ( ) => {
58+ let container = document . querySelector ( ".loader" ) ;
59+ container . remove ( ) ;
60+ } ,
61+ alert : ( message , subtext = False ) => {
62+ let container = document . createElement ( "div" ) ;
63+ container . classList . add ( "alert" ) ;
64+ container . innerHTML = `
65+ <div class="message">
66+ <span class="title">
67+ ${ message }
68+ <div></div>
69+ </span>
70+ ${ subtext ? `<span class="subtext">${ subtext } </span>` : "" }
71+ <button id="close">close</button>
72+ </div>
73+ ` ;
74+ container . querySelector ( "#close" ) . addEventListener ( "click" , ( ) => container . remove ( ) ) ;
75+ document . body . appendChild ( container ) ;
76+ }
77+ } ;
78+
3679document . getElementById ( "render" ) . addEventListener ( "submit" , ( e ) => {
3780 e . preventDefault ( ) ;
3881 let data = {
3982 html : document . getElementById ( "html" ) . files [ 0 ] ,
4083 css : document . getElementById ( "css" ) . files [ 0 ] ,
4184 js : document . getElementById ( "js" ) . files [ 0 ] ,
42- selector : document . getElementById ( "selector" ) . value ,
43- format : document . getElementById ( "format" ) . value ,
44- size : document . getElementById ( "size" ) . value !== "" ? document . getElementById ( "size" ) . value . split ( "x" ) : null ,
45- timeout : parseFloat ( document . getElementById ( "timeout" ) . value ) . toFixed ( 1 )
85+ selector : document . getElementById ( "render- selector" ) . value ,
86+ format : document . getElementById ( "render- format" ) . value ,
87+ size : document . getElementById ( "render- size" ) . value !== "" ? document . getElementById ( "size" ) . value . split ( "x" ) : null ,
88+ timeout : Number ( document . getElementById ( "render- timeout" ) . value ) + ( .1 * [ 10 ** - 5 ] )
4689 }
47-
4890 clearForm ( data ) ;
49-
50- const { html, css, js, ...args } = data ;
91+
92+ const { html, css, js, ...args } = data ;
5193 read ( html , css , js ) . then ( ( [ html , css , js ] ) => {
5294 let body = {
5395 elements : html ,
@@ -56,6 +98,8 @@ document.getElementById("render").addEventListener("submit", (e) => {
5698 ...args
5799 }
58100 clearForm ( body ) ;
101+
102+ loader . show ( ) ;
59103 fetch ( "api/v1/render" , {
60104 method : "POST" ,
61105 headers : {
@@ -64,10 +108,19 @@ document.getElementById("render").addEventListener("submit", (e) => {
64108 body : JSON . stringify ( body )
65109 } ) . then ( res => {
66110 if ( res . status === 200 ) {
111+ loader . hide ( ) ;
67112 window . location . href = res . url ;
113+ } else {
114+ loader . hide ( ) ;
115+ res . text ( ) . then ( text => {
116+ let regex = / l i > ( [ \s \S ] * ?) < \/ l i / g;
117+ text = text . replace ( / \n * / gm, "" ) ;
118+ loader . alert ( `Error: ${ res . status } ` , extractGroup ( text , regex ) ) ;
119+ } ) ;
68120 } ;
69121 } ) . catch ( err => {
70- console . log ( err ) ;
122+ loader . hide ( ) ;
123+ loader . alert ( err . message ) ;
71124 } ) ;
72125 } )
73126} ) ;
@@ -76,25 +129,35 @@ document.getElementById("urlToImage").addEventListener("submit", (e) => {
76129 e . preventDefault ( ) ;
77130 let data = {
78131 url : document . getElementById ( "url" ) . value ,
79- selector : document . getElementById ( "selector" ) . value ,
80- format : document . getElementById ( "format" ) . value ,
81- size : document . getElementById ( "size" ) . value !== "" ? document . getElementById ( "size" ) . value . split ( "x" ) : null ,
82- timeout : parseFloat ( document . getElementById ( "timeout" ) . value ) . toFixed ( 1 ) ,
132+ selector : document . getElementById ( "urlToImage- selector" ) . value ,
133+ format : document . getElementById ( "urlToImage- format" ) . value ,
134+ size : document . getElementById ( "urlToImage- size" ) . value !== "" ? document . getElementById ( "size" ) . value . split ( "x" ) : null ,
135+ timeout : Number ( document . getElementById ( "urlToImage- timeout" ) . value ) + ( .1 * [ 10 ** - 5 ] ) ,
83136 }
84-
85137 clearForm ( data ) ;
138+
139+ loader . show ( ) ;
86140 fetch ( "/api/v1/urlToImage" , {
87141 method : "POST" ,
88142 headers : {
89143 "Content-Type" : "application/json"
90144 } ,
91145 body : JSON . stringify ( data )
92- }
146+ }
93147 ) . then ( res => {
94148 if ( res . status === 200 ) {
149+ loader . hide ( ) ;
95150 window . location . href = res . url ;
96- }
151+ } else {
152+ loader . hide ( ) ;
153+ res . text ( ) . then ( text => {
154+ let regex = / l i > ( [ \s \S ] * ?) < \/ l i / g;
155+ text = text . replace ( / \n * / gm, "" ) ;
156+ loader . alert ( `Error: ${ res . status } ` , extractGroup ( text , regex ) ) ;
157+ } ) ;
158+ } ;
97159 } ) . catch ( err => {
98- console . log ( err ) ;
160+ loader . hide ( ) ;
161+ loader . alert ( err . message ) ;
99162 } ) ;
100163} ) ;
0 commit comments