Files
welshman/docs/app/storesandloaders.md
T
2025-02-25 14:07:44 -08:00

3.1 KiB

Stores and Loaders

The @welshman/app package provides a powerful system of collection-based reactive stores and loader utilities.

These utilities follow a consistent pattern for working with various types of Nostr data, making it easy to:

  1. Query data from the repository
  2. Transform it into application-specific structures
  3. Access it reactively in your UI
  4. Trigger network loading when needed

Core Concept

Each collection-based module exports a similar set of utilities:

// Common pattern across collection-based modules
export const {
  // Main collection store (derived from repository)
  store: follows,

  // Indexed map for efficient lookup
  indexStore: followsByPubkey,

  // Function to get a reactive store for a specific item
  deriveItem: deriveFollows,

  // Function to trigger loading an item from the network
  loadItem: loadFollows
} = collection({
  name: "collection-name",
  store: baseStore,
  getKey: item => item.keyProperty,
  load: async (key) => { /* Loading logic */ }
})

Available Collections

Collection Key Kind Description
follows pubkey 3 User follow lists
mutes pubkey 10000 User mute lists
pins pubkey 10001 User pinned items
profiles pubkey 0 User profile metadata
relaySelections pubkey 10002 User relay preferences
inboxRelaySelections pubkey 10005 User inbox relay settings
zappers lnurl - Lightning zapper metadata
handles nip05 - NIP-05 identifier metadata

Usage Examples

Loading and Accessing Data

import { loadProfile, deriveProfile, profilesByPubkey } from '@welshman/app'

// Trigger loading a profile from the network
await loadProfile('pubkey123')

// Get a reactive store for a specific profile
const profile = deriveProfile('pubkey123')

// Access all profiles by pubkey
const allProfiles = profilesByPubkey.get()
const specificProfile = allProfiles.get('pubkey123')

User-Specific Collections

Several modules provide user-specific derived stores that automatically load data for the currently signed-in user:

import { userProfile, userFollows, userMutes, userPins } from '@welshman/app'

// These are derived stores that automatically:
// 1. Watch for changes to the current user's pubkey
// 2. Load the appropriate data when the user changes
// 3. Provide the data reactively

userProfile.subscribe(profile => {
  // Current user's profile data
})

userFollows.subscribe(follows => {
  // Current user's follow list
})

Web of Trust Utilities

The wot.ts module provides additional utilities for analyzing the social graph:

import { getFollows, getFollowers, getNetwork, getWotScore } from '@welshman/app'

// Get users followed by a pubkey
const followedUsers = getFollows('pubkey123')

// Get users following a pubkey
const followers = getFollowers('pubkey123')

// Get extended network (follows-of-follows)
const network = getNetwork('pubkey123')

// Calculate trust score between users
const score = getWotScore('userPubkey', 'targetPubkey')