|
1 | 1 | (function () { |
2 | 2 | 'use strict'; |
3 | 3 |
|
4 | | - var STORAGE = 'ote-reader-state-v1'; |
| 4 | + var DEMO_MODE = new URLSearchParams(location.search).get('demo') === '1' || location.pathname.replace(/\/+$/, '').endsWith('/demo'); |
| 5 | + var STORAGE = DEMO_MODE ? 'ote-reader-demo-state-v1' : 'ote-reader-state-v1'; |
5 | 6 | var INSTALL_DISMISSED = 'ote-reader-install-dismissed-v1'; |
6 | 7 | var THEME_STORAGE = 'ote-reader-theme-v1'; |
7 | 8 | var WIDTH_STORAGE = 'ote-reader-width-v1'; |
8 | 9 | var ADOPTERS_URL = 'https://opentechevents.org/data/adopters.json'; |
9 | | - var DEFAULT_FEEDS = [ |
10 | | - { url: new URL('demo-feed.json', location.href).href, title: 'Feed demo' } |
| 10 | + var DEMO_FEEDS = [ |
| 11 | + { url: new URL('demo-feed.json', document.baseURI).href, title: 'Feed demo' } |
11 | 12 | ]; |
12 | 13 | var DIRECTORY_DEMO_FEEDS = [ |
13 | | - { url: new URL('eventos-wiki-demo-feed.json', location.href).href, title: 'Eventos Wiki demo' }, |
14 | | - { url: new URL('techconf-demo-feed.json', location.href).href, title: 'TechConf España demo' } |
| 14 | + { url: new URL('eventos-wiki-demo-feed.json', document.baseURI).href, title: 'Eventos Wiki demo' }, |
| 15 | + { url: new URL('techconf-demo-feed.json', document.baseURI).href, title: 'TechConf España demo' } |
15 | 16 | ]; |
16 | 17 | var DIRECTORY_FOLDER = 'Directorios OTE'; |
17 | 18 | var DEFAULT_FOLDERS = ['Conferencias', 'Eventos Almería', 'CFP para charlas']; |
|
96 | 97 | } catch (e) { |
97 | 98 | showMessage('No se pudo leer el estado guardado. Se usará una sesión limpia.', 'warn'); |
98 | 99 | } |
99 | | - if (!state.feeds.length) { |
100 | | - DEFAULT_FEEDS.forEach(function (feed) { |
| 100 | + if (DEMO_MODE && !state.feeds.length) { |
| 101 | + DEMO_FEEDS.forEach(function (feed) { |
101 | 102 | state.feeds.push({ url: feed.url, title: feed.title, status: 'pending' }); |
102 | 103 | }); |
103 | 104 | } |
104 | 105 | migrateCategories(); |
105 | | - seedDirectoryDemoFeeds(); |
| 106 | + if (DEMO_MODE) seedDirectoryDemoFeeds(); |
106 | 107 | migrateBoards(); |
107 | 108 | persist(); |
108 | 109 | } |
|
120 | 121 | } |
121 | 122 |
|
122 | 123 | function migrateCategories() { |
123 | | - if (!state.categories.length) { |
| 124 | + if (!state.categories.length && state.feeds.length) { |
124 | 125 | state.categories.push({ |
125 | 126 | id: 'community', |
126 | 127 | name: 'Community feeds', |
127 | 128 | open: true, |
128 | 129 | feedUrls: state.feeds.map(function (feed) { return feed.url; }) |
129 | 130 | }); |
130 | 131 | } |
131 | | - seedDefaultFolders(); |
| 132 | + if (DEMO_MODE) seedDefaultFolders(); |
| 133 | + if (!state.categories.length) return; |
132 | 134 | var known = new Set(state.categories.flatMap(function (category) { return category.feedUrls || []; })); |
133 | 135 | var missing = state.feeds.map(function (feed) { return feed.url; }).filter(function (url) { return !known.has(url); }); |
134 | 136 | if (missing.length) state.categories[0].feedUrls = unique((state.categories[0].feedUrls || []).concat(missing)); |
|
1087 | 1089 | if (!events.length) { |
1088 | 1090 | widget.events = []; |
1089 | 1091 | widget.setAttribute('empty-message', 'No hay eventos con esos filtros.'); |
1090 | | - showMessage('No hay eventos con esos filtros.', 'warn', true); |
| 1092 | + if (!state.feeds.length) showEmptyState(); |
| 1093 | + else showMessage('No hay eventos con esos filtros.', 'warn', true); |
1091 | 1094 | return; |
1092 | 1095 | } |
1093 | 1096 | clearMessages(); |
|
1342 | 1345 | $('messages').replaceChildren(); |
1343 | 1346 | } |
1344 | 1347 |
|
| 1348 | + function showEmptyState() { |
| 1349 | + var box = $('messages'); |
| 1350 | + box.replaceChildren(); |
| 1351 | + var empty = document.createElement('section'); |
| 1352 | + empty.className = 'empty-state'; |
| 1353 | + var title = document.createElement('h3'); |
| 1354 | + title.textContent = DEMO_MODE ? 'Demo sin eventos cargados' : 'Empieza con tus propias fuentes OTE'; |
| 1355 | + var copy = document.createElement('p'); |
| 1356 | + copy.textContent = DEMO_MODE |
| 1357 | + ? 'La demo usa feeds de ejemplo para enseñar folders, vistas y colecciones.' |
| 1358 | + : 'Suscríbete a feeds OTE, descubre fuentes publicadas o abre una demo con datos de ejemplo.'; |
| 1359 | + var actions = document.createElement('div'); |
| 1360 | + actions.className = 'empty-actions'; |
| 1361 | + var manual = document.createElement('button'); |
| 1362 | + manual.type = 'button'; |
| 1363 | + manual.textContent = 'Añadir feed'; |
| 1364 | + manual.addEventListener('click', function () { openModal('subscribe-modal'); }); |
| 1365 | + var discover = document.createElement('button'); |
| 1366 | + discover.type = 'button'; |
| 1367 | + discover.className = 'ghost'; |
| 1368 | + discover.textContent = 'Discover new feeds'; |
| 1369 | + discover.addEventListener('click', openSources); |
| 1370 | + actions.append(manual, discover); |
| 1371 | + if (!DEMO_MODE) { |
| 1372 | + var demo = document.createElement('a'); |
| 1373 | + demo.className = 'ghost-link'; |
| 1374 | + demo.href = 'demo/'; |
| 1375 | + demo.textContent = 'Ver demo'; |
| 1376 | + actions.appendChild(demo); |
| 1377 | + } |
| 1378 | + empty.append(title, copy, actions); |
| 1379 | + box.appendChild(empty); |
| 1380 | + } |
| 1381 | + |
1345 | 1382 | function subscribe(rawUrl) { |
1346 | 1383 | var url; |
1347 | 1384 | try { url = normaliseUrl(rawUrl); } catch (e) { |
|
1405 | 1442 | } |
1406 | 1443 |
|
1407 | 1444 | function bind() { |
| 1445 | + $('demo-exit').addEventListener('click', exitDemo); |
1408 | 1446 | $('subscribe-open-side').addEventListener('click', function () { openModal('subscribe-modal'); }); |
1409 | 1447 | $('find-sources-open').addEventListener('click', openSources); |
1410 | 1448 | $('sidebar-toggle').addEventListener('click', toggleSidebar); |
|
1578 | 1616 | $('help-install').hidden = !canInstall; |
1579 | 1617 | } |
1580 | 1618 |
|
| 1619 | + function updateDemoUi() { |
| 1620 | + $('demo-bar').hidden = !DEMO_MODE; |
| 1621 | + } |
| 1622 | + |
| 1623 | + function exitDemo(event) { |
| 1624 | + var target = location.origin + '/'; |
| 1625 | + if (window.top !== window.self) { |
| 1626 | + event.preventDefault(); |
| 1627 | + window.top.location.href = target; |
| 1628 | + } |
| 1629 | + } |
| 1630 | + |
1581 | 1631 | async function promptInstall() { |
1582 | 1632 | if (!deferredInstall) return; |
1583 | 1633 | deferredInstall.prompt(); |
|
1633 | 1683 | loadState(); |
1634 | 1684 | bind(); |
1635 | 1685 | updateInstallUi(); |
| 1686 | + updateDemoUi(); |
1636 | 1687 | await waitForEmbed(); |
1637 | 1688 | render(); |
1638 | 1689 | applySubscribeParam(); |
|
0 commit comments