mcpField
R
react-native-state

react-native-state

github.com/pluginagentmarketplaceDevelopment1037 installsUpdated 42w ago
Repository

About react-native-state

react-native-state is a learning skill for React Native developers covering app and server state with TypeScript. It combines examples and selection guidance for Redux Toolkit, Zustand, TanStack Query, and persistent storage.

Key features

  1. 01Set up Redux Toolkit with TypeScript
  2. 02Create persistent Zustand stores
  3. 03Manage server state with TanStack Query
  4. 04Persist data with AsyncStorage or MMKV
  5. 05Choose state tools by use case
  6. 06Troubleshoot common state errors

Use cases

  1. 01Adding typed state management to a React Native app
  2. 02Persisting preferences across app restarts
  3. 03Caching and synchronizing server data

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/pluginagentmarketplace/custom-plugin-react-native --skill react-native-state

After installing, type/react-native-statein Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

assets/
config.yaml
schema.json
references/
GUIDE.md
PATTERNS.md
scripts/
validate.py

Details

From the project README

React Native State Management Skill

Learn production-ready state management including Redux Toolkit, Zustand, TanStack Query, and persistence with AsyncStorage/MMKV.

Prerequisites

  • React Native basics
  • TypeScript fundamentals
  • Understanding of React hooks

Learning Objectives

After completing this skill, you will be able to:

  • Set up Redux Toolkit with TypeScript
  • Create Zustand stores with persistence
  • Manage server state with TanStack Query
  • Persist data with AsyncStorage/MMKV
  • Choose the right solution for each use case

Topics Covered

1. Redux Toolkit Setup
// store/index.ts
import { configureStore } from '@reduxjs/toolkit';
import { authSlice } from './slices/authSlice';

export const store = configureStore({
  reducer: {
    auth: authSlice.reducer,
  },
});

export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;
2. RTK Slice
import { createSlice, PayloadAction } from '@reduxjs/toolkit';

interface AuthState {
  user: User | null;
  token: string | null;
}

export const authSlice = createSlice({
  name: 'auth',
  initialState: { user: null, token: null } as AuthState,
  reducers: {
    setUser: (state, action: PayloadAction<User>) => {
      state.user = action.payload;
    },
    logout: (state) => {
      state.user = null;
      state.token = null;
    },
  },
});
3. Zustand Store
import { create } from 'zustand';
import { persist, createJSONStorage } from 'zustand/middleware';
import AsyncStorage from '@react-native-async-storage/async-storage';

interface AppStore {
  theme: 'light' | 'dark';
  setTheme: (theme: 'light' | 'dark') => void;
}

export const useAppStore = create<AppStore>()(
  persist(
    (set) => ({
      theme: 'light',
      setTheme: (theme) => set({ theme }),
    }),
    {
      name: 'app-storage',
      storage: createJSONStorage(() => AsyncStorage),
    }
  )
);
4. TanStack Query
import { useQuery, useMutation } from '@tanstack/react-query';

export function useProducts() {
  return useQuery({
    queryKey: ['products'],
    queryFn: () => api.getProducts(),
    staleTime: 1000 * 60 * 5, // 5 minutes
  });
}

export function useCreateProduct() {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: api.createProduct,
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ['products'] });
    },
  });
}
5. When to Use What
SolutionUse Case
useState/useReducerComponent-local state
ZustandSimple global state, preferences
Redux ToolkitComplex app state, large teams
TanStack QueryServer state, caching, sync
ContextTheme, auth status (low-frequency)

Quick Start Example

// Zustand + TanStack Query combo
import { create } from 'zustand';
import { useQuery } from '@tanstack/react-query';

// UI state with Zustand
const useUIStore = create((set) => ({
  sidebarOpen: false,
  toggleSidebar: () => set((s) => ({ sidebarOpen: !s.sidebarOpen })),
}));

// Server state with TanStack Query
function ProductList() {
  const { data, isLoading } = useQuery({
    queryKey: ['products'],
    queryFn: fetchProducts,
  });

  const sidebarOpen = useUIStore((s) => s.sidebarOpen);

  // Render with both states
}

Common Errors & Solutions

ErrorCauseSolution
"Non-serializable value"Functions in Redux stateUse middleware ignore
State not persistingWrong storage configCheck persist config
Stale dataMissing invalidationAdd proper query keys

Validation Checklist

  • State updates correctly
  • Persistence works across restarts
  • Server state syncs properly
  • TypeScript types are correct

Usage

Skill("react-native-state")

Bonded Agent: 03-react-native-state

Comments

Markdown supported