|
| 1 | +# Tutorial System - MyTaskly |
| 2 | + |
| 3 | +Sistema di tutorial interattivo per guidare gli utenti attraverso le funzionalità principali dell'app MyTaskly. |
| 4 | + |
| 5 | +## Architettura |
| 6 | + |
| 7 | +Il sistema di tutorial è basato su `react-native-walkthrough-tooltip` e utilizza un approccio context-based per la gestione dello stato globale. |
| 8 | + |
| 9 | +### Componenti Principali |
| 10 | + |
| 11 | +``` |
| 12 | +src/components/Tutorial/ |
| 13 | +├── InteractiveTutorial.tsx # Componente base per tooltip interattivi |
| 14 | +├── TutorialTooltip.tsx # Wrapper semplificato per applicare tooltip |
| 15 | +├── TutorialWelcomeScreen.tsx # Schermata di benvenuto iniziale |
| 16 | +├── index.tsx # TutorialManager (legacy - deprecato) |
| 17 | +└── exports.ts # Esportazioni centralizzate |
| 18 | +``` |
| 19 | + |
| 20 | +### Context & Hooks |
| 21 | + |
| 22 | +``` |
| 23 | +src/contexts/TutorialContext.tsx # Context provider per stato tutorial |
| 24 | +src/hooks/useInteractiveTutorial.ts # Hook per usare il tutorial context |
| 25 | +``` |
| 26 | + |
| 27 | +### Configurazione |
| 28 | + |
| 29 | +``` |
| 30 | +src/constants/tutorialContent.ts # Definizione degli step del tutorial |
| 31 | +src/locales/ # Traduzioni IT/EN |
| 32 | +``` |
| 33 | + |
| 34 | +## Come Funziona |
| 35 | + |
| 36 | +### 1. Avvio Automatico |
| 37 | + |
| 38 | +Al primo avvio dell'app, viene mostrata automaticamente la `TutorialWelcomeScreen` che offre due opzioni: |
| 39 | +- **Inizia il Tour**: Avvia il tutorial interattivo |
| 40 | +- **Salta il tour**: Chiude la schermata e salva la preferenza |
| 41 | + |
| 42 | +### 2. Step del Tutorial |
| 43 | + |
| 44 | +Gli step sono definiti in `tutorialContent.ts` e organizzati per schermata: |
| 45 | + |
| 46 | +**Home Screen:** |
| 47 | +- `home-text-chat`: Input messaggio chat testuale |
| 48 | +- `home-voice-chat`: Pulsante microfono per chat vocale |
| 49 | +- `home-chat-history`: Pulsante cronologia conversazioni |
| 50 | + |
| 51 | +**Categories Screen:** |
| 52 | +- `categories-general`: Vista categoria generale |
| 53 | +- `categories-new-task`: Pulsante creazione task da categoria |
| 54 | +- `categories-refresh`: Pulsante aggiorna/sincronizza |
| 55 | + |
| 56 | +**Notes Screen** (da implementare): |
| 57 | +- `notes-create`: Creazione nuova nota |
| 58 | +- `notes-edit`: Modifica nota esistente |
| 59 | +- `notes-move`: Spostamento nota su whiteboard |
| 60 | + |
| 61 | +**Calendar Screen** (da implementare): |
| 62 | +- `calendar-switch`: Switch tra vista base e avanzata |
| 63 | + |
| 64 | +### 3. Tooltip Interattivi |
| 65 | + |
| 66 | +Ogni elemento UI chiave è wrappato con `<TutorialTooltip stepKey="...">`: |
| 67 | + |
| 68 | +```tsx |
| 69 | +<TutorialTooltip stepKey="home-text-chat"> |
| 70 | + <View style={styles.inputContainer}> |
| 71 | + {/* ... elemento UI ... */} |
| 72 | + </View> |
| 73 | +</TutorialTooltip> |
| 74 | +``` |
| 75 | + |
| 76 | +Il tooltip mostra: |
| 77 | +- Titolo e descrizione dello step |
| 78 | +- Pulsanti navigazione (Avanti/Indietro) |
| 79 | +- Opzione "Salta tutorial" |
| 80 | +- Posizionamento automatico (top/bottom/left/right) |
| 81 | + |
| 82 | +### 4. Persistenza |
| 83 | + |
| 84 | +Lo stato di completamento del tutorial viene salvato in AsyncStorage: |
| 85 | +- Key: `@mytaskly:tutorial_completed` |
| 86 | +- Values: `"true"` (completato), `"skipped"` (saltato), `null` (non fatto) |
| 87 | + |
| 88 | +## Utilizzo |
| 89 | + |
| 90 | +### Integrare un Nuovo Step |
| 91 | + |
| 92 | +1. **Aggiungi traduzione** in `src/locales/it.json` e `en.json`: |
| 93 | +```json |
| 94 | +"tutorial": { |
| 95 | + "steps": { |
| 96 | + "myScreen": { |
| 97 | + "myFeature": { |
| 98 | + "title": "Titolo Feature", |
| 99 | + "description": "Descrizione dettagliata" |
| 100 | + } |
| 101 | + } |
| 102 | + } |
| 103 | +} |
| 104 | +``` |
| 105 | + |
| 106 | +2. **Definisci lo step** in `src/constants/tutorialContent.ts`: |
| 107 | +```typescript |
| 108 | +{ |
| 109 | + key: 'myScreen-myFeature', |
| 110 | + screen: 'MyScreen', |
| 111 | + title: content.myScreen.myFeature.title, |
| 112 | + description: content.myScreen.myFeature.description, |
| 113 | + placement: 'bottom', |
| 114 | +} |
| 115 | +``` |
| 116 | + |
| 117 | +3. **Wrappa l'elemento UI** nella schermata: |
| 118 | +```tsx |
| 119 | +import { TutorialTooltip } from '../../components/Tutorial/TutorialTooltip'; |
| 120 | + |
| 121 | +<TutorialTooltip stepKey="myScreen-myFeature"> |
| 122 | + <TouchableOpacity> |
| 123 | + {/* ... */} |
| 124 | + </TouchableOpacity> |
| 125 | +</TutorialTooltip> |
| 126 | +``` |
| 127 | + |
| 128 | +### Riavviare il Tutorial |
| 129 | + |
| 130 | +Gli utenti possono riavviare il tutorial da **Impostazioni > Rivedi Tutorial**. Questo: |
| 131 | +- Rimuove il flag di completamento |
| 132 | +- Imposta gli step del tutorial |
| 133 | +- Avvia il tutorial dall'inizio |
| 134 | + |
| 135 | +## API Context |
| 136 | + |
| 137 | +### TutorialContext |
| 138 | + |
| 139 | +```typescript |
| 140 | +interface TutorialContextType { |
| 141 | + isTutorialVisible: boolean; |
| 142 | + shouldAutoStart: boolean; |
| 143 | + currentStepIndex: number; |
| 144 | + currentStep: TutorialStep | null; |
| 145 | + steps: TutorialStep[]; |
| 146 | + startTutorial: () => void; |
| 147 | + closeTutorial: () => void; |
| 148 | + nextStep: () => void; |
| 149 | + previousStep: () => void; |
| 150 | + skipTutorial: () => void; |
| 151 | + setSteps: (steps: TutorialStep[]) => void; |
| 152 | + registerElementRef: (key: string, ref: any) => void; |
| 153 | + getElementRef: (key: string) => any; |
| 154 | +} |
| 155 | +``` |
| 156 | + |
| 157 | +### Uso del Context |
| 158 | + |
| 159 | +```tsx |
| 160 | +import { useTutorialContext } from '../contexts/TutorialContext'; |
| 161 | + |
| 162 | +const { |
| 163 | + startTutorial, |
| 164 | + nextStep, |
| 165 | + currentStep |
| 166 | +} = useTutorialContext(); |
| 167 | +``` |
| 168 | + |
| 169 | +## Personalizzazione Stili |
| 170 | + |
| 171 | +Gli stili dei tooltip sono definiti in `InteractiveTutorial.tsx`: |
| 172 | + |
| 173 | +```typescript |
| 174 | +const styles = StyleSheet.create({ |
| 175 | + tooltipContent: { padding: 20, maxWidth: 300 }, |
| 176 | + tooltipTitle: { fontSize: 18, fontWeight: 'bold' }, |
| 177 | + tooltipDescription: { fontSize: 14, color: '#666' }, |
| 178 | + primaryButton: { backgroundColor: '#007AFF' }, |
| 179 | + // ... |
| 180 | +}); |
| 181 | +``` |
| 182 | + |
| 183 | +## Migrazione dal Vecchio Sistema |
| 184 | + |
| 185 | +Il vecchio sistema basato su `TutorialManager` è stato deprecato. Le differenze principali: |
| 186 | + |
| 187 | +| Vecchio | Nuovo | |
| 188 | +|---------|-------| |
| 189 | +| `TutorialManager` component | `TutorialWelcomeScreen` + `TutorialTooltip` | |
| 190 | +| Navigation-based | Context-based | |
| 191 | +| Spotlight overlay | Native tooltips | |
| 192 | +| Sequenza fissa | Step modulari | |
| 193 | +| Pulsante "?" nella Home | Avvio automatico + Settings | |
| 194 | + |
| 195 | +## Troubleshooting |
| 196 | + |
| 197 | +### Il tutorial non si avvia |
| 198 | +- Verifica che `TutorialWelcomeScreen` sia montato in `navigation/index.tsx` |
| 199 | +- Controlla AsyncStorage per il flag `@mytaskly:tutorial_completed` |
| 200 | +- Verifica che gli step siano configurati correttamente |
| 201 | + |
| 202 | +### I tooltip non appaiono |
| 203 | +- Verifica che `stepKey` corrisponda a uno step definito |
| 204 | +- Controlla che `isTutorialVisible` sia `true` nel context |
| 205 | +- Verifica il `currentStep.screen` corrisponda alla schermata corrente |
| 206 | + |
| 207 | +### Errori TypeScript |
| 208 | +- Assicurati che `TutorialStep` sia importato da `InteractiveTutorial.tsx` |
| 209 | +- Non confondere `TutorialStep` (nuovo) con `OldTutorialStep` (legacy) |
| 210 | + |
| 211 | +## Future Enhancements |
| 212 | + |
| 213 | +- [ ] Completare integrazione Notes e Calendar |
| 214 | +- [ ] Aggiungere animazioni personalizzate |
| 215 | +- [ ] Tracking analytics completamento tutorial |
| 216 | +- [ ] Supporto per tooltip condizionali (es. solo se feature attiva) |
| 217 | +- [ ] Tutorial contestuali (es. dopo aver completato un'azione) |
0 commit comments