Ignore:
Timestamp:
01/19/25 23:18:37 (4 months ago)
Author:
Aleksandar Panovski <apano77@…>
Branches:
main
Children:
f5b256e
Parents:
db39d9e
Message:

Done with stupid timeslots

File:
1 edited

Legend:

Unmodified
Added
Removed
  • my-react-app/src/components/AppContent.js

    rdb39d9e r8ca35dc  
    1 import * as React from "react";
     1import React from "react";
     2import axios from "axios";
    23import WelcomeContent from "./WelcomeContent";
    34import AuthContent from "./AuthContent";
    45import LoginForm from "./LoginForm";
    5 import { request, setAuthToken } from "../axios_helper";
    6 import Buttons from './Buttons'
     6import AuthForm from "./AuthForm";
     7import Buttons from './Buttons';
     8import restaurants from "./Restaurants";
    79
    8 export default class AppContent extends React.Component {
     10class AppContent extends React.Component {
    911    constructor(props) {
    1012        super(props);
    1113        this.state = {
    12             componentToShow: "welcome"
     14            componentToShow: "welcome",
     15            isAuthenticated: false,
     16            user: null,
     17            loading: false // Add loading state
    1318        };
     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            });
    1440    };
    1541
    1642    login = () => {
    17         this.setState({componentToShow: "login"})
     43        this.setState({ componentToShow: "login" });
    1844    }
    1945
    2046    logout = () => {
    21         this.setState({componentToShow: "welcome"})
     47        localStorage.removeItem('token');
     48        this.setAuthToken(null);
     49        this.setState({ componentToShow: "welcome", isAuthenticated: false });
    2250    }
    2351
    2452    onLogin = (e, email, password) => {
    2553        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
    3668    };
    3769
    3870    onRegister = (e, firstName, lastName, email, password) => {
    3971        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        }
    5592    };
    5693
     
    5895        return (
    5996            <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 */}
    64102            </div>
    65         )
     103        );
    66104    }
    67105}
     106
     107
     108export default AppContent;
Note: See TracChangeset for help on using the changeset viewer.