📅 Realtime Store
Build a custom Svelte store for realtime data
Simple Data Fetching
If you don’t want to write custom stores, here’s a simple implementation
export const userData = writable<any>(null);
user.subscribe((user) => {
  if (user) {
    const docRef = doc(db, `users/${user.uid}`);
    onSnapshot(docRef, (snapshot) => {
      userData.set(snapshot.data());
    });
  } 
});
Universal Firestore Store
Use this store to easily fetch data from any Firestore document on the client.
/**
 * @param  {string} path document path or reference
 * @returns a store with realtime updates on document data
 */
export function docStore<T>(
  path: string,
) {
  let unsubscribe: () => void;
  const docRef = doc(db, path);
  const { subscribe } = writable<T | null>(null, (set) => {
    unsubscribe = onSnapshot(docRef, (snapshot) => {
      set((snapshot.data() as T) ?? null);
    });
    return () => unsubscribe();
  });
  return {
    subscribe,
    ref: docRef,
    id: docRef.id,
  };
}
Derived Store
Use a derived store to automatically subscribe to both the user’s auth state and Firestore data at the same time.
interface UserData {
  username: string;
  bio: string;
  photoURL: string;
  links: any[];
}
export const userData: Readable<UserData | null> = derived(user, ($user, set) => { 
  if ($user) {
    return docStore<UserData>(`users/${$user.uid}`).subscribe(set);
  } else {
    set(null); 
  }
});