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
619 changes: 619 additions & 0 deletions src/app/(default)/organizer-application/page.tsx

Large diffs are not rendered by default.

9 changes: 8 additions & 1 deletion src/app/(protected)/extra-credit/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,14 @@ import {
import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge";
import { toast } from "sonner";
import { GraduationCap, Loader2, ArrowLeft, Check, Plus, X } from "lucide-react";
import {
GraduationCap,
Loader2,
ArrowLeft,
Check,
Plus,
X,
} from "lucide-react";

export default function ExtraCredit() {
const { user, isAuthenticated, isLoading: authLoading } = useFirebase();
Expand Down
4 changes: 3 additions & 1 deletion src/app/(protected)/profile/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,9 @@ export default function Profile() {

{helpDeskFlag?.isEnabled && (
<Button
onClick={() => window.open("https://qstack.hackpsu.org", "_blank")}
onClick={() =>
window.open("https://qstack.hackpsu.org", "_blank")
}
className="w-full"
variant="default"
size="lg"
Expand Down
195 changes: 144 additions & 51 deletions src/components/InfoSections.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -86,21 +86,52 @@ const InfoSections: React.FC = () => {
height: "clamp(80px, 30vw, 400px)",
}}
animate={
clicked1 ? {
rotate: [0, 360, 0], y: [-130, -30, -130], scale: [1, 0.9, 1],
transition: {
rotate: { duration: 1, ease: "easeInOut" }, // one-off spin
y: { duration: 5, repeat: Infinity, ease: "easeInOut", delay: 1 },
scale: { duration: 5, repeat: Infinity, ease: "easeInOut", delay: 1 },
}
} : {
rotate: [0, 15, 0], y: [-130, -30, -130], scale: [1, 0.9, 1],
transition: {
rotate : { duration: 5, repeat: Infinity, ease: "easeInOut", delay: 1 },
y: { duration: 5, repeat: Infinity, ease: "easeInOut", delay: 1 },
scale: { duration: 5, repeat: Infinity, ease: "easeInOut", delay: 1 },
}
}
clicked1
? {
rotate: [0, 360, 0],
y: [-130, -30, -130],
scale: [1, 0.9, 1],
transition: {
rotate: { duration: 1, ease: "easeInOut" }, // one-off spin
y: {
duration: 5,
repeat: Infinity,
ease: "easeInOut",
delay: 1,
},
scale: {
duration: 5,
repeat: Infinity,
ease: "easeInOut",
delay: 1,
},
},
}
: {
rotate: [0, 15, 0],
y: [-130, -30, -130],
scale: [1, 0.9, 1],
transition: {
rotate: {
duration: 5,
repeat: Infinity,
ease: "easeInOut",
delay: 1,
},
y: {
duration: 5,
repeat: Infinity,
ease: "easeInOut",
delay: 1,
},
scale: {
duration: 5,
repeat: Infinity,
ease: "easeInOut",
delay: 1,
},
},
}
}
transition={{
duration: 6,
Expand All @@ -109,8 +140,8 @@ const InfoSections: React.FC = () => {
delay: 0,
}}
onClick={() => {
setClicked1(true)
setTimeout(() => setClicked1(false), 1000)
setClicked1(true);
setTimeout(() => setClicked1(false), 1000);
}}
>
<Image
Expand All @@ -131,21 +162,52 @@ const InfoSections: React.FC = () => {
top: "clamp(0px, 1vw, 100px)",
}}
animate={
clicked2 ? {
rotate: [0, 360, 0], y: [0, -20, 0], scale: [1, 0.8, 1],
transition: {
rotate: { duration: 1, ease: "easeInOut" }, // one-off spin
y: { duration: 5, repeat: Infinity, ease: "easeInOut", delay: 1 },
scale: { duration: 5, repeat: Infinity, ease: "easeInOut", delay: 1 },
}
} : {
rotate: [0, 15, 0], y: [0, -20, 0], scale: [1, 0.8, 1],
transition: {
rotate : { duration: 5, repeat: Infinity, ease: "easeInOut", delay: 1 },
y: { duration: 5, repeat: Infinity, ease: "easeInOut", delay: 1 },
scale: { duration: 5, repeat: Infinity, ease: "easeInOut", delay: 1 },
}
}
clicked2
? {
rotate: [0, 360, 0],
y: [0, -20, 0],
scale: [1, 0.8, 1],
transition: {
rotate: { duration: 1, ease: "easeInOut" }, // one-off spin
y: {
duration: 5,
repeat: Infinity,
ease: "easeInOut",
delay: 1,
},
scale: {
duration: 5,
repeat: Infinity,
ease: "easeInOut",
delay: 1,
},
},
}
: {
rotate: [0, 15, 0],
y: [0, -20, 0],
scale: [1, 0.8, 1],
transition: {
rotate: {
duration: 5,
repeat: Infinity,
ease: "easeInOut",
delay: 1,
},
y: {
duration: 5,
repeat: Infinity,
ease: "easeInOut",
delay: 1,
},
scale: {
duration: 5,
repeat: Infinity,
ease: "easeInOut",
delay: 1,
},
},
}
}
transition={{
duration: 5,
Expand All @@ -154,8 +216,8 @@ const InfoSections: React.FC = () => {
delay: 1,
}}
onClick={() => {
setClicked2(true)
setTimeout(() => setClicked2(false), 1000)
setClicked2(true);
setTimeout(() => setClicked2(false), 1000);
}}
>
<Image
Expand All @@ -178,21 +240,52 @@ const InfoSections: React.FC = () => {
height: "clamp(80px, 30vw, 300px)",
}}
animate={
clicked3 ? {
rotate: [0, 360, 0], y: [0, -20, 0], scale: [1, 0.8, 1],
transition: {
rotate: { duration: 1, ease: "easeInOut" }, // one-off spin
y: { duration: 5, repeat: Infinity, ease: "easeInOut", delay: 1 },
scale: { duration: 5, repeat: Infinity, ease: "easeInOut", delay: 1 },
}
} : {
rotate: [0, 15, 0], y: [0, -20, 0], scale: [1, 0.8, 1],
transition: {
rotate : { duration: 5, repeat: Infinity, ease: "easeInOut", delay: 1 },
y: { duration: 5, repeat: Infinity, ease: "easeInOut", delay: 1 },
scale: { duration: 5, repeat: Infinity, ease: "easeInOut", delay: 1 },
}
}
clicked3
? {
rotate: [0, 360, 0],
y: [0, -20, 0],
scale: [1, 0.8, 1],
transition: {
rotate: { duration: 1, ease: "easeInOut" }, // one-off spin
y: {
duration: 5,
repeat: Infinity,
ease: "easeInOut",
delay: 1,
},
scale: {
duration: 5,
repeat: Infinity,
ease: "easeInOut",
delay: 1,
},
},
}
: {
rotate: [0, 15, 0],
y: [0, -20, 0],
scale: [1, 0.8, 1],
transition: {
rotate: {
duration: 5,
repeat: Infinity,
ease: "easeInOut",
delay: 1,
},
y: {
duration: 5,
repeat: Infinity,
ease: "easeInOut",
delay: 1,
},
scale: {
duration: 5,
repeat: Infinity,
ease: "easeInOut",
delay: 1,
},
},
}
}
transition={{
duration: 6.67,
Expand All @@ -201,8 +294,8 @@ const InfoSections: React.FC = () => {
delay: 3,
}}
onClick={() => {
setClicked3(true)
setTimeout(() => setClicked3(false), 1000)
setClicked3(true);
setTimeout(() => setClicked3(false), 1000);
}}
>
<Image
Expand Down
29 changes: 19 additions & 10 deletions src/components/Schedule/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ const eventTypeColors = {
bg: "bg-[#2b98a1]",
border: "border-[#2b98a1]",
text: "text-[#16A34A]",
label: "Food",
label: "General",
jellyfishAsset: "/f25/10.png",
},
[EventType.workshop]: {
Expand Down Expand Up @@ -570,11 +570,13 @@ const PreHackathonList: React.FC<{
}}
>
<div className="text-center bg-[#215172] rounded-xl p-3 -m-4 mb-2">
<h2 className="text-lg font-bold text-white">Pre-Hackathon Events</h2>
<div className="h-1 w-16 bg-white/80 rounded-full mt-1 mx-auto"></div>
<h2 className="text-lg font-bold text-white">Pre-Hackathon Events</h2>
<div className="h-1 w-16 bg-white/80 rounded-full mt-1 mx-auto"></div>
</div>
{events.length === 0 ? (
<p className="text-gray-500 text-sm text-center py-4">No pre-hackathon events at this time.</p>
<p className="text-gray-500 text-sm text-center py-4">
No pre-hackathon events at this time.
</p>
) : (
<ul className="flex flex-col gap-3">
{events
Expand Down Expand Up @@ -608,7 +610,9 @@ const PreHackathonList: React.FC<{
hour12: true,
})}
</div>
<div className="text-xs text-white/80 mt-1">{event.location}</div>
<div className="text-xs text-white/80 mt-1">
{event.location}
</div>
</li>
);
})}
Expand Down Expand Up @@ -790,8 +794,10 @@ const Schedule: React.FC = () => {

// Adds event to PreHackathon if begins before hackathon weekend
const isPreHackathon =
(startDayOfWeek !== 6 && startDayOfWeek !== 0) &&
(endDayOfWeek !== 6 && endDayOfWeek !== 0);
startDayOfWeek !== 6 &&
startDayOfWeek !== 0 &&
endDayOfWeek !== 6 &&
endDayOfWeek !== 0;

// Checks if event ends, or starts and ends, before Saturday
if (isPreHackathon) {
Expand Down Expand Up @@ -909,7 +915,7 @@ const Schedule: React.FC = () => {
const hasUpcomingPreEvents = useMemo(() => {
if (processedEvents.PreHackathon.length === 0) return false;
const now = new Date();
return processedEvents.PreHackathon.some(event => event.endTime > now);
return processedEvents.PreHackathon.some((event) => event.endTime > now);
}, [processedEvents.PreHackathon]);

// Calculate time range to show
Expand Down Expand Up @@ -1156,8 +1162,11 @@ const Schedule: React.FC = () => {
endTime: event.endTime,
day: "Saturday", // Not used for modal
duration: event.duration,
startMinutes: event.startTime.getHours() * 60 + event.startTime.getMinutes(),
endMinutes: event.endTime.getHours() * 60 + event.endTime.getMinutes(),
startMinutes:
event.startTime.getHours() * 60 +
event.startTime.getMinutes(),
endMinutes:
event.endTime.getHours() * 60 + event.endTime.getMinutes(),
column: 0,
});
setIsModalOpen(true);
Expand Down
57 changes: 57 additions & 0 deletions src/lib/api/organizer-application/entity.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
export enum YearStanding {
FRESHMAN = "Freshman",
SOPHOMORE = "Sophomore",
JUNIOR = "Junior",
SENIOR = "Senior",
OTHER = "Other",
}

export enum OrganizerTeam {
COMMUNICATIONS = "Communications",
DESIGN = "Design",
EDUCATION = "Education",
ENTERTAINMENT = "Entertainment",
FINANCE = "Finance",
LOGISTICS = "Logistics",
MARKETING = "Marketing",
SPONSORSHIP = "Sponsorship",
TECHNOLOGY = "Technology",
}

export enum ApplicationStatus {
PENDING = "pending",
ACCEPTED = "accepted",
REJECTED = "rejected",
}

export interface OrganizerApplicationEntity {
id: number;
name: string;
email: string;
yearStanding: YearStanding;
major: string;
firstChoiceTeam: OrganizerTeam;
secondChoiceTeam: OrganizerTeam;
resumeUrl: string;
whyHackpsu: string;
newIdea: string;
whatExcitesYou: string;
firstChoiceStatus: ApplicationStatus;
secondChoiceStatus: ApplicationStatus;
assignedTeam: OrganizerTeam | null;
createdAt: Date;
updatedAt: Date;
}

export interface OrganizerApplicationCreateEntity {
name: string;
email: string;
yearStanding: YearStanding;
major: string;
firstChoiceTeam: OrganizerTeam;
secondChoiceTeam: OrganizerTeam;
whyHackpsu: string;
newIdea: string;
whatExcitesYou: string;
resume: File;
}
Loading