Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 14 additions & 3 deletions apps/admin/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,27 @@ import { BrowserRouter, Navigate, Route, Routes } from "react-router-dom";

import Attendance from "./routes/Attendance";
import routes from "./routes";
import { AuthCallback } from "@rp/shared";
import api from "./util/api";
import { AuthCallback, googleAuth } from "@rp/shared";
import Main from "./routes/Main";
import { useEffect } from "react";

function RefreshHandler() {
useEffect(() => {
const params = new URLSearchParams(window.location.search);
const redirect = params.get("redirect");
googleAuth(false, redirect ?? undefined);
}, []);

return <p>Redirecting to login...</p>;
}

function App() {
return (
<ChakraProvider theme={theme}>
<BrowserRouter>
<Routes>
<Route path="/auth/callback" element={<AuthCallback api={api} />} />
<Route path="/auth/refresh" element={<RefreshHandler />} />
<Route path="/auth/callback" element={<AuthCallback />} />
<Route path="/attendance" element={<Attendance />} />
<Route element={<Main />}>
{routes.map(({ path, element }) => (
Expand Down
7 changes: 3 additions & 4 deletions apps/admin/src/components/AttendanceTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,14 @@ import {
import React, { useEffect, useMemo, useState } from "react";
import AttendanceModal from "./AttendanceModal";
import { ChevronDownIcon } from "@chakra-ui/icons";
import api from "../util/api";
import {
AttendanceType,
Meeting,
path,
Staff,
CommitteeType,
usePolling
usePolling,
api
} from "@rp/shared";
import { useMirrorStyles } from "@/styles/Mirror";
import { MainContext } from "@/routes/Main";
Expand Down Expand Up @@ -93,9 +93,8 @@ const AttendanceBox = () => {
data: staff,
isLoading: staffLoading,
mutate: mutateStaff
} = usePolling(api, "/staff", authorized);
} = usePolling("/staff", authorized);
const { data: meetings, isLoading: meetingsLoading } = usePolling(
api,
"/meetings",
authorized
);
Expand Down
2 changes: 1 addition & 1 deletion apps/admin/src/components/Events/AddModal.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { useMirrorStyles } from "@/styles/Mirror";
import api from "@/util/api";
import { AddIcon } from "@chakra-ui/icons";
import {
Modal,
Expand All @@ -12,6 +11,7 @@ import {
import { FormikHelpers } from "formik";
import { EventFormInitialValues, EventFormValues } from "./EventSchema";
import EventForm from "./EventForm";
import { api } from "@rp/shared";

type AddModalProps = {
updateEvents: () => void;
Expand Down
3 changes: 1 addition & 2 deletions apps/admin/src/components/Events/DeleteModal.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { MainContext } from "@/routes/Main";
import api from "@/util/api";
import {
Button,
Modal,
Expand All @@ -12,7 +11,7 @@ import {
useDisclosure,
useToast
} from "@chakra-ui/react";
import { Event, path } from "@rp/shared";
import { api, Event, path } from "@rp/shared";
import { useOutletContext } from "react-router-dom";

type DeleteModalProps = {
Expand Down
3 changes: 1 addition & 2 deletions apps/admin/src/components/Events/EditModal.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import api from "@/util/api";
import { EditIcon } from "@chakra-ui/icons";
import {
useDisclosure,
Expand All @@ -8,7 +7,7 @@ import {
ModalContent,
useToast
} from "@chakra-ui/react";
import { Event, path } from "@rp/shared";
import { api, Event, path } from "@rp/shared";
import React from "react";
import EventForm from "./EventForm";
import { EventFormValues } from "./EventSchema";
Expand Down
4 changes: 2 additions & 2 deletions apps/admin/src/components/Login.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
HStack,
Heading
} from "@chakra-ui/react";
import { Config, googleAuth } from "@rp/shared";
import { googleAuth } from "@rp/shared";

export default function Login() {
return (
Expand Down Expand Up @@ -84,7 +84,7 @@ export default function Login() {
size="lg"
fontWeight="bold"
onClick={() => {
googleAuth(Config.GOOGLE_OAUTH_CLIENT_ID, true);
googleAuth(true);
}}
fontFamily={"Nunito"}
>
Expand Down
2 changes: 1 addition & 1 deletion apps/admin/src/components/Meetings/AddModal.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { useMirrorStyles } from "@/styles/Mirror";
import api from "@/util/api";
import { AddIcon } from "@chakra-ui/icons";
import {
Modal,
Expand All @@ -12,6 +11,7 @@ import {
import { FormikHelpers } from "formik";
import { MeetingFormInitialValues, MeetingFormValues } from "./MeetingSchema";
import MeetingForm from "./MeetingForm";
import { api } from "@rp/shared";

type AddModalProps = {
updateMeetings: () => void;
Expand Down
3 changes: 1 addition & 2 deletions apps/admin/src/components/Meetings/DeleteModal.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { MainContext } from "@/routes/Main";
import api from "@/util/api";
import {
Button,
Modal,
Expand All @@ -12,7 +11,7 @@ import {
useDisclosure,
useToast
} from "@chakra-ui/react";
import { Meeting, path } from "@rp/shared";
import { api, Meeting, path } from "@rp/shared";
import { useOutletContext } from "react-router-dom";

type DeleteModalProps = {
Expand Down
3 changes: 1 addition & 2 deletions apps/admin/src/components/Meetings/EditModal.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import api from "@/util/api";
import { EditIcon } from "@chakra-ui/icons";
import {
useDisclosure,
Expand All @@ -8,7 +7,7 @@ import {
ModalContent,
useToast
} from "@chakra-ui/react";
import { Meeting, path } from "@rp/shared";
import { api, Meeting, path } from "@rp/shared";
import React from "react";
import MeetingForm from "./MeetingForm";
import { MeetingFormValues } from "./MeetingSchema";
Expand Down
7 changes: 3 additions & 4 deletions apps/admin/src/components/Roles/RoleCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,8 @@ import {
FormLabel,
Button
} from "@chakra-ui/react";
import api from "../../util/api";
import React from "react";
import { path, Role, usePolling, RoleObject } from "@rp/shared";
import { path, Role, usePolling, RoleObject, api } from "@rp/shared";
import { Config } from "@/config";
import { useMirrorStyles } from "@/styles/Mirror";
import { Formik, FormikHelpers } from "formik";
Expand All @@ -48,13 +47,13 @@ const RolesCard: React.FC<RolesCardProps> = () => {
data: adminUsers,
update: updateAdminUsers,
isLoading: adminLoading
} = usePolling(api, path("/auth/:role", { role: "ADMIN" }), authorized);
} = usePolling(path("/auth/:role", { role: "ADMIN" }), authorized);

const {
data: staffUsers,
update: updateStaffUsers,
isLoading: staffLoading
} = usePolling(api, path("/auth/:role", { role: "STAFF" }), authorized);
} = usePolling(path("/auth/:role", { role: "STAFF" }), authorized);

// Combine and deduplicate users
const allUsers = React.useMemo((): UserWithRoles[] => {
Expand Down
4 changes: 1 addition & 3 deletions apps/admin/src/components/StatCard.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import api from "@/util/api";
import { Stat, StatLabel, StatNumber } from "@chakra-ui/react";
import { APIRoutes, usePolling } from "@rp/shared";
import { GettablePaths } from "@rp/shared/src/api/type-wrapper";
import { AnimatedCounter } from "@rp/shared";
import { useMirrorStyles } from "@/styles/Mirror";
import { GettablePaths } from "@rp/shared/src/api/type-wrapper";

type Transformer<T extends GettablePaths> = (
data: APIRoutes[T]["GET"]["response"]
Expand All @@ -26,7 +25,6 @@ const StatCard = <T extends GettablePaths>({
}: StatCardProps<T>) => {
const mirrorStyles = useMirrorStyles(true);
const { data, error, isLoading } = usePolling(
api,
endpoint,
enabled ?? true,
interval
Expand Down
2 changes: 1 addition & 1 deletion apps/admin/src/components/StatusMonitor.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { HStack, Icon, Text, Tooltip } from "@chakra-ui/react";
import { api } from "@rp/shared";
import { useEffect, useState } from "react";
import api from "../util/api";
import {
MdSignalWifi4Bar,
MdSignalWifiConnectedNoInternet4
Expand Down
2 changes: 1 addition & 1 deletion apps/admin/src/routes/Attendance.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ import {
} from "@chakra-ui/react";
import Lottie from "lottie-react";
import successAnimation from "../assets/animations/success.json";
import api from "../util/api";
import axios from "axios";
import { useMirrorStyles } from "@/styles/Mirror";
import { MdArrowBack } from "react-icons/md";
import { api } from "@rp/shared";

type Status =
| "loading"
Expand Down
3 changes: 1 addition & 2 deletions apps/admin/src/routes/Main.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { Outlet } from "react-router-dom";
import api from "../util/api";
import { useEffect, useState } from "react";
import { Box } from "@chakra-ui/react";
import Navbar from "@/components/Navbar";
import { Role } from "@rp/shared";
import { api, Role } from "@rp/shared";
import Unauthorized from "@/components/Unauthorized";
import Login from "@/components/Login";
import {
Expand Down
2 changes: 0 additions & 2 deletions apps/admin/src/routes/pages/Dashboard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import {
CardBody,
VStack
} from "@chakra-ui/react";
import api from "../../util/api";
import StatCard from "@/components/StatCard";
import { motion } from "framer-motion";
import { usePolling } from "@rp/shared";
Expand All @@ -21,7 +20,6 @@ const MotionHeader = motion(Heading);
function Dashboard() {
const { authorized, displayName } = useOutletContext<MainContext>();
const { data: currentEvent } = usePolling(
api,
"/events/currentOrNext",
authorized
);
Expand Down
11 changes: 5 additions & 6 deletions apps/admin/src/routes/pages/EventCheckin.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,15 @@ import {
Text
} from "@chakra-ui/react";
import { IDetectedBarcode, Scanner } from "@yudiel/react-qr-scanner";
import api from "../../util/api.ts";
import { Event, usePolling } from "@rp/shared";
import { ApiError } from "@rp/shared/src/api/axios.ts";
import { api, Event, usePolling } from "@rp/shared";
import { useOutletContext } from "react-router-dom";
import { MainContext } from "../Main.tsx";
import { ApiError } from "@rp/shared/src/api/type-wrapper.ts";

const EventCheckin = () => {
const { authorized } = useOutletContext<MainContext>();
const { data: attendees } = usePolling(api, "/attendee/emails", authorized);
const { data: events } = usePolling(api, "/events", authorized);
const { data: attendees } = usePolling("/attendee/emails", authorized);
const { data: events } = usePolling("/events", authorized);
const [showWebcam, setShowWebcam] = useState(false); // Toggle between webcam and email input
const toast = useToast();
const [email, setEmail] = useState("");
Expand Down Expand Up @@ -53,7 +52,7 @@ const EventCheckin = () => {
{
success: { title: "Succesfully checked into event!" },
error: (error: ApiError) => {
switch (error.response.data.error) {
switch (error?.response?.data?.error) {
case "QR code has expired":
return { title: "Event QR code has expired", status: "error" };
case "IsDuplicate":
Expand Down
3 changes: 1 addition & 2 deletions apps/admin/src/routes/pages/Events.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { Heading, Flex, VStack } from "@chakra-ui/react";
import api from "../../util/api.ts";
import { Event, usePolling } from "@rp/shared";
import EventCard, {
EventCardSkeleton
Expand All @@ -18,7 +17,7 @@ function Events() {
data: events,
update: updateEvents,
isLoading
} = usePolling(api, "/events", authorized);
} = usePolling("/events", authorized);

return (
<VStack spacing={4} align="stretch">
Expand Down
3 changes: 1 addition & 2 deletions apps/admin/src/routes/pages/Meetings.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { Heading, Flex } from "@chakra-ui/react";
import api from "../../util/api.ts";
import { usePolling } from "@rp/shared";
import AddModal from "@/components/Meetings/AddModal.tsx";
import MeetingCard, {
Expand All @@ -14,7 +13,7 @@ function Meetings() {
data: meetings,
update: updateMeetings,
isLoading
} = usePolling(api, "/meetings", authorized);
} = usePolling("/meetings", authorized);

return (
<>
Expand Down
5 changes: 2 additions & 3 deletions apps/admin/src/routes/pages/Merch.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,14 @@ import {
Text
} from "@chakra-ui/react";
import { Scanner } from "@yudiel/react-qr-scanner";
import api from "../../util/api.ts";
import { path, usePolling } from "@rp/shared";
import { api, path, usePolling } from "@rp/shared";
import { useOutletContext } from "react-router-dom";
import { MainContext } from "../Main.tsx";

function Merch() {
const { authorized } = useOutletContext<MainContext>();
const toast = useToast();
const { data: emails } = usePolling(api, "/attendee/emails", authorized);
const { data: emails } = usePolling("/attendee/emails", authorized);
const [showWebcam, setShowWebcam] = useState(false); // Toggle between webcam and email input
const [email, setEmail] = useState("");
const [userId, setUserId] = useState("");
Expand Down
5 changes: 2 additions & 3 deletions apps/admin/src/routes/pages/Sponsors.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ import {
FormErrorMessage,
Heading
} from "@chakra-ui/react";
import api from "../../util/api";
import { usePolling } from "@rp/shared";
import { api, usePolling } from "@rp/shared";
import { useMirrorStyles } from "@/styles/Mirror";
import { Formik, FormikHelpers } from "formik";
import {
Expand All @@ -31,7 +30,7 @@ const Sponsors = () => {
data: sponsors,
update: updateSponsors,
isLoading
} = usePolling(api, "/auth/corporate", authorized);
} = usePolling("/auth/corporate", authorized);
const toast = useToast();
const mirrorStyle = useMirrorStyles();

Expand Down
6 changes: 2 additions & 4 deletions apps/admin/src/routes/pages/Stats.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import { Chart, registerables } from "chart.js";
Chart.register(...registerables);

import { useMemo, useState } from "react";
import api from "../../util/api";
import { path, usePolling } from "@rp/shared";
import StatCard from "@/components/StatCard";
import { useMirrorStyles } from "@/styles/Mirror";
Expand All @@ -39,14 +38,13 @@ function Stats() {

const mirrorStyles = useMirrorStyles(true);
const { data: pastAttendanceData, isLoading: pastAttendanceLoading } =
usePolling(api, path("/stats/attendance/:n", { n: numEvents }), authorized);
usePolling(path("/stats/attendance/:n", { n: numEvents }), authorized);
const { data: eligiblePrize, isLoading: eligiblePrizeLoading } = usePolling(
api,
path("/stats/merch-item/:price", { price }),
authorized
);
const { data: dietaryRestrictions, isLoading: dietaryRestrictionsLoading } =
usePolling(api, "/stats/dietary-restrictions", authorized);
usePolling("/stats/dietary-restrictions", authorized);

const pastAttendance = useMemo(() => {
if (!pastAttendanceData) {
Expand Down
9 changes: 0 additions & 9 deletions apps/admin/src/util/api.ts

This file was deleted.

2 changes: 1 addition & 1 deletion apps/admin/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"@rp/shared": ["../../shared"]
}
},
"include": ["src", "vite.config.ts"],
"include": ["src", "vite.config.ts", "../../shared/src/api/api.ts"],
"references": [
{
"path": "../../shared"
Expand Down
Loading
Loading