Înapoi la portofoliu
WebappStudiu / personal

Digital Clock

Aplicație Remix/React instalabilă ca PWA, construită în jurul unui ceas seven-segment configurabil, cu timezone, 12/24h, meteo local, cronometru, timer, alarme, fullscreen și gesturi mobile.

Digital Clock

Stack principal

TypeScript
React 18
Remix
Vite
Tailwind CSSNode.jsExpress.jsProgressive Web AppWorkboxService Worker APIWeb Notifications APIWeb Push APIweb-pushGeolocation APIFullscreen APIIntl APIlocalStorageOpen-Meteo APIOpenStreetMap Nominatimbasic-ftp

Provocarea

Provocarea a fost transformarea unui simplu afișaj de oră într-o experiență utilă pe ecrane diferite: timezone corect, afișaj seven-segment adaptiv, persistența preferințelor, moduri multiple de măsurare a timpului și comportamente PWA/mobile fără a încărca interfața principală.

Soluția

Soluția folosește Remix + React pentru UI și rutare, un ClockContext pentru setările comune, localStorage pentru preferințe și alarme, CSS custom pentru segmentele digitale și API-uri native de browser pentru fullscreen, notificări, geolocație și gesturi. PWA-ul este configurat cu Vite/Workbox, iar un server Express adaugă endpointuri pentru alarme și Web Push. Funcțiile critice rămân degradabile: ceasul, timerul și cronometru funcționează client-side, iar meteo sau push nu blochează afișajul de bază dacă nu sunt disponibile.

Complexitate notabilă

Digital Clock este un proiect personal care extinde un ceas digital fullscreen într-un utilitar web instalabil. Ecranul principal redă ora într-un display seven-segment construit din componente React și CSS, actualizat la fiecare secundă și configurabil pentru format 12/24h, format de dată, timezone, dimensiune, temă cromatică și animație. Preferințele sunt persistate în localStorage și propagate printr-un ClockContext comun.

Produsul are patru moduri în aceeași suprafață: Clock, Stopwatch, Timer și Alarm. Stopwatch-ul măsoară minute, secunde și sutimi, timerul acceptă ore/minute/secunde și declanșează notificare locală la final, iar modul Alarm permite mai multe alarme, etichete, activare/dezactivare și repetare zilnică. Alarmele sunt păstrate local și sunt sincronizate către un API Express care menține o copie în memorie.

Experiența este gândită pentru desktop și mobil: controalele se rearanjează responsive, dublu-tap-ul comută fullscreen, swipe-urile schimbă modul, iar un gest de shake parcurge temele disponibile. Un screensaver poate muta display-ul prin viewport cu efect de bounce și viteză configurabilă. Codul include și suport pentru Wake Lock, deși hook-ul nu este conectat efectiv în fluxul principal analizat.

În modul Clock, aplicația poate cere geolocația browserului, folosește Nominatim pentru reverse geocoding și Open-Meteo pentru temperatura curentă, apoi reîmprospătează informația periodic. Dacă geolocația sau requesturile eșuează, componenta meteo se ascunde fără să blocheze funcția principală de ceas.

Aplicația este configurată ca PWA prin Remix + Vite și @vite-pwa/remix, cu manifest, iconuri pentru mai multe platforme, screenshots declarate, mod fullscreen/standalone, service worker și strategie NetworkFirst. Root-ul înregistrează service worker-ul, verifică update-uri și încearcă să mențină o subscripție Web Push asociată unui userId local.

Serverul custom Express expune endpointuri pentru sincronizarea alarmelor, citirea alarmelor, verificarea celor active, înregistrarea subscripțiilor push și publicarea cheii VAPID. Un interval server-side verifică minutele curente și încearcă să trimită notificări prin web-push. În snapshotul analizat, starea este însă ținută doar în Map-uri în memorie, cheile VAPID sunt regenerate la restart, timezone-ul selectat în UI nu este trimis serverului, iar service worker-ul custom încearcă să folosească localStorage — indisponibil în context de Service Worker. Din aceste motive, partea de alarmă background trebuie considerată implementare experimentală, nu un scheduler persistent de producție.

Deployment-ul este pregătit pentru hosting Node/cPanel: build-ul Remix produce bundle client/server, loader.cjs pornește serverul custom, iar repository-ul include un script FTP care urcă build-ul într-un subdirector. Snapshotul nu conține workflow-uri CI/CD sau teste automate. Tot în zona de deployment există datorie de securitate: repository-ul conține credențiale FTP și chei VAPID hardcodate, care trebuie revocate și mutate în secret management înainte de reutilizare.

Rezultate cheie

  • Aplicație web cu patru moduri integrate: Clock, Stopwatch, Timer și Alarm
  • Display seven-segment custom construit din React și CSS, cu actualizare în timp real
  • Configurare pentru 12/24h, formatul datei, timezone, trei dimensiuni, cinci teme și patru moduri de animație
  • Persistența preferințelor și alarmelor în localStorage
  • Listă de timezone-uri generată din Intl.supportedValuesOf și conversia afișajului la zona selectată
  • Meteo local prin Geolocation API, Nominatim reverse geocoding și Open-Meteo
  • Interacțiuni mobile pentru fullscreen, schimbarea modului prin swipe și schimbarea temei prin shake
  • Screensaver cu mișcare bounce și viteză configurabilă
  • Timer cu notificare locală și sunet la final și alarmă cu etichetă / repeat daily
  • Manifest PWA, iconuri multi-platformă, service worker și strategie Workbox NetworkFirst
  • API Express pentru sincronizarea alarmelor și subscripțiilor Web Push, plus trimitere server-side implementată
  • Script de build + upload FTP pentru deployment într-un subdirector de hosting

Proiecte asemănătoare

Vrei ceva similar?

Începe cu wizard-ul de estimare — răspunzi la câteva întrebări și primești un range de preț + timeline realist.