Skip to main content

User Store

UserStore is the session manager. It handles login/signup, maintains the current user, and orchestrates data loading after authentication.

What it does

After init, the store starts empty. Once a user logs in, it:

  1. Creates an ESPCDFUser entity for that adaptor
  2. Exposes the auth service for login, signup, OAuth, password recovery
  3. Provides user.getGroups() to bootstrap the app with groups and devices
  4. Clears everything on logout

Multi-adaptor setups maintain one user per adaptor.

API reference

Properties

PropertyTypePurpose
userESPCDFUser | undefinedThe logged-in user for the active adaptor
adaptorAuthorizationEntityMapRecord<string, ESPCDFUser> | nullMap of adaptor ID → user entity (multi-adaptor)
authAuthAuth service: login, signup, OAuth, password reset

Getting the store

import { initCDF } from "@espressif/rainmaker-base-cdf";

const espCDF = await initCDF({ sdkAdaptorRegistry });
const { userStore } = espCDF;

How to use it

Sign in with password

await espCDF.userStore.auth.login({
username: "user@example.com",
password: "••••",
});

Sign in with OAuth

await espCDF.userStore.auth.loginWithOauth({
identityProvider: "google",
// adaptorIdentifier optional when active adaptor is set
});

Sign up

// Step 1: request signup code
await espCDF.userStore.auth.getSignUpCode({
username: "user@example.com",
password: "••••",
});

// Step 2: confirm
await espCDF.userStore.auth.confirmSignUp({
username: "user@example.com",
verificationCode: "789012",
});

Forgot password

await espCDF.userStore.auth.forgotPassword({ username: "user@example.com" });
await espCDF.userStore.auth.setNewPassword({
username: "user@example.com",
newPassword: "••••",
verificationCode: "345678",
});

Restore an existing session

Call restoreSession at app launch to check whether the user is still logged in:

const user = await espCDF.userStore.restoreSession();
if (user) {
// Session found — proceed with data fetch
} else {
// No session — show login screen
}

Access the current user entity

const user = espCDF.userStore.user; // ESPCDFUser | undefined

Fetch groups and nodes

The user entity is the entry point for the hierarchical data fetch:

const user = espCDF.userStore.user!;

// Fetch groups — populates GroupStore automatically via UserStoreSynchronizer
await user.getGroups();

// After getGroups, groups are observable in GroupStore
const groups = espCDF.groupStore.groupsList;

Sign out

await user.logout();
// UserStoreSynchronizer clears all stores

Reactive session display

import { observer } from "mobx-react-lite";
import type { ESPCDF } from "@espressif/rainmaker-base-cdf";

const UserProfileBadge = observer(function UserProfileBadge({
espCDF,
}: {
espCDF: ESPCDF;
}) {
const user = espCDF.userStore.user;

if (!user) return <LoginButton />;
return <Text>{user.userInfo.name ?? user.userInfo.email}</Text>;
});

Profile operations

For profile edits, custom data, and account deletion, use the user entity directly. See ESPCDFUser for full operation details.

Multi-adaptor setup

In apps supporting multiple SDKs, manage users per adaptor:

// Get user for a specific adaptor
const rainmakerUser = espCDF.userStore.getAuthorizationEntityForAdaptor("rainmaker-base-sdk");

// Set user for a specific adaptor (done automatically by auth.login)
espCDF.userStore.setAuthorizationEntityForAdaptor("rainmaker-base-sdk", userEntity);

// Remove a specific adaptor's session
espCDF.userStore.removeAuthorizationEntityForAdaptor("rainmaker-base-sdk");

// Clear all sessions
espCDF.userStore.removeAuthorizationEntityForAdaptor();

Reactive user display

import { observer } from "mobx-react-lite";
import type { ESPCDF } from "@espressif/rainmaker-base-cdf";

const UserProfileBadge = observer(function UserProfileBadge({
espCDF,
}: {
espCDF: ESPCDF;
}) {
const user = espCDF.userStore.user;

if (!user) return <LoginButton />;
return <Text>{user.userInfo.name ?? user.userInfo.email}</Text>;
});

See also

Core entity

Implementation

API Reference

On this page