Ricerca contestuale e swipe: guida UX completa
Un'app mobile si giudica in secondi. Non in funzionalità. Non in numero di pulsanti. In secondi — il tempo che ti serve per trovare ciò che cerchi e fare ciò che vuoi fare. È per questo che ho investito così tanto tempo nella ricerca contestuale e nella navigazione tramite swipe in TAMSIV.
Punti chiave da ricordare:
- La ricerca unificata interroga simultaneamente attività e memo con ponderazione per pertinenza e recenza.
- La ricerca contestuale prioritizza i risultati del contesto attuale (gruppo, cartella) senza escludere gli altri.
- Lo swipe-to-dismiss con una soglia di 100px è il punto ottimale tra gesto accidentale e intenzionale.
- La fluidità di un'app è la somma di centinaia di micro-decisioni UX invisibili.
Perché la ricerca è il primo indicatore di qualità di un'app?
Quando un utente apre un'app di produttività, cerca qualcosa. Un'attività, un memo, un'informazione. Se la ricerca è lenta, mal mirata o assente, l'intera app sembra rotta. È un fatto che il Nielsen Norman Group documenta da anni.
In TAMSIV, la ricerca non è un campo di testo basilare posizionato in cima allo schermo. È un sistema unificato che interroga simultaneamente attività, memo ed eventi del calendario, in tutti i contesti accessibili all'utente.
Il SearchService è un singleton che centralizza tutte le richieste di ricerca. Utilizza il full-text search di PostgreSQL tramite Supabase per risultati rapidi e pertinenti, anche con migliaia di elementi.
Come funziona la ponderazione dei risultati di ricerca?
Non tutti i risultati sono uguali. Quando digiti "riunione", probabilmente vuoi la riunione di domani, non quella di 3 mesi fa. Il sistema di ponderazione tiene conto di due assi:
- La pertinenza testuale: titolo > contenuto > checklist. Una corrispondenza nel titolo vale più di una corrispondenza nel corpo. PostgreSQL
ts_rankgestisce questo nativamente. - La recenza: gli elementi creati o modificati di recente vengono potenziati. Un coefficiente decrescente basato sulla data dell'ultima modifica penalizza i risultati più vecchi.
Questa doppia classificazione è cruciale. Senza di essa, una ricerca su "rapporto" restituirebbe 200 risultati in un ordine incomprensibile. Con essa, i primi 3 risultati sono quasi sempre quelli giusti.
Ho ottimizzato questo sistema con la cache di contenuto per evitare query costose ad ogni battitura. Il debounce di 300ms combinato con la cache di memoria rende la ricerca quasi istantanea.
Cos'è la ricerca contestuale e perché cambia tutto?
La ricerca "classica" tratta tutti i risultati allo stesso modo. Cerchi "budget", ottieni tutti gli elementi contenenti "budget" in tutta l'app. È corretto ma inutile quando stai lavorando in un gruppo specifico.
La ricerca contestuale di TAMSIV funziona diversamente: prioritizza i risultati del contesto attuale senza escludere gli altri. Se sei in un gruppo "Marketing", i risultati di quel gruppo appaiono per primi, seguiti dai risultati personali, poi dagli altri gruppi.
Come funziona tecnicamente?
- Il
SearchServicericeve il contesto corrente (ID gruppo, tipo di vista) come parametro - La query aggiunge un boost di pertinenza per gli elementi del contesto attuale
- I risultati vengono ordinati: contesto attuale → personale → altri gruppi
- Nessun risultato viene filtrato — solo l'ordine cambia
Questo comportamento è ispirato alla FilterBar del sistema di agenda che applica lo stesso principio di filtraggio contestuale. L'utente vede prima ciò che è pertinente nel suo contesto di lavoro.
È una sottigliezza UX che non si nota consapevolmente, ma che fa tutta la differenza tra un'app dove trovi subito e un'app dove fai fatica.
Come implementare uno swipe-to-dismiss affidabile in React Native?
Lo swipe-to-dismiss è un pattern di navigazione che gli utenti adorano — quando funziona bene. Il gesto di swipe dal bordo dello schermo per tornare indietro è diventato un riflesso sul mobile.
In TAMSIV, ho implementato questo pattern su tutte le schermate di dettaglio (attività, memo, evento) con uno stack tecnico preciso:
GestureDetectordi react-native-gesture-handler per il rilevamento del gestoAnimated.Viewper l'animazione fluida dello slide- Un hook personalizzato
useSwipeGestureche incapsula tutta la logica
Il punto critico: la soglia di attivazione. Troppo bassa (30px), lo swipe si attiva accidentalmente scorrendo. Troppo alta (200px), l'utente deve forzare e l'esperienza è faticosa.
Dopo decine di test, ho calibrato la soglia a 100 pixel. È il punto ottimale — sufficientemente alto per evitare falsi positivi, sufficientemente basso per essere naturale. Questa soglia è combinata con una velocità minima: uno swipe lento anche oltre i 100px non attiva il ritorno.
Una trappola classica in React Native: è sempre necessario utilizzare i componenti di react-native-gesture-handler (TouchableOpacity, FlatList, ScrollView) nelle aree di GestureDetector, mai quelli di react-native. Altrimenti, i gesti entrano in conflitto e lo swipe non funziona più. È un "gotcha" che ho scoperto a mie spese e documentato nelle convenzioni del progetto.
Quali micro-decisioni UX separano un prototipo da un prodotto?
La fluidità di un'app non è una funzionalità. È la somma di centinaia di micro-decisioni. Ognuna è invisibile individualmente. Insieme, fanno la differenza tra "questa app è buona" e "questa app è geniale".
Ecco le micro-decisioni che hanno il maggiore impatto in TAMSIV:
- Il debounce di ricerca a 300ms: nessuna richiesta ad ogni tasto. L'utente finisce di digitare, poi la ricerca si avvia. Impercettibile, ma dimezza di 10 il numero di richieste.
- I risultati persistenti durante il caricamento: quando modifichi la tua query, i vecchi risultati rimangono visibili finché non arrivano i nuovi. Nessun flash bianco.
- L'animazione di transizione a 250ms: il punto ottimale per le transizioni dello schermo. Più veloce sembra affrettato, più lento sembra lento. Material Design conferma questo intervallo.
- Il feedback aptico sullo swipe: una leggera vibrazione quando la soglia viene raggiunta conferma l'azione senza guardare lo schermo.
- Lo scroll inerziale preservato: quando torni indietro tramite swipe, la lista è nella stessa posizione di prima. Nessun ritorno in cima.
Ognuna di queste decisioni ha richiesto tempo di refactoring. Ma è esattamente ciò che trasforma un'app funzionale in un'app che le persone usano ogni giorno.
Come misurare la fluidità di un'applicazione mobile?
La fluidità non si misura solo in FPS. Ecco le metriche che monitoro in TAMSIV:
- Time-to-first-result: il tempo tra la prima lettera digitata e la visualizzazione del primo risultato di ricerca. Obiettivo: < 200ms.
- Gesture recognition rate: la percentuale di swipe rilevati correttamente rispetto ai falsi positivi. Obiettivo: > 98%.
- Navigation depth: il numero di tap necessari per raggiungere qualsiasi contenuto. Obiettivo: massimo 3 tap.
- Perceived performance: la sensazione di rapidità, indipendentemente dalle metriche grezze. Le animazioni e il design delle interazioni giocano un ruolo importante.
La dashboard admin mi permette di seguire queste metriche in tempo reale e di rilevare le regressioni prima che gli utenti le segnalino.
Qual è l'impatto della ricerca vocale sulla navigazione?
La ricerca testuale è solo una parte dell'equazione. Con il dittafono integrato, TAMSIV offre un'alternativa ancora più rapida: la ricerca vocale implicita.
Quando dici "dov'è il rapporto marketing della scorsa settimana?", l'IA non si limita a creare un elemento — cerca nei tuoi dati esistenti e ti risponde. È la pipeline vocale che elabora questa richiesta, non il SearchService, ma il risultato è lo stesso: trovi ciò che cerchi senza digitare.
La combinazione ricerca testuale + ricerca vocale + navigazione tramite swipe crea un'esperienza in cui l'app scompare dietro l'azione. Non pensi più all'interfaccia — fai ciò che devi fare.
FAQ
La ricerca di TAMSIV funziona offline?
La ricerca utilizza una cache di memoria locale che conserva gli ultimi risultati e gli elementi frequentemente acceduti. Per una ricerca completa con risultati aggiornati, è necessaria una connessione poiché la ricerca full-text viene eseguita lato server tramite Supabase.
È possibile cercare nelle checklist e negli allegati?
Sì, la ricerca copre i titoli, il contenuto delle attività e dei memo, nonché gli elementi delle checklist. Anche i nomi dei file allegati sono indicizzati. Il sistema pondera i risultati per privilegiare le corrispondenze nei titoli.
Lo swipe-to-dismiss funziona ovunque nell'app?
Lo swipe-to-dismiss è attivo su tutte le schermate di dettaglio: dettaglio attività, dettaglio memo, dettaglio evento calendario. Non è attivo sulle schermate principali di navigazione (schede) per evitare conflitti con lo swipe di cambio scheda.
Come gestisce la ricerca i gruppi privati rispetto a quelli condivisi?
La ricerca rispetta rigorosamente le politiche RLS di Supabase. Tu vedi solo i risultati a cui hai accesso: i tuoi elementi personali e gli elementi dei gruppi di cui sei membro. La contestualizzazione influisce solo sull'ordine, mai sui permessi.