Subscribe Us

header ads

Membuat Halaman Login di React Menggunakan Material UI

 Berikut contoh halaman login di React Menggunakan Lybrary Material UI

disini ada beberapa file yang menjadi fokus kita:

pages/LoginPage.jsx

component/MyButton.jsx

component/MySnackbar.jsx

component/MyTextField.jsx

App.jsx

berikut kodenya :

pages/LoginPage.jsx

import Avatar from "@mui/material/Avatar";
import Box from "@mui/material/Box";
import LockOutlinedIcon from "@mui/icons-material/LockOutlined";
import Typography from "@mui/material/Typography";
import Container from "@mui/material/Container";
import { createTheme, ThemeProvider } from "@mui/material/styles";
import MyTextField from "../component/MyTextField";
import MyButton from "../component/MyButton";
import { Checkbox, FormControlLabel } from "@mui/material";
import { useState } from "react";
import MySnackbar from "../component/MySnackbar";

const defaultTheme = createTheme({
  palette: {
    primary: { main: "#1976d2" },
    secondary: { main: "#7c8ee6ff" },
    error: { main: "#f44336" },
  },
});

export default function LoginPage() {
  const [message, setMessage] = useState("");
  const [isError, setIsError] = useState(false);
  const [isSuccess, setIsSuccess] = useState(false);

  const handleSubmit = async (event) => {
    event.preventDefault();
    const data = new FormData(event.currentTarget);
    const email = data.get("email");
    const password = data.get("password");

    if (!email || !password) {
      setIsError(true);
      setIsSuccess(false);
      setMessage("Email and password must be filled");
      return;
    }

    try {
      const response = await fetch("http://localhost:3001/api/login", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ email, password }),
      });

      const result = await response.json();

      if (response.ok) {
        setIsError(false);
        setIsSuccess(true);
        setMessage(result.message || "Login successful!");
        // localStorage.setItem("token", result.token); // optional
      } else {
        setIsError(true);
        setIsSuccess(false);
        setMessage(
          result.message || "Login failed. Please check your credentials."
        );
      }
    } catch (error) {
      setIsError(true);
      setIsSuccess(false);
      setMessage("Network error. Please try again later.");
      console.error("Login error:", error);
    }
  };

  return (
    <ThemeProvider theme={defaultTheme}>
      <Container component="main" maxWidth="xs">
        <Box
          sx={{
            marginTop: 8,
            display: "flex",
            flexDirection: "column",
            alignItems: "center",
          }}
        >
          <Avatar sx={{ m: 1, bgcolor: "secondary.main" }}>
            <LockOutlinedIcon />
          </Avatar>
          <Typography component="h1" variant="h5">
            Sign In
          </Typography>
        </Box>

        <Box component="form" noValidate sx={{ mt: 1 }} onSubmit={handleSubmit}>
          <MyTextField
            required
            id="email"
            label="Email"
            name="email"
            autoComplete="email"
          />
          <MyTextField
            required
            name="password"
            label="Password"
            type="password"
            id="password"
            autoComplete="current-password"
          />
          <FormControlLabel
            control={<Checkbox value="remember" color="primary" />}
            label="Remember me"
          />
          <MyButton type="submit" label="Sign In" />

          {isError && (
            <MySnackbar
              message={message}
              open={isError}
              severity="error"
              handleClose={() => setIsError(false)}
            />
          )}
          {isSuccess && (
            <MySnackbar
              message={message}
              open={isSuccess}
              severity="success"
              handleClose={() => setIsSuccess(false)}
            />
          )}
        </Box>
      </Container>
    </ThemeProvider>
  );
}

> component/MyButton.jsx

import { Button } from "@mui/material";
import React from "react";

export default function MyButton(props) {
  const {
    type = "submit",
    variant = "contained",
    label,
    handleOnClick,
  } = props;
  return (
    <Button
      {...props}
      fullWidth
      sx={{ mt: 3, mb: 2 }}
      type={type}
      onClick={type === "submit" ? undefined : handleOnClick}
      variant={variant}
    >
      {label}
    </Button>
  );
}


> component/MySnackbar.jsx

 import { Alert, Snackbar } from "@mui/material";

import React from "react";

export default function MySnackbar({ open, handleClose, severity, message }) {
  return (
    <Snackbar
      open={open}
      autoHideDuration={6000}
      onClose={handleClose}
      anchorOrigin={{ vertical: "top", horizontal: "center" }}
    >
      <Alert
        onClose={handleClose}
        severity={severity}
        variant="filled"
        sx={{ width: "100%" }}
      >
        {message}
      </Alert>
    </Snackbar>
  );
}


> component/MyTextField.jsx

import { TextField } from "@mui/material";
import React from "react";

// component TextFiled sudah reusable
export default function MyTextField(props) {
  const { margin, required, id, type, label, name, autoComplete } = props;
  return (
    <TextField
      {...props}
      id={id}
      autoFocus
      fullWidth
      name={name}
      type={type}
      label={label}
      margin={margin || "normal"}
      required={required || false}
      autoComplete={autoComplete}
    />
  );
}


App.jsx

import React from "react";
import LoginPage from "./pages/LoginPage";

function App() {
  return <LoginPage />;
}

export default App;


Jalankan program backend dummy server.js yang sudah kita buat di postingan sebelumnya "Membuat backend server.js untuk test front end login dengan user dummy

jalankan front end, dan coba lakukan login dengan :

username : admin@example.com

password : 12345


maka akan tampil sbb :


Jika email / password salah maka akan muncul sbb:



Posting Komentar

0 Komentar