# Toast Notifications - Implementation Plan
## 📋 Overview
Integration von **Svelte Sonner** für moderne Toast-Benachrichtigungen in uLoad.
## 🎯 Ziele
- Nutzer über Aktionen informieren (Erfolg, Fehler, Loading)
- Konsistente UX über die gesamte App
- Mobile-freundliche Benachrichtigungen
- Minimaler Setup mit maximaler Flexibilität
## 📦 Implementation Steps
### Phase 1: Installation & Setup
```bash
# 1. Package installieren
npm install svelte-sonner
# 2. Toaster in Root-Layout einbinden
# src/routes/+layout.svelte
```
### Phase 2: Basis-Integration
```svelte
```
### Phase 3: Custom Styling
```css
/* src/app.css - Tailwind/Theme Integration */
:root {
/* Light Mode */
--sonner-toast-background: theme('colors.white');
--sonner-toast-text: theme('colors.gray.900');
--sonner-toast-border: theme('colors.gray.200');
/* Success */
--sonner-success-bg: theme('colors.green.50');
--sonner-success-border: theme('colors.green.200');
--sonner-success-text: theme('colors.green.800');
/* Error */
--sonner-error-bg: theme('colors.red.50');
--sonner-error-border: theme('colors.red.200');
--sonner-error-text: theme('colors.red.800');
/* Info */
--sonner-info-bg: theme('colors.blue.50');
--sonner-info-border: theme('colors.blue.200');
--sonner-info-text: theme('colors.blue.800');
}
.dark {
/* Dark Mode */
--sonner-toast-background: theme('colors.gray.800');
--sonner-toast-text: theme('colors.gray.100');
--sonner-toast-border: theme('colors.gray.700');
/* Success */
--sonner-success-bg: theme('colors.green.900/20');
--sonner-success-border: theme('colors.green.800');
--sonner-success-text: theme('colors.green.400');
/* Error */
--sonner-error-bg: theme('colors.red.900/20');
--sonner-error-border: theme('colors.red.800');
--sonner-error-text: theme('colors.red.400');
}
```
### Phase 4: Helper Service
```typescript
// src/lib/services/toast.ts
import { toast } from 'svelte-sonner';
export const notify = {
// Success Messages
success: (message: string) => toast.success(message),
// Error Messages with optional details
error: (message: string, details?: string) => {
if (details) {
toast.error(message, {
description: details,
});
} else {
toast.error(message);
}
},
// Loading → Success/Error Pattern
promise: async (
promise: Promise,
messages: {
loading: string;
success: string | ((data: T) => string);
error: string | ((error: any) => string);
}
) => {
return toast.promise(promise, messages);
},
// Info Messages
info: (message: string) => toast.info(message),
// Custom with Actions
action: (message: string, actionLabel: string, onAction: () => void) => {
toast(message, {
action: {
label: actionLabel,
onClick: onAction,
},
});
},
};
```
## 🔄 Migration Plan
### 1. Username Setup Page
```typescript
// src/routes/(app)/setup-username/+page.svelte
import { notify } from '$lib/services/toast';
// Nach erfolgreichem Setzen
notify.success('Username erfolgreich gesetzt! 🎉');
// Bei Fehler
notify.error('Username bereits vergeben');
```
### 2. Link Management
```typescript
// Link erstellen
notify.promise(createLink(data), {
loading: 'Link wird erstellt...',
success: 'Link erfolgreich erstellt!',
error: (err) => `Fehler: ${err.message}`,
});
// Link kopieren
notify.success('Link in Zwischenablage kopiert 📋');
// Link löschen mit Undo
notify.action('Link gelöscht', 'Rückgängig', async () => {
await restoreLink(linkId);
notify.success('Link wiederhergestellt');
});
```
### 3. Authentication
```typescript
// Login
notify.success('Erfolgreich angemeldet');
// Logout
notify.info('Erfolgreich abgemeldet');
// Email-Verifikation
notify.info('Bestätigungsmail wurde gesendet');
// Passwort zurücksetzen
notify.success('Passwort-Reset-Link wurde gesendet');
```
### 4. Profile Updates
```typescript
// Profil speichern
notify.promise(updateProfile(data), {
loading: 'Profil wird aktualisiert...',
success: 'Profil erfolgreich gespeichert',
error: 'Fehler beim Speichern des Profils',
});
// Avatar hochladen
notify.promise(uploadAvatar(file), {
loading: 'Bild wird hochgeladen...',
success: 'Profilbild aktualisiert',
error: 'Fehler beim Upload',
});
```
### 5. Subscription/Payment
```typescript
// Upgrade
notify.success('Erfolgreich auf Pro-Plan upgraded! 🚀');
// Payment failed
notify.error('Zahlung fehlgeschlagen', 'Bitte Zahlungsmethode überprüfen');
// Subscription cancelled
notify.info('Abo wurde gekündigt. Zugang bis Monatsende aktiv.');
```
## 🎨 Toast-Typen & Verwendung
| Typ | Verwendung | Beispiel |
| ----------- | --------------------- | ------------------------------ |
| **success** | Erfolgreiche Aktionen | "Link erstellt", "Gespeichert" |
| **error** | Fehler & Probleme | "Fehler beim Speichern" |
| **info** | Informationen | "Neue Version verfügbar" |
| **loading** | Laufende Prozesse | "Wird geladen..." |
| **promise** | Async-Operationen | API-Calls, Datei-Uploads |
| **action** | Mit Aktion-Button | "Gelöscht" → "Rückgängig" |
## 📱 Mobile Considerations
- **Position**: `bottom-center` auf Mobile für bessere Erreichbarkeit
- **Swipe to dismiss**: Automatisch aktiviert
- **Stacking**: Maximal 3 Toasts gleichzeitig
- **Duration**: 4 Sekunden (außer bei Aktionen)
## 🧪 Testing Checklist
- [ ] Toast erscheint bei Success-Actions
- [ ] Toast erscheint bei Fehlern
- [ ] Promise-basierte Toasts zeigen alle 3 States
- [ ] Dark Mode Styling funktioniert
- [ ] Mobile Swipe-to-dismiss funktioniert
- [ ] Undo-Actions funktionieren
- [ ] Toasts stören keine anderen UI-Elemente
- [ ] Screen-Reader Kompatibilität
## 📊 Metriken
Nach Implementation tracken:
- Toast-Interaktionen (dismissals, action clicks)
- Häufigste Toast-Typen
- Durchschnittliche Anzeigedauer
## 🚀 Rollout
1. **Week 1**: Installation & Basic Setup
2. **Week 2**: Migration kritischer User-Flows (Login, Links)
3. **Week 3**: Vollständige Migration aller Feedback-Messages
4. **Week 4**: A/B Testing & Optimierung
## 📝 Notes
- Svelte Sonner unterstützt auch **Custom Components** als Toasts
- Bei Bedarf können wir spezielle Toast-Typen für uLoad erstellen (z.B. "Link-Preview-Toast")
- Toast-History könnte in Zukunft implementiert werden