>>;
26 |
27 | export const GET = async () => {
28 | const snapshot = await getDocs(collection(db, "statistics"));
29 |
30 | const heatmaps: heatmap = {};
31 |
32 | snapshot.forEach((doc) => {
33 | const data = doc.data();
34 | heatmaps[doc.id] = {};
35 |
36 | labels.forEach((label: string) => {
37 | heatmaps[doc.id][label] = {};
38 |
39 | statuses.forEach((status: string) => {
40 | heatmaps[doc.id][label][status] = [];
41 |
42 | const results = data[label][status];
43 | const values: number[] = orders[doc.id].map((key) => results[key]);
44 |
45 | heatmaps[doc.id][label][status] = values;
46 | });
47 | });
48 | });
49 |
50 | return Response.json(heatmaps);
51 | };
52 |
--------------------------------------------------------------------------------
/src/app/api/teams/ideas/route.ts:
--------------------------------------------------------------------------------
1 | import { authenticate } from "@/utils/auth";
2 | import { addDoc, collection } from "firebase/firestore";
3 | import { db } from "@/utils/firebase";
4 |
5 | export const POST = async (req: Request) => {
6 | const { auth, message } = await authenticate({
7 | participants: [1],
8 | });
9 |
10 | if (auth !== 200) {
11 | return Response.json(
12 | { message: `Authentication Error: ${message}` },
13 | { status: auth },
14 | );
15 | }
16 |
17 | const { idea, languages, details, contact } = await req.json();
18 |
19 | try {
20 | await addDoc(collection(db, "ideas"), {
21 | idea,
22 | languages,
23 | details,
24 | contact,
25 | });
26 | return Response.json({ message: "OK" }, { status: 200 });
27 | } catch (err) {
28 | return Response.json(
29 | { message: `Internal Server Error: ${err}` },
30 | { status: 500 },
31 | );
32 | }
33 | };
34 |
--------------------------------------------------------------------------------
/src/app/apply/admin/page.tsx:
--------------------------------------------------------------------------------
1 | import Admin from "@/components/form/admin";
2 |
3 | export const metadata = {
4 | title: "Form | Admin",
5 | };
6 |
7 | export default Admin;
8 |
--------------------------------------------------------------------------------
/src/app/apply/committee/page.tsx:
--------------------------------------------------------------------------------
1 | import Committee from "@/components/form/committee";
2 |
3 | export const metadata = {
4 | title: "Form | Committee",
5 | };
6 |
7 | export default Committee;
8 |
--------------------------------------------------------------------------------
/src/app/apply/feedback/page.tsx:
--------------------------------------------------------------------------------
1 | import Feedback from "@/components/form/feedback";
2 |
3 | export const metadata = {
4 | title: "Form | Feedback",
5 | };
6 |
7 | export default Feedback;
8 |
--------------------------------------------------------------------------------
/src/app/apply/idea/page.tsx:
--------------------------------------------------------------------------------
1 | import Ideas from "@/components/form/ideas";
2 |
3 | export const metadata = {
4 | title: "Form | Ideas",
5 | };
6 |
7 | export default Ideas;
8 |
--------------------------------------------------------------------------------
/src/app/apply/interest/page.tsx:
--------------------------------------------------------------------------------
1 | import Interest from "@/components/form/interest";
2 |
3 | export const metadata = {
4 | title: "Form | Interest",
5 | };
6 |
7 | export default Interest;
8 |
--------------------------------------------------------------------------------
/src/app/apply/layout.tsx:
--------------------------------------------------------------------------------
1 | import Providers from "@/components/providers";
2 | import { Toaster } from "react-hot-toast";
3 | import ProtectedPage from "@/components/protected";
4 | import { getSession } from "@/utils/auth";
5 |
6 | type Props = {
7 | children: React.ReactNode;
8 | };
9 |
10 | const FormLayout = async ({ children }: Props) => {
11 | const session = await getSession();
12 |
13 | return (
14 |
15 |
16 |
17 | {children}
18 |
19 |
20 | );
21 | };
22 |
23 | export default FormLayout;
24 |
--------------------------------------------------------------------------------
/src/app/apply/lead/page.tsx:
--------------------------------------------------------------------------------
1 | import Lead from "@/components/form/lead";
2 |
3 | export const metadata = {
4 | title: "Form | Lead",
5 | };
6 |
7 | export default Lead;
8 |
--------------------------------------------------------------------------------
/src/app/apply/mentor/page.tsx:
--------------------------------------------------------------------------------
1 | import Mentor from "@/components/form/mentor";
2 |
3 | export const metadata = {
4 | title: "Form | Mentor",
5 | };
6 |
7 | export default Mentor;
8 |
--------------------------------------------------------------------------------
/src/app/apply/panel/page.tsx:
--------------------------------------------------------------------------------
1 | import Panel from "@/components/form/panel";
2 |
3 | export const metadata = {
4 | title: "Form | Panel",
5 | };
6 |
7 | export default Panel;
8 |
--------------------------------------------------------------------------------
/src/app/apply/participant/page.tsx:
--------------------------------------------------------------------------------
1 | import Participant from "@/components/form/participant";
2 |
3 | export const metadata = {
4 | title: "Form | Participant",
5 | };
6 |
7 | export default Participant;
8 |
--------------------------------------------------------------------------------
/src/app/apply/sponsor/page.tsx:
--------------------------------------------------------------------------------
1 | import Sponsor from "@/components/form/sponsor";
2 |
3 | export const metadata = {
4 | title: "Form | Sponsor",
5 | };
6 |
7 | export default Sponsor;
8 |
--------------------------------------------------------------------------------
/src/app/apply/volunteer/page.tsx:
--------------------------------------------------------------------------------
1 | import Volunteer from "@/components/form/volunteer";
2 |
3 | export const metadata = {
4 | title: "Form | Volunteer",
5 | };
6 |
7 | export default Volunteer;
8 |
--------------------------------------------------------------------------------
/src/app/auth/error/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import Error from "@/components/error";
3 | import { useParams } from "next/navigation";
4 |
5 | interface Params {
6 | error?: string;
7 | }
8 |
9 | const AuthError = () => {
10 | const { error } = useParams() as Params;
11 |
12 | return (
13 |
19 | );
20 | };
21 |
22 | export default AuthError;
23 |
--------------------------------------------------------------------------------
/src/app/error.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import Error from "@/components/error";
3 |
4 | type props = {
5 | error: {
6 | code: number;
7 | error: string;
8 | name: string;
9 | message: string;
10 | dev: string;
11 | };
12 | };
13 |
14 | const InternalError = ({ error: { code, name, message, dev } }: props) => {
15 | return ;
16 | };
17 |
18 | export default InternalError;
19 |
--------------------------------------------------------------------------------
/src/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/acm-ucr/aurora/e2d09fdfbfe93b499a17d2f3afaee64e9edcc525/src/app/favicon.ico
--------------------------------------------------------------------------------
/src/app/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
--------------------------------------------------------------------------------
/src/app/judge/end/page.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import Image from "next/image";
3 | import image1 from "@/public/engineering/hackathon/judgeAssets3.webp";
4 | import image2 from "@/public/engineering/hackathon/judgeAssets4.webp";
5 |
6 | const Page = () => {
7 | return (
8 |
9 |
10 |
11 | THANK YOU FOR JUDGING!
12 |
13 |
14 |
15 | );
16 | };
17 |
18 | export default Page;
19 |
--------------------------------------------------------------------------------
/src/app/judge/layout.tsx:
--------------------------------------------------------------------------------
1 | /* eslint-disable new-cap */
2 | import Providers from "@/components/providers";
3 | import { Toaster } from "react-hot-toast";
4 | import { getSession } from "@/utils/auth";
5 | import ProtectedPage from "@/components/protected";
6 |
7 | type Props = {
8 | children: React.ReactNode;
9 | };
10 |
11 | const JudgeLayout = async ({ children }: Props) => {
12 | const session = await getSession();
13 |
14 | return (
15 |
16 |
17 |
18 | {children}
19 |
20 |
21 | );
22 | };
23 |
24 | export default JudgeLayout;
25 |
--------------------------------------------------------------------------------
/src/app/judge/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { Button } from "@/components/ui/button";
3 | import { useSession } from "next-auth/react";
4 | import Link from "next/link";
5 | import Image from "next/image";
6 | import image1 from "@/public/engineering/hackathon/judgeAssets1.webp";
7 | import image2 from "@/public/engineering/hackathon/judgeAssets2.webp";
8 | const Page = () => {
9 | const { data: session } = useSession();
10 |
11 | const name = session?.user?.firstName;
12 |
13 | return (
14 |
15 |
16 |
17 |
18 | Judging Portal
19 |
20 |
Welcome {name}
21 |
22 |
23 |
26 |
27 |
30 |
31 |
34 |
35 |
36 |
37 |
38 |
39 | );
40 | };
41 |
42 | export default Page;
43 |
--------------------------------------------------------------------------------
/src/app/judge/register/page.tsx:
--------------------------------------------------------------------------------
1 | import Judge from "@/components/form/judge";
2 |
3 | export const metadata = {
4 | title: "Judge | Register",
5 | };
6 |
7 | export default Judge;
8 |
--------------------------------------------------------------------------------
/src/app/judge/start/[id]/page.tsx:
--------------------------------------------------------------------------------
1 | import Start from "@/components/judging/start";
2 |
3 | interface props {
4 | params: {
5 | id: string;
6 | };
7 | searchParams: { [key: string]: string };
8 | }
9 |
10 | const Page = ({ params, searchParams }: props) => {
11 | const { id } = params;
12 |
13 | return (
14 |
20 | );
21 | };
22 |
23 | export default Page;
24 |
--------------------------------------------------------------------------------
/src/app/judge/start/page.tsx:
--------------------------------------------------------------------------------
1 | import Dashboard from "@/components/judging/start/dashboard";
2 |
3 | const Page = () => {
4 | return ;
5 | };
6 |
7 | export default Page;
8 |
--------------------------------------------------------------------------------
/src/app/judge/structure/page.tsx:
--------------------------------------------------------------------------------
1 | const Page = () => {
2 | return Put the Content from Judging Debriefing Slides Here
;
3 | };
4 |
5 | export default Page;
6 |
--------------------------------------------------------------------------------
/src/app/layout.tsx:
--------------------------------------------------------------------------------
1 | /* eslint-disable new-cap */
2 | import "./globals.css";
3 | import { Poppins } from "next/font/google";
4 |
5 | const poppins = Poppins({
6 | subsets: ["latin"],
7 | display: "swap",
8 | weight: ["100", "200", "300", "400", "500", "600", "700", "800", "900"],
9 | variable: "--font-poppins",
10 | });
11 |
12 | type Props = {
13 | children: React.ReactNode;
14 | };
15 |
16 | const RootLayout = async ({ children }: Props) => {
17 | return (
18 |
19 |
20 | {children}
21 |
22 |
23 | );
24 | };
25 |
26 | export default RootLayout;
27 |
--------------------------------------------------------------------------------
/src/app/loading.tsx:
--------------------------------------------------------------------------------
1 | import Loading from "@/components/loading";
2 |
3 | export default Loading;
4 |
--------------------------------------------------------------------------------
/src/app/manifest.tsx:
--------------------------------------------------------------------------------
1 | import data from "@/data/config";
2 |
3 | interface Manifest {
4 | name: string;
5 | short_name: string;
6 | description: string;
7 | start_url: string;
8 | }
9 |
10 | const manifest = (): Manifest => {
11 | return {
12 | name: data.name,
13 | short_name: data.short_name,
14 | description: data.description,
15 | start_url: "/",
16 | };
17 | };
18 |
19 | export default manifest;
20 |
--------------------------------------------------------------------------------
/src/app/not-found.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import Error from "@/components/error";
3 |
4 | const NotFoundError = () => {
5 | return (
6 |
11 | );
12 | };
13 |
14 | export default NotFoundError;
15 |
--------------------------------------------------------------------------------
/src/app/page.tsx:
--------------------------------------------------------------------------------
1 | import Release from "@/components/release";
2 | import RELEASES from "@/data/releases";
3 | import Live from "@/components/live";
4 |
5 | const Page = () => {
6 | return (
7 |
8 |
9 |
10 |
11 |
12 | );
13 | };
14 |
15 | export default Page;
16 |
17 | export const dynamic = "force-dynamic";
18 |
--------------------------------------------------------------------------------
/src/app/resources/page.tsx:
--------------------------------------------------------------------------------
1 | import Resources from "@/components/resources/resources";
2 |
3 | export default Resources;
4 |
--------------------------------------------------------------------------------
/src/app/robots.txt:
--------------------------------------------------------------------------------
1 | User-Agent: *
2 | Allow: /
3 | Disallow: /admin/
4 |
--------------------------------------------------------------------------------
/src/app/sitemap.ts:
--------------------------------------------------------------------------------
1 | import data from "@/data/config";
2 |
3 | const sitemap = () => {
4 | return [
5 | {
6 | url: `${data.domain}/`,
7 | lastModified: new Date(),
8 | changeFrequency: "monthly",
9 | priority: 1,
10 | },
11 | {
12 | url: `${data.domain}/apply/admin`,
13 | lastModified: new Date(),
14 | changeFrequency: "monthly",
15 | priority: 0.5,
16 | },
17 | {
18 | url: `${data.domain}/apply/committee`,
19 | lastModified: new Date(),
20 | changeFrequency: "monthly",
21 | priority: 0.5,
22 | },
23 | {
24 | url: `${data.domain}/apply/feedback`,
25 | lastModified: new Date(),
26 | changeFrequency: "monthly",
27 | priority: 0.5,
28 | },
29 | {
30 | url: `${data.domain}/apply/judge`,
31 | lastModified: new Date(),
32 | changeFrequency: "monthly",
33 | priority: 0.5,
34 | },
35 | {
36 | url: `${data.domain}/apply/mentor`,
37 | lastModified: new Date(),
38 | changeFrequency: "monthly",
39 | priority: 0.5,
40 | },
41 | {
42 | url: `${data.domain}/apply/participant`,
43 | lastModified: new Date(),
44 | changeFrequency: "monthly",
45 | priority: 0.5,
46 | },
47 | {
48 | url: `${data.domain}/apply/volunteer`,
49 | lastModified: new Date(),
50 | changeFrequency: "monthly",
51 | priority: 0.5,
52 | },
53 | {
54 | url: `${data.domain}/apply/sponsor`,
55 | lastModified: new Date(),
56 | changeFrequency: "monthly",
57 | priority: 0.5,
58 | },
59 | {
60 | url: `${data.domain}/apply/panel`,
61 | lastModified: new Date(),
62 | changeFrequency: "monthly",
63 | priority: 0.5,
64 | },
65 | {
66 | url: `${data.domain}/user/checkin`,
67 | lastModified: new Date(),
68 | changeFrequency: "monthly",
69 | priority: 0.5,
70 | },
71 | {
72 | url: `${data.domain}/user/dashboard`,
73 | lastModified: new Date(),
74 | changeFrequency: "monthly",
75 | priority: 0.5,
76 | },
77 | ];
78 | };
79 |
80 | export default sitemap;
81 |
--------------------------------------------------------------------------------
/src/app/user/checkin/page.tsx:
--------------------------------------------------------------------------------
1 | import CheckIn from "@/components/user/checkIn";
2 |
3 | export const metadata = {
4 | title: "User | CheckIn",
5 | };
6 |
7 | export default CheckIn;
8 |
--------------------------------------------------------------------------------
/src/app/user/dashboard/page.tsx:
--------------------------------------------------------------------------------
1 | import Dashboard from "@/components/user/dashboard";
2 |
3 | export const metadata = {
4 | title: "User | Dashboard",
5 | };
6 |
7 | export default Dashboard;
8 |
--------------------------------------------------------------------------------
/src/app/user/find/page.tsx:
--------------------------------------------------------------------------------
1 | import Find from "@/components/user/find";
2 |
3 | export const metadata = {
4 | title: "User | Find",
5 | };
6 |
7 | export default Find;
8 |
--------------------------------------------------------------------------------
/src/app/user/join/[team]/page.tsx:
--------------------------------------------------------------------------------
1 | import Join from "@/components/user/join";
2 |
3 | type props = {
4 | params: { team: string };
5 | };
6 |
7 | export const metadata = {
8 | title: "User | Join",
9 | };
10 |
11 | const Page = ({ params }: props) => {
12 | return ;
13 | };
14 |
15 | export default Page;
16 |
--------------------------------------------------------------------------------
/src/app/user/layout.tsx:
--------------------------------------------------------------------------------
1 | /* eslint-disable new-cap */
2 | import Providers from "@/components/providers";
3 | import { Toaster } from "react-hot-toast";
4 | import { getSession } from "@/utils/auth";
5 | import ProtectedPage from "@/components/protected";
6 |
7 | type Props = {
8 | children: React.ReactNode;
9 | };
10 |
11 | const UserLayout = async ({ children }: Props) => {
12 | const session = await getSession();
13 |
14 | return (
15 |
16 |
17 |
18 | {children}
19 |
20 |
21 | );
22 | };
23 |
24 | export default UserLayout;
25 |
--------------------------------------------------------------------------------
/src/app/user/schedule/page.tsx:
--------------------------------------------------------------------------------
1 | import Schedule from "@/components/user/schedule/Wrapper";
2 |
3 | export const metadata = {
4 | title: "User | Schedule",
5 | };
6 |
7 | export default Schedule;
8 |
9 | export const dynamic = "force-dynamic";
10 |
--------------------------------------------------------------------------------
/src/app/user/team/page.tsx:
--------------------------------------------------------------------------------
1 | import Team from "@/components/user/team/team";
2 |
3 | export const metadata = {
4 | title: "User | Team",
5 | };
6 |
7 | export default Team;
8 |
--------------------------------------------------------------------------------
/src/app/visualize/page.tsx:
--------------------------------------------------------------------------------
1 | import Visualizer from "next-route-visualizer";
2 |
3 | const Page = () => ;
4 | export default Page;
5 |
--------------------------------------------------------------------------------
/src/components/admin/dashboards/admins.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { TAGS, COLUMNS, SUBCOLUMNS } from "@/data/admin/admins";
3 | import { STATUSES } from "@/data/statuses";
4 | import Table from "./dashboard/dashboard";
5 | import { SearchParams } from "@/types/dashboard";
6 |
7 | type props = {
8 | searchParams: SearchParams;
9 | };
10 |
11 | const Admin = ({ searchParams }: props) => {
12 | return (
13 |
23 | );
24 | };
25 | export default Admin;
26 |
--------------------------------------------------------------------------------
/src/components/admin/dashboards/committees.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { TAGS, COLUMNS } from "@/data/admin/committees";
3 | import { STATUSES } from "@/data/statuses";
4 | import Table from "./dashboard/dashboard";
5 | import { SearchParams } from "@/types/dashboard";
6 |
7 | type props = {
8 | searchParams: SearchParams;
9 | };
10 |
11 | const Committee = ({ searchParams }: props) => {
12 | return (
13 |
23 | );
24 | };
25 | export default Committee;
26 |
--------------------------------------------------------------------------------
/src/components/admin/dashboards/dashboard/filters.jsx:
--------------------------------------------------------------------------------
1 | import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";
2 | import { COLORS } from "@/data/tags";
3 | import { cn } from "@/utils/tailwind";
4 |
5 | const Filters = ({ statuses, filters, setFilters }) => {
6 | const selectedFilters =
7 | filters.find(({ id }) => id === "status")?.value || [];
8 |
9 | const onClick = (value, isActive) => {
10 | setFilters((prev) => {
11 | const statuses = prev.find(({ id }) => id === "status")?.value;
12 | if (!statuses) {
13 | return prev.concat({
14 | id: "status",
15 | value: [value],
16 | });
17 | }
18 |
19 | return prev.map((f) =>
20 | f.id === "status"
21 | ? {
22 | id: "status",
23 | value: isActive
24 | ? statuses.filter((s) => s !== value)
25 | : statuses.concat(value),
26 | }
27 | : f,
28 | );
29 | });
30 | };
31 |
32 | return (
33 |
34 |
35 | {Object.entries(statuses).map(([key, value]) => (
36 |
40 | onClick(parseInt(key), selectedFilters.includes(parseInt(key)))
41 | }
42 | className={cn(
43 | COLORS["gray"]?.background,
44 | COLORS["gray"]?.text,
45 | COLORS["gray"]?.hover,
46 | "capitalize",
47 | )}
48 | >
49 | {value}
50 |
51 | ))}
52 |
53 |
54 | );
55 | };
56 |
57 | export default Filters;
58 |
--------------------------------------------------------------------------------
/src/components/admin/dashboards/dashboard/view.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { useState } from "react";
3 | import { Download } from "lucide-react";
4 | import { download } from "@/utils/download";
5 | import { Badge } from "@/components/ui/badge";
6 | import {
7 | Dialog,
8 | DialogContent,
9 | DialogHeader,
10 | DialogTitle,
11 | } from "@/components/ui/dialog";
12 |
13 | const View = ({ title, src, type }) => {
14 | const [modal, setModal] = useState({
15 | title: "",
16 | src: "",
17 | visible: false,
18 | });
19 |
20 | const openPDF = () => {
21 | const byteCharacters = atob(src.split(",")[1]);
22 | const byteNumbers = new Array(byteCharacters.length);
23 |
24 | for (let i = 0; i < byteCharacters.length; i++) {
25 | byteNumbers[i] = byteCharacters.charCodeAt(i);
26 | }
27 |
28 | const byteArray = new Uint8Array(byteNumbers);
29 | const blob = new Blob([byteArray], { type: "application/pdf" });
30 |
31 | const blobUrl = URL.createObjectURL(blob);
32 | window.open(blobUrl, "_blank");
33 | };
34 |
35 | return (
36 |
37 |
55 |
56 |
59 | type === "photo" ? setModal({ src, title, visible: true }) : openPDF()
60 | }
61 | >
62 | view
63 |
64 |
65 |
68 | download(
69 | src,
70 | `${title.replace(" ", "_")}.${type === "photo" ? "png" : "pdf"}`,
71 | )
72 | }
73 | />
74 |
75 | );
76 | };
77 |
78 | export default View;
79 |
--------------------------------------------------------------------------------
/src/components/admin/dashboards/feedback.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { STATUSES, TAGS, COLUMNS } from "@/data/admin/feedback";
3 | import Table from "./dashboard/dashboard";
4 | import { SearchParams } from "@/types/dashboard";
5 |
6 | type props = {
7 | searchParams: SearchParams;
8 | };
9 |
10 | const Feedback = ({ searchParams }: props) => {
11 | return (
12 |
22 | );
23 | };
24 | export default Feedback;
25 |
--------------------------------------------------------------------------------
/src/components/admin/dashboards/interests.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { TAGS, COLUMNS } from "@/data/admin/interests";
3 | import { STATUSES } from "@/data/statuses";
4 | import Table from "./dashboard/dashboard";
5 | import { SearchParams } from "@/types/dashboard";
6 |
7 | type props = {
8 | searchParams: SearchParams;
9 | };
10 |
11 | const Interests = ({ searchParams }: props) => {
12 | return (
13 |
23 | );
24 | };
25 | export default Interests;
26 |
--------------------------------------------------------------------------------
/src/components/admin/dashboards/judges.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { TAGS, COLUMNS } from "@/data/admin/judges";
3 | import { STATUSES } from "@/data/statuses";
4 | import Table from "./dashboard/dashboard";
5 | import { SearchParams } from "@/types/dashboard";
6 |
7 | type props = {
8 | searchParams: SearchParams;
9 | };
10 |
11 | const Judges = ({ searchParams }: props) => {
12 | return (
13 |
23 | );
24 | };
25 | export default Judges;
26 |
--------------------------------------------------------------------------------
/src/components/admin/dashboards/leads.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { TAGS, COLUMNS } from "@/data/admin/leads";
3 | import { STATUSES } from "@/data/statuses";
4 | import Table from "./dashboard/dashboard";
5 | import { SearchParams } from "@/types/dashboard";
6 |
7 | type props = {
8 | searchParams: SearchParams;
9 | };
10 |
11 | const Leads = ({ searchParams }: props) => {
12 | return (
13 |
23 | );
24 | };
25 | export default Leads;
26 |
--------------------------------------------------------------------------------
/src/components/admin/dashboards/mentors.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { TAGS, COLUMNS } from "@/data/admin/mentors";
3 | import { STATUSES } from "@/data/statuses";
4 | import Table from "./dashboard/dashboard";
5 | import { SearchParams } from "@/types/dashboard";
6 |
7 | type props = {
8 | searchParams: SearchParams;
9 | };
10 |
11 | const Mentors = ({ searchParams }: props) => {
12 | return (
13 |
23 | );
24 | };
25 | export default Mentors;
26 |
--------------------------------------------------------------------------------
/src/components/admin/dashboards/panels.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { TAGS, COLUMNS } from "@/data/admin/panelists";
3 | import { STATUSES } from "@/data/statuses";
4 | import Table from "./dashboard/dashboard";
5 | import { SearchParams } from "@/types/dashboard";
6 |
7 | type props = {
8 | searchParams: SearchParams;
9 | };
10 |
11 | const Panels = ({ searchParams }: props) => {
12 | return (
13 |
23 | );
24 | };
25 | export default Panels;
26 |
--------------------------------------------------------------------------------
/src/components/admin/dashboards/participants.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { TAGS, COLUMNS, SUBCOLUMNS } from "@/data/admin/participants";
3 | import { STATUSES } from "@/data/statuses";
4 | import Table from "./dashboard/dashboard";
5 | import { SearchParams } from "@/types/dashboard";
6 |
7 | type props = {
8 | searchParams: SearchParams;
9 | };
10 |
11 | const Participants = ({ searchParams }: props) => {
12 | return (
13 |
23 | );
24 | };
25 | export default Participants;
26 |
--------------------------------------------------------------------------------
/src/components/admin/dashboards/resumes.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { TAGS, COLUMNS } from "@/data/admin/resumes";
3 | import { STATUSES } from "@/data/statuses";
4 | import Table from "./dashboard/dashboard";
5 | import { SearchParams } from "@/types/dashboard";
6 |
7 | type props = {
8 | searchParams: SearchParams;
9 | };
10 |
11 | const Resumes = ({ searchParams }: props) => {
12 | return (
13 |
23 | );
24 | };
25 | export default Resumes;
26 |
--------------------------------------------------------------------------------
/src/components/admin/dashboards/sponsors.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { TAGS, COLUMNS } from "@/data/admin/sponsors";
3 | import { STATUSES } from "@/data/statuses";
4 | import Table from "./dashboard/dashboard";
5 | import { SearchParams } from "@/types/dashboard";
6 |
7 | type props = {
8 | searchParams: SearchParams;
9 | };
10 |
11 | const Sponsors = ({ searchParams }: props) => {
12 | return (
13 |
23 | );
24 | };
25 | export default Sponsors;
26 |
--------------------------------------------------------------------------------
/src/components/admin/dashboards/teams.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { TAGS, COLUMNS } from "@/data/admin/teams";
3 | import { STATUSES } from "@/data/statuses";
4 | import Table from "./dashboard/dashboard";
5 | import { SearchParams } from "@/types/dashboard";
6 |
7 | type props = {
8 | searchParams: SearchParams;
9 | };
10 |
11 | const Teams = ({ searchParams }: props) => {
12 | return (
13 |
23 | );
24 | };
25 | export default Teams;
26 |
--------------------------------------------------------------------------------
/src/components/admin/dashboards/volunteers.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { TAGS, COLUMNS } from "@/data/admin/volunteers";
3 | import { STATUSES } from "@/data/statuses";
4 | import Table from "./dashboard/dashboard";
5 | import { SearchParams } from "@/types/dashboard";
6 |
7 | type props = {
8 | searchParams: SearchParams;
9 | };
10 |
11 | const Volunteers = ({ searchParams }: props) => {
12 | return (
13 |
23 | );
24 | };
25 | export default Volunteers;
26 |
--------------------------------------------------------------------------------
/src/components/admin/services/calendar/actions.ts:
--------------------------------------------------------------------------------
1 | import { LABELS, EventTypes } from "@/data/admin/calendar";
2 | import { api } from "@/utils/api";
3 | import { AuroraEvent } from "@/types/calendar";
4 | const min = new Date(
5 | new Date().getTime() - 20 * 7 * 24 * 60 * 60 * 1000,
6 | ).toISOString();
7 |
8 | const max = new Date(
9 | new Date().getTime() + 20 * 7 * 24 * 60 * 60 * 1000,
10 | ).toISOString();
11 |
12 | export const getEvents = async () => {
13 | const hackathonResponse = await api({
14 | method: "GET",
15 | url: `https://www.googleapis.com/calendar/v3/calendars/${process.env.NEXT_PUBLIC_GOOGLE_CALENDAR}/events?key=${process.env.NEXT_PUBLIC_GOOGLE_CALENDAR_API_KEY}&singleEvents=true&orderBy=startTime&timeMin=${min}&timeMax=${max}`,
16 | });
17 |
18 | const leadsResponse = await api({
19 | method: "GET",
20 | url: `https://www.googleapis.com/calendar/v3/calendars/${process.env.NEXT_PUBLIC_GOOGLE_CALENDAR_LEADS}/events?key=${process.env.NEXT_PUBLIC_GOOGLE_CALENDAR_API_KEY}&singleEvents=true&orderBy=startTime&timeMin=${min}&timeMax=${max}`,
21 | });
22 |
23 | const items = [...hackathonResponse.items, leadsResponse.items][0];
24 | items.forEach(
25 | (
26 | item: AuroraEvent & {
27 | start: { dateTime: string };
28 | end: { dateTime: string };
29 | },
30 | ) => {
31 | item.startDate = new Date(item.start.dateTime);
32 | item.endDate = new Date(item.end.dateTime);
33 | let category: EventTypes = "other";
34 | let assignee: string = "";
35 | if (item.description) {
36 | [category, assignee] = item.description
37 | .split("\n")[0]
38 | .split("#")
39 | .map((item: string) => item.trim())
40 | .filter((item: string) => item !== "") as [EventTypes, string];
41 | } else {
42 | item.description = "N/A";
43 | }
44 | if (category in LABELS) {
45 | item.color = LABELS[category].background;
46 | } else {
47 | category = "other";
48 | item.color = "!bg-hackathon-tags-gray-text";
49 | }
50 | item.category = category;
51 | item.assignee = assignee;
52 | item.hidden = false;
53 | },
54 | );
55 |
56 | return items;
57 | };
58 |
--------------------------------------------------------------------------------
/src/components/admin/services/calendar/event.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | interface EventProps {
4 | event: {
5 | startDate: Date;
6 | summary: string;
7 | };
8 | view: string;
9 | }
10 |
11 | const Event: React.FC = ({ event, view }) => {
12 | return (
13 |
14 |
15 | {view === "month" && (
16 | <>
17 | {new Date(event.startDate).toLocaleTimeString(navigator.language, {
18 | hour: "2-digit",
19 | minute: "2-digit",
20 | })}
21 | {" - "}
22 | >
23 | )}
24 | {event.summary}
25 |
26 |
27 | );
28 | };
29 |
30 | export default Event;
31 |
--------------------------------------------------------------------------------
/src/components/admin/services/calendar/index.tsx:
--------------------------------------------------------------------------------
1 | import { ReactQuery } from "@/utils/react-query";
2 | import { getEvents } from "./actions";
3 | import Calendar from "./calendar";
4 |
5 | const Index = () => {
6 | return (
7 |
8 |
9 |
10 | );
11 | };
12 |
13 | export default Index;
14 |
--------------------------------------------------------------------------------
/src/components/admin/services/calendar/modal.tsx:
--------------------------------------------------------------------------------
1 | import { X, MapPin, User } from "lucide-react";
2 | import { Badge } from "@/components/ui/badge";
3 | import { AuroraEvent } from "@/types/calendar";
4 |
5 | interface props {
6 | event: AuroraEvent | null;
7 | setEvent: (event: AuroraEvent | null) => void;
8 | }
9 |
10 | const Modal = ({ event, setEvent }: props) => {
11 | return (
12 | event && (
13 |
14 |
17 | {event.summary}
18 | setEvent(null)}
20 | className="text-xl text-white hover:cursor-pointer hover:!text-red-500"
21 | />
22 |
23 |
24 |
25 |
26 | {event.startDate.toLocaleString("default", {
27 | month: "long",
28 | weekday: "long",
29 | day: "2-digit",
30 | year: "numeric",
31 | })}
32 |
33 | {event.startDate.toLocaleString("default", {
34 | hour: "numeric",
35 | minute: "2-digit",
36 | })}
37 |
38 |
39 |
40 | {event.category}
41 |
42 |
43 |
44 |
45 | {event.location ? event.location : "No Location Specified"}
46 |
47 |
48 |
49 | {event.assignee}
50 |
51 |
{event.description.split("\n")[1]}
52 |
53 |
54 | )
55 | );
56 | };
57 |
58 | export default Modal;
59 |
--------------------------------------------------------------------------------
/src/components/admin/services/checkin/actions.ts:
--------------------------------------------------------------------------------
1 | import { api } from "@/utils/api";
2 |
3 | export const getEvents = async () => {
4 | const { items } = await api({
5 | method: "GET",
6 | url: `https://www.googleapis.com/calendar/v3/calendars/${process.env.NEXT_PUBLIC_GOOGLE_CALENDAR}/events?key=${process.env.NEXT_PUBLIC_GOOGLE_CALENDAR_API_KEY}&singleEvents=true&orderBy=startTime`,
7 | });
8 |
9 | return items;
10 | };
11 |
12 | export const getUser = async (user: string | null) => {
13 | const { items } = await api({
14 | method: "GET",
15 | url: `/api/checkin?uid=${user}`,
16 | });
17 |
18 | return items;
19 | };
20 |
--------------------------------------------------------------------------------
/src/components/admin/services/checkin/index.tsx:
--------------------------------------------------------------------------------
1 | import Checkin from "./checkIn";
2 | import { getEvents } from "./actions";
3 | import { ReactQuery } from "@/utils/react-query";
4 |
5 | const Index = async () => {
6 | return (
7 |
8 |
9 |
10 | );
11 | };
12 |
13 | export default Index;
14 |
--------------------------------------------------------------------------------
/src/components/admin/services/checkin/scanner.tsx:
--------------------------------------------------------------------------------
1 | import { useZxing } from "react-zxing";
2 |
3 | type Props = {
4 | setResult: (value: string) => void;
5 | };
6 |
7 | const ScanQRCode = ({ setResult }: Props) => {
8 | const { ref } = useZxing({
9 | onDecodeResult(result) {
10 | setResult(result.getText());
11 | },
12 | });
13 |
14 | return (
15 |