Loading...
Loading...
Anders & A-Cube S.r.l. / 15 luglio 2025 • 3 min read
Pempel Dashboard è un'applicazione mobile production-ready per la gestione di scontrini elettronici, costruita su Expo 53 e React Native 0.79. Fornisce un'esperienza offline-first seamless con autenticazione mTLS sicura, internazionalizzazione completa e standard di qualità codice enterprise-grade.
Expo Router (file-based) gestisce navigazione con app/(tabs)/* e app/modal/*. Layer stato Zustand per Scontrini, Auth, UI, Sync e Impostazioni. Layer dati con E-Receipt SDK, SQLite e AsyncStorage. Layer sicurezza con expo-mutual-tls, Secure Store e Keychain/Keystore.
Ecosistema Expo:
Stack React Native:
Gestione Stato & Dati:
Lista Scontrini con virtualizzazione:
import { FlashList } from '@shopify/flash-list'
import { useReceiptsStore } from '@/store/receipts'
export default function ReceiptsScreen() {
const { receipts, loading, fetchReceipts } = useReceiptsStore()
return (
<FlashList
data={receipts}
estimatedItemSize={120}
renderItem={({ item }) => <ReceiptCard receipt={item} />}
onRefresh={fetchReceipts}
refreshing={loading}
/>
)
}Dettagli Scontrino con visualizzazione PDF: Recupero scontrino tramite ID con possibilità download e condivisione PDF. Integrazione expo-file-system per gestione file locale e expo-sharing per condivisione multi-app.
Setup Certificato:
import ExpoMutualTls from '@a-cube-io/expo-mutual-tls'
import * as SecureStore from 'expo-secure-store'
export const setupMTLS = async (credentials: Credentials) => {
try {
// Configura modulo mTLS
await ExpoMutualTls.configureP12('pempel-app', true)
// Memorizza certificato in modo sicuro
const certificateData = await fetchUserCertificate(credentials)
await ExpoMutualTls.storeP12(
certificateData.p12Base64,
certificateData.password
)
// Memorizza metadata in secure storage
Chiamate API Autenticate: SDK EReceipts usa automaticamente mTLS per tutte le richieste con configurazione timeout 30s e gestione errori completa.
Strategia Sync:
export const useSyncManager = () => {
const { lastSync, isSyncing, setLastSync } = useSyncStore()
const syncReceipts = async () => {
const netInfo = await NetInfo.fetch()
if (!netInfo.isConnected) {
return { success: false, reason: 'offline' }
}
setIsSyncing(true)
try {
// Recupera ultimi scontrini da server
const serverReceipts = await receiptsSDK
Setup Traduzioni:
import i18n from 'i18next'
import { initReactI18next } from 'react-i18next'
import * as Localization from 'expo-localization'
i18n
.use(initReactI18next)
.init({
compatibilityJSON: 'v3',
resources: {
en: { translation: require('./locales/en.json') },
it: { translation: require('./locales/it.json') },
fr: { translation: require('./locales/fr.json') }
},
lng: Localization.locale.split(
Tooling Qualità Completo:
lint: Linting completo codicelint:fix: Fix automatico problemilint:check: Linting con zero warninglint:unused: Rimozione import inutilizzatiformat: Formattazione Prettiertype:check: Verifica TypeScriptquality:check: Controlli qualità completiquality:fix: Fix automatico tutti i problemiquality:full: Fix e verifica completiRegole Linting Complete:
Quality Gates Pre-commit:
{
"lint-staged": {
"*.{ts,tsx,js,jsx}": [
"eslint --fix",
"prettier --write",
"tsc-files --noEmit"
]
}
}Sostituzione FlatList con FlashList per rendering 10x più veloce. Prima (FlatList): ~16ms per frame per 1000 items. Dopo (FlashList): ~2ms per frame per 1000 items.
Gestione efficiente grandi dataset con @tanstack/react-virtual. Rendering solo elementi visibili con overscan 5 items. Calcolo dinamico posizioni elementi con estimateSize.
Strategia Memoizzazione:
import { memo, useMemo, useCallback } from 'react'
const ReceiptCard = memo(({ receipt, onPress }) => {
const formattedDate = useMemo(
() => formatDate(receipt.date),
[receipt.date]
)
const handlePress = useCallback(() => {
onPress(receipt.id)
}, [receipt.id, onPress])
return (
<Pressable onPress=
Pempel Dashboard dimostra sviluppo mobile production-ready con Expo e React Native, raggiungendo qualità enterprise-grade attraverso tooling completo e best practices. Il progetto bilancia con successo prestazioni, sicurezza ed esperienza sviluppatore.
Licenza: Proprietaria (A-Cube S.r.l.)