1
1
const localStorageIgnore = [ "photo" ] ;
2
+ const themeUrl = "https://cdn.jsdelivr.net/npm/[email protected] " ;
2
3
3
4
// Elements
4
5
const addCustomLinkButton = document . querySelector ( "a.btn" ) ;
@@ -218,3 +219,152 @@ checkbox_preview.addEventListener("change", () => {
218
219
checkbox_zip . addEventListener ( "change" , ( ) => {
219
220
checkbox_preview . disabled = checkbox_zip . checked ;
220
221
} ) ;
222
+
223
+ /*****************************************************/
224
+ /***************** Real Time Preview *****************/
225
+ /*****************************************************/
226
+
227
+ // Get Window Elements
228
+ var previewButton = document . getElementById ( 'previewButton' ) ;
229
+ var previewBlock = document . getElementById ( 'previewBlock' ) ;
230
+ var additionalLinkButton = document . getElementById ( "additionalLink" ) ;
231
+ var formData = document . getElementById ( 'form' ) ;
232
+ var theme = document . getElementById ( 'theme' ) ;
233
+
234
+ // Real time variables
235
+ var preview = false ;
236
+ var photo = "" ;
237
+ var linkCount = Number ( additionalLinkButton . getAttribute ( "data-index" ) ) ;
238
+ const styleElement = document . createElement ( 'style' ) ;
239
+
240
+ // Preview Button functionality
241
+ previewButton . addEventListener ( 'click' , ( ) => {
242
+ preview = ! preview ;
243
+ if ( preview ) {
244
+ // previewBlock.style.display = 'block';
245
+ previewBlock . style . right = '0' ;
246
+ previewButton . style . filter = 'invert(1)' ;
247
+ UpdatePreview ( ) ;
248
+ } else {
249
+ // previewBlock.style.display = 'none';
250
+ previewBlock . style . right = '-100%' ;
251
+ previewButton . style . filter = 'invert(0)' ;
252
+ }
253
+ } ) ;
254
+
255
+ // Update Preview Photo On Input
256
+ formData [ 'photo' ] . addEventListener ( 'input' , ( e ) => {
257
+ var photoData = e . target . files [ 0 ] ;
258
+ if ( photoData ) {
259
+ const reader = new FileReader ( ) ;
260
+ reader . onload = ( e ) => {
261
+ photo = e . target . result ;
262
+ UpdatePreview ( ) ;
263
+ }
264
+ reader . readAsDataURL ( photoData ) ;
265
+ }
266
+ } ) ;
267
+
268
+ // Add Listner for additionalLinkButton and for form data
269
+ additionalLinkButton . addEventListener ( 'click' , ( ) => {
270
+ linkCount ++ ;
271
+ var linkId = `links[${ linkCount } ]` ;
272
+ document . getElementById ( linkId + "[url]" ) . addEventListener ( 'input' , UpdatePreview ) ;
273
+ document . getElementById ( linkId + "[name]" ) . addEventListener ( 'input' , UpdatePreview ) ;
274
+ document . getElementById ( linkId + "[icon]" ) . addEventListener ( 'input' , UpdatePreview ) ;
275
+ } ) ;
276
+
277
+ // Update Prview Function
278
+ function UpdatePreview ( ) {
279
+ var name = formData [ 'name' ] . value ;
280
+ var mainUrl = formData [ 'url' ] . value ;
281
+ var description = formData [ 'description' ] . value ;
282
+ var email = formData [ 'email' ] . value ;
283
+ var links = "" ;
284
+ var photoCode = "" ;
285
+ var themePath = "" ;
286
+
287
+ // Links
288
+ for ( var i = 0 ; i < linkCount ; i ++ ) {
289
+ var linkId = `links[${ i } ]` ;
290
+ var linkUrl = document . getElementById ( linkId + "[url]" ) . value ;
291
+ var linkName = document . getElementById ( linkId + "[name]" ) . value ;
292
+ var linkIcon = document . getElementById ( linkId + "[icon]" ) . value ;
293
+
294
+ if ( linkUrl !== "" ) {
295
+ if ( linkIcon !== "" ) {
296
+ links +=
297
+ `<a class="link" href="${ linkUrl } " target="_blank">
298
+ <ion-icon name="${ linkIcon } "></ion-icon>
299
+ ${ linkName } </a>` ;
300
+ }
301
+ else {
302
+ links +=
303
+ `<a class="link" href="${ linkUrl } " target="_blank">
304
+ ${ linkName } </a>` ;
305
+ }
306
+ }
307
+ }
308
+
309
+ // Check if data is added
310
+ if ( photo !== '' ) photoCode = `<img id="userPhoto" src="${ photo } " alt="User Photo"></img>` ;
311
+ if ( name !== '' ) name = `<a href="${ mainUrl } "><h1 id="userName">${ name } </h1></a>` ;
312
+ if ( description !== '' ) description = `<p id="description">${ description } </p>` ;
313
+ if ( email !== '' ) email = `<a class="link" href="mailto:${ email } " target="_blank"><ion-icon name="mail"></ion-icon> Email</a>` ;
314
+
315
+ // Add path to files
316
+ if ( theme . value !== "" )
317
+ {
318
+ let jsonString = theme . value . match ( / { .* } / ) [ 0 ] ;
319
+ var json = JSON . parse ( jsonString ) ;
320
+ themePath = "themes/" + json . id ;
321
+ }
322
+ else themePath = "themes/darkmode" ;
323
+
324
+ // Add Style
325
+ var themeStylePath = themeUrl + "/" + themePath + "/" + "style.css" ;
326
+
327
+ // Add JS
328
+ var themeJSPath = themeUrl + "/" + themePath + "/" + "index.js" ;
329
+
330
+ // Update Preview
331
+ var previewHTMLCode =
332
+ `<html>
333
+ <head>
334
+ <meta name="viewport" content="width=device-width, initial-scale=1">
335
+ <meta charset="UTF-8">
336
+ <link rel="stylesheet" href="${ themeStylePath } ">
337
+ </head>
338
+ <body>
339
+ ${ photoCode }
340
+ ${ name }
341
+ ${ description }
342
+ <div id="links">
343
+ ${ links }
344
+ ${ email }
345
+ </div>
346
+ </body>
347
+ <script src="${ themeJSPath } "></script>
348
+ <script type="module" src="https://cdn.jsdelivr.net/npm/[email protected] /dist/ionicons/ionicons.esm.js"></script>
349
+ <script nomodule src="https://cdn.jsdelivr.net/npm/[email protected] /dist/ionicons/ionicons.js"></script>
350
+ </html>` ;
351
+
352
+ var blob = new Blob ( [ previewHTMLCode ] , { type : 'text/html' } ) ;
353
+ var url = URL . createObjectURL ( blob ) ;
354
+ previewBlock . innerHTML = `<object style="width: 100%; height: 100%;" type='text/html' data='${ url } '></object>` ;
355
+ } ;
356
+
357
+ // Add Listner for all links on file Load
358
+ for ( var i = 0 ; i < linkCount ; i ++ ) {
359
+ var linkId = `links[${ i } ]` ;
360
+ document . getElementById ( linkId + "[url]" ) . addEventListener ( 'input' , UpdatePreview ) ;
361
+ document . getElementById ( linkId + "[name]" ) . addEventListener ( 'input' , UpdatePreview ) ;
362
+ document . getElementById ( linkId + "[icon]" ) . addEventListener ( 'input' , UpdatePreview ) ;
363
+ }
364
+
365
+ // Add Listner for all forms inputs on file Load
366
+ formData [ 'name' ] . addEventListener ( 'input' , UpdatePreview ) ;
367
+ formData [ 'url' ] . addEventListener ( 'input' , UpdatePreview ) ;
368
+ formData [ 'description' ] . addEventListener ( 'input' , UpdatePreview ) ;
369
+ formData [ 'email' ] . addEventListener ( 'input' , UpdatePreview ) ;
370
+ theme . addEventListener ( 'input' , UpdatePreview ) ;
0 commit comments