diff --git a/.env.example b/.env.example index dadd6616..7478295f 100644 --- a/.env.example +++ b/.env.example @@ -12,6 +12,7 @@ DATABASE_URL="mysql://root:root@localhost/track-the-hack" # NEXTAUTH_SECRET= NEXTAUTH_URL=http://localhost:3000 + # Next Auth Google Provider GOOGLE_CLIENT_ID= GOOGLE_CLIENT_SECRET= @@ -49,3 +50,6 @@ QR_SECRET_KEY= # Walk-Ins WALK_IN_SECRET_KEY= + +# Open date for applications +NEXT_PUBLIC_APPLICATIONS_OPEN_AT=2025-6-24T00:00:00Z diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index fb8610de..2f0bf866 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -20,7 +20,7 @@ jobs: cache: "npm" - name: Install dependencies - run: npm ci --prefer-offline --no-audit + run: npm ci - name: Create .env file run: node ./.github/workflows/create-env.mjs "$SECRETS" "$VARS" @@ -32,7 +32,7 @@ jobs: run: npm run build - name: Deploy to production directory - run: rsync -avz --delete --exclude='.git' ./ /home/azure/track-the-hack/ + run: rsync -avz --delete ./ /home/azure/track-the-hack/ - name: Update the database schema working-directory: /home/azure/track-the-hack diff --git a/README.md b/README.md index 306f29a5..9de20858 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,8 @@ Track the Hack is a comprehensive event management solution designed to streamli ## Self-host the database 1. Install [Docker](https://docs.docker.com/get-docker/). -2. Run `docker compose up -d` to start the database. -3. Run `npx prisma db push` to push the database schema and create the tables. +2. Run `npx prisma db push` to push the database schema and create the tables. +3. Run `docker compose up -d` to start the database. 4. Run `npx prisma db seed` to seed the database. ## Contributing @@ -25,6 +25,6 @@ If you're part of the Hack the Hill team, refer to our [Contribution guidelines] ## Contact -For inquiries, please contact us at [development@ctn-rtc.org](mailto:development@ctn-rtc.org). +For inquiries, please contact us at [development@hackthehill.com](mailto:development@hackthehill.com). Copyright © 2023 Hack the Hill. All Rights Reserved. diff --git a/package-lock.json b/package-lock.json index b319b655..f85c1df1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,8 +23,8 @@ "i18next": "^23.7.11", "micro": "^10.0.1", "mimetext": "^3.0.16", - "next": "^14.2.30", - "next-auth": "^4.24.11", + "next": "^14.2.26", + "next-auth": "^4.24.5", "next-i18next": "^15.1.1", "next-pwa": "^5.6.0", "nodemailer": "^6.9.14", @@ -103,13 +103,11 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", + "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" }, "engines": { @@ -442,19 +440,17 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "license": "MIT", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "license": "MIT", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "engines": { "node": ">=6.9.0" } @@ -480,26 +476,99 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", - "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", + "version": "7.22.15", "license": "MIT", "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", - "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", - "license": "MIT", + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { - "@babel/types": "^7.26.10" + "has-flag": "^3.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", + "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1544,9 +1613,7 @@ "license": "MIT" }, "node_modules/@babel/runtime": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", - "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "version": "7.23.6", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1556,9 +1623,7 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.26.10.tgz", - "integrity": "sha512-uITFQYO68pMEYR46AHgQoyBg7KPPJDAbGn4jUTIRgCFJIp88MIBUianVOplhZDEec07bp9zIyr4Kp0FCyQzmWg==", + "version": "7.22.15", "license": "MIT", "dependencies": { "core-js-pure": "^3.30.2", @@ -1569,14 +1634,13 @@ } }, "node_modules/@babel/template": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", - "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", - "license": "MIT", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1607,13 +1671,13 @@ } }, "node_modules/@babel/types": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", - "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", - "license": "MIT", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.0.tgz", + "integrity": "sha512-LcnxQSsd9aXOIgmmSpvZ/1yo46ra2ESYyqLcryaBZOghxy5qqOBjvCWP5JfkI8yl9rlxRgdLTTMCQQRcN2hdCg==", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" @@ -1807,9 +1871,9 @@ } }, "node_modules/@next/env": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.30.tgz", - "integrity": "sha512-KBiBKrDY6kxTQWGzKjQB7QirL3PiiOkV7KW98leHFjtVRKtft76Ra5qSA/SL75xT44dp6hOcqiiJ6iievLOYug==", + "version": "14.2.26", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.26.tgz", + "integrity": "sha512-vO//GJ/YBco+H7xdQhzJxF7ub3SUwft76jwaeOyVVQFHCi5DCnkP16WHB+JBylo4vOKPoZBlR94Z8xBxNBdNJA==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { @@ -1821,9 +1885,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.30.tgz", - "integrity": "sha512-EAqfOTb3bTGh9+ewpO/jC59uACadRHM6TSA9DdxJB/6gxOpyV+zrbqeXiFTDy9uV6bmipFDkfpAskeaDcO+7/g==", + "version": "14.2.26", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.26.tgz", + "integrity": "sha512-zDJY8gsKEseGAxG+C2hTMT0w9Nk9N1Sk1qV7vXYz9MEiyRoF5ogQX2+vplyUMIfygnjn9/A04I6yrUTRTuRiyQ==", "cpu": [ "arm64" ], @@ -1837,9 +1901,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.30.tgz", - "integrity": "sha512-TyO7Wz1IKE2kGv8dwQ0bmPL3s44EKVencOqwIY69myoS3rdpO1NPg5xPM5ymKu7nfX4oYJrpMxv8G9iqLsnL4A==", + "version": "14.2.26", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.26.tgz", + "integrity": "sha512-U0adH5ryLfmTDkahLwG9sUQG2L0a9rYux8crQeC92rPhi3jGQEY47nByQHrVrt3prZigadwj/2HZ1LUUimuSbg==", "cpu": [ "x64" ], @@ -1853,9 +1917,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.30.tgz", - "integrity": "sha512-I5lg1fgPJ7I5dk6mr3qCH1hJYKJu1FsfKSiTKoYwcuUf53HWTrEkwmMI0t5ojFKeA6Vu+SfT2zVy5NS0QLXV4Q==", + "version": "14.2.26", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.26.tgz", + "integrity": "sha512-SINMl1I7UhfHGM7SoRiw0AbwnLEMUnJ/3XXVmhyptzriHbWvPPbbm0OEVG24uUKhuS1t0nvN/DBvm5kz6ZIqpg==", "cpu": [ "arm64" ], @@ -1869,9 +1933,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.30.tgz", - "integrity": "sha512-8GkNA+sLclQyxgzCDs2/2GSwBc92QLMrmYAmoP2xehe5MUKBLB2cgo34Yu242L1siSkwQkiV4YLdCnjwc/Micw==", + "version": "14.2.26", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.26.tgz", + "integrity": "sha512-s6JaezoyJK2DxrwHWxLWtJKlqKqTdi/zaYigDXUJ/gmx/72CrzdVZfMvUc6VqnZ7YEvRijvYo+0o4Z9DencduA==", "cpu": [ "arm64" ], @@ -1885,9 +1949,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.30.tgz", - "integrity": "sha512-8Ly7okjssLuBoe8qaRCcjGtcMsv79hwzn/63wNeIkzJVFVX06h5S737XNr7DZwlsbTBDOyI6qbL2BJB5n6TV/w==", + "version": "14.2.26", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.26.tgz", + "integrity": "sha512-FEXeUQi8/pLr/XI0hKbe0tgbLmHFRhgXOUiPScz2hk0hSmbGiU8aUqVslj/6C6KA38RzXnWoJXo4FMo6aBxjzg==", "cpu": [ "x64" ], @@ -1901,9 +1965,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.30.tgz", - "integrity": "sha512-dBmV1lLNeX4mR7uI7KNVHsGQU+OgTG5RGFPi3tBJpsKPvOPtg9poyav/BYWrB3GPQL4dW5YGGgalwZ79WukbKQ==", + "version": "14.2.26", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.26.tgz", + "integrity": "sha512-BUsomaO4d2DuXhXhgQCVt2jjX4B4/Thts8nDoIruEJkhE5ifeQFtvW5c9JkdOtYvE5p2G0hcwQ0UbRaQmQwaVg==", "cpu": [ "x64" ], @@ -1917,9 +1981,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.30.tgz", - "integrity": "sha512-6MMHi2Qc1Gkq+4YLXAgbYslE1f9zMGBikKMdmQRHXjkGPot1JY3n5/Qrbg40Uvbi8//wYnydPnyvNhI1DMUW1g==", + "version": "14.2.26", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.26.tgz", + "integrity": "sha512-5auwsMVzT7wbB2CZXQxDctpWbdEnEW/e66DyXO1DcgHxIyhP06awu+rHKshZE+lPLIGiwtjo7bsyeuubewwxMw==", "cpu": [ "arm64" ], @@ -1933,9 +1997,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.30.tgz", - "integrity": "sha512-pVZMnFok5qEX4RT59mK2hEVtJX+XFfak+/rjHpyFh7juiT52r177bfFKhnlafm0UOSldhXjj32b+LZIOdswGTg==", + "version": "14.2.26", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.26.tgz", + "integrity": "sha512-GQWg/Vbz9zUGi9X80lOeGsz1rMH/MtFO/XqigDznhhhTfDlDoynCM6982mPCbSlxJ/aveZcKtTlwfAjwhyxDpg==", "cpu": [ "ia32" ], @@ -1949,9 +2013,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.30.tgz", - "integrity": "sha512-4KCo8hMZXMjpTzs3HOqOGYYwAXymXIy7PEPAXNEcEOyKqkjiDlECumrWziy+JEF0Oi4ILHGxzgQ3YiMGG2t/Lg==", + "version": "14.2.26", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.26.tgz", + "integrity": "sha512-2rdB3T1/Gp7bv1eQTTm9d1Y1sv9UuJ2LAwOE0Pe2prHKe32UNscj7YS13fRB37d0GAiGNR+Y7ZcW8YjDI8Ns0w==", "cpu": [ "x64" ], @@ -3878,9 +3942,7 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "version": "0.5.0", "license": "MIT", "engines": { "node": ">= 0.6" @@ -7110,15 +7172,14 @@ } }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.7", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -7142,12 +7203,12 @@ "peer": true }, "node_modules/next": { - "version": "14.2.30", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.30.tgz", - "integrity": "sha512-+COdu6HQrHHFQ1S/8BBsCag61jZacmvbuL2avHvQFbWa2Ox7bE+d8FyNgxRLjXQ5wtPyQwEmk85js/AuaG2Sbg==", + "version": "14.2.26", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.26.tgz", + "integrity": "sha512-b81XSLihMwCfwiUVRRja3LphLo4uBBMZEzBBWMaISbKTwOmq3wPknIETy/8000tr7Gq4WmbuFYPS7jOYIf+ZJw==", "license": "MIT", "dependencies": { - "@next/env": "14.2.30", + "@next/env": "14.2.26", "@swc/helpers": "0.5.5", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", @@ -7162,15 +7223,15 @@ "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.30", - "@next/swc-darwin-x64": "14.2.30", - "@next/swc-linux-arm64-gnu": "14.2.30", - "@next/swc-linux-arm64-musl": "14.2.30", - "@next/swc-linux-x64-gnu": "14.2.30", - "@next/swc-linux-x64-musl": "14.2.30", - "@next/swc-win32-arm64-msvc": "14.2.30", - "@next/swc-win32-ia32-msvc": "14.2.30", - "@next/swc-win32-x64-msvc": "14.2.30" + "@next/swc-darwin-arm64": "14.2.26", + "@next/swc-darwin-x64": "14.2.26", + "@next/swc-linux-arm64-gnu": "14.2.26", + "@next/swc-linux-arm64-musl": "14.2.26", + "@next/swc-linux-x64-gnu": "14.2.26", + "@next/swc-linux-x64-musl": "14.2.26", + "@next/swc-win32-arm64-msvc": "14.2.26", + "@next/swc-win32-ia32-msvc": "14.2.26", + "@next/swc-win32-x64-msvc": "14.2.26" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -7192,14 +7253,13 @@ } }, "node_modules/next-auth": { - "version": "4.24.11", - "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.24.11.tgz", - "integrity": "sha512-pCFXzIDQX7xmHFs4KVH4luCjaCbuPRtZ9oBUjUhOk84mZ9WVPf94n87TxYI4rSRf9HmfHEF8Yep3JrYDVOo3Cw==", - "license": "ISC", + "version": "4.24.8", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.24.8.tgz", + "integrity": "sha512-SLt3+8UCtklsotnz2p+nB4aN3IHNmpsQFAZ24VLxGotWGzSxkBh192zxNhm/J5wgkcrDWVp0bwqvW0HksK/Lcw==", "dependencies": { "@babel/runtime": "^7.20.13", "@panva/hkdf": "^1.0.2", - "cookie": "^0.7.0", + "cookie": "^0.5.0", "jose": "^4.15.5", "oauth": "^0.9.15", "openid-client": "^5.4.0", @@ -7209,10 +7269,10 @@ }, "peerDependencies": { "@auth/core": "0.34.2", - "next": "^12.2.5 || ^13 || ^14 || ^15", + "next": "^12.2.5 || ^13 || ^14", "nodemailer": "^6.6.5", - "react": "^17.0.2 || ^18 || ^19", - "react-dom": "^17.0.2 || ^18 || ^19" + "react": "^17.0.2 || ^18", + "react-dom": "^17.0.2 || ^18" }, "peerDependenciesMeta": { "@auth/core": { @@ -8768,9 +8828,7 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "version": "6.0.1", "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" @@ -9308,6 +9366,13 @@ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", diff --git a/package.json b/package.json index aa926782..0028404e 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "build": "next build", - "dev": "next dev", + "dev": "next dev -H 0.0.0.0 -p 3000", "postinstall": "prisma generate", "lint": "next lint", "start": "next start", @@ -25,8 +25,8 @@ "i18next": "^23.7.11", "micro": "^10.0.1", "mimetext": "^3.0.16", - "next": "^14.2.30", - "next-auth": "^4.24.11", + "next": "^14.2.26", + "next-auth": "^4.24.5", "next-i18next": "^15.1.1", "next-pwa": "^5.6.0", "nodemailer": "^6.9.14", diff --git a/prisma/seeders/events.mts b/prisma/seeders/events.mts index 375a543c..412f779e 100644 --- a/prisma/seeders/events.mts +++ b/prisma/seeders/events.mts @@ -1,6 +1,6 @@ import { EventType } from "@prisma/client"; -const day1 = "2024-09-27"; +const day1 = "2025-09-27"; const events = [ { @@ -19,8 +19,8 @@ const events = [ name: "Opening Ceremony", nameFr: "Cérémonie d'ouverture", type: EventType.ALL, - description: "Welcome to the Hack the Hill III event! We're excited to have you here.", - descriptionFr: "Bienvenue à l'événement Hack the Hill III! Nous sommes ravis de vous avoir ici.", + description: "Welcome to the Hack The Hill III event! We're excited to have you here.", + descriptionFr: "Bienvenue à l'événement Hack The Hill III! Nous sommes ravis de vous avoir ici.", room: "Room 2", maxCheckIns: 1, }, diff --git a/public/assets/hackthehill-logo.svg b/public/assets/hackthehill-logo.svg index 2cc4c64d..899a76ec 100644 --- a/public/assets/hackthehill-logo.svg +++ b/public/assets/hackthehill-logo.svg @@ -1,35 +1,97 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + diff --git a/public/assets/hero/building.svg b/public/assets/hero/building.svg index cfd504e6..d3a8a3c5 100644 --- a/public/assets/hero/building.svg +++ b/public/assets/hero/building.svg @@ -1,24 +1,24 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/hero/hack.svg b/public/assets/hero/hack.svg index 49d43edd..da4ef85c 100644 --- a/public/assets/hero/hack.svg +++ b/public/assets/hero/hack.svg @@ -1,6 +1,6 @@ - + diff --git a/public/assets/hero/hill.svg b/public/assets/hero/hill.svg index a85fe7b8..f9136546 100644 --- a/public/assets/hero/hill.svg +++ b/public/assets/hero/hill.svg @@ -1,42 +1,42 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/public/assets/hero/stars.svg b/public/assets/hero/stars.svg new file mode 100644 index 00000000..6afda66c --- /dev/null +++ b/public/assets/hero/stars.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/assets/hero/the.svg b/public/assets/hero/the.svg index d3c505bf..235c7600 100644 --- a/public/assets/hero/the.svg +++ b/public/assets/hero/the.svg @@ -1,6 +1,6 @@ - + diff --git a/public/assets/home.svg b/public/assets/home.svg index b87d918c..62865819 100644 --- a/public/assets/home.svg +++ b/public/assets/home.svg @@ -1,9 +1,9 @@ - + - + diff --git a/public/assets/list.svg b/public/assets/list.svg index a41c9a99..40be211c 100644 --- a/public/assets/list.svg +++ b/public/assets/list.svg @@ -1,8 +1,8 @@ - - - - - - + + + + + + diff --git a/public/assets/maps.svg b/public/assets/maps.svg index 1a5bad6c..b9addcf4 100644 --- a/public/assets/maps.svg +++ b/public/assets/maps.svg @@ -1,5 +1,5 @@ - - - + + + diff --git a/public/assets/profile.svg b/public/assets/profile.svg index 87e3f300..59a28374 100644 --- a/public/assets/profile.svg +++ b/public/assets/profile.svg @@ -1 +1 @@ - + diff --git a/public/assets/qr.svg b/public/assets/qr.svg index 91e44592..fbddad42 100644 --- a/public/assets/qr.svg +++ b/public/assets/qr.svg @@ -1 +1 @@ - + diff --git a/public/assets/resources.svg b/public/assets/resources.svg index 32adee86..0a6928e5 100644 --- a/public/assets/resources.svg +++ b/public/assets/resources.svg @@ -1,4 +1,4 @@ - - + + diff --git a/public/assets/schedule.svg b/public/assets/schedule.svg index c38f0401..603c7cb5 100644 --- a/public/assets/schedule.svg +++ b/public/assets/schedule.svg @@ -1,13 +1,13 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/public/assets/sponsors.svg b/public/assets/sponsors.svg index 6075cf31..25521c93 100644 --- a/public/assets/sponsors.svg +++ b/public/assets/sponsors.svg @@ -1 +1 @@ - + diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index 9f6d0bbd..00000000 Binary files a/public/favicon.ico and /dev/null differ diff --git a/public/icons/android-chrome-192x192.png b/public/icons/android-chrome-192x192.png index 2cdcbfb0..0187aebe 100644 Binary files a/public/icons/android-chrome-192x192.png and b/public/icons/android-chrome-192x192.png differ diff --git a/public/icons/android-chrome-512x512.png b/public/icons/android-chrome-512x512.png index bf235ab3..ef1d70d7 100644 Binary files a/public/icons/android-chrome-512x512.png and b/public/icons/android-chrome-512x512.png differ diff --git a/public/icons/apple-touch-icon-114x114.png b/public/icons/apple-touch-icon-114x114.png deleted file mode 100644 index be6908c7..00000000 Binary files a/public/icons/apple-touch-icon-114x114.png and /dev/null differ diff --git a/public/icons/apple-touch-icon-120x120.png b/public/icons/apple-touch-icon-120x120.png deleted file mode 100644 index 472b500b..00000000 Binary files a/public/icons/apple-touch-icon-120x120.png and /dev/null differ diff --git a/public/icons/apple-touch-icon-144x144.png b/public/icons/apple-touch-icon-144x144.png deleted file mode 100644 index 85b16b61..00000000 Binary files a/public/icons/apple-touch-icon-144x144.png and /dev/null differ diff --git a/public/icons/apple-touch-icon-152x152.png b/public/icons/apple-touch-icon-152x152.png deleted file mode 100644 index 8bddca36..00000000 Binary files a/public/icons/apple-touch-icon-152x152.png and /dev/null differ diff --git a/public/icons/apple-touch-icon-57x57.png b/public/icons/apple-touch-icon-57x57.png deleted file mode 100644 index e8fbfb97..00000000 Binary files a/public/icons/apple-touch-icon-57x57.png and /dev/null differ diff --git a/public/icons/apple-touch-icon-60x60.png b/public/icons/apple-touch-icon-60x60.png deleted file mode 100644 index b429e1fd..00000000 Binary files a/public/icons/apple-touch-icon-60x60.png and /dev/null differ diff --git a/public/icons/apple-touch-icon-72x72.png b/public/icons/apple-touch-icon-72x72.png deleted file mode 100644 index a20d9e1f..00000000 Binary files a/public/icons/apple-touch-icon-72x72.png and /dev/null differ diff --git a/public/icons/apple-touch-icon-76x76.png b/public/icons/apple-touch-icon-76x76.png deleted file mode 100644 index 636a7dc1..00000000 Binary files a/public/icons/apple-touch-icon-76x76.png and /dev/null differ diff --git a/public/icons/apple-touch-icon.png b/public/icons/apple-touch-icon.png index 6a74a31e..9a1d76be 100644 Binary files a/public/icons/apple-touch-icon.png and b/public/icons/apple-touch-icon.png differ diff --git a/public/icons/favicon-128x128.png b/public/icons/favicon-128x128.png deleted file mode 100644 index a578c224..00000000 Binary files a/public/icons/favicon-128x128.png and /dev/null differ diff --git a/public/icons/favicon-16x16.png b/public/icons/favicon-16x16.png index f4dc45b2..d47a5fa6 100644 Binary files a/public/icons/favicon-16x16.png and b/public/icons/favicon-16x16.png differ diff --git a/public/icons/favicon-196x196.png b/public/icons/favicon-196x196.png deleted file mode 100644 index 0b9b6d19..00000000 Binary files a/public/icons/favicon-196x196.png and /dev/null differ diff --git a/public/icons/favicon-32x32.png b/public/icons/favicon-32x32.png index f4f5d39a..5ce99a1c 100644 Binary files a/public/icons/favicon-32x32.png and b/public/icons/favicon-32x32.png differ diff --git a/public/icons/favicon-96x96.png b/public/icons/favicon-96x96.png deleted file mode 100644 index 1bbcc5f8..00000000 Binary files a/public/icons/favicon-96x96.png and /dev/null differ diff --git a/public/icons/favicon.ico b/public/icons/favicon.ico new file mode 100644 index 00000000..587f0acd Binary files /dev/null and b/public/icons/favicon.ico differ diff --git a/public/icons/favicon.svg b/public/icons/favicon.svg index 253748fa..2156293c 100644 --- a/public/icons/favicon.svg +++ b/public/icons/favicon.svg @@ -1 +1,34 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/icons/maskable/maskable-128x128.png b/public/icons/maskable/maskable-128x128.png deleted file mode 100644 index ef26c96c..00000000 Binary files a/public/icons/maskable/maskable-128x128.png and /dev/null differ diff --git a/public/icons/maskable/maskable-192x192.png b/public/icons/maskable/maskable-192x192.png deleted file mode 100644 index 8ab55890..00000000 Binary files a/public/icons/maskable/maskable-192x192.png and /dev/null differ diff --git a/public/icons/maskable/maskable-384x384.png b/public/icons/maskable/maskable-384x384.png deleted file mode 100644 index fd085477..00000000 Binary files a/public/icons/maskable/maskable-384x384.png and /dev/null differ diff --git a/public/icons/maskable/maskable-48x48.png b/public/icons/maskable/maskable-48x48.png deleted file mode 100644 index d9058519..00000000 Binary files a/public/icons/maskable/maskable-48x48.png and /dev/null differ diff --git a/public/icons/maskable/maskable-512x512.png b/public/icons/maskable/maskable-512x512.png deleted file mode 100644 index adca8f04..00000000 Binary files a/public/icons/maskable/maskable-512x512.png and /dev/null differ diff --git a/public/icons/maskable/maskable-72x72.png b/public/icons/maskable/maskable-72x72.png deleted file mode 100644 index 47012169..00000000 Binary files a/public/icons/maskable/maskable-72x72.png and /dev/null differ diff --git a/public/icons/maskable/maskable-96x96.png b/public/icons/maskable/maskable-96x96.png deleted file mode 100644 index 265d0185..00000000 Binary files a/public/icons/maskable/maskable-96x96.png and /dev/null differ diff --git a/public/icons/mstile-144x144.png b/public/icons/mstile-144x144.png deleted file mode 100644 index 7a97ccf0..00000000 Binary files a/public/icons/mstile-144x144.png and /dev/null differ diff --git a/public/icons/mstile-150x150.png b/public/icons/mstile-150x150.png deleted file mode 100644 index 9aea81cb..00000000 Binary files a/public/icons/mstile-150x150.png and /dev/null differ diff --git a/public/icons/mstile-310x150.png b/public/icons/mstile-310x150.png deleted file mode 100644 index 95f40fec..00000000 Binary files a/public/icons/mstile-310x150.png and /dev/null differ diff --git a/public/icons/mstile-310x310.png b/public/icons/mstile-310x310.png deleted file mode 100644 index 1566a1f7..00000000 Binary files a/public/icons/mstile-310x310.png and /dev/null differ diff --git a/public/icons/mstile-70x70.png b/public/icons/mstile-70x70.png deleted file mode 100644 index 4d8a973c..00000000 Binary files a/public/icons/mstile-70x70.png and /dev/null differ diff --git a/public/icons/safari-pinned-tab.svg b/public/icons/safari-pinned-tab.svg deleted file mode 100644 index b9265143..00000000 --- a/public/icons/safari-pinned-tab.svg +++ /dev/null @@ -1,119 +0,0 @@ - - - - -Created by potrace 1.14, written by Peter Selinger 2001-2017 - - - - - - - - - - - - - - - diff --git a/public/locales/en/auth.json b/public/locales/en/auth.json index ba3b4601..46ab400b 100644 --- a/public/locales/en/auth.json +++ b/public/locales/en/auth.json @@ -2,10 +2,10 @@ "sign-in": "Sign In", "sign-up": "Sign Up", "email-address": "Email Address", - "email-sign-in": "Email Sign In", - "email-sign-up": "Email Sign Up", + "email-sign-in": "Send", + "email-sign-up": "Send", "password": "Password", - "credentials-sign-in": "Credentials Sign In", + "credentials-sign-in": "Sign In", "credentials-sign-up": "Credentials Sign Up", "password-strength": "Your password must be between 8 and 32 characters long and contain at least one uppercase letter, one lowercase letter, and one number.", "verify-request": "Verify Request", diff --git a/public/locales/en/confirm.json b/public/locales/en/confirm.json index 631be2f4..9605d34f 100644 --- a/public/locales/en/confirm.json +++ b/public/locales/en/confirm.json @@ -1,29 +1,29 @@ { "confirm": "Confirm", - "not-accepted": "You have not yet received an acceptance to attend Hack the Hill II.", + "not-accepted": "You have not yet received an acceptance to attend Hack The Hill III.", "acceptance-expired": "This confirmation link has expired. Please contact us if you need help.", "error-no-id-found": "Error: no ID Found", "invalid-confirmation-link": "Invalid confirmation link. Please use the link from the email you received.", "you-must-be-logged-in": "You must be logged in to confirm your attendance.", - "congratulations-for-acceptance": "Congratulations {{name}} for being accepted to attend Hack the Hill II!", + "congratulations-for-acceptance": "Congratulations {{name}} for being accepted to attend Hack The Hill III!", "excited-to-have-you-join-us": "We're excited to have you join us for a weekend of hacking, learning, and fun!", - "description": "Hack the Hill II will take place from Friday, September 27th to Sunday, September 29th on the uOttawa campus.", + "description": "Hack The Hill III will take place from Friday, September 27th to Sunday, September 29th on the uOttawa campus.", "please-confirm-your-attendance": "Please confirm your attendance by selecting your team, signing the necessary legal documents, and clicking the button below.", "which-team": "Which team would you like to join? (optional)", "team-already-exists": "A team with this name already exists. Are you sure you want to join a team with {{members}}?", "create-team": "Create Team", "team-created-successfully": "Team created successfully!", "terms-privacy": "I have read the <0>Terms of Service and <1>Privacy Policy of the Track the Hack application.", - "code-of-conduct": "I have read the Hack the Hill II <0>Code of Conduct.", + "code-of-conduct": "I have read the Hack The Hill III <0>Code of Conduct.", "waivers": "I have read the <0>Liability Release Waiver and <1>Media Release Waiver.", "travel-policy": "I have read the <0>Travel Reimbursement Policy.", - "parent-guardian-consent": "By signing below, I, the undersigned parent or legal guardian of {{name}}, acknowledge that I have read, understood, and agree to all the terms and conditions in the documents referenced above, and consent to my child's participation in Hack the Hill II.", - "attendee-consent": "By signing below, I, {{name}}, acknowledge that I have read, understood, and agree to all the terms and conditions in the documents referenced above, and consent to participate in Hack the Hill II.", + "parent-guardian-consent": "By signing below, I, the undersigned parent or legal guardian of {{name}}, acknowledge that I have read, understood, and agree to all the terms and conditions in the documents referenced above, and consent to my child's participation in Hack The Hill III.", + "attendee-consent": "By signing below, I, {{name}}, acknowledge that I have read, understood, and agree to all the terms and conditions in the documents referenced above, and consent to participate in Hack The Hill III.", "clear": "Clear", "ill-be-there": "I'll be there!", "you-can-change-your-response": "You can change your response by revisiting this page anytime before the deadline of {{deadline}}.", "thank-you-for-confirming-your-attendance": "Thank you for confirming your attendance!", - "we-look-forward-to-seeing-you": "We look forward to seeing you at Hack the Hill II!", + "we-look-forward-to-seeing-you": "We look forward to seeing you at Hack The Hill III!", "you-must-accept-terms": "You must agree to the terms and conditions to continue.", "signature-upload-failed": "Signature upload failed. Please try again.", "undo-edit-response": "Undo RSVP and Edit Response" diff --git a/public/locales/en/discord.json b/public/locales/en/discord.json index ba17a781..765a7e1c 100644 --- a/public/locales/en/discord.json +++ b/public/locales/en/discord.json @@ -2,8 +2,8 @@ "title": "Discord Verification", "please-sign-in": "Please sign in", "sign-in": "Sign In", - "success-welcome": "Success! Welcome to the Hack the Hill II Discord server!", - "verify-details": "Verify that you are a hacker to gain access to the Hack the Hill II Discord server.", + "success-welcome": "Success! Welcome to the Hack The Hill III Discord server!", + "verify-details": "Verify that you are a hacker to gain access to the Hack The Hill III Discord server.", "verify": "Verify", "you-must-be-logged-in": "You must be logged in to verify your Discord account.", "missing-discord-id": "Discord ID is missing. Please check the link and try again.", diff --git a/public/locales/en/email.json b/public/locales/en/email.json index 9e329153..1f696911 100644 --- a/public/locales/en/email.json +++ b/public/locales/en/email.json @@ -1,9 +1,9 @@ { "apply": { - "subject": "Thank you for applying to Hack the Hill II!", - "preview": "Thank you for applying for the Hack the Hill II hackathon!", + "subject": "Thank you for applying to Hack The Hill III!", + "preview": "Thank you for applying for the Hack The Hill III hackathon!", "greeting": "Hi {{name}},", - "body": "Thank you for applying for the Hack the Hill II hackathon. We appreciate your interest and are excited to have you on board. Stay tuned for more updates!", + "body": "Thank you for applying for the Hack The Hill III hackathon. We appreciate your interest and are excited to have you on board. Stay tuned for more updates!", "closing": "If you have any questions, feel free to reply to this email.", "signature": "Hack the Hill" } diff --git a/public/locales/en/index.json b/public/locales/en/index.json index afe44798..1b6cd09d 100644 --- a/public/locales/en/index.json +++ b/public/locales/en/index.json @@ -1,5 +1,10 @@ { - "description": "Sept 27 – 29, 2024 in Ottawa, Canada", + "description": "November 14 - 16, 2025 in Ottawa, Canada", "get-started": "Get Started", - "apply": "Apply now!" + "apply": "Apply now!", + "profile": "Profile", + "qr": "QR", + "waitlisted": "Waitlisted", + "rejected": "Rejected", + "pending-admission": "Pending admission" } diff --git a/public/locales/fr/confirm.json b/public/locales/fr/confirm.json index 0286b6f2..4f14f780 100644 --- a/public/locales/fr/confirm.json +++ b/public/locales/fr/confirm.json @@ -1,29 +1,29 @@ { "confirm": "Confirm", - "not-accepted": "Vous n'avez pas encore reçu d'acceptation pour participer à Hack the Hill II.", + "not-accepted": "Vous n'avez pas encore reçu d'acceptation pour participer à Hack The Hill III.", "acceptance-expired": "Ce lien de confirmation a expiré. Veuillez nous contacter si vous avez besoin d'aide.", "error-no-id-found": "Erreur : aucun ID trouvé", "invalid-confirmation-link": "Lien de confirmation invalide. Veuillez utiliser le lien du courriel que vous avez reçu.", "you-must-be-logged-in": "Vous devez être connecté pour confirmer votre présence.", - "congratulations-for-acceptance": "Félicitations {{name}} pour avoir été accepté à Hack the Hill II!", + "congratulations-for-acceptance": "Félicitations {{name}} pour avoir été accepté à Hack The Hill III!", "excited-to-have-you-join-us": "Nous sommes ravis de vous accueillir pour un week-end de hacking, d'apprentissage et de plaisir!", - "description": "Hack the Hill II aura lieu du vendredi 27 septembre au dimanche 29 septembre sur le campus de l'Université d'Ottawa.", + "description": "Hack The Hill III aura lieu du vendredi 27 septembre au dimanche 29 septembre sur le campus de l'Université d'Ottawa.", "please-confirm-your-attendance": "Veuillez confirmer votre présence en sélectionnant votre équipe, en signant les documents légaux nécessaires et en cliquant sur le bouton ci-dessous.", "which-team": "Dans quelle équipe souhaitez-vous vous joindre? (facultatif)", "team-already-exists": "Une équipe avec ce nom existe déjà.", "create-team": "Créer une équipe", "team-created-successfully": "Équipe créée avec succès!", "terms-privacy": "J'ai lu les <0>Conditions d'utilisation et la <1>Politique de confidentialité de l'application Track the Hack.", - "code-of-conduct": "J'ai lu le <0>Code de conduite de Hack the Hill II.", + "code-of-conduct": "J'ai lu le <0>Code de conduite de Hack The Hill III.", "waivers": "J'ai lu la <0>Renonciation à la responsabilité et la <1>Renonciation à la diffusion de médias.", "travel-policy": "J'ai lu la <0>Politique de remboursement des frais de déplacement.", - "parent-guardian-consent": "En signant ci-dessous, je, le parent ou tuteur légal de {{name}}, reconnais avoir lu, compris et accepté tous les termes et conditions des documents référencés ci-dessus, et je consens à la participation de mon enfant à Hack the Hill II.", - "attendee-consent": "En signant ci-dessous, je, {{name}}, reconnais avoir lu, compris et accepté tous les termes et conditions des documents référencés ci-dessus, et je consens à participer à Hack the Hill II.", + "parent-guardian-consent": "En signant ci-dessous, je, le parent ou tuteur légal de {{name}}, reconnais avoir lu, compris et accepté tous les termes et conditions des documents référencés ci-dessus, et je consens à la participation de mon enfant à Hack The Hill III.", + "attendee-consent": "En signant ci-dessous, je, {{name}}, reconnais avoir lu, compris et accepté tous les termes et conditions des documents référencés ci-dessus, et je consens à participer à Hack The Hill III.", "clear": "Effacer", "ill-be-there": "Je serai là!", "you-can-change-your-response": "Vous pouvez modifier votre réponse en revisitant cette page à tout moment avant la date limite du {{deadline}}.", "thank-you-for-confirming-your-attendance": "Merci d'avoir confirmé votre présence!", - "we-look-forward-to-seeing-you": "Nous avons hâte de vous voir à Hack the Hill II!", + "we-look-forward-to-seeing-you": "Nous avons hâte de vous voir à Hack The Hill III!", "you-must-accept-terms": "Vous devez accepter les termes et conditions pour continuer.", "signature-upload-failed": "Signature upload failed. Please try again.", "undo-edit-response": "Annuler RSVP et modifier la réponse" diff --git a/public/locales/fr/discord.json b/public/locales/fr/discord.json index 6eee7f6c..3c72484f 100644 --- a/public/locales/fr/discord.json +++ b/public/locales/fr/discord.json @@ -2,8 +2,8 @@ "title": "Vérification Discord", "please-sign-in": "Veuillez vous connecter", "sign-in": "Se connecter", - "success-welcome": "Succès! Bienvenue sur le serveur Discord de Hack the Hill II!", - "verify-details": "Vérifiez que vous êtes un hacker pour accéder au serveur Discord de Hack the Hill II.", + "success-welcome": "Succès! Bienvenue sur le serveur Discord de Hack The Hill III!", + "verify-details": "Vérifiez que vous êtes un hacker pour accéder au serveur Discord de Hack The Hill III.", "verify": "Vérifier", "you-must-be-logged-in": "Vous devez être connecté pour vérifier votre compte Discord.", "missing-discord-id": "L'ID Discord est manquant. Veuillez vérifier le lien et réessayer.", diff --git a/public/locales/fr/email.json b/public/locales/fr/email.json index dc40e1b9..4cb6c0ca 100644 --- a/public/locales/fr/email.json +++ b/public/locales/fr/email.json @@ -1,9 +1,9 @@ { "apply": { - "subject": "Merci d'avoir postulé à Hack the Hill II!", - "preview": "Merci d'avoir postulé pour le hackathon Hack the Hill II!", + "subject": "Merci d'avoir postulé à Hack The Hill III!", + "preview": "Merci d'avoir postulé pour le hackathon Hack The Hill III!", "greeting": "Salut {{name}},", - "body": "Merci d'avoir postulé pour le hackathon Hack the Hill II. Nous apprécions votre intérêt et sommes ravis de vous avoir à bord. Restez à l'écoute pour plus de mises à jour!", + "body": "Merci d'avoir postulé pour le hackathon Hack The Hill III. Nous apprécions votre intérêt et sommes ravis de vous avoir à bord. Restez à l'écoute pour plus de mises à jour!", "closing": "Si vous avez des questions, n'hésitez pas à répondre à ce courriel.", "signature": "Hack the Hill" } diff --git a/public/locales/fr/index.json b/public/locales/fr/index.json index c73a68b4..1226912a 100644 --- a/public/locales/fr/index.json +++ b/public/locales/fr/index.json @@ -1,5 +1,10 @@ { - "description": "27 – 29 septembre 2024 à Ottawa, Canada", + "description": "14 - 16 novembre 2024 à Ottawa, Canada", "get-started": "Commencez", - "apply": "Postulez maintenant!" + "apply": "Postulez maintenant!", + "profile": "Profil", + "qr": "QR", + "waitlisted": "En liste d'attente", + "rejected": "Rejeté", + "pending-admission": "En attente d'admission" } diff --git a/public/manifest.json b/public/manifest.json index 6d7c7c11..dda6aad1 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -17,125 +17,6 @@ "src": "/icons/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" - }, - { "src": "/icons/apple-touch-icon", "type": "image/png" }, - { - "src": "/icons/apple-touch-icon-57x57.png", - "sizes": "57x57", - "type": "image/png" - }, - { - "src": "/icons/apple-touch-icon-60x60.png", - "sizes": "60x60", - "type": "image/png" - }, - { - "src": "/icons/apple-touch-icon-72x72.png", - "sizes": "72x72", - "type": "image/png" - }, - { - "src": "/icons/apple-touch-icon-76x76.png", - "sizes": "76x76", - "type": "image/png" - }, - { - "src": "/icons/apple-touch-icon-114x114.png", - "sizes": "114x114", - "type": "image/png" - }, - { - "src": "/icons/apple-touch-icon-120x120.png", - "sizes": "120x120", - "type": "image/png" - }, - { - "src": "/icons/apple-touch-icon-144x144.png", - "sizes": "144x144", - "type": "image/png" - }, - { - "src": "/icons/apple-touch-icon-152x152.png", - "sizes": "152x152", - "type": "image/png" - }, - - { - "src": "/icons/favicon-16x16.png", - "sizes": "16x16", - "type": "image/png" - }, - { - "src": "/icons/favicon-32x32.png", - "sizes": "32x32", - "type": "image/png" - }, - { - "src": "/icons/favicon-96x96.png", - "sizes": "96x96", - "type": "image/png" - }, - { - "src": "/icons/favicon-128x128.png", - "sizes": "128x128", - "type": "image/png" - }, - { - "src": "/icons/favicon-196x196.png", - "sizes": "196x196", - "type": "image/png" - }, - { - "src": "/icons/mstile-70x70.png", - "sizes": "70x70", - "type": "image/png" - }, - { - "src": "/icons/mstile-144x144.png", - "sizes": "144x144", - "type": "image/png" - }, - { - "src": "/icons/mstile-150x150.png", - "sizes": "150x150", - "type": "image/png" - }, - { - "src": "/icons/mstile-310x150.png", - "sizes": "310x150", - "type": "image/png" - }, - { - "src": "/icons/mstile-310x310.png", - "sizes": "310x310", - "type": "image/png" - }, - { "src": "/icons/maskable/maskable-48x48.png", "sizes": "48x48", "type": "image/png", "purpose": "maskable" }, - { "src": "/icons/maskable/maskable-72x72.png", "sizes": "72x72", "type": "image/png", "purpose": "maskable" }, - { "src": "/icons/maskable/maskable-96x96.png", "sizes": "96x96", "type": "image/png", "purpose": "maskable" }, - { - "src": "/icons/maskable/maskable-128x128.png", - "sizes": "128x128", - "type": "image/png", - "purpose": "maskable" - }, - { - "src": "/icons/maskable/maskable-192x192.png", - "sizes": "192x192", - "type": "image/png", - "purpose": "maskable" - }, - { - "src": "/icons/maskable/maskable-384x384.png", - "sizes": "384x384", - "type": "image/png", - "purpose": "maskable" - }, - { - "src": "/icons/maskable/maskable-512x512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "maskable" } ] } diff --git a/src/components/Error.tsx b/src/components/Error.tsx index ee2180ea..673f5c18 100644 --- a/src/components/Error.tsx +++ b/src/components/Error.tsx @@ -15,10 +15,10 @@ const Error = ({ message }: ErrorProps) => { message, })} - + diff --git a/src/components/FormPage.tsx b/src/components/FormPage.tsx index eea70614..032e72bc 100644 --- a/src/components/FormPage.tsx +++ b/src/components/FormPage.tsx @@ -28,7 +28,7 @@ const FormPage = ({ children, onSubmit, error, invalid, loading, title }: FormPa >
{t("hack-the-hill-logo-alt")} { return ( + {/** used site to generate icons: https://favicon.io/favicon-converter/ */} {title ? `${title} | Track the Hack` : "Track the Hack"} + + + + - - - - - - - - - - - - - - - - - - - {noIndex && } diff --git a/src/components/Modal.tsx b/src/components/Modal.tsx index 558eadc3..9e04ae00 100644 --- a/src/components/Modal.tsx +++ b/src/components/Modal.tsx @@ -26,13 +26,13 @@ const Modal = ({ children, buttons }: ModalProps) => { return modalRoot ? createPortal(
-
+
{children}
{buttons.map((button, index) => (
- - {error && } - -
- - )} */} ); }; export const getServerSideProps: GetServerSideProps = async ({ req, res, locale }) => { - // const session = await getServerSession(req, res, getAuthOptions(req)); - + const session = await getServerSession(req, res, getAuthOptions(req)); + const redirect = sessionRedirect(session, "/apply"); + if (redirect) { + return { redirect }; + } return { - // sessionRedirect(session, "/apply") - redirect: { - destination: "/", - }, props: { ...(await serverSideTranslations(locale ?? "en", ["apply", "zod", "navbar", "common"])), applicationQuestions: getApplicationQuestions( diff --git a/src/pages/auth/error.tsx b/src/pages/auth/error.tsx index fa1a726f..27066aff 100644 --- a/src/pages/auth/error.tsx +++ b/src/pages/auth/error.tsx @@ -24,11 +24,10 @@ const ErrorPage = () => {
{t("common:hack-the-hill-logo-alt")}

diff --git a/src/pages/auth/sign-in.tsx b/src/pages/auth/sign-in.tsx index deb76bc7..369b5813 100644 --- a/src/pages/auth/sign-in.tsx +++ b/src/pages/auth/sign-in.tsx @@ -5,6 +5,7 @@ import { useTranslation } from "next-i18next"; import { serverSideTranslations } from "next-i18next/serverSideTranslations"; import Image from "next/image"; import { useRouter } from "next/router"; +import { useState } from "react"; import Error from "../../components/Error"; import Head from "../../components/Head"; @@ -41,99 +42,142 @@ const SignIn = ({ providers }: InferGetServerSidePropsType; } + // Determine providers and custom order + const providerList = Object.values(providers); + const credentialsProvider = providerList.find(p => p.id === "credentials"); + const emailProvider = providerList.find(p => p.id === "email"); + const otherProviders = providerList.filter(p => p.id !== "credentials" && p.id !== "email"); + return ( <>
{t("common:hack-the-hill-logo-alt")} -

+

{t("sign-in")}

- {Object.values(providers).map(provider => ( + {/* 3rd party auth */} + {otherProviders.map(provider => (
{ + e.preventDefault(); + void signIn(provider.id, { callbackUrl }); + }} + > + +
+ ))} + + {/* Credentials sign-in */} + {credentialsProvider && ( +
{ e.preventDefault(); const formData = new FormData(e.target as HTMLFormElement); - if (provider.id === "email") { - void signIn(provider.id, { - email: formData.get("email"), - redirectTo: callbackUrl, - }); - } else if (provider.id === "credentials") { - void signIn(provider.id, { - email: formData.get("email") as string, - password: formData.get("password") as string, - redirectTo: callbackUrl, - }); - } else { - void signIn(provider.id, { callbackUrl }); - } + void signIn(credentialsProvider.id, { + email: formData.get("email") as string, + password: formData.get("password") as string, + redirectTo: callbackUrl, + }); }} > - {provider.id === "email" && ( + + +
+ + +
+
+ )} + + {/* Email magic-link sign-in below credentials; input hidden until Forgot Password is clicked */} + {emailProvider && ( +
{ + e.preventDefault(); + const formData = new FormData(e.target as HTMLFormElement); + void signIn(emailProvider.id, { + email: formData.get("email"), + redirectTo: callbackUrl, + }); + }} + > + {showEmailField && ( )} - {provider.id === "credentials" && ( - <> - - - + {showEmailField && ( + )} -
- ))} + )} + {error && }
diff --git a/src/pages/auth/sign-up.tsx b/src/pages/auth/sign-up.tsx index e3138dae..9c6733f9 100644 --- a/src/pages/auth/sign-up.tsx +++ b/src/pages/auth/sign-up.tsx @@ -50,6 +50,7 @@ const SignUp = ({ providers }: InferGetServerSidePropsType(null); const [showConfirmation, setShowConfirmation] = useState(false); + const [showEmailField, setShowEmailField] = useState(false); const handleSubmit = (e: React.FormEvent, providerId: string) => { e.preventDefault(); @@ -113,20 +114,25 @@ const SignUp = ({ providers }: InferGetServerSidePropsType; } + // Reordered providers similar to sign-in: third-party first, then credentials, then email + const providerList = Object.values(providers); + const credentialsProvider = providerList.find(p => p.id === "credentials"); + const emailProvider = providerList.find(p => p.id === "email"); + const otherProviders = providerList.filter(p => p.id !== "credentials" && p.id !== "email"); + return ( <>
{t("common:hack-the-hill-logo-alt")} -

+

{t("sign-up")}

@@ -138,59 +144,102 @@ const SignUp = ({ providers }: InferGetServerSidePropsType )} - {Object.values(providers).map(provider => ( + + {/* Third-party connections at the top */} + {otherProviders.map(provider => (
void handleSubmit(e, provider.id)} + onSubmit={e => { + e.preventDefault(); + void handleSubmit(e as unknown as React.FormEvent, provider.id); + }} > - {provider.id === "email" && ( + + + ))} + + {/* Credentials sign-up */} + {credentialsProvider && ( +
void handleSubmit(e, credentialsProvider.id)} + > + + +
+
+ + + +
+
+
+ )} + + {/* Email magic-link sign-up below credentials; input hidden until reveal is clicked */} + {emailProvider && ( +
void handleSubmit(e, emailProvider.id)} + > + {showEmailField && ( )} - {provider.id === "credentials" && ( - <> - - - + {showEmailField && ( + )} -
- ))} + )} + {error && }

{showConfirmation && ( @@ -206,7 +255,7 @@ const SignUp = ({ providers }: InferGetServerSidePropsType -

{t("sign-up-confirmation")}

+

{t("sign-up-confirmation")}

{loading && } )} diff --git a/src/pages/auth/verify-request.tsx b/src/pages/auth/verify-request.tsx index d2c51794..97e3dbca 100644 --- a/src/pages/auth/verify-request.tsx +++ b/src/pages/auth/verify-request.tsx @@ -20,11 +20,11 @@ const VerifyRequest = () => {
{t("common:hack-the-hill-logo-alt")}

diff --git a/src/pages/confirm/index.tsx b/src/pages/confirm/index.tsx index 904d6027..52c433b3 100644 --- a/src/pages/confirm/index.tsx +++ b/src/pages/confirm/index.tsx @@ -220,7 +220,7 @@ const Confirm: NextPage = () => { @@ -265,7 +265,7 @@ const Confirm: NextPage = () => { type="button" disabled={teamName.length < 3} onClick={handleCreateTeam} - className="rounded-lg border border-dark-primary-color bg-light-quaternary-color px-4 py-2 font-coolvetica text-sm text-dark-primary-color transition-colors hover:bg-light-tertiary-color disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-light-quaternary-color short:text-base" + className="rounded-lg border border-dark-primary-color bg-medium-primary-color px-4 py-2 font-coolvetica text-sm text-dark-primary-color transition-colors hover:bg-light-tertiary-color disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-medium-primary-color short:text-base" > {t("create-team")} @@ -317,7 +317,7 @@ const Confirm: NextPage = () => { @@ -330,7 +330,7 @@ const Confirm: NextPage = () => { diff --git a/src/pages/discord/index.tsx b/src/pages/discord/index.tsx index b53d6eae..6f6bfbc6 100644 --- a/src/pages/discord/index.tsx +++ b/src/pages/discord/index.tsx @@ -66,7 +66,7 @@ const Discord: NextPage = () => {

{validationMessage &&

{validationMessage}

} diff --git a/src/pages/hacker.tsx b/src/pages/hacker.tsx new file mode 100644 index 00000000..c391001a --- /dev/null +++ b/src/pages/hacker.tsx @@ -0,0 +1,3 @@ +import HackerPage, { getServerSideProps } from "./hackers/hacker"; +export { getServerSideProps }; +export default HackerPage; diff --git a/src/pages/hackers/hacker.tsx b/src/pages/hackers/hacker.tsx index 2662fa42..663eb506 100644 --- a/src/pages/hackers/hacker.tsx +++ b/src/pages/hackers/hacker.tsx @@ -239,7 +239,7 @@ const HackerPage: NextPage<{ {prevHackerQuery.data && ( {t("previous")} @@ -247,7 +247,7 @@ const HackerPage: NextPage<{ {nextHackerQuery.data && ( {t("next")} @@ -279,7 +279,7 @@ const HackerPage: NextPage<{

{presence.value}

+ ) : isOrganizer ? ( + // Organizer view (hide Apply CTA) +
+ + +
+ ) : acceptanceStatus === AcceptanceStatus.ACCEPTED ? ( +
+ + +
+ ) : acceptanceStatus === AcceptanceStatus.WAITLISTED ? ( +
+ + {t("waitlisted")} +
+ ) : acceptanceStatus === AcceptanceStatus.REJECTED ? ( +
+ + {t("rejected")} +
+ ) : hasApplied ? ( +
+ + + {t("pending-admission")} + +
+ ) : isOpen ? ( + + ) : ( +
+

+ {t("applications-open-in", { defaultValue: "Applications open in" })} +

+
+ {String(days).padStart(2, "0")}d + {String(hours).padStart(2, "0")}h + {String(minutes).padStart(2, "0")}m + {String(seconds).padStart(2, "0")}s +
+
)} ); diff --git a/src/pages/internal/roles.tsx b/src/pages/internal/roles.tsx index 2e9c48b6..e9f41920 100644 --- a/src/pages/internal/roles.tsx +++ b/src/pages/internal/roles.tsx @@ -1,6 +1,7 @@ import { RoleName } from "@prisma/client"; import type { GetServerSideProps, NextPage } from "next"; import { getServerSession } from "next-auth"; +import { useSession } from "next-auth/react"; import { useTranslation } from "next-i18next"; import { serverSideTranslations } from "next-i18next/serverSideTranslations"; import { rolesRedirect } from "../../server/lib/redirects"; @@ -19,7 +20,13 @@ const Roles: NextPage = () => { const [roles, setRoles] = useState([]); const users = trpc.users.search.useQuery({ query }); - const mutation = trpc.users.updateRoles.useMutation(); + const trpcUtils = trpc.useUtils(); + const mutation = trpc.users.updateRoles.useMutation({ + onSuccess: async () => { + await trpcUtils.users.search.invalidate(); + }, + }); + useSession(); // keep hook to ensure session context updates without unused var warning const handleSelectUser = (id: string, roles: RoleName[]) => { setRoles(roles); @@ -39,7 +46,6 @@ const Roles: NextPage = () => { const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); mutation.mutate({ roles, userIds }); - window.location.reload(); }; return ( @@ -99,10 +105,13 @@ const Roles: NextPage = () => {
+ {mutation.isSuccess && ( +

{t("roles-updated")}

+ )}
diff --git a/src/pages/qr/index.tsx b/src/pages/qr/index.tsx index ab5cdacc..55db5540 100644 --- a/src/pages/qr/index.tsx +++ b/src/pages/qr/index.tsx @@ -38,6 +38,7 @@ const QR = ({ encryptedId }: { encryptedId: string }) => { const [error, setError] = useState(""); const [menuOptions, setMenuOptions] = useState([]); const [display, setDisplay] = useState(<>); + const [force, setForce] = useState(0); const { data: events } = trpc.events.all.useQuery(); const { mutateAsync: presenceUpsertMutateAsync } = trpc.presence.upsert.useMutation(); @@ -56,10 +57,11 @@ const QR = ({ encryptedId }: { encryptedId: string }) => { setMenuOptions([DEFAULT_ACTION, ...validEvents]); }, [events]); - // Reload page to re-render a new QRScanner + // Replace language change full page reload with local state trigger to re-render useEffect(() => { const handleLanguageChange = () => { - window.location.reload(); + // trigger local rerender instead of full reload + setForce(f => f + 1); }; i18n.on("languageChanged", handleLanguageChange); @@ -158,12 +160,13 @@ const QR = ({ encryptedId }: { encryptedId: string }) => {
<>