11import React , { useState , useEffect } from "react" ;
2- import { useNavigate } from "react-router-dom" ;
2+ import { useNavigate , useSearchParams } from "react-router-dom" ;
3+ import Swal from "sweetalert2" ;
34import granola from "../../../assets/granola.jpg" ;
45import cuttery from "../../../assets/cuttery-set.jpg" ;
56import basket from "../../../assets/basket.png" ;
@@ -22,19 +23,53 @@ import Dropdown from "../../components/Dashboard/Dropdown";
2223
2324const Dashboard = ( ) => {
2425 const navigate = useNavigate ( ) ;
26+ const [ searchParams ] = useSearchParams ( ) ;
2527
28+ // HIGHLIGHT: Yeh useEffect Google se redirect hokar aaye token ko handle karega
2629 useEffect ( ( ) => {
27- const params = new URLSearchParams ( window . location . search ) ;
28- const email = params . get ( "email" ) ;
29- const username = params . get ( "username" ) ;
30+ const token = searchParams . get ( "token" ) ;
31+ const usernameFromUrl = searchParams . get ( "username" ) ;
3032
31- if ( email && username ) {
32- localStorage . setItem ( "email" , email ) ;
33+ // Skip if already logged in
34+ const isLoggedIn = localStorage . getItem ( "isLoggedIn" ) ;
35+ if ( isLoggedIn === "true" ) {
36+ return ;
37+ }
38+
39+ // Agar URL mein token hai, to yeh Google se login hokar aaya hai
40+ if ( token && usernameFromUrl ) {
41+ // Data ko localStorage mein save karein
42+ localStorage . setItem ( "accessToken" , token ) ;
43+ localStorage . setItem ( "username" , usernameFromUrl ) ;
3344 localStorage . setItem ( "isLoggedIn" , "true" ) ;
34- localStorage . setItem ( "username" , username ) ;
45+
46+ try {
47+ const base64Url = token . split ( "." ) [ 1 ] ;
48+ const base64 = base64Url . replace ( / - / g, "+" ) . replace ( / _ / g, "/" ) ;
49+ const padded = base64 + "=" . repeat ( ( 4 - ( base64 . length % 4 ) ) % 4 ) ;
50+ const payload = JSON . parse ( atob ( padded ) ) ;
51+ const role = payload ?. role ?? 0 ;
52+ localStorage . setItem ( "role" , String ( role ) ) ;
53+ } catch ( error ) {
54+ console . warn ( "Unable to decode role from token." , error ) ;
55+ localStorage . setItem ( "role" , "0" ) ;
56+ }
57+
58+ // Success message dikhayein
59+ Swal . fire ( {
60+ title : "Login Successful!" ,
61+ text : `Welcome, ${ usernameFromUrl } !` ,
62+ icon : "success" ,
63+ timer : 2000 ,
64+ showConfirmButton : false ,
65+ } ) ;
66+
67+ // URL ko saaf karein taaki token dikhna band ho jaye
68+ navigate ( "/dashboard" , { replace : true } ) ;
3569 }
36- } , [ location ] ) ;
70+ } , [ searchParams , navigate ] ) ;
3771
72+ // Aapka baaki ka code...
3873 const initialProducts = [
3974 {
4075 image : granola ,
@@ -48,39 +83,19 @@ const Dashboard = () => {
4883 price : 1200 ,
4984 rating : 4 ,
5085 } ,
51- {
52- image : basket ,
53- title : "Jute Cotton Basket" ,
54- price : 399 ,
55- rating : 4 ,
56- } ,
57- {
58- image : shawls ,
59- title : "Premium Woolen Shawls" ,
60- price : 5000 ,
61- rating : 5 ,
62- } ,
86+ { image : basket , title : "Jute Cotton Basket" , price : 399 , rating : 4 } ,
87+ { image : shawls , title : "Premium Woolen Shawls" , price : 5000 , rating : 5 } ,
6388 ] ;
6489
6590 const moreProducts = [
66- {
67- image : notebooks ,
68- title : "Eco-Friendly Notebook" ,
69- price : 250 ,
70- rating : 4 ,
71- } ,
91+ { image : notebooks , title : "Eco-Friendly Notebook" , price : 250 , rating : 4 } ,
7292 {
7393 image : toothbrushes ,
7494 title : "Bamboo Toothbrush Set" ,
7595 price : 150 ,
7696 rating : 5 ,
7797 } ,
78- {
79- image : towels ,
80- title : "Organic Cotton Towels" ,
81- price : 600 ,
82- rating : 4 ,
83- } ,
98+ { image : towels , title : "Organic Cotton Towels" , price : 600 , rating : 4 } ,
8499 {
85100 image : shoppingBags ,
86101 title : "Reusable Shopping Bags" ,
@@ -99,18 +114,8 @@ const Dashboard = () => {
99114 price : 200 ,
100115 rating : 4 ,
101116 } ,
102- {
103- image : waterBottle ,
104- title : "Glass Water Bottle" ,
105- price : 350 ,
106- rating : 5 ,
107- } ,
108- {
109- image : teaSet ,
110- title : "Organic Tea Set" ,
111- price : 750 ,
112- rating : 5 ,
113- } ,
117+ { image : waterBottle , title : "Glass Water Bottle" , price : 350 , rating : 5 } ,
118+ { image : teaSet , title : "Organic Tea Set" , price : 750 , rating : 5 } ,
114119 ] ;
115120
116121 const [ products ] = useState ( [ ...initialProducts , ...moreProducts ] ) ;
@@ -140,22 +145,27 @@ const Dashboard = () => {
140145 setShowViewLess ( false ) ;
141146 } ;
142147
148+ // HIGHLIGHT: Logout function ko Swal se update kiya gaya hai
143149 const handleLogout = ( ) => {
144- try {
145- let confirmed = confirm ( "Are you sure you want to logout?" ) ;
146- if ( confirmed ) {
150+ Swal . fire ( {
151+ title : "Are you sure you want to logout?" ,
152+ icon : "warning" ,
153+ showCancelButton : true ,
154+ confirmButtonColor : "#3085d6" ,
155+ cancelButtonColor : "#d33" ,
156+ confirmButtonText : "Yes, logout!" ,
157+ } ) . then ( ( result ) => {
158+ if ( result . isConfirmed ) {
159+ // Saare login-related items ko clear karein
147160 localStorage . removeItem ( "isLoggedIn" ) ;
148161 localStorage . removeItem ( "email" ) ;
149162 localStorage . removeItem ( "username" ) ;
150- alert ( "Logout Successfully and safely. ") ;
151- navigate ( "/login ") ;
152- } else {
153- return ;
163+ localStorage . removeItem ( "accessToken ") ;
164+ localStorage . removeItem ( "role ") ;
165+
166+ navigate ( "/home" ) ;
154167 }
155- } catch ( error ) {
156- alert ( "Logout Failed. Try Again later" ) ;
157- console . log ( error ) ;
158- }
168+ } ) ;
159169 } ;
160170
161171 return (
@@ -166,11 +176,10 @@ const Dashboard = () => {
166176 { /* Main Content */ }
167177 < main className = "flex-1 p-6 mt-10" >
168178 { /* Header */ }
169- < Header />
170-
179+ < Header handleLogout = { handleLogout } /> { " " }
180+ { /* Pass handleLogout to Header */ }
171181 { /* Search Bar */ }
172182 < SearchBar searchTerm = { searchTerm } handleSearch = { handleSearch } />
173-
174183 { /* New Today Section */ }
175184 < section >
176185 < div className = "flex justify-between" >
0 commit comments