From e6a17024226ede304dd4b3fe764e4e773b1c2207 Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Mon, 11 Dec 2023 18:45:23 +0530 Subject: [PATCH 1/6] feat : launch changes --- src/pages/launch/Home.tsx | 2 +- src/pages/launch/LaunchHome.module.css | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/pages/launch/Home.tsx b/src/pages/launch/Home.tsx index 9730fa51..6ae9ae27 100644 --- a/src/pages/launch/Home.tsx +++ b/src/pages/launch/Home.tsx @@ -66,7 +66,7 @@ const LaunchHome: React.FC = ({}) => {

VIJÑ
A
- NA 2.0 + NA' 24

{/* */} diff --git a/src/pages/launch/LaunchHome.module.css b/src/pages/launch/LaunchHome.module.css index ff73b8dd..1df8375b 100644 --- a/src/pages/launch/LaunchHome.module.css +++ b/src/pages/launch/LaunchHome.module.css @@ -45,11 +45,19 @@ /* width: 42vw; */ } } +@keyframes showdown { + from { + transform: translateY(-100%); + } + to { + transform: translateY(0%); + } +} .home { .topbar { - animation: show 2s ease-in-out forwards; - animation-delay: 3s; - opacity: 0; + transform: translateY(-100%); + animation: showdown 2s ease-in-out forwards; + animation-delay: 4s; } .background { position: absolute; @@ -109,7 +117,7 @@ height: calc(100vh - var(--topbar-total-height) - var(--bottom-spacing)); .content { - animation: show 2s ease-in-out forwards; + animation: show 4s ease-in-out forwards; animation-delay: 2s; opacity: 0; position: absolute; From 9403e2d9b3ba3898b7e08990c4dd2f786054f2c8 Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Mon, 11 Dec 2023 19:13:57 +0530 Subject: [PATCH 2/6] feat (admin) : event list --- src/App.tsx | 4 ++ src/pages/admin/Admin.tsx | 61 +++++++++++++++++-- .../admin/admin_pages/users_list/UserList.tsx | 51 ++++++++++++++++ .../admin_pages/view_events/ViewEvents.tsx | 48 +++++++++++++++ 4 files changed, 159 insertions(+), 5 deletions(-) create mode 100644 src/pages/admin/admin_pages/users_list/UserList.tsx create mode 100644 src/pages/admin/admin_pages/view_events/ViewEvents.tsx diff --git a/src/App.tsx b/src/App.tsx index 8776834e..79e03d7b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -26,6 +26,7 @@ import Launch from "./pages/launch/launch"; import LaunchHome from "./pages/launch/Home"; import Admin from "./pages/admin/Admin"; import NewEvent from "./pages/admin/admin_pages/new_event/NewEvent"; +import ViewEvent from "./pages/admin/admin_pages/view_events/ViewEvents"; function getTheme() { var theme = localStorage.getItem("theme"); @@ -185,6 +186,9 @@ function App() { > }> }> + }> + }> + }> }> diff --git a/src/pages/admin/Admin.tsx b/src/pages/admin/Admin.tsx index 9f3f7c2e..b9b2040c 100644 --- a/src/pages/admin/Admin.tsx +++ b/src/pages/admin/Admin.tsx @@ -23,11 +23,62 @@ const Admin: React.FC = ({}) => {

Vijnana Admin

    -
  • About Event
  • -
  • Events
  • -
  • Add Event
  • -
  • Add Admin
  • -
  • Users
  • +
  • { + redirect("/admin/about"); + }} + className="list-group-item" + > + About Event +
  • +
  • { + redirect("/admin/events"); + }} + className="list-group-item" + > + Events +
  • +
  • { + redirect("/admin/events/new"); + }} + className="list-group-item" + > + Add Event +
  • +
  • { + redirect("/admin/admin/new"); + }} + className="list-group-item" + > + Add Admin +
  • +
  • { + redirect("/admin/users"); + }} + className="list-group-item" + > + Users +
  • +
  • { + redirect("/admin/logs/error"); + }} + className="list-group-item" + > + Error Log +
  • +
  • { + redirect("/admin/logs/request"); + }} + className="list-group-item" + > + Request Log +
diff --git a/src/pages/admin/admin_pages/users_list/UserList.tsx b/src/pages/admin/admin_pages/users_list/UserList.tsx new file mode 100644 index 00000000..7337bd92 --- /dev/null +++ b/src/pages/admin/admin_pages/users_list/UserList.tsx @@ -0,0 +1,51 @@ +import React, { useEffect, useState } from "react"; +import { _Event, _EventCreateData, _EventInfo } from "../../../../utils/types"; +import { useToast } from "../../../../components/toast/useToast"; +import { getEvents } from "../../../../apis/eventApi"; +import { useLoader } from "../../../../components/toploader/useLoader"; +import { Link } from "react-router-dom"; + +const ViewEvent: React.FC = () => { + const [events, setEvents] = useState<_EventInfo[]>([]); // [ + const { setToastStatus } = useToast(); + const { addLoader } = useLoader(); + useEffect(() => { + getEvents(null, addLoader, setToastStatus, 10).then((res) => { + setEvents(res ? res : []); + }); + }, []); + return ( +
+

+ Registered Users List +

+ {events.map((event) => { + return ( +
+
+
{event.name}
+

{event.description}

+ + Edit Event + + + View Event + + +
+
+ ); + })} +
+ ); +}; + +export default ViewEvent; diff --git a/src/pages/admin/admin_pages/view_events/ViewEvents.tsx b/src/pages/admin/admin_pages/view_events/ViewEvents.tsx new file mode 100644 index 00000000..809f84a1 --- /dev/null +++ b/src/pages/admin/admin_pages/view_events/ViewEvents.tsx @@ -0,0 +1,48 @@ +import React, { useEffect, useState } from "react"; +import { _Event, _EventCreateData, _EventInfo } from "../../../../utils/types"; +import { useToast } from "../../../../components/toast/useToast"; +import { getEvents } from "../../../../apis/eventApi"; +import { useLoader } from "../../../../components/toploader/useLoader"; +import { Link } from "react-router-dom"; + +const ViewEvent: React.FC = () => { + const [events, setEvents] = useState<_EventInfo[]>([]); // [ + const { setToastStatus } = useToast(); + const { addLoader } = useLoader(); + useEffect(() => { + getEvents(null, addLoader, setToastStatus, 10).then((res) => { + setEvents(res ? res : []); + }); + }, []); + return ( +
+

+ Event List +

+ {events.map((event) => { + return ( +
+
+
{event.name}
+

{event.description}

+ + Edit Event + + + View Event + + +
+
+ ); + })} +
+ ); +}; + +export default ViewEvent; From fa78c1fb0c0f890adbc17701d61264780ad259c2 Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Mon, 11 Dec 2023 19:45:42 +0530 Subject: [PATCH 3/6] feat : users list --- src/App.tsx | 3 +- src/apis/adminApi.tsx | 14 +++- .../admin/admin_pages/users_list/UserList.tsx | 71 ++++++++++++------- src/utils/types.tsx | 7 ++ 4 files changed, 66 insertions(+), 29 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 79e03d7b..b2c1b401 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -27,6 +27,7 @@ import LaunchHome from "./pages/launch/Home"; import Admin from "./pages/admin/Admin"; import NewEvent from "./pages/admin/admin_pages/new_event/NewEvent"; import ViewEvent from "./pages/admin/admin_pages/view_events/ViewEvents"; +import UserList from "./pages/admin/admin_pages/users_list/UserList"; function getTheme() { var theme = localStorage.getItem("theme"); @@ -188,7 +189,7 @@ function App() { }> }> }> - }> + }> }> diff --git a/src/apis/adminApi.tsx b/src/apis/adminApi.tsx index bcfacfd4..7457c31d 100644 --- a/src/apis/adminApi.tsx +++ b/src/apis/adminApi.tsx @@ -1,4 +1,4 @@ -import { _EventCreateData } from "../utils/types"; +import { _AdminUserList, _EventCreateData } from "../utils/types"; import { ApiResponse, ResponseStatus, @@ -7,6 +7,18 @@ import { validateResponse, } from "./api"; +export const usersList = async (): Promise<_AdminUserList[] | null> => { + var res = publicRouter.post("/api/v2/admin/users"); + var val = await validateResponse(res); + if ( + val.status == ResponseStatus.SUCCESS && + val.contentType == ResponseType.DATA + ) { + return (val.data.data as any)["users"] as _AdminUserList[]; + } + return null; +}; + export const isAdmin = async (): Promise => { var res = publicRouter.post("/api/v2/admin/is_admin"); var val = await validateResponse(res); diff --git a/src/pages/admin/admin_pages/users_list/UserList.tsx b/src/pages/admin/admin_pages/users_list/UserList.tsx index 7337bd92..197e88a9 100644 --- a/src/pages/admin/admin_pages/users_list/UserList.tsx +++ b/src/pages/admin/admin_pages/users_list/UserList.tsx @@ -1,17 +1,17 @@ import React, { useEffect, useState } from "react"; -import { _Event, _EventCreateData, _EventInfo } from "../../../../utils/types"; -import { useToast } from "../../../../components/toast/useToast"; -import { getEvents } from "../../../../apis/eventApi"; -import { useLoader } from "../../../../components/toploader/useLoader"; -import { Link } from "react-router-dom"; +import { + _AdminUserList, + _Event, + _EventCreateData, + _EventInfo, +} from "../../../../utils/types"; +import { usersList } from "../../../../apis/adminApi"; -const ViewEvent: React.FC = () => { - const [events, setEvents] = useState<_EventInfo[]>([]); // [ - const { setToastStatus } = useToast(); - const { addLoader } = useLoader(); +const UserList: React.FC = () => { + const [users, setUsers] = useState<_AdminUserList[]>([]); useEffect(() => { - getEvents(null, addLoader, setToastStatus, 10).then((res) => { - setEvents(res ? res : []); + usersList().then((res) => { + setUsers(res ? res : []); }); }, []); return ( @@ -19,27 +19,44 @@ const ViewEvent: React.FC = () => {

Registered Users List

- {events.map((event) => { + {users.map((u) => { return (
-
{event.name}
-

{event.description}

- - Edit Event - - - View Event - + {u.name} asfjha f sag sasfab saf + +

+ {u.userId} +
+ Registration Status : {" "} + {u.step === 2 ? "Completed" : "Not Completed"} +
+ College : {u.college} +
+ Course : {u.course} ({u.year}) +
+ Email : {u.email} +
+ Phone : {u.phone} +
+ Register Method : {u.is_google ? "Google" : "Email"} +
+ Admin : {u.is_admin ? "Yes" : "No"} +
+ Registered In : {u.participation.length} events +

+   // Not Implemented Here
); @@ -48,4 +65,4 @@ const ViewEvent: React.FC = () => { ); }; -export default ViewEvent; +export default UserList; diff --git a/src/utils/types.tsx b/src/utils/types.tsx index 2c4905de..dc18dedb 100644 --- a/src/utils/types.tsx +++ b/src/utils/types.tsx @@ -104,3 +104,10 @@ export type _EventCreateData = { gctian_only: boolean; is_reg: boolean; }; + +export type _AdminUserList = { + is_google: boolean; + is_admin: boolean; + participation: { event: string }[]; + phone: string; +} & _UserDetails; From 2287bb2e17c6a0b12a80cd78931e920941a8b644 Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Mon, 11 Dec 2023 21:07:23 +0530 Subject: [PATCH 4/6] feat (admin) : request logs --- src/App.tsx | 2 + src/apis/adminApi.tsx | 20 +++++- .../admin_pages/request_log/RequestLog.tsx | 72 +++++++++++++++++++ .../admin/admin_pages/users_list/UserList.tsx | 2 +- src/utils/types.tsx | 18 +++++ 5 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 src/pages/admin/admin_pages/request_log/RequestLog.tsx diff --git a/src/App.tsx b/src/App.tsx index b2c1b401..b36375f5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -28,6 +28,7 @@ import Admin from "./pages/admin/Admin"; import NewEvent from "./pages/admin/admin_pages/new_event/NewEvent"; import ViewEvent from "./pages/admin/admin_pages/view_events/ViewEvents"; import UserList from "./pages/admin/admin_pages/users_list/UserList"; +import RequestLog from "./pages/admin/admin_pages/request_log/RequestLog"; function getTheme() { var theme = localStorage.getItem("theme"); @@ -190,6 +191,7 @@ function App() { }> }> }> + }> }> diff --git a/src/apis/adminApi.tsx b/src/apis/adminApi.tsx index 7457c31d..24fc835f 100644 --- a/src/apis/adminApi.tsx +++ b/src/apis/adminApi.tsx @@ -1,4 +1,8 @@ -import { _AdminUserList, _EventCreateData } from "../utils/types"; +import { + _AdminRequestLog, + _AdminUserList, + _EventCreateData, +} from "../utils/types"; import { ApiResponse, ResponseStatus, @@ -7,6 +11,20 @@ import { validateResponse, } from "./api"; +export const requestLog = async ( + count: number = 10 +): Promise<_AdminRequestLog[] | null> => { + var res = publicRouter.get("/api/v2/admin/logs/request?count=" + count); + var val = await validateResponse(res); + if ( + val.status == ResponseStatus.SUCCESS && + val.contentType == ResponseType.DATA + ) { + return (val.data.data as any)["logs"] as _AdminRequestLog[]; + } + return null; +}; + export const usersList = async (): Promise<_AdminUserList[] | null> => { var res = publicRouter.post("/api/v2/admin/users"); var val = await validateResponse(res); diff --git a/src/pages/admin/admin_pages/request_log/RequestLog.tsx b/src/pages/admin/admin_pages/request_log/RequestLog.tsx new file mode 100644 index 00000000..dab6c8da --- /dev/null +++ b/src/pages/admin/admin_pages/request_log/RequestLog.tsx @@ -0,0 +1,72 @@ +import React, { useEffect, useState } from "react"; +import { + _AdminRequestLog, + _Event, + _EventCreateData, + _EventInfo, +} from "../../../../utils/types"; +import { requestLog } from "../../../../apis/adminApi"; + +const RequestLog: React.FC = () => { + const [logs, setLogs] = useState<_AdminRequestLog[]>([]); + const [limit, setLimit] = useState(10); + const getLogs = (limit = 10) => { + requestLog(limit).then((res) => { + console.log(res); + setLogs(res ? res : []); + }); + }; + + useEffect(() => { + getLogs(); + }, []); + + return ( +
+

+ Request Logs +

+ { + setLimit(parseInt(e.target.value)); + }} + /> + { + getLogs(limit); + }} + /> + {logs.map((l) => { + return ( +
+
+
+ URL : {l.url} ({l.status}) +
+

+ Request :{" "} + + {l.data ? JSON.stringify(l.data, [], 2) : "No data"} + +
+ Response :{" "} + + {l.response + ? JSON.stringify(l.response, null, 2) + : "No Response"} + +
+

+
+
+ ); + })} +
+ ); +}; + +export default RequestLog; diff --git a/src/pages/admin/admin_pages/users_list/UserList.tsx b/src/pages/admin/admin_pages/users_list/UserList.tsx index 197e88a9..47d35ed8 100644 --- a/src/pages/admin/admin_pages/users_list/UserList.tsx +++ b/src/pages/admin/admin_pages/users_list/UserList.tsx @@ -31,7 +31,7 @@ const UserList: React.FC = () => { }} className="card-title underline start mb-4" > - {u.name} asfjha f sag sasfab saf + {u.name}

{u.userId} diff --git a/src/utils/types.tsx b/src/utils/types.tsx index dc18dedb..d6bedc30 100644 --- a/src/utils/types.tsx +++ b/src/utils/types.tsx @@ -111,3 +111,21 @@ export type _AdminUserList = { participation: { event: string }[]; phone: string; } & _UserDetails; + +export type _AdminRequestLog = { + method: string; + url: string; + user: { + userId: string; + name: string; + email: string; + phone: string; + college: string; + } | null; + status: number; + data: string; + response: string | null; + completed: boolean; + requestTime: Date; + resopnseTime: Date; +}; From cf83845ced725309dc31c1c65ab778fd8a4c3218 Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Mon, 11 Dec 2023 21:19:24 +0530 Subject: [PATCH 5/6] feat(admin) : Error log --- src/App.tsx | 2 + src/apis/adminApi.tsx | 15 ++++ .../admin/admin_pages/error_log/ErrorLog.tsx | 68 +++++++++++++++++++ .../admin_pages/request_log/RequestLog.tsx | 6 ++ src/utils/types.tsx | 13 +++- 5 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 src/pages/admin/admin_pages/error_log/ErrorLog.tsx diff --git a/src/App.tsx b/src/App.tsx index b36375f5..6258b3ff 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -29,6 +29,7 @@ import NewEvent from "./pages/admin/admin_pages/new_event/NewEvent"; import ViewEvent from "./pages/admin/admin_pages/view_events/ViewEvents"; import UserList from "./pages/admin/admin_pages/users_list/UserList"; import RequestLog from "./pages/admin/admin_pages/request_log/RequestLog"; +import ErrorLog from "./pages/admin/admin_pages/error_log/ErrorLog"; function getTheme() { var theme = localStorage.getItem("theme"); @@ -192,6 +193,7 @@ function App() { }> }> }> + }> }> diff --git a/src/apis/adminApi.tsx b/src/apis/adminApi.tsx index 24fc835f..b42c0adb 100644 --- a/src/apis/adminApi.tsx +++ b/src/apis/adminApi.tsx @@ -1,4 +1,5 @@ import { + _AdminErrorLog, _AdminRequestLog, _AdminUserList, _EventCreateData, @@ -11,6 +12,20 @@ import { validateResponse, } from "./api"; +export const errorLog = async ( + count: number = 10 +): Promise<_AdminErrorLog[] | null> => { + var res = publicRouter.get("/api/v2/admin/logs/error?count=" + count); + var val = await validateResponse(res); + if ( + val.status == ResponseStatus.SUCCESS && + val.contentType == ResponseType.DATA + ) { + return (val.data.data as any)["logs"] as _AdminErrorLog[]; + } + return null; +}; + export const requestLog = async ( count: number = 10 ): Promise<_AdminRequestLog[] | null> => { diff --git a/src/pages/admin/admin_pages/error_log/ErrorLog.tsx b/src/pages/admin/admin_pages/error_log/ErrorLog.tsx new file mode 100644 index 00000000..a51925b6 --- /dev/null +++ b/src/pages/admin/admin_pages/error_log/ErrorLog.tsx @@ -0,0 +1,68 @@ +import React, { useEffect, useState } from "react"; +import { + _AdminErrorLog, + _Event, + _EventCreateData, + _EventInfo, +} from "../../../../utils/types"; +import { errorLog } from "../../../../apis/adminApi"; + +const ErrorLog: React.FC = () => { + const [logs, setLogs] = useState<_AdminErrorLog[]>([]); + const [limit, setLimit] = useState(10); + const getLogs = (limit = 10) => { + errorLog(limit).then((res) => { + console.log(res); + setLogs(res ? res : []); + }); + }; + + useEffect(() => { + getLogs(); + }, []); + + return ( +

+

+ Error Logs +

+ { + setLimit(parseInt(e.target.value)); + }} + /> + { + getLogs(limit); + }} + /> + {logs.map((l) => { + return ( +
+
+
URL : {l.url}
+

+ Requested At :{" "} + {new Date(l.requestTime).toLocaleString()} +
+ Response At :{" "} + {new Date(l.responseTime).toLocaleString()} +
+ Error : {l.error} +
+ Response : {l.stack} +
+

+
+
+ ); + })} +
+ ); +}; + +export default ErrorLog; diff --git a/src/pages/admin/admin_pages/request_log/RequestLog.tsx b/src/pages/admin/admin_pages/request_log/RequestLog.tsx index dab6c8da..7ca64d16 100644 --- a/src/pages/admin/admin_pages/request_log/RequestLog.tsx +++ b/src/pages/admin/admin_pages/request_log/RequestLog.tsx @@ -47,6 +47,12 @@ const RequestLog: React.FC = () => {
URL : {l.url} ({l.status})
+ Requested At :{" "} + {new Date(l.requestTime).toLocaleString()} +
+ Response At :{" "} + {new Date(l.responseTime).toLocaleString()} +

Request :{" "} diff --git a/src/utils/types.tsx b/src/utils/types.tsx index d6bedc30..9cc0db2b 100644 --- a/src/utils/types.tsx +++ b/src/utils/types.tsx @@ -126,6 +126,15 @@ export type _AdminRequestLog = { data: string; response: string | null; completed: boolean; - requestTime: Date; - resopnseTime: Date; + requestTime: string; + responseTime: string; +}; + +export type _AdminErrorLog = { + url: string; + error: string; + stack: string; + log: { logId: string; userId: string; data: string } | null; + requestTime: string; + responseTime: string; }; From 68388d281a60022054282a4eef84ad6e2ab5fb93 Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Mon, 11 Dec 2023 21:30:15 +0530 Subject: [PATCH 6/6] feat(admin) : add admin --- src/App.tsx | 2 + src/apis/adminApi.tsx | 14 +++++ .../admin/admin_pages/add_admin/AddAdmin.tsx | 55 +++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 src/pages/admin/admin_pages/add_admin/AddAdmin.tsx diff --git a/src/App.tsx b/src/App.tsx index 6258b3ff..6c96e2e5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -30,6 +30,7 @@ import ViewEvent from "./pages/admin/admin_pages/view_events/ViewEvents"; import UserList from "./pages/admin/admin_pages/users_list/UserList"; import RequestLog from "./pages/admin/admin_pages/request_log/RequestLog"; import ErrorLog from "./pages/admin/admin_pages/error_log/ErrorLog"; +import AddAdmin from "./pages/admin/admin_pages/add_admin/AddAdmin"; function getTheme() { var theme = localStorage.getItem("theme"); @@ -189,6 +190,7 @@ function App() { > }> }> + }> }> }> }> diff --git a/src/apis/adminApi.tsx b/src/apis/adminApi.tsx index b42c0adb..bb756b07 100644 --- a/src/apis/adminApi.tsx +++ b/src/apis/adminApi.tsx @@ -12,6 +12,20 @@ import { validateResponse, } from "./api"; +export const addAdmin = async ( + data: { email: string }, + setToast: ( + status: boolean, + message: string | null, + hideAfter: number | null + ) => void +): Promise => { + var res = publicRouter.post("/api/v2/admin/add_admin", data); + var val = await validateResponse(res); + setToast(true, val.data.message, 3000); + return val; +}; + export const errorLog = async ( count: number = 10 ): Promise<_AdminErrorLog[] | null> => { diff --git a/src/pages/admin/admin_pages/add_admin/AddAdmin.tsx b/src/pages/admin/admin_pages/add_admin/AddAdmin.tsx new file mode 100644 index 00000000..4394db48 --- /dev/null +++ b/src/pages/admin/admin_pages/add_admin/AddAdmin.tsx @@ -0,0 +1,55 @@ +import React, { useState } from "react"; +import { _Event, _EventCreateData } from "../../../../utils/types"; +import { useToast } from "../../../../components/toast/useToast"; +import { addAdmin } from "../../../../apis/adminApi"; + +const AddAdmin: React.FC = () => { + const [formData, setFormData] = useState({ + email: "", + }); + const { setToastStatus } = useToast(); + const handleChange = ( + e: React.ChangeEvent< + HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement + > + ) => { + console.log(e.target.id, e.target.value); + setFormData({ + ...formData, + [e.target.id]: e.target.value, + }); + }; + + const handleSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + console.log("Form submitted!"); + console.log(formData); + await addAdmin(formData, setToastStatus); + }; + + return ( +

+

+ Add A new Administrator +

+
+
+ + +
+ +
+
+ ); +}; + +export default AddAdmin;