CRDT Guidelines
Critical: Draft-Style Mutations Only
// CORRECT - mutate in place
setState((state) => {
state.transactions[id] = transaction;
});
// WRONG - returning new objects breaks change tracking
setState((state) => ({
...state,
transactions: { ...state.transactions, [id]: transaction },
}));
Rules
- Import types from
schema.ts, don't redeclare - Soft deletes: Set
deletedAttimestamp, never remove from document - Use
crypto.randomUUID()for IDs,Date.now()for timestamps
Schema Pattern
export const entitySchema = schema.LoroMap({
id: schema.String({ required: true }),
// ... fields
deletedAt: schema.Number(), // 0 = not deleted, >0 = timestamp
});
React Hooks
useActiveTransactions()- excludes soft-deleteduseTransactions()- includes soft-deleteduseVaultAction()- for mutations
Sync
- Updates encrypted before leaving client
- Loro handles versioning via version vectors
- Conflicts: last-write-wins per field