added login and forgot form validation and changed server response format

This commit is contained in:
Pramod Mahajan 2025-04-03 17:51:59 +05:30
parent e6a687c8e2
commit 1451c1aff7
12 changed files with 102 additions and 85 deletions

View File

@ -35,7 +35,7 @@ const ProjectNav = ( {onPillClick, activePill} ) =>
<i className="bx bx-group bx-sm me-1_5"></i> Teams
</a>
</li>
<li className={`nav-item ${HasViewInfraStructure ? "":"d-none"} `}>
<li className={`nav-item ${!HasViewInfraStructure && 'd-none'} `}>
<a
className={`nav-link ${activePill === "infra" ? "active" : ""}`}
href="#"

View File

@ -41,6 +41,7 @@ const useMaster = () => {
break;
case "Job Role":
response = await MasterRespository.getJobRole();
response = response.data
break;
case "Module":
response = [{description: null,module:"Module 1",featurePermission: null,id: "08dd4761-363c-49ed-8851-3d2489a3e98d"},{description: null,module:"Module 2",featurePermission: null,id: "08dy9761-363c-49ed-8851-3d2489a3e98d"},{description: null,module:"Module 3",featurePermission: null,id: "08dy7761-263c-49ed-8851-3d2489a3e98d"}];

View File

@ -16,9 +16,9 @@ export const useMasterRole =()=>{
if (!features_cache) {
MasterRespository.getRoles()
.then((response) => {
setMasterRole(response);
setMasterRole(response.data);
cacheData("masterRole", response);
cacheData("masterRole", response.data);
setLoading(false)
})
.catch((error) => {
@ -55,9 +55,9 @@ export const useFeatures =()=> {
if (!features_cache) {
MasterRespository.getFeatures()
.then((response) => {
setMasterFeatures(response);
setMasterFeatures(response.data);
cacheData("features", response);
cacheData("features", response.data);
setLoading(false)
})
.catch((error) => {

View File

@ -18,8 +18,8 @@ export const useProfile = () =>
{
setLoading( true )
let response = await AuthRepository.profile();
setProfile( response )
cacheProfileData( response )
setProfile( response.data )
cacheProfileData( response.data )
setLoading( false );
} catch ( error )

View File

@ -19,9 +19,9 @@ export const useProjects =()=>{
setLoading(true)
ProjectRepository.getProjectList()
.then((response) => {
setProjects(response);
setProjects(response.data);
cacheData("projectslist", response);
cacheData("projectslist", response.data);
setLoading(false);
})
.catch((error) => {
@ -94,8 +94,8 @@ export const useProjectDetails =(projectId)=>{
ProjectRepository.getProjectByprojectId(projectId)
.then( ( response ) =>
{
setProject_Details(response);
cacheData( `projectinfo-${ projectId }`, response );
setProject_Details(response.data);
cacheData( `projectinfo-${ projectId }`, response.data );
setLoading(false)
})
.catch((error) => {

View File

@ -25,22 +25,12 @@ const TaskPlannng = () => {
if (!activities_cache) {
ActivityeRepository.getActivities()
.then((response) => {
setActivities(response);
cacheData("activitiesMaster", response);
setActivities(response.data);
cacheData("activitiesMaster", response.data);
})
.catch((error) => {
setError("Failed to fetch data.");
});
// api
// .get("/api/task/activities")
// .then((data) => {
// setActivities(data);
// dispatch(cacheApiResponse({ key: "activitiesMaster", data: data }));
// })
// .catch((error) => {
// console.error(error);
// setError("Failed to fetch data.");
// });
} else {
setActivities(activities_cache);
}

View File

@ -4,45 +4,52 @@ import { AuthWrapper } from "./AuthWrapper"
import "./page-auth.css";
import AuthRepository from "../../repositories/AuthRepository";
import showToast from "../../services/toastService";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import {z} from "zod";
const forgotPassSceham = z.object( {
email: z.string().email(),
} )
const ForgotPasswordPage = () => {
const [ email, setEmail ] = useState( "" );
const[loding,setLoading] = useState(false)
const handleChange = (e) => {
setEmail(e.target.value);
};
const {register,
handleSubmit,
formState: { errors },
reset,
getValues } = useForm( {
resolver: zodResolver( forgotPassSceham ),
defaultValues: {
email:""
}
})
const handleSubmit = async ( e ) =>
const onSubmit = async (data) =>
{
setLoading(true)
e.preventDefault();
try
{
const response = await AuthRepository.forgotPassword({email})
const response = await AuthRepository.forgotPassword(data)
if ( response.data && response.success )
{
showToast( response.message, "success" )
} else
{
showToast( response.message, "warning" )
}
setLoading( false )
setEmail("")
} catch ( error )
} catch ( err )
{
showToast( "User Not Found", "error" )
showToast( err.response.data, "error" )
setLoading(false)
}
};
}
return (
<AuthWrapper>
<h4 className="mb-2">Forgot Password? 🔒</h4>
<p className="mb-4">
Enter your email and we'll send you instructions to reset your password
</p>
<form id="formAuthentication" className="mb-3" onSubmit={handleSubmit}>
<form id="formAuthentication" className="mb-3" onSubmit={handleSubmit(onSubmit)}>
<div className="mb-3">
<label htmlFor="email" className="form-label">
Email
@ -52,11 +59,18 @@ const ForgotPasswordPage = () => {
className="form-control"
id="email"
name="email"
value={email}
onChange={handleChange}
{...register("email")}
placeholder="Enter your email"
autoFocus
/>
{errors.email && (
<div
className="danger-text text-start"
style={{ fontSize: "12px" }}
>
{errors.email.message}
</div>
)}
</div>
<button aria-label="Click me" className="btn btn-primary d-grid w-100">
{loding ? "Please Wait...":"Send Reset Link"}

View File

@ -5,39 +5,40 @@ import { useNavigate } from "react-router-dom";
import "./page-auth.css";
import AuthRepository from "../../repositories/AuthRepository";
import showToast from "../../services/toastService";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import {z} from "zod"
const loginScheam = z.object( {
username: z.string().email(),
password: z.string().min( 1, {message: "Password required"} ),
rememberMe: z.boolean(),
} )
const LoginPage = () => {
const navigate = useNavigate();
const [loading, setLoading] = useState(false);
const [formData, setFormData] = useState({
password: "",
username: "",
rememberMe: false,
});
const {register,
handleSubmit,
formState: { errors },
reset,
getValues } = useForm( {
resolver: zodResolver( loginScheam ),
})
const handleChange = (e) => {
const { name, value, type, checked } = e.target;
setFormData((prevData) => ({
...prevData,
[name]: type === "checkbox" ? checked : value,
}));
};
const handleSubmit = async ( e ) =>
{
e.preventDefault();
const onSubmit = async ( data ) =>
{
setLoading(true);
try {
let data = {
username: formData.username,
password: formData.password,
};
const response = await AuthRepository.login(data);
let userCredential = {
username: data.username,
password:data.password
}
const response = await AuthRepository.login(userCredential);
localStorage.setItem("jwtToken", response.data.token);
localStorage.setItem( "refreshToken", response.data.refreshToken );
setLoading(false);
@ -45,9 +46,9 @@ const LoginPage = () => {
} catch (err) {
console.log("Unable to proceed. Please try again.");
setLoading(false);
}
};
return (
<AuthWrapper>
<h4 className="mb-2">Welcome to PMS!</h4>
@ -55,7 +56,7 @@ const LoginPage = () => {
Please sign-in to your account and start the adventure
</p>
<form id="formAuthentication" className="mb-3" onSubmit={handleSubmit}>
<form id="formAuthentication" className="mb-3" onSubmit={handleSubmit(onSubmit)}>
<div className="mb-3">
<label htmlFor="username" className="form-label">
Email or Username
@ -64,12 +65,19 @@ const LoginPage = () => {
type="text"
className="form-control"
id="username"
value={formData.name}
onChange={handleChange}
{...register("username")}
name="username"
placeholder="Enter your email or username"
autoFocus
/>
{errors.username && (
<div
className="danger-text text-start"
style={{ fontSize: "12px" }}
>
{errors.username.message}
</div>
)}
</div>
<div className="mb-3 form-password-toggle">
<div className="d-flex justify-content-between">
@ -88,8 +96,7 @@ const LoginPage = () => {
type="password"
autoComplete="true"
id="password"
value={formData.password}
onChange={handleChange}
{...register("password")}
className="form-control"
name="password"
placeholder="&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;&#xb7;"
@ -97,6 +104,14 @@ const LoginPage = () => {
/>
<span className="input-group-text cursor-pointer"></span>
</div>
{errors.password && (
<div
className="danger-text text-start"
style={{ fontSize: "12px" }}
>
{errors.password.message}
</div>
)}
</div>
<div className="mb-3">
<div className="form-check">
@ -105,8 +120,7 @@ const LoginPage = () => {
type="checkbox"
id="remember-me"
name="rememberMe"
checked={formData.rememberMe}
onChange={handleChange}
{...register("rememberMe")}
/>
<label className="form-check-label" htmlFor="remember-me">
{" "}

View File

@ -35,8 +35,8 @@ const ProjectDetails = () => {
if (!activities_cache) {
ActivityeRepository.getActivities()
.then((response) => {
setActivities(response);
cacheData("activitiesMaster", response);
setActivities(response.data);
cacheData("activitiesMaster", response.data);
})
.catch((error) => {
setError("Failed to fetch data.");
@ -55,9 +55,9 @@ const ProjectDetails = () => {
ProjectRepository.getProjectByprojectId(projectId)
.then( ( response ) =>
{
setProjectDetails(response);
setProject(response);
cacheData( `projectinfo-${ projectId }`, response );
setProjectDetails(response.data);
setProject(response.data);
cacheData( `projectinfo-${ projectId }`, response.data );
setLoading(false)
})
.catch((error) => {

View File

@ -118,11 +118,7 @@ const ProjectList = () =>
{" "}
<button
type="button"
className={`btn btn-sm btn-primary ${
HasManageProject
? ""
: "d-none"
}`}
className={`btn btn-sm btn-primary ${!HasManageProject && 'd-none' }`}
data-bs-toggle="modal"
data-bs-target="#create-project-model"
onClick={handleShow}

View File

@ -5,7 +5,7 @@ const localVariablesSlice = createSlice({
initialState: {
selectedMaster:"Role",
regularizationCount:0,
projectId:5,
projectId:1,
},
reducers: {

View File

@ -5,6 +5,8 @@ export const MANAGE_MASTER = "588a8824-f924-4955-82d8-fc51956cf323";
export const MANAGE_PROJECT = "172fc9b6-755b-4f62-ab26-55c34a330614"
export const VIEW_PROJECTS = "6ea44136-987e-44ba-9e5d-1cf8f5837ebc"
export const MANAGE_EMPLOYEES = "a97d366a-c2bb-448d-be93-402bd2324566"
export const MANAGE_PROJECT_INFRA = "f2aee20a-b754-4537-8166-f9507b44585b"