Passed
Pull Request — dev (#45)
by James
03:39
created

src/components/AdminPanel.jsx   A

Complexity

Total Complexity 4
Complexity/F 4

Size

Lines of Code 171
Function Count 1

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 127
dl 0
loc 171
rs 10
c 0
b 0
f 0
wmc 4
mnd 3
bc 3
fnc 1
bpm 3
cpm 4
noi 0

1 Function

Rating   Name   Duplication   Size   Complexity  
A AdminPanel.jsx ➔ fetchData 0 5 1
1
import React, { useEffect, useState } from "react";
2
import admin from "../models/admin";
3
import { adminform } from "../data/data";
4
5
const AdminPanel = () => {
6
  const [adminData, setAdminData] = useState();
7
  const [selected, setSelected] = useState();
8
  const [newAdmin, setNewAdmin] = useState({
9
    firstName: "",
10
    lastName: "",
11
    email: "",
12
    password: "",
13
  });
14
  const [mode, setMode] = useState("list");
15
16
  useEffect(() => {
17
    fetchData();
18
  }, []);
19
20
  async function fetchData() {
21
    const res = await admin.getAdmin();
22
    const data = res.admins;
23
    setAdminData(data);
24
  }
25
26
  const handleChangeAdmin = (target, value) => {
27
    setNewAdmin({ ...newAdmin, [target]: value });
28
  };
29
30
  const handleDeleteAdmin = async () => {
31
    await admin.deleteAdmin(selected._id);
32
    await fetchData();
33
34
  };
35
36
  const handleRegister = async () => {
37
    await admin.addAdmin(newAdmin);
38
    await fetchData();
39
    setNewAdmin({
40
      firstName: "",
41
      lastName: "",
42
      email: "",
43
      password: "",
44
    });
45
  };
46
47
  const allAdmins = () => {
48
    return adminData.map((item, index) => {
49
      return (
50
        <div
51
          key={index}
52
          className="
53
        border-b border-slate-400 px-1 py-3"
54
        >
55
          <p>{item.firstName}</p>
56
          <p>{item.lastName}</p>
57
          <p>{item.email}</p>
58
          <label className="pr-2 font-semibold">Select</label>
59
          <input
60
            type="radio"
61
            name="select"
62
            value={item._id}
63
            onClick={() => {
64
              setSelected(item);
65
            }}
66
            className="
67
           bg-gray-600 text-white font-semibold
68
           rounded-xl"
69
          />
70
        </div>
71
      );
72
    });
73
  };
74
75
  const adminForm = () => {
76
    return adminform.map((item, index) => {
77
      return (
78
        <div>
79
          <label>{item.title}</label>
80
          <input
81
            type={item.type}
82
            name={item.name}
83
            value={newAdmin[item.name]}
84
            placeholder={item.placeholder}
85
            onChange={(e) => {
86
              handleChangeAdmin(item.name, e.target.value);
87
            }}
88
            className="bg-gray-50 border border-gray-300 text-gray-900
89
            text-sm rounded-lg block p-2.5 w-72"
90
          />
91
        </div>
92
      );
93
    });
94
  };
95
96
  if (!adminData) {
97
    return <div>loading</div>;
98
  }
99
100
  if (mode === "list") {
101
    return (
102
      <div className="px-3 w-80">
103
        <h1 className="text-2xl font-semibold p-2">Admin Settings</h1>
104
        <div
105
          className="rounded-xl shadow-md h-125 w-full overflow-scroll
106
       bg-white border border-slate-700 p-4"
107
        >
108
          <h1 className="text-xl underline">All Admins</h1>
109
          <div className="flex flex-col">{allAdmins()}</div>
110
        </div>
111
        <div className="my-5 flex flex-row justify-evenly">
112
          <button
113
            onClick={() => {
114
              setMode("register");
115
            }}
116
            className="p-2 bg-sidebarHover hover:bg-sidebarBlue
117
        rounded-xl text-white"
118
          >
119
            Register Admin
120
          </button>
121
122
          <button
123
            onClick={() => {
124
              handleDeleteAdmin();
125
            }}
126
            className="p-2 bg-sidebarHover hover:bg-sidebarBlue
127
        rounded-xl text-white"
128
          >
129
            Delete selected
130
          </button>
131
        </div>
132
      </div>
133
    );
134
  } else if (mode === "register") {
135
    return (
136
      <div className="p-3">
137
        <form
138
          className="rounded-xl shadow-md w-full overflow-scroll
139
          bg-white border border-slate-700 p-4"
140
        >
141
          <h1 className="underline text-xl text-center">Register Admin</h1>
142
          {adminForm()}
143
          <div className="flex flex-row justify-evenly pt-3">
144
            <button
145
              onClick={() => {
146
                setMode("list");
147
              }}
148
              className="py-2 px-4 transition-colors bg-sidebarHover
149
              hover:bg-sidebarBlue text-white rounded-full"
150
            >
151
              Cancel
152
            </button>
153
            <button
154
              onClick={() => {
155
                handleRegister();
156
                setMode("list");
157
              }}
158
              className="py-2 px-4 transition-colors bg-sidebarHover
159
              hover:bg-sidebarBlue text-white rounded-full"
160
            >
161
              Register
162
            </button>
163
          </div>
164
        </form>
165
      </div>
166
    );
167
  }
168
};
169
170
export default AdminPanel;
171