Changeset 8ca35dc for my-react-app/src/components/AppContent.js
- Timestamp:
- 01/19/25 23:18:37 (4 months ago)
- Branches:
- main
- Children:
- f5b256e
- Parents:
- db39d9e
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
my-react-app/src/components/AppContent.js
rdb39d9e r8ca35dc 1 import * as React from "react"; 1 import React from "react"; 2 import axios from "axios"; 2 3 import WelcomeContent from "./WelcomeContent"; 3 4 import AuthContent from "./AuthContent"; 4 5 import LoginForm from "./LoginForm"; 5 import { request, setAuthToken } from "../axios_helper"; 6 import Buttons from './Buttons' 6 import AuthForm from "./AuthForm"; 7 import Buttons from './Buttons'; 8 import restaurants from "./Restaurants"; 7 9 8 export defaultclass AppContent extends React.Component {10 class AppContent extends React.Component { 9 11 constructor(props) { 10 12 super(props); 11 13 this.state = { 12 componentToShow: "welcome" 14 componentToShow: "welcome", 15 isAuthenticated: false, 16 user: null, 17 loading: false // Add loading state 13 18 }; 19 } 20 21 componentDidMount() { 22 const token = localStorage.getItem('token'); 23 console.log(token); 24 if (token) { 25 this.setAuthToken(token); 26 this.setState({ componentToShow: "restaurants", isAuthenticated: true }); 27 } 28 } 29 30 fetchUserDetails = (token) => { 31 console.log("Fetch"); 32 axios.get("/api/user") 33 .then((response) => { 34 this.setState({ user: response.data, componentToShow: "restaurants", isAuthenticated: true }); 35 }) 36 .catch((error) => { 37 console.error("Failed to fetch user details:", error); 38 this.logout(); 39 }); 14 40 }; 15 41 16 42 login = () => { 17 this.setState({ componentToShow: "login"})43 this.setState({ componentToShow: "login" }); 18 44 } 19 45 20 46 logout = () => { 21 this.setState({componentToShow: "welcome"}) 47 localStorage.removeItem('token'); 48 this.setAuthToken(null); 49 this.setState({ componentToShow: "welcome", isAuthenticated: false }); 22 50 } 23 51 24 52 onLogin = (e, email, password) => { 25 53 e.preventDefault(); 26 request( 27 "POST", 28 "/api/login", 29 {email: email, password: password} 30 ).then((response) => { 31 this.setState({componentToShow: "restaurants"}) 32 setAuthToken(response.data.token); 33 }).catch((error) => { 34 this.setState({componentToShow: "welcome"}) 35 }); 54 // After successful login, save the token 55 axios.post("/api/login", { email, password }) 56 .then((response) => { 57 const token = response.data.token; 58 localStorage.setItem('token', token); // Save the token 59 console.log(token); 60 this.setAuthToken(token); // Set the token for future requests 61 this.setState({ componentToShow: "restaurants", isAuthenticated: true }); 62 }) 63 .catch((error) => { 64 console.error("Login failed:", error); 65 this.setState({ componentToShow: "welcome" }); 66 }); 67 36 68 }; 37 69 38 70 onRegister = (e, firstName, lastName, email, password) => { 39 71 e.preventDefault(); 40 request( 41 "POST", 42 "/api/register", 43 { 44 firstName: firstName, 45 lastName: lastName, 46 email: email, 47 password: password 48 } 49 ).then((response) => { 50 this.setState({componentToShow: "restaurants"}) 51 setAuthToken(response.data.token); 52 }).catch((error) => { 53 this.setState({componentToShow: "welcome"}) 54 }); 72 axios.post("/api/register", { firstName, lastName, email, password }) 73 .then((response) => { 74 const token = response.data.token; 75 localStorage.setItem('token', token); 76 console.log(token); 77 this.setAuthToken(token); 78 this.fetchUserDetails(token); 79 }) 80 .catch((error) => { 81 this.setState({ componentToShow: "welcome" }); 82 console.error(error); 83 }); 84 }; 85 86 setAuthToken = (token) => { 87 if (token) { 88 axios.defaults.headers.common["Authorization"] = `Bearer ${token}`; 89 } else { 90 delete axios.defaults.headers.common["Authorization"]; 91 } 55 92 }; 56 93 … … 58 95 return ( 59 96 <div> 60 <Buttons login={this.login} logout={this.logout}></Buttons> 61 {this.state.componentToShow === "welcome" && <WelcomeContent/>} 62 {this.state.componentToShow === "restaurants" && <AuthContent/>} 63 {this.state.componentToShow === "login" && <LoginForm onLogin={this.onLogin} onRegister={this.onRegister}/>} 97 <Buttons login={this.login} logout={this.logout} /> 98 {this.state.componentToShow === "welcome" && <WelcomeContent />} 99 {this.state.componentToShow === "restaurants" && <AuthContent />} 100 {this.state.componentToShow === "login" && <LoginForm onLogin={this.onLogin} onRegister={this.onRegister} />} 101 {this.state.loading && <div>Loading...</div>} {/* Show loading state */} 64 102 </div> 65 ) 103 ); 66 104 } 67 105 } 106 107 108 export default AppContent;
Note:
See TracChangeset
for help on using the changeset viewer.