import './styles.css' import { h, mount } from './dom' import { bootstrap, getState, subscribe } from './store' import { renderJoin } from './views/join' import { renderWeek } from './views/week' import { renderRadar } from './views/radar' import { renderJournal } from './views/journal' import { renderSettings } from './views/settings' import { getBaseUrl } from './config' import { checkForUpdate } from './update' import { showUpdateModal } from './update-modal' type Tab = 'meteo' | 'radar' | 'bilan' | 'parametres' const app = document.getElementById('app')! let activeTab: Tab = 'meteo' const TABS: { id: Tab; label: string; icon: string }[] = [ { id: 'meteo', label: 'Météo', icon: 'cloud-sun' }, { id: 'radar', label: 'Radar', icon: 'satellite-dish' }, { id: 'bilan', label: 'Bilan', icon: 'journal-bookmark' }, { id: 'parametres', label: 'Plus', icon: 'gear' }, ] function svgIcon(name: string): string { const icons: Record = { 'cloud-sun': '', 'satellite-dish': '', 'journal-bookmark': '', 'gear': '', } return `${icons[name] ?? ''}` } function renderApp(): void { const state = getState() // Écran d'accueil if (!state.session) { const container = h('div', { class: 'mobile-container' }) const main = h('main', { class: 'app-main' }) renderJoin(main, renderApp) container.append(main) mount(app, container) return } const container = h('div', { class: 'mobile-container' }) // Header const header = h( 'header', { class: 'app-header' }, h( 'div', { class: 'flex items-center gap-3' }, h('div', { class: 'app-mark paper-grid' }, h('div', { class: 'zero' }, '0')), h( 'div', {}, h('h1', { class: 'font-bold text-lg leading-none' }, 'Météo Exam'), h('p', { class: 'text-[10px] font-black tracking-widest uppercase mt-1', style: 'color:var(--blue2)' }, `${state.klass?.name ?? state.session.klass.name}${state.klass?.level ? ` • ${state.klass.level}` : ''}`), ), ), h( 'button', { class: 'live-btn', onclick: () => {} }, h('span', { class: 'status-dot', style: 'background:var(--good)' }), ), ) // Main content const main = h('main', { class: 'app-main' }) const rerender = (): void => renderApp() switch (activeTab) { case 'meteo': renderWeek(main, rerender); break case 'radar': renderRadar(main, rerender); break case 'bilan': renderJournal(main, rerender); break case 'parametres': renderSettings(main, rerender); break } // Bottom nav const nav = h( 'nav', { class: 'bottom-nav' }, ...TABS.map((tab) => { const active = tab.id === activeTab return h( 'button', { class: active ? 'active' : '', onclick: () => { activeTab = tab.id; renderApp() }, }, h('span', { html: svgIcon(tab.icon) }), h('span', {}, tab.label), ) }), ) container.append(header, main, nav) mount(app, container) } subscribe(renderApp) void bootstrap().then(() => { renderApp() console.log(`Météo Exam — v${__APP_VERSION__} — serveur : ${getBaseUrl()}`) void checkForUpdate().then((update) => { if (update) showUpdateModal(update, () => renderApp()) }) })