diff --git a/.vscode/settings.json b/.vscode/settings.json index 44a73ec3a..80718c3fa 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,5 +3,15 @@ { "mode": "auto" } - ] + ], + "css.lint.unknownAtRules": "ignore", + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "tailwindCSS.experimental.configFile": { + "apps/blade/**": "apps/blade/tailwind.config.ts", + "apps/club/**": "apps/club/tailwind.config.ts", + "apps/guild/**": "apps/guild/tailwind.config.ts", + "apps/gemiknights/**": "apps/gemiknights/tailwind.config.ts", + "apps/2025/**": "apps/2025/tailwind.config.ts" + } } diff --git a/apps/2025/next.config.js b/apps/2025/next.config.js index 2b7b88d2d..b7d42f6da 100644 --- a/apps/2025/next.config.js +++ b/apps/2025/next.config.js @@ -13,7 +13,6 @@ const config = { transpilePackages: ["@forge/ui"], /** We already do linting and typechecking as separate tasks in CI */ - eslint: { ignoreDuringBuilds: true }, typescript: { ignoreBuildErrors: true }, /** Disable image optimization for static export */ diff --git a/apps/2025/package.json b/apps/2025/package.json index c5012b424..557721c4c 100644 --- a/apps/2025/package.json +++ b/apps/2025/package.json @@ -18,36 +18,35 @@ "dependencies": { "@forge/api": "workspace:*", "@forge/ui": "workspace:*", - "@t3-oss/env-nextjs": "^0.11.1", - "@tanstack/react-query": "^5.69.0", - "@trpc/client": "^11.0.0", - "@trpc/react-query": "^11.0.0", - "@trpc/server": "^11.0.0", - "framer-motion": "^12.0.1", - "minimatch": "^10.2.1", - "next": "^14.2.26", - "react": "catalog:react18", - "react-dom": "catalog:react18", + "@t3-oss/env-nextjs": "^0.13.10", + "@tanstack/react-query": "^5.90.21", + "@trpc/client": "^11.10.0", + "@trpc/react-query": "^11.10.0", + "@trpc/server": "^11.10.0", + "framer-motion": "^12.34.3", + "minimatch": "^10.2.4", + "next": "^16.0.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", "server-only": "^0.0.1", - "superjson": "2.2.1", + "superjson": "2.2.6", "tailwindcss-animate": "^1.0.7", "zod": "catalog:" }, "devDependencies": { - "@eslint/eslintrc": "^3.3.1", - "@tailwindcss/postcss": "^4.0.15", - "@types/minimatch": "^6.0.0", - "@types/node": "^20.16.11", - "@types/react": "catalog:react18", - "@types/react-dom": "catalog:react18", - "eslint": "^9.22.0", - "eslint-config-next": "^14.2.26", - "postcss": "^8.4.47", - "prettier": "^3.5.3", - "prettier-plugin-tailwindcss": "^0.6.8", - "tailwindcss": "^4.1.4", - "typescript": "~5.7.2", - "typescript-eslint": "^8.26.1" + "@eslint/eslintrc": "^3.3.4", + "@tailwindcss/postcss": "^4.2.1", + "@types/node": "^25.3.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "eslint": "catalog:", + "eslint-config-next": "^16.0.0", + "postcss": "^8.5.6", + "prettier": "^3.8.1", + "prettier-plugin-tailwindcss": "^0.7.2", + "tailwindcss": "catalog:", + "typescript": "^5.9.3", + "typescript-eslint": "^8.56.1" }, "ct3aMetadata": { "initVersion": "7.39.3" diff --git a/apps/2025/src/app/_components/navbar/FloatingNav.tsx b/apps/2025/src/app/_components/navbar/FloatingNav.tsx index 4e9d2d93c..67ad45821 100644 --- a/apps/2025/src/app/_components/navbar/FloatingNav.tsx +++ b/apps/2025/src/app/_components/navbar/FloatingNav.tsx @@ -258,7 +258,7 @@ function FloatingNav({ navLinks }: FloatingNavProps) { ref={skipLinkRef} href="#main-content" tabIndex={1} - className="sr-only fixed top-0 left-0 z-[10000] rounded-none bg-[#d83434] px-4 py-2 text-white focus:not-sr-only focus:absolute focus:top-4 focus:left-4" + className="sr-only fixed top-0 left-0 z-10000 rounded-none bg-[#d83434] px-4 py-2 text-white focus:not-sr-only focus:absolute focus:top-4 focus:left-4" > Skip to main content @@ -271,7 +271,7 @@ function FloatingNav({ navLinks }: FloatingNavProps) { opacity: isNavVisible || isAtTop ? 1 : 0, }} transition={{ duration: 0.3, ease: "easeOut" }} - className="fixed top-4 left-1/2 z-[9999] hidden w-auto -translate-x-1/2 md:block" + className="fixed top-4 left-1/2 z-9999 hidden w-auto -translate-x-1/2 md:block" role="navigation" aria-label="Main navigation" style={{ @@ -319,7 +319,7 @@ function FloatingNav({ navLinks }: FloatingNavProps) { handleDesktopNavClick(link.href); } }} - className={`tk-ccmeanwhile relative flex min-h-[48px] cursor-pointer items-center justify-center rounded-none px-3 py-3 text-base font-bold outline-1 -outline-offset-1 outline-black transition-all duration-200 focus:outline-4 focus:outline-offset-2 focus:outline-[#d83434] md:px-4 xl:text-lg ${ + className={`tk-ccmeanwhile relative flex min-h-12 cursor-pointer items-center justify-center rounded-none px-3 py-3 text-base font-bold outline-1 -outline-offset-1 outline-black transition-all duration-200 focus:outline-4 focus:outline-offset-2 focus:outline-[#d83434] md:px-4 xl:text-lg ${ isActive ? "text-white shadow-lg" : "text-slate-800 hover:text-white" @@ -371,7 +371,7 @@ function FloatingNav({ navLinks }: FloatingNavProps) { opacity: isNavVisible || isAtTop ? 1 : 0, }} transition={{ duration: 0.3, ease: "easeOut" }} - className="mobile-nav-container fixed top-4 left-4 z-[9999] touch-manipulation md:hidden" + className="mobile-nav-container fixed top-4 left-4 z-9999 touch-manipulation md:hidden" role="navigation" aria-label="Mobile navigation" style={{ @@ -430,7 +430,7 @@ function FloatingNav({ navLinks }: FloatingNavProps) { animate={{ opacity: 1, y: 0, scale: 1 }} exit={{ opacity: 0, y: -20, scale: 0.95 }} transition={{ duration: 0.2 }} - className="mobile-nav-container absolute top-full left-0 z-[9999] mt-2 touch-manipulation" + className="mobile-nav-container absolute top-full left-0 z-9999 mt-2 touch-manipulation" style={{ WebkitTapHighlightColor: "transparent", maxHeight: "calc(100vh - 100px)", @@ -443,7 +443,7 @@ function FloatingNav({ navLinks }: FloatingNavProps) {
{/* Mobile menu with TextBox styling */}
-
+
{navLinks.map((link, index) => { const isActive = !isAtTop && activeSection === link.href.substring(1); @@ -463,7 +463,7 @@ function FloatingNav({ navLinks }: FloatingNavProps) { handleMobileNavClick(link.href); } }} - className={`tk-ccmeanwhile flex min-h-[48px] w-full cursor-pointer items-center rounded-none px-4 py-3 text-left text-base font-bold outline-1 -outline-offset-1 outline-black transition-all duration-200 focus:outline-4 focus:outline-offset-2 focus:outline-[#d83434] ${ + className={`tk-ccmeanwhile flex min-h-12 w-full cursor-pointer items-center rounded-none px-4 py-3 text-left text-base font-bold outline-1 -outline-offset-1 outline-black transition-all duration-200 focus:outline-4 focus:outline-offset-2 focus:outline-[#d83434] ${ isActive ? "text-white shadow-md" : "text-slate-800 hover:text-white" diff --git a/apps/2025/src/app/_components/navbar/Navbar.tsx b/apps/2025/src/app/_components/navbar/Navbar.tsx index 2766dbe03..596b5376b 100644 --- a/apps/2025/src/app/_components/navbar/Navbar.tsx +++ b/apps/2025/src/app/_components/navbar/Navbar.tsx @@ -14,23 +14,21 @@ const NAV_LINKS = [ const Navbar = () => { const [showFloating, setShowFloating] = useState(false); - const [mounted, setMounted] = useState(false); useEffect(() => { - setMounted(true); - const handleScroll = () => { // Show navbar when scrolling, hide when at top const shouldShow = window.scrollY > 50; setShowFloating(shouldShow); }; + // set initial value without a dedicated mounted state + handleScroll(); + window.addEventListener("scroll", handleScroll, { passive: true }); return () => window.removeEventListener("scroll", handleScroll); }, []); - if (!mounted) return null; - return ( <> diff --git a/apps/2025/src/app/_components/partners/partnerPosters.tsx b/apps/2025/src/app/_components/partners/partnerPosters.tsx index 787426b90..609d53c79 100644 --- a/apps/2025/src/app/_components/partners/partnerPosters.tsx +++ b/apps/2025/src/app/_components/partners/partnerPosters.tsx @@ -112,33 +112,32 @@ export default function PartnerPosters() { key={idx} className={`${partner.mobilePosition} ${partner.gridPosition} stagger-item`} > - - - {/* Main card */} -
- {/* subtle dot pattern */} -
+ + {/* Main card */} +
+ {/* subtle dot pattern */} +
- {/* logo container */} -
- {partner.alt} -
+ {/* logo container */} +
+ {partner.alt}
+
- {/* Black drop shadow */} -
- + {/* Black drop shadow */} +
))} diff --git a/apps/2025/src/app/_components/sponsors/sponsorPosters.tsx b/apps/2025/src/app/_components/sponsors/sponsorPosters.tsx index 10c882385..1d8f7e02c 100644 --- a/apps/2025/src/app/_components/sponsors/sponsorPosters.tsx +++ b/apps/2025/src/app/_components/sponsors/sponsorPosters.tsx @@ -246,69 +246,62 @@ export default function SponsorPosters() { > - - {/* Main card */} -
- {/* subtle dot pattern */} -
+ {/* subtle dot pattern */} +
- {/* logo container */} -
- {sponsor.alt === "GOOGLE" ? ( - <> - {sponsor.alt} - {sponsor.alt} - - ) : ( + {/* logo container */} +
+ {sponsor.alt === "GOOGLE" ? ( + <> {sponsor.alt} - )} -
+ {sponsor.alt} + + ) : ( + {sponsor.alt} + )}
+
- {/* Black drop shadow */} -
- + {/* Black drop shadow */} +
); diff --git a/apps/2025/src/app/layout.tsx b/apps/2025/src/app/layout.tsx index d4fc8a56e..a49588318 100644 --- a/apps/2025/src/app/layout.tsx +++ b/apps/2025/src/app/layout.tsx @@ -33,7 +33,6 @@ export const metadata: Metadata = { }, ], }, - themeColor: "#c84c3c", }; export const viewport: Viewport = { diff --git a/apps/blade/next.config.js b/apps/blade/next.config.js index 7cfb9f68a..b4f30a97f 100644 --- a/apps/blade/next.config.js +++ b/apps/blade/next.config.js @@ -18,7 +18,6 @@ const config = { ], /** We already do linting and typechecking as separate tasks in CI */ - eslint: { ignoreDuringBuilds: true }, typescript: { ignoreBuildErrors: true }, images: { diff --git a/apps/blade/package.json b/apps/blade/package.json index 0b9eec8ea..4ead26acd 100644 --- a/apps/blade/package.json +++ b/apps/blade/package.json @@ -15,8 +15,8 @@ "with-env": "dotenv -e ../../.env --" }, "dependencies": { - "@aws-sdk/client-s3": "^3.717.0", - "@aws-sdk/s3-request-presigner": "^3.717.0", + "@aws-sdk/client-s3": "^3.999.0", + "@aws-sdk/s3-request-presigner": "^3.999.0", "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", @@ -27,33 +27,33 @@ "@forge/email": "workspace:^", "@forge/ui": "workspace:*", "@forge/validators": "workspace:*", - "@react-email/render": "1.1.0", - "@stripe/react-stripe-js": "^3.0.0", - "@stripe/stripe-js": "^5.2.0", - "@t3-oss/env-nextjs": "^0.11.1", + "@react-email/render": "^2.0.0", + "@stripe/react-stripe-js": "^5.6.0", + "@stripe/stripe-js": "^8.8.0", + "@t3-oss/env-nextjs": "^0.13.10", "@tanstack/react-query": "catalog:", - "@tanstack/react-table": "^8.20.6", + "@tanstack/react-table": "^8.21.3", "@trpc/client": "catalog:", "@trpc/react-query": "catalog:", "@trpc/server": "catalog:", - "canvas-confetti": "^1.9.3", + "canvas-confetti": "^1.9.4", "csv-parse": "^6.1.0", "csv-stringify": "^6.6.0", - "geist": "^1.3.1", - "google-auth-library": "^9.15.0", - "googleapis": "^144.0.0", - "lucide-react": "^0.469.0", - "minio": "^8.0.3", - "next": "^14.2.26", - "next-themes": "^0.3.0", - "react": "catalog:react18", - "react-dom": "catalog:react18", - "react-icons": "^5.4.0", - "react-markdown": "^9.0.3", + "geist": "^1.7.0", + "google-auth-library": "^10.6.1", + "googleapis": "^171.4.0", + "lucide-react": "^0.575.0", + "minio": "^8.0.6", + "next": "^16.0.0", + "next-themes": "^0.4.6", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-icons": "^5.5.0", + "react-markdown": "^10.1.0", "react-qr-code": "^2.0.18", "react-qr-reader": "3.0.0-beta-1", - "recharts": "^2.15.1", - "superjson": "2.2.1", + "recharts": "^3.7.0", + "superjson": "2.2.6", "zod": "catalog:" }, "devDependencies": { @@ -61,13 +61,14 @@ "@forge/prettier-config": "workspace:*", "@forge/tailwind-config": "workspace:*", "@forge/tsconfig": "workspace:*", + "@tailwindcss/postcss": "^4.2.1", "@types/canvas-confetti": "^1.9.0", - "@types/node": "^20.16.11", - "@types/react": "catalog:react18", - "@types/react-dom": "catalog:react18", - "dotenv-cli": "^7.4.2", + "@types/node": "^25.3.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "dotenv-cli": "^11.0.0", "eslint": "catalog:", - "jiti": "^2.3.3", + "jiti": "^2.6.1", "prettier": "catalog:", "tailwindcss": "catalog:", "typescript": "catalog:" diff --git a/apps/blade/postcss.config.cjs b/apps/blade/postcss.config.cjs index ee5f90b30..483f37854 100644 --- a/apps/blade/postcss.config.cjs +++ b/apps/blade/postcss.config.cjs @@ -1,5 +1,5 @@ module.exports = { plugins: { - tailwindcss: {}, + "@tailwindcss/postcss": {}, }, }; diff --git a/apps/blade/src/app/_components/admin/charts/FirstTimeHackersPie.tsx b/apps/blade/src/app/_components/admin/charts/FirstTimeHackersPie.tsx index bfdd73929..b8c07f73d 100644 --- a/apps/blade/src/app/_components/admin/charts/FirstTimeHackersPie.tsx +++ b/apps/blade/src/app/_components/admin/charts/FirstTimeHackersPie.tsx @@ -145,7 +145,7 @@ export default function FirstTimeHackersPie({ people }: { people: Person[] }) { diff --git a/apps/blade/src/app/_components/admin/charts/GenderPie.tsx b/apps/blade/src/app/_components/admin/charts/GenderPie.tsx index ef18aeca1..942de7f8f 100644 --- a/apps/blade/src/app/_components/admin/charts/GenderPie.tsx +++ b/apps/blade/src/app/_components/admin/charts/GenderPie.tsx @@ -133,7 +133,7 @@ export default function GenderPie({ people }: { people: Person[] }) { diff --git a/apps/blade/src/app/_components/admin/charts/MajorBarChart.tsx b/apps/blade/src/app/_components/admin/charts/MajorBarChart.tsx index 19031fbcf..715d00d46 100644 --- a/apps/blade/src/app/_components/admin/charts/MajorBarChart.tsx +++ b/apps/blade/src/app/_components/admin/charts/MajorBarChart.tsx @@ -78,7 +78,9 @@ export default function MajorBarChart({ people }: { people: Person[] }) { { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, @typescript-eslint/no-unsafe-member-access if (active && payload?.[0]?.payload) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access const data = payload[0].payload as { fullMajor: string; people: number; diff --git a/apps/blade/src/app/_components/admin/charts/RaceOrEthnicityPie.tsx b/apps/blade/src/app/_components/admin/charts/RaceOrEthnicityPie.tsx index d07657bc1..9fd4986f4 100644 --- a/apps/blade/src/app/_components/admin/charts/RaceOrEthnicityPie.tsx +++ b/apps/blade/src/app/_components/admin/charts/RaceOrEthnicityPie.tsx @@ -152,7 +152,7 @@ export default function RaceOrEthnicityPie({ people }: { people: Person[] }) { diff --git a/apps/blade/src/app/_components/admin/charts/SchoolBarChart.tsx b/apps/blade/src/app/_components/admin/charts/SchoolBarChart.tsx index 2ff31a0d8..2382dfb21 100644 --- a/apps/blade/src/app/_components/admin/charts/SchoolBarChart.tsx +++ b/apps/blade/src/app/_components/admin/charts/SchoolBarChart.tsx @@ -78,7 +78,9 @@ export default function SchoolBarChart({ people }: { people: Person[] }) { { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, @typescript-eslint/no-unsafe-member-access if (active && payload?.[0]?.payload) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access const data = payload[0].payload as { fullSchool: string; people: number; diff --git a/apps/blade/src/app/_components/admin/charts/SchoolYearPie.tsx b/apps/blade/src/app/_components/admin/charts/SchoolYearPie.tsx index 3cb2e2166..055d219a8 100644 --- a/apps/blade/src/app/_components/admin/charts/SchoolYearPie.tsx +++ b/apps/blade/src/app/_components/admin/charts/SchoolYearPie.tsx @@ -153,7 +153,7 @@ export default function SchoolYearPie({ people }: { people: Person[] }) { diff --git a/apps/blade/src/app/_components/admin/club/data/event-data/AttendancesBarChart.tsx b/apps/blade/src/app/_components/admin/club/data/event-data/AttendancesBarChart.tsx index 36416ce79..fe174c8a9 100644 --- a/apps/blade/src/app/_components/admin/club/data/event-data/AttendancesBarChart.tsx +++ b/apps/blade/src/app/_components/admin/club/data/event-data/AttendancesBarChart.tsx @@ -103,7 +103,6 @@ export default function AttendancesBarChart({ diff --git a/apps/blade/src/app/_components/admin/club/data/event-data/HowFound.tsx b/apps/blade/src/app/_components/admin/club/data/event-data/HowFound.tsx index c6bf08c24..bf1514b13 100644 --- a/apps/blade/src/app/_components/admin/club/data/event-data/HowFound.tsx +++ b/apps/blade/src/app/_components/admin/club/data/event-data/HowFound.tsx @@ -122,7 +122,7 @@ export default function FoundPie({ found }: { found: string[] }) { diff --git a/apps/blade/src/app/_components/admin/club/data/event-data/TypePie.tsx b/apps/blade/src/app/_components/admin/club/data/event-data/TypePie.tsx index ab7bf1a06..12ea68774 100644 --- a/apps/blade/src/app/_components/admin/club/data/event-data/TypePie.tsx +++ b/apps/blade/src/app/_components/admin/club/data/event-data/TypePie.tsx @@ -125,7 +125,7 @@ export default function TypePie({ events }: { events: ReturnEvent[] }) { diff --git a/apps/blade/src/app/_components/admin/club/data/member-data/GenderPie.tsx b/apps/blade/src/app/_components/admin/club/data/member-data/GenderPie.tsx index 36cfe2675..f4dcc2850 100644 --- a/apps/blade/src/app/_components/admin/club/data/member-data/GenderPie.tsx +++ b/apps/blade/src/app/_components/admin/club/data/member-data/GenderPie.tsx @@ -134,7 +134,7 @@ export default function SchoolYearPie({ diff --git a/apps/blade/src/app/_components/admin/club/data/member-data/SchoolBarChart.tsx b/apps/blade/src/app/_components/admin/club/data/member-data/SchoolBarChart.tsx index 262065d0d..3e0542f7f 100644 --- a/apps/blade/src/app/_components/admin/club/data/member-data/SchoolBarChart.tsx +++ b/apps/blade/src/app/_components/admin/club/data/member-data/SchoolBarChart.tsx @@ -78,7 +78,9 @@ export default function SchoolBarChart({ members }: { members: Member[] }) { { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, @typescript-eslint/no-unsafe-member-access if (active && payload?.[0]?.payload) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access const data = payload[0].payload as { fullSchool: string; members: number; diff --git a/apps/blade/src/app/_components/admin/club/data/member-data/ShirtSizePie.tsx b/apps/blade/src/app/_components/admin/club/data/member-data/ShirtSizePie.tsx index dfbf82f53..4b2062dfc 100644 --- a/apps/blade/src/app/_components/admin/club/data/member-data/ShirtSizePie.tsx +++ b/apps/blade/src/app/_components/admin/club/data/member-data/ShirtSizePie.tsx @@ -138,7 +138,7 @@ export default function ShirtSizePie({ members }: { members: Member[] }) { diff --git a/apps/blade/src/app/_components/admin/club/data/member-data/YearOfStudyPie.tsx b/apps/blade/src/app/_components/admin/club/data/member-data/YearOfStudyPie.tsx index cbfa47939..c67f7f756 100644 --- a/apps/blade/src/app/_components/admin/club/data/member-data/YearOfStudyPie.tsx +++ b/apps/blade/src/app/_components/admin/club/data/member-data/YearOfStudyPie.tsx @@ -200,7 +200,7 @@ export default function YearOfStudyPie({ members }: YearOfStudyPieProps) { diff --git a/apps/blade/src/app/_components/admin/club/members/update-member.tsx b/apps/blade/src/app/_components/admin/club/members/update-member.tsx index c995ac524..d00ee5859 100644 --- a/apps/blade/src/app/_components/admin/club/members/update-member.tsx +++ b/apps/blade/src/app/_components/admin/club/members/update-member.tsx @@ -79,12 +79,13 @@ export default function UpdateMemberButton({ }); const form = useForm({ + // @ts-expect-error -- schema uses .transform() so input≠output; ZodType in useForm can't represent this schema: UpdateMemberSchema, defaultValues: { firstName: member.firstName || "", lastName: member.lastName || "", email: member.email || "", - points: (member.points ?? 0).toString(), + points: member.points ?? 0, phoneNumber: member.phoneNumber || "", dob: member.dob || "", gender: member.gender, @@ -311,7 +312,7 @@ export default function UpdateMemberButton({ defaultValue={field.value} > - + diff --git a/apps/blade/src/app/_components/admin/forms/editor/client.tsx b/apps/blade/src/app/_components/admin/forms/editor/client.tsx index f87972a1b..8498cfa73 100644 --- a/apps/blade/src/app/_components/admin/forms/editor/client.tsx +++ b/apps/blade/src/app/_components/admin/forms/editor/client.tsx @@ -278,6 +278,7 @@ export function EditorClient({ if (!isFetching) { if (fetchError || !formData) { if (slug === "test-form") { + // eslint-disable-next-line react-hooks/set-state-in-effect setFormTitle("Test Form (Mock)"); setFormDescription( "This is a mock form description for testing UI components.", diff --git a/apps/blade/src/app/_components/admin/forms/homepage.tsx b/apps/blade/src/app/_components/admin/forms/homepage.tsx index c70ac359b..b6837f75f 100644 --- a/apps/blade/src/app/_components/admin/forms/homepage.tsx +++ b/apps/blade/src/app/_components/admin/forms/homepage.tsx @@ -21,6 +21,7 @@ export default function FormsClient() { if (sections.length > 0 && !sections.includes(activeSection)) { const firstSection = sections[0]; if (firstSection) { + // eslint-disable-next-line react-hooks/set-state-in-effect setActiveSection(firstSection); } } diff --git a/apps/blade/src/app/_components/admin/forms/responses/FileUploadResponsesTable.tsx b/apps/blade/src/app/_components/admin/forms/responses/FileUploadResponsesTable.tsx index cb10f7fd6..45180a1bb 100644 --- a/apps/blade/src/app/_components/admin/forms/responses/FileUploadResponsesTable.tsx +++ b/apps/blade/src/app/_components/admin/forms/responses/FileUploadResponsesTable.tsx @@ -66,7 +66,7 @@ export function FileUploadResponsesTable({

-
+
diff --git a/apps/blade/src/app/_components/admin/forms/responses/ResponseHorizontalBarChart.tsx b/apps/blade/src/app/_components/admin/forms/responses/ResponseHorizontalBarChart.tsx index 10d7be57f..1a6f1a5e9 100644 --- a/apps/blade/src/app/_components/admin/forms/responses/ResponseHorizontalBarChart.tsx +++ b/apps/blade/src/app/_components/admin/forms/responses/ResponseHorizontalBarChart.tsx @@ -99,7 +99,7 @@ export function ResponseHorizontalBarChart({ {/* center the chart horizontally and make scrollable */} {/* Mobile view - compact horizontal bar chart */} -
+
{/* Desktop view - original horizontal bar chart */} -
+
{/* allow horizontal scrolling if table is too wide */} -
+
diff --git a/apps/blade/src/app/_components/admin/hackathon/check-in/manual-entry-form.tsx b/apps/blade/src/app/_components/admin/hackathon/check-in/manual-entry-form.tsx index 1855b0351..27d8d1442 100644 --- a/apps/blade/src/app/_components/admin/hackathon/check-in/manual-entry-form.tsx +++ b/apps/blade/src/app/_components/admin/hackathon/check-in/manual-entry-form.tsx @@ -68,6 +68,7 @@ export function ManualEntryForm() { new Date(a.startDate).getTime() - new Date(b.startDate).getTime(), )[0]; + // eslint-disable-next-line react-hooks/set-state-in-effect setActiveHackathon(closestHackathon ?? hackathons[0] ?? null); } }, [hackathons, activeHackathon]); diff --git a/apps/blade/src/app/_components/admin/hackathon/data/HackathonDataContent.tsx b/apps/blade/src/app/_components/admin/hackathon/data/HackathonDataContent.tsx index 876c641bf..109c1b8d9 100644 --- a/apps/blade/src/app/_components/admin/hackathon/data/HackathonDataContent.tsx +++ b/apps/blade/src/app/_components/admin/hackathon/data/HackathonDataContent.tsx @@ -26,6 +26,7 @@ export default function HackathonDataContent() { (a, b) => new Date(b.startDate).getTime() - new Date(a.startDate).getTime(), ); + // eslint-disable-next-line react-hooks/set-state-in-effect setActiveHackathon(sortedHackathons[0] ?? null); } }, [hackathons, activeHackathon]); diff --git a/apps/blade/src/app/_components/admin/hackathon/data/LevelOfStudyPie.tsx b/apps/blade/src/app/_components/admin/hackathon/data/LevelOfStudyPie.tsx index de3054feb..6b7ee6e7f 100644 --- a/apps/blade/src/app/_components/admin/hackathon/data/LevelOfStudyPie.tsx +++ b/apps/blade/src/app/_components/admin/hackathon/data/LevelOfStudyPie.tsx @@ -176,7 +176,7 @@ export default function LevelOfStudyPie({ diff --git a/apps/blade/src/app/_components/admin/hackathon/data/ShirtSizePie.tsx b/apps/blade/src/app/_components/admin/hackathon/data/ShirtSizePie.tsx index aa1991b8f..71abb39d4 100644 --- a/apps/blade/src/app/_components/admin/hackathon/data/ShirtSizePie.tsx +++ b/apps/blade/src/app/_components/admin/hackathon/data/ShirtSizePie.tsx @@ -138,7 +138,7 @@ export default function ShirtSizePie({ hackers }: { hackers: Hacker[] }) { diff --git a/apps/blade/src/app/_components/admin/hackathon/hackers/food-restrictions.tsx b/apps/blade/src/app/_components/admin/hackathon/hackers/food-restrictions.tsx index 27d0906e6..9c9a6419e 100644 --- a/apps/blade/src/app/_components/admin/hackathon/hackers/food-restrictions.tsx +++ b/apps/blade/src/app/_components/admin/hackathon/hackers/food-restrictions.tsx @@ -21,6 +21,7 @@ export default function FoodRestrictionsButton({ const [foodString, setFoodString] = useState(""); useEffect(() => { + // eslint-disable-next-line react-hooks/set-state-in-effect setFoodString(hacker.foodAllergies?.replace(/,/g, ", ") || ""); }, [hacker.foodAllergies]); diff --git a/apps/blade/src/app/_components/admin/hackathon/hackers/hackers-table.tsx b/apps/blade/src/app/_components/admin/hackathon/hackers/hackers-table.tsx index 02ac80aec..ffb360f16 100644 --- a/apps/blade/src/app/_components/admin/hackathon/hackers/hackers-table.tsx +++ b/apps/blade/src/app/_components/admin/hackathon/hackers/hackers-table.tsx @@ -216,6 +216,7 @@ export default function HackerTable({ new Date(a.startDate).getTime() - new Date(b.startDate).getTime(), )[0]; + // eslint-disable-next-line react-hooks/set-state-in-effect setActiveHackathon(closestHackathon ?? hackathons[0] ?? null); } }, [hackathons, activeHackathon]); diff --git a/apps/blade/src/app/_components/admin/hackathon/hackers/update-hacker.tsx b/apps/blade/src/app/_components/admin/hackathon/hackers/update-hacker.tsx index 7bd94a047..72c76e65e 100644 --- a/apps/blade/src/app/_components/admin/hackathon/hackers/update-hacker.tsx +++ b/apps/blade/src/app/_components/admin/hackathon/hackers/update-hacker.tsx @@ -303,7 +303,7 @@ export default function UpdateHackerButton({ defaultValue={field.value} > - + diff --git a/apps/blade/src/app/_components/admin/roles/roleedit.tsx b/apps/blade/src/app/_components/admin/roles/roleedit.tsx index ca26209fc..bcbe0ab22 100644 --- a/apps/blade/src/app/_components/admin/roles/roleedit.tsx +++ b/apps/blade/src/app/_components/admin/roles/roleedit.tsx @@ -91,11 +91,13 @@ export default function RoleEdit({ }, []); useEffect(() => { + // eslint-disable-next-line react-hooks/set-state-in-effect updateString(form.getValues()); }, [form, updateString]); useEffect(() => { if (roles) + // eslint-disable-next-line react-hooks/set-state-in-effect setIsDupeID( oldRole ? false @@ -113,6 +115,7 @@ export default function RoleEdit({ useEffect(() => { if (roles) + // eslint-disable-next-line react-hooks/set-state-in-effect setIsDupeName( oldRole?.name == name ? false diff --git a/apps/blade/src/app/_components/dashboard/hackathon-dashboard/hackathon-data.tsx b/apps/blade/src/app/_components/dashboard/hackathon-dashboard/hackathon-data.tsx index fc69ae4b6..0b3c9f1a6 100644 --- a/apps/blade/src/app/_components/dashboard/hackathon-dashboard/hackathon-data.tsx +++ b/apps/blade/src/app/_components/dashboard/hackathon-dashboard/hackathon-data.tsx @@ -59,6 +59,7 @@ export function HackathonData({ } useEffect(() => { + // eslint-disable-next-line react-hooks/set-state-in-effect setHackerStatus(getStatusName(hacker?.status)); setHackerStatusColor(getStatusColor(hacker?.status)); }, [hacker]); diff --git a/apps/blade/src/app/_components/dashboard/hackathon-dashboard/point-leaderboard.tsx b/apps/blade/src/app/_components/dashboard/hackathon-dashboard/point-leaderboard.tsx index 0e95103f5..5ae5a4a51 100644 --- a/apps/blade/src/app/_components/dashboard/hackathon-dashboard/point-leaderboard.tsx +++ b/apps/blade/src/app/_components/dashboard/hackathon-dashboard/point-leaderboard.tsx @@ -86,6 +86,7 @@ export function PointLeaderboard({ ); }, [activeTop, hacker?.id, data?.place, activeInd]); + // eslint-disable-next-line react-hooks/purity return targetDate <= Date.now() && !isAdmin ? ( <>

diff --git a/apps/blade/src/app/_components/dashboard/hackathon-dashboard/upcoming-events.tsx b/apps/blade/src/app/_components/dashboard/hackathon-dashboard/upcoming-events.tsx index 01e9edd26..5bcc0a3d8 100644 --- a/apps/blade/src/app/_components/dashboard/hackathon-dashboard/upcoming-events.tsx +++ b/apps/blade/src/app/_components/dashboard/hackathon-dashboard/upcoming-events.tsx @@ -16,6 +16,7 @@ import { api } from "~/trpc/server"; export default async function UpcomingEvents() { const events = await api.event.getEvents(); + // eslint-disable-next-line react-hooks/purity const now = Date.now(); const fiveHoursLater = now + 5 * 60 * 60 * 1000; diff --git a/apps/blade/src/app/_components/dashboard/hacker-dashboard/hacker-data.tsx b/apps/blade/src/app/_components/dashboard/hacker-dashboard/hacker-data.tsx index 7b29f1002..6b3425f74 100644 --- a/apps/blade/src/app/_components/dashboard/hacker-dashboard/hacker-data.tsx +++ b/apps/blade/src/app/_components/dashboard/hacker-dashboard/hacker-data.tsx @@ -136,6 +136,7 @@ export function HackerData({ }); useEffect(() => { + // eslint-disable-next-line react-hooks/set-state-in-effect setHackerStatus(getStatusName(hacker?.status)); setHackerStatusColor(getStatusColor(hacker?.status)); }, [hacker]); diff --git a/apps/blade/src/app/_components/dashboard/hacker/hacker-application-form.tsx b/apps/blade/src/app/_components/dashboard/hacker/hacker-application-form.tsx index 66593c897..5a41eb1d4 100644 --- a/apps/blade/src/app/_components/dashboard/hacker/hacker-application-form.tsx +++ b/apps/blade/src/app/_components/dashboard/hacker/hacker-application-form.tsx @@ -201,7 +201,7 @@ export function HackerFormPage({ if (fileList[0].size > MINIO.MAX_RESUME_SIZE) { ctx.addIssue({ code: z.ZodIssueCode.too_big, - type: "number", + origin: "number", maximum: MINIO.MAX_RESUME_SIZE, inclusive: true, exact: false, @@ -286,6 +286,7 @@ export function HackerFormPage({ // Set selected allergies for the UI if (previousHacker.foodAllergies) { const allergies = previousHacker.foodAllergies.split(","); + // eslint-disable-next-line react-hooks/set-state-in-effect setSelectedAllergies(allergies); } @@ -845,7 +846,7 @@ export function HackerFormPage({