mobx-state-tree-store-builder
MobX State Tree Store Builder
This skill helps create MobX State Tree stores following the established patterns in the Fitness Tracker App. It handles the complex setup required for proper TypeScript integration, RootStore injection, and consistent architectural patterns.
When to Use This Skill
Use this skill when you need to:
- Create a new domain model (like ExerciseModel)
- Build a collection store (like ExerciseStoreModel)
- Add a new store to the RootStore
- Extend existing stores with new functionality
- Create proper TypeScript interfaces and snapshots
Store Types
Domain Models
Atomic data models that represent business entities. Examples: ExerciseModel, UserModel.
Pattern: types.model("Name", { ... }).views(...).actions(...)
Collection Stores
Stores that manage collections of domain models. Examples: ExerciseStore, StatsStore.
Pattern: types.model("StoreName", { collection: types.map(Model) }).views(...).actions(...)
Singleton Stores
Stores with single-instance data. Examples: UserStore, UiStore.
Pattern: types.model("StoreName", { ... }).views(...).actions(...)
Root Store Integration
All stores must be added to the RootStore for dependency injection:
export const RootStoreModel = types.model("RootStore", {
// Add new store here
newStore: types.optional(NewStoreModel, {}),
// ... existing stores
})
TypeScript Integration
Always export proper interfaces:
IStoreName- Instance typeIStoreNameSnapshotIn- Input snapshot typeIStoreNameSnapshotOut- Output snapshot type
Common Patterns
Computed Views
Use for derived data that depends on store state:
.views((self) => ({
get computedProperty() {
return self.someData * 2
},
}))
Actions with Root Access
Use getRoot<IRootStore>(self) to access other stores:
.actions((self) => ({
someAction() {
const rootStore = getRoot<IRootStore>(self)
rootStore.otherStore.doSomething()
},
}))
Async Actions
Use flow for async operations:
import { flow } from "mobx-state-tree"
.actions((self) => ({
asyncAction: flow(function* () {
try {
// async operations
yield someAsyncCall()
} catch (error) {
// error handling
}
}),
}))
File Organization
Store files go in app/models/:
- Domain models:
ModelName.ts - Stores:
StoreName.ts - Root store:
RootStore.ts
Testing
Each store should have corresponding tests in app/models/__tests__/.
References
See MST_PATTERNS.md for detailed patterns and examples from the codebase.
See STORE_TEMPLATES.md for reusable templates.
See ROOT_STORE_INTEGRATION.md for adding stores to RootStore.
More from planeinabottle/fitnessmobileapp
react-native-i18n-workflow
Manages internationalization strings and translation workflows using i18next and react-i18next. Use when adding new text, supporting additional languages, or implementing pluralization and interpolation in Fitness Tracker App.
4react-native-storage-manager
Handles MMKV storage operations and data persistence patterns with encryption. Use when implementing data persistence, caching, or user preferences in Fitness Tracker App.
4react-native-navigation-builder
Creates navigation structures following the app's nested navigator pattern. Handles type-safe navigation, stack and tab setup, and screen parameter management in Fitness Tracker App.
3react-native-testing-patterns
Implements testing strategies for React Native components, MST stores, and services using Jest, React Testing Library, and Maestro. Use when writing unit, integration, or E2E tests in Fitness Tracker App.
3