fix: moved projects from redux to context

This commit is contained in:
2025-07-30 22:11:31 +04:00
parent 128a1b3c4f
commit 8af4a908e6
6 changed files with 113 additions and 57 deletions

View File

@ -1,39 +1,21 @@
"use client";
import { useEffect } from "react";
import { useSelector } from "react-redux";
import { Group } from "@mantine/core";
import { useProjectsContext } from "@/app/deals/contexts/ProjectsContext";
import ProjectSelect from "@/components/selects/ProjectSelect/ProjectSelect";
import {
selectProject,
setProjects,
} from "@/lib/features/projects/projectsSlice";
import { RootState, useAppDispatch } from "@/lib/store";
const Header = () => {
const projectsState = useSelector(
(state: RootState) => state.projectsState
);
const dispatch = useAppDispatch();
useEffect(() => {
const mockProjects = [
{ id: 1, name: "Проект 1" },
{ id: 2, name: "Проект 2" },
{ id: 3, name: "Проект 3" },
];
dispatch(setProjects(mockProjects));
dispatch(selectProject(mockProjects[0]));
}, []);
const { projects, setSelectedProject, selectedProject } =
useProjectsContext();
return (
<Group
justify={"flex-end"}
w={"100%"}>
<ProjectSelect
data={projectsState.projects}
value={projectsState.selectedProject}
onChange={value => value && dispatch(selectProject(value))}
data={projects}
value={selectedProject}
onChange={value => value && setSelectedProject(value)}
/>
</Group>
);

View File

@ -0,0 +1,77 @@
"use client";
import React, {
createContext,
FC,
useContext,
useEffect,
useState,
} from "react";
import useProjects from "@/app/deals/hooks/useProjects";
import { ProjectSchema } from "@/types/ProjectSchema";
type ProjectsContextState = {
selectedProject: ProjectSchema | null;
setSelectedProject: React.Dispatch<
React.SetStateAction<ProjectSchema | null>
>;
projects: ProjectSchema[];
};
const ProjectsContext = createContext<ProjectsContextState | undefined>(
undefined
);
const useProjectsContextState = () => {
const { projects, refetchProjects } = useProjects();
const [selectedProject, setSelectedProject] =
useState<ProjectSchema | null>(null);
useEffect(() => {
if (projects.length > 0) {
if (selectedProject) {
setSelectedProject(
projects.find(
project => project.id === selectedProject.id
) ?? null
);
} else {
setSelectedProject(projects[0]);
}
} else {
setSelectedProject(null);
}
}, [projects]);
return {
projects,
selectedProject,
setSelectedProject,
};
};
type ProjectsContextProviderProps = {
children: React.ReactNode;
};
export const ProjectsContextProvider: FC<ProjectsContextProviderProps> = ({
children,
}) => {
const state = useProjectsContextState();
return (
<ProjectsContext.Provider value={state}>
{children}
</ProjectsContext.Provider>
);
};
export const useProjectsContext = () => {
const context = useContext(ProjectsContext);
if (!context) {
throw new Error(
"useProjectsContext must be used within a ProjectsContextProvider"
);
}
return context;
};

View File

@ -0,0 +1,25 @@
import { useEffect, useState } from "react";
import { ProjectSchema } from "@/types/ProjectSchema";
const useProjects = () => {
const [projects, setProjects] = useState<ProjectSchema[]>([]);
useEffect(() => {
const mockProjects = [
{ id: 1, name: "Проект 1" },
{ id: 2, name: "Проект 2" },
{ id: 3, name: "Проект 3" },
];
setProjects(mockProjects);
}, []);
const refetchProjects = () => {};
return {
projects,
setProjects,
refetchProjects,
};
};
export default useProjects;

View File

@ -1,5 +1,6 @@
import Boards from "@/app/deals/components/Boards/Boards";
import Header from "@/app/deals/components/Header/Header";
import { ProjectsContextProvider } from "@/app/deals/contexts/ProjectsContext";
import PageBlock from "@/components/PageBlock/PageBlock";
import PageContainer from "@/components/PageContainer/PageContainer";
@ -7,8 +8,10 @@ export default function DealsPage() {
return (
<PageContainer>
<PageBlock>
<Header />
<Boards />
<ProjectsContextProvider>
<Header />
<Boards />
</ProjectsContextProvider>
</PageBlock>
</PageContainer>
);