Sito Web: https://graziadecarlo.it/
Il sito web https://graziadecarlo.it/ rappresenta una vetrina per una psicoterapeuta per presentare in modo chiaro e professionale i servizi offerti. Ogni servizio è descritto in dettaglio per fornire agli utenti una panoramica completa delle competenze della professionista.
Un aspetto fondamentale del progetto è stata l’implementazione di una sezione blog, pensata per accogliere articoli tematici della psicoterapeuta. Grazie a un sistema di gestione dei contenuti personalizzato (CMS), accessibile tramite l'autenticazione Google, è possibile gestire il blog autonomamente anche senza competenze tecniche. Questo approccio mantiene i contenuti aggiornati, contribuendo a stabilire un dialogo continuo con i visitatori interessati.
Lo sviluppo del sito ha previsto l’utilizzo di un set di tecnologie moderne e consolidato. Le scelte tecnologiche sono state guidate da tre obiettivi principali:
La scelta è ricaduta principalmente su queste librerie Next.js, Material UI, Prisma e Typescript.
Next.js è un framework basato su React che semplifica la configurazione e ottimizza le prestazioni. Tra i vantaggi che ho trovato:
Grazie a Next.js, posso sviluppare applicazioni più efficaci e scalabili, che sarebbero altrimenti difficili da mantenere come sviluppatore singolo.
TypeScript è uno strumento potente che aggiunge il supporto dei tipi statici a JavaScript, consentendo di rilevare errori durante lo sviluppo. Con TypeScript:
Prisma è un ORM (Object-Relational Mapping) che facilita la gestione e l'interrogazione del database con un'interfaccia più intuitiva rispetto alla scrittura di query SQL tradizionali.
Grazie a Prisma, posso concentrarmi di più sulla logica del progetto e meno sulla gestione complessa del database, il che è essenziale per lo sviluppo rapido e sicuro.
Material UI è una libreria di componenti React che si basa sulle linee guida di Material Design di Google.
In particolare, Material UI mi ha aiutato a creare rapidamente interfacce professionali, risparmiando tempo nello sviluppo del design e permettendomi di concentrarmi maggiormente sulla funzionalità del sito.
Note: per installare npm install next-auth
NextAuth è una libreria open-source per Next.js che semplifica l'implementazione dell'autenticazione nelle applicazioni web.
Supporta diversi provider di autenticazione, come Google, Facebook, GitHub e molti altri, oltre ad offrire un'integrazione semplice per email e credenziali.
Con NextAuth.js è possibile gestire facilmente login, logout, sessioni e autorizzazioni, rendendo più sicuro e veloce il processo di autenticazione degli utenti.
Note: per installare npm install cloudinary
Cloudinary è una piattaforma per la gestione di immagini e video su web e mobile. Offre strumenti per caricare, archiviare, ottimizzare e trasformare contenuti multimediali in tempo reale, migliorando le prestazioni e l’esperienza utente.
Cloudinary supporta funzionalità avanzate come il ridimensionamento automatico, la compressione, il formato adattivo e la distribuzione tramite CDN, rendendolo ideale per sviluppatori e aziende che vogliono gestire contenuti visivi in modo efficiente.
Note: per installare npm install --save lexical @lexical/react
Lexical è un editor di testo open-source basato su React, progettato per essere altamente estensibile, performante e accessibile. Fornisce agli sviluppatori la flessibilità di creare esperienze di editing avanzate con supporto per plugin personalizzati, gestione della selezione e rendering ottimizzato.
Lexical è ideale per applicazioni che richiedono editor di testo avanzati, come CMS, piattaforme di blogging e app di collaborazione.
Il design, in linea con le preferenze della cliente, utilizza come colore principale un verde scuro, con i font Cormorant e Roboto. Ho realizzato un video introduttivo e un logo in SVG per facilitare la personalizzazione CSS di colore e animazione.
Il tema di Material UI è stato costruito con un’architettura modulare, suddividendo le componenti (come Typography.ts per i testi e Components.ts per gli elementi) e unendo tutto nel file index.ts
. In questo modo è stato possibile esportare il tema per passarlo al <ThemeProvider theme={theme} />
nel file di layout.ts
.
Per differenziare il layout dell'area utente rispetto all'accesso al CMS, ho definito due layout root distinti, eliminando il layout principale presente nella directory ./app:
.
Ho quindi configurato un layout dedicato per la sezione di autenticazione e gestione utente all'interno di /(auth)/layout.ts
, dove sono state definite tutte le componenti necessarie per la login e per le funzionalità dell'utente autenticato, evitando di caricare elementi non necessari per il client pubblico.
Per ottenere un effetto di comparsa graduale dei vari componenti nella pagina, ho implementato un'animazione CSS e un hook di osservazione dell'intersezione, che permette di rilevare quando un elemento entra nell'area visibile. Questo approccio migliora l’esperienza visiva, rendendo il caricamento dei componenti più fluido.
componentsFadeIn
, viene applicata un'animazione di comparsa (compFadeIn
) con un effetto di scorrimento verso l'alto e aumento dell'opacità.useIntersectionObserver
, consente di monitorare quando un elemento entra nell'area visibile della pagina e di applicare la classe CSS di animazione (componentsFadeIn
) una volta che l'elemento è visibile. Essa utilizza l'API IntersectionObserver
per osservare l'intersezione degli elementi con il viewport, aggiungendo la classe CSS al primo rilevamento e interrompendo poi l'osservazione per ottimizzare le prestazioni.CardPost
, uso l'hook useIntersectionObserver
per assegnare la classe CSS di animazione alla card quando entra in pagina dell'utente.Grazie a questa configurazione, i componenti come CardPost
si animano gradualmente quando diventano visibili, migliorando l'estetica della pagina e rendendo l'interfaccia utente più interattiva e coinvolgente.
L'autenticazione è implementata per permettere l’accesso solo all’account della psicoterapeuta come amministratore, grazie alla libreria NextAuth:
Il database, costruito con MongoDB e Prisma, memorizza post e dati utente. L’architettura è pensata per gestire post esclusivamente creati dall’utente amministratore.
L'utilizzo di Prisma ha semplificato e velocizzato la gestione delle operazioni di accesso alle risorse, rendendo le operazioni CRUD (Create, Read, Update, Delete) più efficienti e sicure. In particolare, Prisma permette di lavorare con un'API intuitiva per il database, riducendo il rischio di errori e aumentando la produttività. Per esempio, di seguito troviamo un’implementazione delle azioni per recuperare i post del blog e ottenere i dettagli di un singolo post tramite il suo slug.
Questo mi ha permesso di avere:
schema.prisma
Per la gestione delle immagini, ho scelto Cloudinary per le sue potenti funzionalità di ottimizzazione e gestione dei contenuti visivi, che contribuiscono a migliorare la velocità di caricamento del sito e la qualità dell’esperienza utente. Cloudinary supporta trasformazioni dinamiche delle immagini, permettendomi di applicare ridimensionamenti e compressioni al momento del caricamento senza sacrificare la qualità.
Nell’applicazione, ho implementato una funzione per il caricamento delle immagini che gestisce l’interazione con l'API di Cloudinary, caricando ogni immagine su un server esterno e restituendo un URL ottimizzato per il web:
Note: utilizzo come immagine di prova per la copertina del post, il backround del mio sito web.
Grazie a questa funzione, gli utenti possono caricare le immagini in modo rapido e sicuro. Inoltre, ogni immagine è ottimizzata automaticamente e memorizzata nella cartella specifica del progetto per una gestione ordinata dei contenuti.
Dopo il salvataggio del post andato a buon fine, verrà salvato il post sul mongo e visualizzato nella pagina di dashboard con la possibilità di eliminarlo e/o modificarlo.
Considerando che il cliente non ha una conoscenza tecnica, ho selezionato un editor di testo avanzato che consente di scrivere e formattare i post in modo semplice e intuitivo. Dopo un’attenta ricerca, ho optato per Lexical, una libreria flessibile che offre la possibilità di creare plugin personalizzati per migliorare l’esperienza utente e adattarsi alle esigenze specifiche del cliente.
L'editor Lexical permette di costruire una toolbar personalizzata e aggiungere funzionalità specifiche grazie ai plugin, rendendo l'interfaccia di scrittura personalizzabile. Inoltre, il testo formattato viene salvato in editorState
, una variabile JSON che conserva la struttura del contenuto, rendendo la gestione dei post semplice e sicura.
L'implementazione include un plugin toolbar per le principali azioni di formattazione (grassetto, corsivo, link, ecc.) e un plugin di gestione dello stato in tempo reale, che aggiorna automaticamente editorState
ogni volta che l'utente effettua modifiche. Di seguito, la configurazione e il codice dell’editor:
Grazie a questa soluzione, la psicoterapeuta può aggiornare i contenuti in autonomia, formattando il testo secondo le necessità e ottenendo un'interfaccia intuitiva che semplifica la gestione del blog senza la necessità di conoscere linguaggi di markup.
Per l'ottimizzazione SEO, ho integrato robots.txt e sitemap.xml, generata dinamicamente con Next.js. Infatti NextJs permette di generare dinamicamente la sitemap per tutte le pagine del sito, garantendo che ogni nuovo articolo sia automaticamente aggiunto e indicizzato. Visitando il sito online sarà possibile vedere la sitemap generata.
Sono stati inseriti i principali Metadati nella intestazione come il titolo, descrizione, immagine per twitter e opengraph, keywords ,ecc...
Con l'uso di Google Search Console è possibile avere una panoramica di dati utili come ad esempio le query più utilizzate dagli utenti per trovare il sito sviluppato.
Vercel è una piattaforma di deployment e collaborazione per sviluppatori frontend integrata con GitHub, che supporta un flusso di lavoro fluido tra sviluppo e rilascio. Nel mio caso, gestisco due branch principali:
Seguo una numerazione del tipo "X.X.X-SNAPSHOT", dove:
SNAPSHOT
indica che si tratta di una versione in fase di sviluppo.Quando le modifiche passano su main, il suffisso -SNAPSHOT
viene rimosso per indicare che la versione è stabile e pronta per la distribuzione.