104 lines
2.6 KiB
Markdown
104 lines
2.6 KiB
Markdown
# Collection Stores
|
|
|
|
The `collection` utility creates stores that handle caching, loading, and indexing of Nostr data. It provides a consistent pattern for managing entities that need to be fetched from the network and cached locally.
|
|
|
|
```typescript
|
|
const {
|
|
indexStore, // Map of all items by key
|
|
deriveItem, // Get reactive item by key
|
|
loadItem // Trigger network load
|
|
} = collection({
|
|
name: "storeName", // For persistence
|
|
store: writable([]), // Base store
|
|
getKey: item => item.id // How to index items
|
|
load: async (key) => { // Network loader
|
|
// Load logic here
|
|
}
|
|
})
|
|
```
|
|
|
|
## Available Collections
|
|
|
|
```typescript
|
|
// Profiles
|
|
profiles → profilesByPubkey → deriveProfile → loadProfile
|
|
|
|
// Lists
|
|
follows → followsByPubkey → deriveFollows → loadFollows
|
|
mutes → mutesByPubkey → deriveMutes → loadMutes
|
|
pins → pinsByPubkey → derivePins → loadPins
|
|
|
|
// Relays
|
|
relays → relaysByUrl → deriveRelay → loadRelay
|
|
relaySelections → relaySelectionsByPubkey → deriveRelaySelections → loadRelaySelections
|
|
inboxRelaySelections → inboxRelaySelectionsByPubkey → deriveInboxRelaySelections → loadInboxRelaySelections
|
|
|
|
// Identity
|
|
handles → handlesByNip05 → deriveHandle → loadHandle
|
|
zappers → zappersByLnurl → deriveZapper → loadZapper
|
|
```
|
|
|
|
## Real World Examples
|
|
|
|
### Loading and Displaying Profiles
|
|
|
|
```typescript
|
|
import {
|
|
deriveProfile,
|
|
loadProfile,
|
|
displayProfile
|
|
} from '@welshman/app'
|
|
|
|
// In a Svelte component
|
|
let profile
|
|
|
|
// Subscribe to profile changes
|
|
$: profile = $deriveProfile(pubkey)
|
|
|
|
// Load automatically triggers when needed
|
|
onMount(() => {
|
|
loadProfile(pubkey, {
|
|
// Optional request params
|
|
relays: ["wss://relay.example.com"]
|
|
})
|
|
})
|
|
|
|
// Display with fallback
|
|
$: name = displayProfile(profile, "unknown")
|
|
```
|
|
|
|
### Managing Relay Selections
|
|
|
|
```typescript
|
|
import {
|
|
deriveRelaySelections,
|
|
loadRelaySelections,
|
|
getReadRelayUrls,
|
|
getWriteRelayUrls
|
|
} from '@welshman/app'
|
|
|
|
// Get user's relay preferences
|
|
const selections = deriveRelaySelections(pubkey).get()
|
|
|
|
// Load from network if needed
|
|
await loadRelaySelections(pubkey)
|
|
|
|
// Get read/write URLs
|
|
const readRelays = getReadRelayUrls(selections)
|
|
const writeRelays = getWriteRelayUrls(selections)
|
|
|
|
// Use with router
|
|
const relays = ctx.app.router
|
|
.FromPubkey(pubkey)
|
|
.getUrls()
|
|
```
|
|
|
|
Each collection automatically:
|
|
- Caches to IndexedDB
|
|
- Deduplicates network requests
|
|
- Updates reactively
|
|
- Provides typed access
|
|
- Handles loading states
|
|
|
|
The pattern is consistent across all stores, making it predictable to work with different types of nostr data.
|