298 lines
7.5 KiB
Markdown
298 lines
7.5 KiB
Markdown
|
|
# SoundWave PWA Implementation
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
SoundWave is now a fully-featured Progressive Web App (PWA) with offline capabilities, installability, and native app-like experience.
|
||
|
|
|
||
|
|
## Features Implemented
|
||
|
|
|
||
|
|
### 1. **Service Worker**
|
||
|
|
- **Location**: `frontend/public/service-worker.js`
|
||
|
|
- **Caching Strategies**:
|
||
|
|
- **Network First**: API requests, HTML pages (with cache fallback)
|
||
|
|
- **Cache First**: Audio files, images (with network fallback)
|
||
|
|
- **Stale While Revalidate**: JS/CSS static assets
|
||
|
|
- **Background Sync**: Pending uploads and favorites sync when online
|
||
|
|
- **Push Notifications**: Support for push notifications
|
||
|
|
- **Cache Management**: Separate caches for static, API, audio, and images
|
||
|
|
|
||
|
|
### 2. **Web App Manifest**
|
||
|
|
- **Location**: `frontend/public/manifest.json`
|
||
|
|
- **Features**:
|
||
|
|
- App metadata (name, description, icons)
|
||
|
|
- Display mode: `standalone` (native app-like)
|
||
|
|
- Theme colors and background
|
||
|
|
- App shortcuts (Home, Search, Library, Local Files)
|
||
|
|
- Share target (share audio files to app)
|
||
|
|
- Icon sizes: 72px to 512px
|
||
|
|
- Screenshots for app stores
|
||
|
|
|
||
|
|
### 3. **PWA Manager**
|
||
|
|
- **Location**: `frontend/src/utils/pwa.ts`
|
||
|
|
- **Capabilities**:
|
||
|
|
- Service worker registration
|
||
|
|
- Install prompt handling
|
||
|
|
- Update management
|
||
|
|
- Cache control
|
||
|
|
- Notification permissions
|
||
|
|
- Online/offline detection
|
||
|
|
- Cache size estimation
|
||
|
|
|
||
|
|
### 4. **PWA Context Provider**
|
||
|
|
- **Location**: `frontend/src/context/PWAContext.tsx`
|
||
|
|
- **Global State**:
|
||
|
|
- Online/offline status
|
||
|
|
- Installation state
|
||
|
|
- Update availability
|
||
|
|
- Cache size
|
||
|
|
- Notification permissions
|
||
|
|
|
||
|
|
### 5. **UI Components**
|
||
|
|
|
||
|
|
#### PWA Prompts (`PWAPrompts.tsx`)
|
||
|
|
- Offline alert (persistent)
|
||
|
|
- Back online notification
|
||
|
|
- Install app prompt (delayed 3s)
|
||
|
|
- Update available prompt
|
||
|
|
- Visual online/offline indicator
|
||
|
|
|
||
|
|
#### PWA Settings Card (`PWASettingsCard.tsx`)
|
||
|
|
- Connection status display
|
||
|
|
- Install app button
|
||
|
|
- Update app button
|
||
|
|
- Cache management (size display, clear cache)
|
||
|
|
- Notification toggle
|
||
|
|
- PWA features list
|
||
|
|
|
||
|
|
#### Splash Screen (`SplashScreen.tsx`)
|
||
|
|
- Loading screen for PWA startup
|
||
|
|
- App logo and branding
|
||
|
|
|
||
|
|
### 6. **PWA-Specific Styles**
|
||
|
|
- **Location**: `frontend/src/styles/pwa.css`
|
||
|
|
- **Optimizations**:
|
||
|
|
- Touch target sizes (44x44px minimum)
|
||
|
|
- Touch feedback animations
|
||
|
|
- Safe area insets for notched devices
|
||
|
|
- iOS scrolling optimizations
|
||
|
|
- Prevent zoom on input focus
|
||
|
|
- Loading skeletons
|
||
|
|
- Responsive utilities
|
||
|
|
- Dark mode support
|
||
|
|
- Reduced motion support
|
||
|
|
- High contrast mode
|
||
|
|
- Landscape orientation adjustments
|
||
|
|
|
||
|
|
### 7. **Media Session API**
|
||
|
|
- **Location**: `frontend/src/utils/mediaSession.ts`
|
||
|
|
- **Features**:
|
||
|
|
- Media controls in notification tray
|
||
|
|
- Lock screen controls
|
||
|
|
- Playback state management
|
||
|
|
- Position state for seek bar
|
||
|
|
- Metadata display (title, artist, album, artwork)
|
||
|
|
|
||
|
|
### 8. **Offline Storage**
|
||
|
|
- **Location**: `frontend/src/utils/offlineStorage.ts`
|
||
|
|
- **IndexedDB Stores**:
|
||
|
|
- Audio queue
|
||
|
|
- Favorites
|
||
|
|
- Playlists
|
||
|
|
- Settings
|
||
|
|
- Pending uploads
|
||
|
|
- **Background sync** for offline actions
|
||
|
|
|
||
|
|
### 9. **Enhanced HTML**
|
||
|
|
- **Location**: `frontend/index.html`
|
||
|
|
- **Meta Tags**:
|
||
|
|
- PWA meta tags
|
||
|
|
- Apple mobile web app capable
|
||
|
|
- Theme color
|
||
|
|
- Open Graph tags
|
||
|
|
- Twitter cards
|
||
|
|
- Multiple icon sizes
|
||
|
|
- Manifest link
|
||
|
|
|
||
|
|
## How to Use
|
||
|
|
|
||
|
|
### For Users
|
||
|
|
|
||
|
|
#### Install the App
|
||
|
|
1. **Desktop (Chrome/Edge)**:
|
||
|
|
- Click the install icon in the address bar
|
||
|
|
- Or click "Install App" button in Settings > PWA
|
||
|
|
|
||
|
|
2. **Mobile (Chrome/Safari)**:
|
||
|
|
- Tap the "Add to Home Screen" prompt
|
||
|
|
- Or use browser menu > "Add to Home Screen"
|
||
|
|
|
||
|
|
#### Offline Usage
|
||
|
|
- Previously viewed content is cached automatically
|
||
|
|
- Audio files can be cached for offline playback
|
||
|
|
- App works offline with cached data
|
||
|
|
- Changes sync when connection is restored
|
||
|
|
|
||
|
|
#### Update the App
|
||
|
|
- Notification appears when update is available
|
||
|
|
- Click "Update" to install new version
|
||
|
|
- App reloads with latest features
|
||
|
|
|
||
|
|
### For Developers
|
||
|
|
|
||
|
|
#### Test PWA Locally
|
||
|
|
```bash
|
||
|
|
cd frontend
|
||
|
|
npm run build
|
||
|
|
npm run preview
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Generate PWA Icons
|
||
|
|
1. Use [PWA Builder Image Generator](https://www.pwabuilder.com/imageGenerator)
|
||
|
|
2. Upload a 512x512 PNG logo
|
||
|
|
3. Download generated icons
|
||
|
|
4. Place in `frontend/public/img/`
|
||
|
|
|
||
|
|
Required sizes:
|
||
|
|
- 72x72, 96x96, 128x128, 144x144
|
||
|
|
- 152x152, 192x192, 384x384, 512x512
|
||
|
|
|
||
|
|
#### Test Service Worker
|
||
|
|
```javascript
|
||
|
|
// In browser console
|
||
|
|
navigator.serviceWorker.ready.then(registration => {
|
||
|
|
console.log('Service Worker registered:', registration);
|
||
|
|
});
|
||
|
|
|
||
|
|
// Check cache
|
||
|
|
caches.keys().then(keys => console.log('Cache keys:', keys));
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Debug Offline Mode
|
||
|
|
1. Open DevTools > Application > Service Workers
|
||
|
|
2. Check "Offline" checkbox
|
||
|
|
3. Reload page to test offline functionality
|
||
|
|
|
||
|
|
## Browser Support
|
||
|
|
|
||
|
|
### Desktop
|
||
|
|
- ✅ Chrome 80+
|
||
|
|
- ✅ Edge 80+
|
||
|
|
- ✅ Firefox 90+
|
||
|
|
- ⚠️ Safari 15+ (limited features)
|
||
|
|
|
||
|
|
### Mobile
|
||
|
|
- ✅ Chrome Android 80+
|
||
|
|
- ✅ Safari iOS 15+
|
||
|
|
- ✅ Samsung Internet 12+
|
||
|
|
|
||
|
|
## Features by Platform
|
||
|
|
|
||
|
|
### All Platforms
|
||
|
|
- ✅ Offline caching
|
||
|
|
- ✅ Install to home screen
|
||
|
|
- ✅ Push notifications
|
||
|
|
- ✅ Background sync
|
||
|
|
|
||
|
|
### Desktop Only
|
||
|
|
- ✅ Window controls overlay
|
||
|
|
- ✅ App shortcuts in taskbar
|
||
|
|
- ✅ Badge API
|
||
|
|
|
||
|
|
### Mobile Only
|
||
|
|
- ✅ Share target API
|
||
|
|
- ✅ Media session API
|
||
|
|
- ✅ Safe area insets
|
||
|
|
|
||
|
|
## Performance Optimizations
|
||
|
|
|
||
|
|
### Code Splitting
|
||
|
|
- Vendor bundle (React, React DOM, React Router)
|
||
|
|
- MUI bundle (@mui/material, @mui/icons-material)
|
||
|
|
- Lazy loading for routes
|
||
|
|
|
||
|
|
### Caching Strategy
|
||
|
|
- Static assets: Stale-while-revalidate
|
||
|
|
- API: Network-first with cache fallback
|
||
|
|
- Audio: Cache-first with network fallback
|
||
|
|
- Images: Cache-first with network fallback
|
||
|
|
|
||
|
|
### Bundle Size
|
||
|
|
- Service worker: ~12KB
|
||
|
|
- PWA utilities: ~8KB
|
||
|
|
- Total overhead: ~20KB
|
||
|
|
|
||
|
|
## Security Considerations
|
||
|
|
|
||
|
|
### HTTPS Required
|
||
|
|
PWA features require HTTPS in production. Service workers only work on:
|
||
|
|
- `https://` domains
|
||
|
|
- `localhost` (for development)
|
||
|
|
|
||
|
|
### Content Security Policy
|
||
|
|
Update CSP headers to allow:
|
||
|
|
- Service worker scripts
|
||
|
|
- Manifest file
|
||
|
|
- Media files
|
||
|
|
|
||
|
|
### Cache Invalidation
|
||
|
|
Caches are versioned and automatically cleaned up on service worker update.
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### Service Worker Not Registering
|
||
|
|
1. Check browser console for errors
|
||
|
|
2. Verify HTTPS or localhost
|
||
|
|
3. Check service worker file path
|
||
|
|
4. Clear browser cache
|
||
|
|
|
||
|
|
### Install Prompt Not Showing
|
||
|
|
1. Must be served over HTTPS
|
||
|
|
2. User hasn't installed before
|
||
|
|
3. User hasn't dismissed recently
|
||
|
|
4. All PWA criteria must be met
|
||
|
|
|
||
|
|
### Offline Content Not Loading
|
||
|
|
1. Check service worker is active
|
||
|
|
2. Verify content was cached
|
||
|
|
3. Check cache names in DevTools
|
||
|
|
4. Test network conditions
|
||
|
|
|
||
|
|
### Update Not Applying
|
||
|
|
1. Close all tabs
|
||
|
|
2. Clear service worker in DevTools
|
||
|
|
3. Hard refresh (Ctrl+Shift+R)
|
||
|
|
4. Reinstall the app
|
||
|
|
|
||
|
|
## Next Steps
|
||
|
|
|
||
|
|
1. **Generate Production Icons**
|
||
|
|
- Create high-quality 512x512 app icon
|
||
|
|
- Generate all required sizes
|
||
|
|
- Add to `public/img/` directory
|
||
|
|
|
||
|
|
2. **Configure Push Notifications**
|
||
|
|
- Set up push notification server
|
||
|
|
- Add VAPID keys
|
||
|
|
- Implement backend push endpoint
|
||
|
|
|
||
|
|
3. **Test on Real Devices**
|
||
|
|
- Test install flow on iOS/Android
|
||
|
|
- Verify offline functionality
|
||
|
|
- Check media controls
|
||
|
|
|
||
|
|
4. **Monitor Performance**
|
||
|
|
- Use Lighthouse PWA audit
|
||
|
|
- Track cache hit rates
|
||
|
|
- Monitor service worker updates
|
||
|
|
|
||
|
|
5. **App Store Submission**
|
||
|
|
- Package as TWA (Android)
|
||
|
|
- Submit to Google Play Store
|
||
|
|
- Consider iOS App Store (limited)
|
||
|
|
|
||
|
|
## Resources
|
||
|
|
|
||
|
|
- [PWA Builder](https://www.pwabuilder.com/)
|
||
|
|
- [Web.dev PWA Guide](https://web.dev/progressive-web-apps/)
|
||
|
|
- [MDN Service Worker API](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API)
|
||
|
|
- [Workbox (Google)](https://developers.google.com/web/tools/workbox)
|