<< All versions
Skill v1.0.1
currentAutomated scan100/100majiayu000/claude-skill-registry-data/offline-first
3 files
──Details
PublishedMay 14, 2026 at 11:26 PM
Content Hashsha256:0722e8bbc6d46214...
Git SHA6c0be08ba74a
Bump Typepatch
──Files
Files (1 file, 2.0 KB)
SKILL.md2.0 KBactive
SKILL.md · 106 lines · 2.0 KB
version: "1.0.1" name: offline-first description: Local storage, data sync, and conflict resolution for offline-capable apps.
Offline-First
Storage Options
| Option | Use Case | |
|---|---|---|
| AsyncStorage | Simple key-value | |
| MMKV | Fast key-value | |
| SQLite | Complex queries | |
| WatermelonDB | Large datasets, sync |
MMKV (Recommended)
typescript
import { MMKV } from 'react-native-mmkv';const storage = new MMKV();// Storestorage.set('user', JSON.stringify(user));storage.set('token', 'abc123');// Retrieveconst user = JSON.parse(storage.getString('user') || '{}');const token = storage.getString('token');// Deletestorage.delete('token');
Sync Strategy
Optimistic Updates
typescript
async function updateItem(id: string, data: Partial<Item>) {// 1. Update local immediatelyawait localDb.update(id, { ...data, _synced: false });// 2. Update UIqueryClient.setQueryData(['item', id], (old) => ({...old,...data,}));// 3. Sync to servertry {await api.updateItem(id, data);await localDb.update(id, { _synced: true });} catch (error) {// Queue for retryawait syncQueue.add({ type: 'update', id, data });}}
Background Sync
typescript
import NetInfo from '@react-native-community/netinfo';NetInfo.addEventListener((state) => {if (state.isConnected) {syncQueue.processAll();}});
Conflict Resolution
typescript
// Last-write-winsif (serverItem.updatedAt > localItem.updatedAt) {await localDb.update(id, serverItem);} else {await api.updateItem(id, localItem);}// Or: Manual resolutionif (hasConflict) {showConflictResolver(serverItem, localItem);}
Network Status
typescript
function useNetworkStatus() {const [isOnline, setIsOnline] = useState(true);useEffect(() => {return NetInfo.addEventListener((state) => {setIsOnline(state.isConnected ?? false);});}, []);return isOnline;}