cda-redux

cda-redux

SPA React orientée Redux/RTK Query combinant un espace utilisateur (login/register/home) et un module Star Wars (listing, pagination, filtres) avec authentification et gestion de session. Le projet démontre l'usage de RTK Query pour la consommation d'API externes et la gestion du cache côté client.

🎯 Contexte et objectifs

  • Structurer une application front moderne basée sur Redux Toolkit et flux asynchrones API.
  • Mettre en place un socle d’authentification avec stockage de tokens, récupération utilisateur courant et garde d’accès.
  • Implémenter des fonctionnalités de consultation/search côté interface avec états dérivés et pagination.

🛠️ Réalisations

🧩 Conception

{
  "scripts": {
    "dev": "vite ./",
    "build": "vite build ./",
    "serve": "vite preview ./"
  },
  "dependencies": {
    "@reduxjs/toolkit": "^1.6.2",
    "react": "^17.0.0",
    "react-redux": "^7.2.6",
    "react-router-dom": "^6.0.2",
    "redux": "^4.1.2",
    "redux-logger": "^3.0.6",
    "redux-persist": "^6.0.0"
  },
  "devDependencies": {
    "@vitejs/plugin-react": "^1.0.0",
    "vite": "^2.6.4"
  }
}
export const store = configureStore({
  reducer: {
    [peopleApi.reducerPath]: peopleApi.reducer,
    [authApi.reducerPath]: authApi.reducer,
    [usersManagerApi.reducerPath]: usersManagerApi.reducer,
    auth,
  },
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware().concat(
      usersManagerApi.middleware,
      authApi.middleware,
      peopleApi.middleware,
      logger
    ),
});

💻 Développement

const baseQuery = fetchBaseQuery({
  baseUrl: "<REDACTED_URL>",
  prepareHeaders: (headers, { getState }) => {
    const accessToken = getState().auth.accessToken;
    const xsrfToken = getState().auth.xsrfToken;

    if (accessToken && xsrfToken) {
      headers.set("authorization", `Bearer ${accessToken}`);
      headers.set("x-xsrf-token", xsrfToken);
    }

    return headers;
  },
});

La couche RTK Query encapsule les endpoints d’authentification et de session (/auth/login, /auth/me, /auth/token, /users/). Source: cda-redux/vite-project/src/js/services/authService.js

export const authApi = createApi({
  reducerPath: "authApi",
  baseQuery: baseQuery,
  keepUnusedDataFor: false,
  endpoints: (builder) => ({
    login: builder.mutation({ query: (userInfo) => loginRequest("/auth/login", userInfo) }),
    fetchCurrentUser: builder.query({ query: () => authMeRequest("/auth/me") }),
    authToken: builder.mutation({ query: (emailToken) => authTokenRequest("/auth/token", emailToken) }),
    register: builder.mutation({
      query: (body) => ({ url: "/users/", method: "POST", body }),
    }),
  }),
});
<Routes>
  <Route path="/register" element={<Register />} />
  <Route path="/login" element={<Login />} />
  <Route path="/" element={<Navigate replace to="/home" />} />
  <Route path="/home" element={<HomePage />}>
    <Route path="users" element={<ListUsers />}></Route>
    <Route path="research-user" element={<p>Rechercher des utilisateurs</p>}></Route>
    <Route path="profil" element={<InfoProfil />}></Route>
  </Route>
  <Route path="/starwars/people" element={<PeopleStarWars />} />
  <Route path="/starwars/people/:peopleId" element={<PeopleStarWarsDetails />} />
</Routes>

Le hook useIsAuth restaure les credentials depuis localStorage, synchronise le store et déclenche la récupération du user courant. Source: cda-redux/vite-project/src/js/hooks/useIsAuth.js

useEffect(() => {
  const accessToken = getLocalStorageItem("accessToken");
  const xsrfToken = getLocalStorageItem("xsrfToken");

  if (accessToken && xsrfToken) {
    dispatch(setCredentials({ accessToken, xsrfToken }));
  } else {
    dispatch(setIsInitialized());
  }

  const refreshToken = getLocalStorageItem("refreshToken");
  const email = getLocalStorageItem("email");
  if (email && refreshToken) {
    async () => {
      const result = authToken({ email, refreshToken });
      console.log("result auth/token", result);
    };
  }
}, []);

La page Star Wars implémente recherche textuelle, filtre par genre et pagination sur API SWAPI via RTK Query. Source: cda-redux/vite-project/src/js/pages/PeopleStarWars.jsx

const [page, setPage] = useState(1);
const { data: peopleStarwars, isFetching } = useFetchAllPeopleQuery(page);
const [searchTerm, setSearchTerm] = useState("");
const [activeCategory, setActiveCategory] = useState("");

<ul className="people-list">
  {peopleStarwars?.results
    ?.filter((val) => {
      if (searchTerm == "") return val;
      if (val.name.toLowerCase().includes(searchTerm.toLowerCase())) return val;
    })
    .map(({ name, height, mass, gender }, index) =>
      !activeCategory || activeCategory === gender ? (
        <div key={name}><PeopleItem index={index} name={name} height={height} mass={mass} gender={gender} /></div>
      ) : null
    )}
</ul>

🏗️ DevOps & Qualité

  • Le dépôt inclut une pipeline GitLab CI de build frontend et publication des fichiers dist, puis une étape de déploiement automatisée. Source: cda-redux/.gitlab-ci.yml
image: node:16

stages:
  - build
  - deploy

build_parcel_master:
  stage: build
  script:
    - cd ./vite-project/
    - npm install
    - npm run build
  artifacts:
    expire_in: 20 mins
    paths:
      - ./vite-project/dist

📈 Résultats

  • Sur la base de l’historique Git du dépôt analysé, le travail couvre la période 2021-11-08 -> 2026-02-14, avec 24 commits et 3 contributeurs. Le projet aboutit à une SPA structurée avec authentification API, gestion de tokens côté Redux, et modules de navigation/liste/recherche sur des données externes. L’utilisation de RTK Query standardise les flux asynchrones et réduit la complexité du code d’appel réseau. Le bénéfice technique est une base frontend maintenable, adaptée à des cas d’usage multi-API avec état global centralisé.

🔧 Environnement technique

  • Frontend: React 17, React Router 6, Vite.
  • State/API: Redux Toolkit, RTK Query (authApi, peopleApi, usersManagerApi), React Redux, Redux Logger.
  • Données: API utilisateur/auth (URL masquée), SWAPI (people).
  • Session: stockage local de tokens + initialisation via hook useIsAuth.
  • DevOps: GitLab CI (build, artifacts, déploiement).
🌐 Voir le projet

Technologies utilisées

Frontend
JavaScript
React
Redux
Vite