diff --git a/app/dashboard/leaderboard/page.tsx b/app/dashboard/leaderboard/page.tsx index d88d78a..4af1ec5 100644 --- a/app/dashboard/leaderboard/page.tsx +++ b/app/dashboard/leaderboard/page.tsx @@ -1,4 +1,5 @@ import Leaderboard from '@/ui/Leaderboard'; +import { cookies } from 'next/headers'; export const metadata = { title: 'Tableau des scores', @@ -6,5 +7,6 @@ export const metadata = { }; export default async function Page() { - return ; + const token = cookies().get('token')?.value; + return ; } diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx index 28e2b3e..3fa8b8e 100644 --- a/app/dashboard/page.tsx +++ b/app/dashboard/page.tsx @@ -1,104 +1,99 @@ 'use client'; +import { useContext } from 'react'; + import { UserContext } from '@/context/user'; import Card from '@/ui/Card'; -import { useContext } from 'react'; export default function Page() { const { data: me, isLoading } = useContext(UserContext); return ( -
-
-
-
-

Tableau de bord

-

Ceci est la page d'accueil du dashboard

-
-
- - - -
-
-
-
-
-
-

Guides

-
-
- Work in progress -
-
-
-
-

Historiques

-
-
- Work in progress -
-
-
- {/* TODO fix ça c'est pas responsive */} - {/*
-
-

Statistiques

-

Ceci est la page d'accueil du dashboard

-
-
- +
+

Tableau de bord

+

Ceci est la page d'accueil du dashboard

+
+
+
+ - -
-
*/} -
+ + +
+
+
+

Derniers puzzles

+

+ Voici les derniers puzzles que vous avez résolus ou essayer de résoudres +

+
+
+
    + {me?.completionsList && me.completionsList.length > 0 ? ( + me?.completionsList + .sort( + (a, b) => + a.score - b.score || + a.tries - b.tries || + a.puzzleName.localeCompare(b.puzzleName) + ) + .map((completion, key) => { + return ( +
  • +
    +
    + {completion.puzzleName} +
    +
    +
    +
    + + Essai{completion.tries > 1 ? 's' : ''} + + + {completion.tries} + +
    +
    + Score + + {completion.score} + +
    +
    +
  • + ); + }) + ) : ( +
  • + + {isLoading ? 'Chargement en cours...' : 'Aucun puzzles'} + +
  • + )} +
+
+
+
+ + ); } diff --git a/app/logout/page.tsx b/app/logout/page.tsx index 96e3e7b..509e0b7 100644 --- a/app/logout/page.tsx +++ b/app/logout/page.tsx @@ -8,7 +8,7 @@ export default function Page() { useEffect(() => { router.push('/'); - }, []); + }, [router]); return <>; } diff --git a/lib/fetcher.ts b/lib/fetcher.ts deleted file mode 100644 index 1803a9c..0000000 --- a/lib/fetcher.ts +++ /dev/null @@ -1,12 +0,0 @@ -import axios from 'axios'; - -const fetcher = axios.create({ - baseURL: process.env.NEXT_PUBLIC_API_URL, - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json' - }, - insecureHTTPParser: true -}); - -export default fetcher; diff --git a/lib/nav-items.ts b/lib/nav-items.ts index 27f1e2d..8e2aecb 100644 --- a/lib/nav-items.ts +++ b/lib/nav-items.ts @@ -20,33 +20,33 @@ export type NavItem = { * @type {NavItem[]} */ export const navItems: NavItem[] = [ - // { - // name: 'Dashboard', - // slug: '', - // icon: 'dashboard-line', - // disabled: false - // }, + { + name: 'Dashboard', + slug: 'dashboard', + icon: 'dashboard-line', + disabled: false + }, { name: 'Classement', - slug: 'leaderboard', + slug: 'dashboard/leaderboard', icon: 'line-chart-line', disabled: false }, { name: 'Puzzles', - slug: 'puzzles', + slug: 'dashboard/puzzles', icon: 'code-s-slash-line', disabled: false }, { name: 'Badges', - slug: 'badges', + slug: 'dashboard/badges', icon: 'award-fill', disabled: false }, { name: 'Paramètres', - slug: 'settings', + slug: 'dashboard/settings', icon: 'equalizer-line', disabled: false } diff --git a/lib/players.ts b/lib/players.ts index 9cf09d3..5ea73de 100644 --- a/lib/players.ts +++ b/lib/players.ts @@ -38,6 +38,7 @@ export type Player = { tries: number; completions: number; rank: number; + completionsList: Completion[]; badges: Badge[] | null; }; @@ -46,3 +47,9 @@ export type Badge = { level: number; logo?: string; }; + +export type Completion = { + puzzleName: string; + tries: number; + score: number; +}; diff --git a/middleware.ts b/middleware.ts index 27ea001..a9e061c 100644 --- a/middleware.ts +++ b/middleware.ts @@ -1,4 +1,5 @@ import { NextResponse, type NextRequest } from 'next/server'; + import { getURL } from './lib/utils'; /** @@ -26,7 +27,7 @@ export async function middleware(req: NextRequest) { return res; } - if (isAuth && req.nextUrl.pathname === '/logout') { + if (isAuth && req.nextUrl.pathname.includes('logout')) { res.cookies.set('token', '', { path: '/', expires: new Date(0) @@ -34,21 +35,15 @@ export async function middleware(req: NextRequest) { } if (isAuth && req.nextUrl.pathname.includes('sign')) { - return NextResponse.redirect(getURL('/dashboard/puzzles')); + return NextResponse.redirect(getURL('/dashboard')); } - - // TODO REMOVE - if (isAuth && req.nextUrl.pathname.match(/^\/dashboard\/?$/)) { - return NextResponse.redirect(getURL('/dashboard/puzzles')); - } - return res; } export const config = { matcher: [ // On exclut les routes de l'API, les fichiers statiques, les images, les assets, le favicon et le service worker. - '/((?!api|_next/static|_next/image|assets|favicon|sw.js).*)' + '/((?!api|_next/static|_next/image|favicon.ico|assets|sw.js).*)' ] }; diff --git a/package.json b/package.json index 8fa298f..f4bd141 100644 --- a/package.json +++ b/package.json @@ -22,18 +22,16 @@ "dependencies": { "@radix-ui/react-dialog": "^1.0.3", "@radix-ui/react-popover": "^1.0.5", - "axios": "^1.3.4", "boring-avatars": "^1.7.0", "clsx": "^1.2.1", + "edge-csrf": "^1.0.3", "framer-motion": "^10.12.4", "js-cookie": "^3.0.1", - "next": "13.2.3", + "next": "13.3.1", "react": "18.2.0", - "react-confetti": "^6.1.0", "react-dom": "18.2.0", "react-hook-form": "^7.43.1", "react-markdown": "^8.0.5", - "react-use": "^17.4.0", "remark-breaks": "^3.0.2", "remark-gfm": "^3.0.1", "remixicon": "^2.5.0", @@ -51,12 +49,12 @@ "@typescript-eslint/parser": "^5.50.0", "autoprefixer": "^10.4.13", "eslint": "8.33.0", - "eslint-config-next": "13.2.3", + "eslint-config-next": "13.3.1", "eslint-config-prettier": "^8.6.0", "eslint-plugin-prettier": "^4.2.1", "postcss": "^8.4.21", "prettier": "^2.8.3", - "prettier-plugin-tailwindcss": "^0.2.2", + "prettier-plugin-tailwindcss": "^0.2.7", "tailwindcss": "^3.2.4", "typescript": "4.9.5" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 19c672a..cd2c1a7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,15 +7,15 @@ dependencies: '@radix-ui/react-popover': specifier: ^1.0.5 version: 1.0.5(@types/react@18.0.27)(react-dom@18.2.0)(react@18.2.0) - axios: - specifier: ^1.3.4 - version: 1.3.5 boring-avatars: specifier: ^1.7.0 version: 1.7.0 clsx: specifier: ^1.2.1 version: 1.2.1 + edge-csrf: + specifier: ^1.0.3 + version: 1.0.3(next@13.3.1) framer-motion: specifier: ^10.12.4 version: 10.12.4(react-dom@18.2.0)(react@18.2.0) @@ -23,14 +23,11 @@ dependencies: specifier: ^3.0.1 version: 3.0.1 next: - specifier: 13.2.3 - version: 13.2.3(react-dom@18.2.0)(react@18.2.0) + specifier: 13.3.1 + version: 13.3.1(react-dom@18.2.0)(react@18.2.0) react: specifier: 18.2.0 version: 18.2.0 - react-confetti: - specifier: ^6.1.0 - version: 6.1.0(react@18.2.0) react-dom: specifier: 18.2.0 version: 18.2.0(react@18.2.0) @@ -40,9 +37,6 @@ dependencies: react-markdown: specifier: ^8.0.5 version: 8.0.6(@types/react@18.0.27)(react@18.2.0) - react-use: - specifier: ^17.4.0 - version: 17.4.0(react-dom@18.2.0)(react@18.2.0) remark-breaks: specifier: ^3.0.2 version: 3.0.2 @@ -91,8 +85,8 @@ devDependencies: specifier: 8.33.0 version: 8.33.0 eslint-config-next: - specifier: 13.2.3 - version: 13.2.3(eslint@8.33.0)(typescript@4.9.5) + specifier: 13.3.1 + version: 13.3.1(eslint@8.33.0)(typescript@4.9.5) eslint-config-prettier: specifier: ^8.6.0 version: 8.8.0(eslint@8.33.0) @@ -106,7 +100,7 @@ devDependencies: specifier: ^2.8.3 version: 2.8.7 prettier-plugin-tailwindcss: - specifier: ^0.2.2 + specifier: ^0.2.7 version: 0.2.7(prettier@2.8.7) tailwindcss: specifier: ^3.2.4 @@ -212,36 +206,18 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@next/env@13.2.3: - resolution: {integrity: sha512-FN50r/E+b8wuqyRjmGaqvqNDuWBWYWQiigfZ50KnSFH0f+AMQQyaZl+Zm2+CIpKk0fL9QxhLxOpTVA3xFHgFow==} + /@next/env@13.3.1: + resolution: {integrity: sha512-EDtCoedIZC7JlUQ3uaQpSc4aVmyhbLHmQVALg7pFfQgOTjgSnn7mKtA0DiCMkYvvsx6aFb5octGMtWrOtGXW9A==} dev: false - /@next/eslint-plugin-next@13.2.3: - resolution: {integrity: sha512-QmMPItnU7VeojI1KnuwL9SLFWEwmaNHNlnOGpoTwdLoSiP9sc8KYiAHWEc4/44L+cAdCxcZYvn7frcRNP5l84Q==} + /@next/eslint-plugin-next@13.3.1: + resolution: {integrity: sha512-Hpd74UrYGF+bq9bBSRDXRsRfaWkPpcwjhvachy3sr/R/5fY6feC0T0s047pUthyqcaeNsqKOY1nUGQQJNm4WyA==} dependencies: glob: 7.1.7 dev: true - /@next/swc-android-arm-eabi@13.2.3: - resolution: {integrity: sha512-mykdVaAXX/gm+eFO2kPeVjnOCKwanJ9mV2U0lsUGLrEdMUifPUjiXKc6qFAIs08PvmTMOLMNnUxqhGsJlWGKSw==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@next/swc-android-arm64@13.2.3: - resolution: {integrity: sha512-8XwHPpA12gdIFtope+n9xCtJZM3U4gH4vVTpUwJ2w1kfxFmCpwQ4xmeGSkR67uOg80yRMuF0h9V1ueo05sws5w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@next/swc-darwin-arm64@13.2.3: - resolution: {integrity: sha512-TXOubiFdLpMfMtaRu1K5d1I9ipKbW5iS2BNbu8zJhoqrhk3Kp7aRKTxqFfWrbliAHhWVE/3fQZUYZOWSXVQi1w==} + /@next/swc-darwin-arm64@13.3.1: + resolution: {integrity: sha512-UXPtriEc/pBP8luSLSCZBcbzPeVv+SSjs9cH/KygTbhmACye8/OOXRZO13Z2Wq1G0gLmEAIHQAOuF+vafPd2lw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -249,8 +225,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64@13.2.3: - resolution: {integrity: sha512-GZctkN6bJbpjlFiS5pylgB2pifHvgkqLAPumJzxnxkf7kqNm6rOGuNjsROvOWVWXmKhrzQkREO/WPS2aWsr/yw==} + /@next/swc-darwin-x64@13.3.1: + resolution: {integrity: sha512-lT36yYxosCfLtplFzJWgo0hrPu6/do8+msgM7oQkPeohDNdhjtjFUgOOwdSnPublLR6Mo2Ym4P/wl5OANuD2bw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -258,26 +234,8 @@ packages: dev: false optional: true - /@next/swc-freebsd-x64@13.2.3: - resolution: {integrity: sha512-rK6GpmMt/mU6MPuav0/M7hJ/3t8HbKPCELw/Uqhi4732xoq2hJ2zbo2FkYs56y6w0KiXrIp4IOwNB9K8L/q62g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-arm-gnueabihf@13.2.3: - resolution: {integrity: sha512-yeiCp/Odt1UJ4KUE89XkeaaboIDiVFqKP4esvoLKGJ0fcqJXMofj4ad3tuQxAMs3F+qqrz9MclqhAHkex1aPZA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-arm64-gnu@13.2.3: - resolution: {integrity: sha512-/miIopDOUsuNlvjBjTipvoyjjaxgkOuvlz+cIbbPcm1eFvzX2ltSfgMgty15GuOiR8Hub4FeTSiq3g2dmCkzGA==} + /@next/swc-linux-arm64-gnu@13.3.1: + resolution: {integrity: sha512-wRb76nLWJhonH8s3kxC/1tFguEkeOPayIwe9mkaz1G/yeS3OrjeyKMJsb4+Kdg0zbTo53bNCOl59NNtDM7yyyw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -285,8 +243,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl@13.2.3: - resolution: {integrity: sha512-sujxFDhMMDjqhruup8LLGV/y+nCPi6nm5DlFoThMJFvaaKr/imhkXuk8uCTq4YJDbtRxnjydFv2y8laBSJVC2g==} + /@next/swc-linux-arm64-musl@13.3.1: + resolution: {integrity: sha512-qz3BzjJRZ16Iq/jrp+pjiYOc0jTjHlfmxQmZk9x/+5uhRP6/eWQSTAPVJ33BMo6oK5O5N4644OgTAbzXzorecg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -294,8 +252,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu@13.2.3: - resolution: {integrity: sha512-w5MyxPknVvC9LVnMenAYMXMx4KxPwXuJRMQFvY71uXg68n7cvcas85U5zkdrbmuZ+JvsO5SIG8k36/6X3nUhmQ==} + /@next/swc-linux-x64-gnu@13.3.1: + resolution: {integrity: sha512-6mgkLmwlyWlomQmpl21I3hxgqE5INoW4owTlcLpNsd1V4wP+J46BlI/5zV5KWWbzjfncIqzXoeGs5Eg+1GHODA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -303,8 +261,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl@13.2.3: - resolution: {integrity: sha512-CTeelh8OzSOVqpzMFMFnVRJIFAFQoTsI9RmVJWW/92S4xfECGcOzgsX37CZ8K982WHRzKU7exeh7vYdG/Eh4CA==} + /@next/swc-linux-x64-musl@13.3.1: + resolution: {integrity: sha512-uqm5sielhQmKJM+qayIhgZv1KlS5pqTdQ99b+Z7hMWryXS96qE0DftTmMZowBcUL6x7s2vSXyH5wPtO1ON7LBg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -312,8 +270,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc@13.2.3: - resolution: {integrity: sha512-7N1KBQP5mo4xf52cFCHgMjzbc9jizIlkTepe9tMa2WFvEIlKDfdt38QYcr9mbtny17yuaIw02FXOVEytGzqdOQ==} + /@next/swc-win32-arm64-msvc@13.3.1: + resolution: {integrity: sha512-WomIiTj/v3LevltlibNQKmvrOymNRYL+a0dp5R73IwPWN5FvXWwSELN/kiNALig/+T3luc4qHNTyvMCp9L6U5Q==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -321,8 +279,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc@13.2.3: - resolution: {integrity: sha512-LzWD5pTSipUXTEMRjtxES/NBYktuZdo7xExJqGDMnZU8WOI+v9mQzsmQgZS/q02eIv78JOCSemqVVKZBGCgUvA==} + /@next/swc-win32-ia32-msvc@13.3.1: + resolution: {integrity: sha512-M+PoH+0+q658wRUbs285RIaSTYnGBSTdweH/0CdzDgA6Q4rBM0sQs4DHmO3BPP0ltCO/vViIoyG7ks66XmCA5g==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -330,8 +288,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc@13.2.3: - resolution: {integrity: sha512-aLG2MaFs4y7IwaMTosz2r4mVbqRyCnMoFqOcmfTi7/mAS+G4IMH0vJp4oLdbshqiVoiVuKrAfqtXj55/m7Qu1Q==} + /@next/swc-win32-x64-msvc@13.3.1: + resolution: {integrity: sha512-Sl1F4Vp5Z1rNXWZYqJwMuWRRol4bqOB6+/d7KqkgQ4AcafKPN1PZmpkCoxv4UFHtFNIB7EotnuIhtXu3zScicQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -650,8 +608,8 @@ packages: resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} dev: true - /@swc/helpers@0.4.14: - resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} + /@swc/helpers@0.5.0: + resolution: {integrity: sha512-SjY/p4MmECVVEWspzSRpQEM3sjR17sP8PbGxELWrT+YZMBfiUyt1MRUNjMV23zohwlG2HYtCQOsCwsTHguXkyg==} dependencies: tslib: 2.5.0 dev: false @@ -677,10 +635,6 @@ packages: '@types/unist': 2.0.6 dev: false - /@types/js-cookie@2.2.7: - resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} - dev: false - /@types/js-cookie@3.0.3: resolution: {integrity: sha512-Xe7IImK09HP1sv2M/aI+48a20VX+TdRJucfq4vfRVy6nWN8PYPOEnlMRSgxJAgYQIXJVL8dZ4/ilAM7dWNaOww==} dev: true @@ -864,10 +818,6 @@ packages: eslint-visitor-keys: 3.4.0 dev: true - /@xobotyi/scrollbar-width@1.9.5: - resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} - dev: false - /acorn-jsx@5.3.2(acorn@8.8.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -993,10 +943,6 @@ packages: resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} dev: true - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false - /autoprefixer@10.4.14(postcss@8.4.21): resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} engines: {node: ^10 || ^12 || >=14} @@ -1023,16 +969,6 @@ packages: engines: {node: '>=4'} dev: true - /axios@1.3.5: - resolution: {integrity: sha512-glL/PvG/E+xCWwV8S6nCHcrfg1exGx7vxyUIivIA1iL7BIh6bePylCfVHwp6k13ao7SATxB6imau2kqY+I67kw==} - dependencies: - follow-redirects: 1.15.2 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: false - /axobject-query@3.1.1: resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} dependencies: @@ -1081,6 +1017,13 @@ packages: update-browserslist-db: 1.0.10(browserslist@4.21.5) dev: true + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: @@ -1152,13 +1095,6 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: false - /comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: false @@ -1172,12 +1108,6 @@ packages: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /copy-to-clipboard@3.3.3: - resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} - dependencies: - toggle-selection: 1.0.6 - dev: false - /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1187,20 +1117,6 @@ packages: which: 2.0.2 dev: true - /css-in-js-utils@3.1.0: - resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} - dependencies: - hyphenate-style-name: 1.0.4 - dev: false - - /css-tree@1.1.3: - resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} - engines: {node: '>=8.0.0'} - dependencies: - mdn-data: 2.0.14 - source-map: 0.6.1 - dev: false - /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -1281,11 +1197,6 @@ packages: object-keys: 1.1.1 dev: true - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: false - /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -1329,6 +1240,14 @@ packages: esutils: 2.0.3 dev: true + /edge-csrf@1.0.3(next@13.3.1): + resolution: {integrity: sha512-miYuAv+tLaKw+niVD8Os5zQcMOB4Sdc748DKz3w6VIkou+WU2GHCUeL3fn9NyNeHAfNsUrOTB9Y/zlBVmnSTEQ==} + peerDependencies: + next: ^13.0.0 + dependencies: + next: 13.3.1(react-dom@18.2.0)(react@18.2.0) + dev: false + /electron-to-chromium@1.4.356: resolution: {integrity: sha512-nEftV1dRX3omlxAj42FwqRZT0i4xd2dIg39sog/CnCJeCcL1TRd2Uh0i9Oebgv8Ou0vzTPw++xc+Z20jzS2B6A==} dev: true @@ -1345,12 +1264,6 @@ packages: tapable: 2.2.1 dev: true - /error-stack-parser@2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - dependencies: - stackframe: 1.3.4 - dev: false - /es-abstract@1.21.2: resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} engines: {node: '>= 0.4'} @@ -1444,8 +1357,8 @@ packages: engines: {node: '>=12'} dev: false - /eslint-config-next@13.2.3(eslint@8.33.0)(typescript@4.9.5): - resolution: {integrity: sha512-kPulHiQEHGei9hIaaNGygHRc0UzlWM+3euOmYbxNkd2Nbhci5rrCDeMBMPSV8xgUssphDGmwDHWbk4VZz3rlZQ==} + /eslint-config-next@13.3.1(eslint@8.33.0)(typescript@4.9.5): + resolution: {integrity: sha512-DieA5djybeE3Q0IqnDXihmhgRSp44x1ywWBBpVRA9pSx+m5Icj8hFclx7ffXlAvb9MMLN6cgj/hqJ4lka/QmvA==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 typescript: '>=3.3.1' @@ -1453,7 +1366,7 @@ packages: typescript: optional: true dependencies: - '@next/eslint-plugin-next': 13.2.3 + '@next/eslint-plugin-next': 13.3.1 '@rushstack/eslint-patch': 1.2.0 '@typescript-eslint/parser': 5.57.1(eslint@8.33.0)(typescript@4.9.5) eslint: 8.33.0 @@ -1778,6 +1691,7 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true /fast-diff@1.2.0: resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} @@ -1802,18 +1716,6 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fast-loops@1.1.3: - resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==} - dev: false - - /fast-shallow-equal@1.0.0: - resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} - dev: false - - /fastest-stable-stringify@2.0.2: - resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} - dev: false - /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: @@ -1854,31 +1756,12 @@ packages: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true - /follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false - /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 dev: true - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - /fraction.js@4.2.0: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} dev: true @@ -2105,10 +1988,6 @@ packages: resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} dev: false - /hyphenate-style-name@1.0.4: - resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} - dev: false - /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} @@ -2142,13 +2021,6 @@ packages: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} dev: false - /inline-style-prefixer@6.0.4: - resolution: {integrity: sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==} - dependencies: - css-in-js-utils: 3.1.0 - fast-loops: 1.1.3 - dev: false - /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} @@ -2353,10 +2225,6 @@ packages: hasBin: true dev: true - /js-cookie@2.2.1: - resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} - dev: false - /js-cookie@3.0.1: resolution: {integrity: sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==} engines: {node: '>=12'} @@ -2594,10 +2462,6 @@ packages: '@types/mdast': 3.0.11 dev: false - /mdn-data@2.0.14: - resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} - dev: false - /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -2860,18 +2724,6 @@ packages: picomatch: 2.3.1 dev: true - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: false - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: false - /mini-svg-data-uri@1.4.4: resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} hasBin: true @@ -2907,24 +2759,6 @@ packages: thenify-all: 1.6.0 dev: true - /nano-css@5.3.5(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==} - peerDependencies: - react: '*' - react-dom: '*' - dependencies: - css-tree: 1.1.3 - csstype: 3.1.2 - fastest-stable-stringify: 2.0.2 - inline-style-prefixer: 6.0.4 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - rtl-css-js: 1.16.1 - sourcemap-codec: 1.4.8 - stacktrace-js: 2.0.2 - stylis: 4.1.3 - dev: false - /nanoid@3.3.6: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -2938,12 +2772,12 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /next@13.2.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-nKFJC6upCPN7DWRx4+0S/1PIOT7vNlCT157w9AzbXEgKy6zkiPKEt5YyRUsRZkmpEqBVrGgOqNfwecTociyg+w==} - engines: {node: '>=14.6.0'} + /next@13.3.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-eByWRxPzKHs2oQz1yE41LX35umhz86ZSZ+mYyXBqn2IBi2hyUqxBA88avywdr4uyH+hCJczegGsDGWbzQA5Rqw==} + engines: {node: '>=14.18.0'} hasBin: true peerDependencies: - '@opentelemetry/api': ^1.4.0 + '@opentelemetry/api': ^1.1.0 fibers: '>= 3.1.0' node-sass: ^6.0.0 || ^7.0.0 react: ^18.2.0 @@ -2959,27 +2793,24 @@ packages: sass: optional: true dependencies: - '@next/env': 13.2.3 - '@swc/helpers': 0.4.14 + '@next/env': 13.3.1 + '@swc/helpers': 0.5.0 + busboy: 1.6.0 caniuse-lite: 1.0.30001476 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) styled-jsx: 5.1.1(react@18.2.0) optionalDependencies: - '@next/swc-android-arm-eabi': 13.2.3 - '@next/swc-android-arm64': 13.2.3 - '@next/swc-darwin-arm64': 13.2.3 - '@next/swc-darwin-x64': 13.2.3 - '@next/swc-freebsd-x64': 13.2.3 - '@next/swc-linux-arm-gnueabihf': 13.2.3 - '@next/swc-linux-arm64-gnu': 13.2.3 - '@next/swc-linux-arm64-musl': 13.2.3 - '@next/swc-linux-x64-gnu': 13.2.3 - '@next/swc-linux-x64-musl': 13.2.3 - '@next/swc-win32-arm64-msvc': 13.2.3 - '@next/swc-win32-ia32-msvc': 13.2.3 - '@next/swc-win32-x64-msvc': 13.2.3 + '@next/swc-darwin-arm64': 13.3.1 + '@next/swc-darwin-x64': 13.3.1 + '@next/swc-linux-arm64-gnu': 13.3.1 + '@next/swc-linux-arm64-musl': 13.3.1 + '@next/swc-linux-x64-gnu': 13.3.1 + '@next/swc-linux-x64-musl': 13.3.1 + '@next/swc-win32-arm64-msvc': 13.3.1 + '@next/swc-win32-ia32-msvc': 13.3.1 + '@next/swc-win32-x64-msvc': 13.3.1 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -3322,10 +3153,6 @@ packages: resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} dev: false - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: false - /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} @@ -3340,16 +3167,6 @@ packages: engines: {node: '>=10'} dev: true - /react-confetti@6.1.0(react@18.2.0): - resolution: {integrity: sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==} - engines: {node: '>=10.18'} - peerDependencies: - react: ^16.3.0 || ^17.0.1 || ^18.0.0 - dependencies: - react: 18.2.0 - tween-functions: 1.2.0 - dev: false - /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: @@ -3455,40 +3272,6 @@ packages: tslib: 2.5.0 dev: false - /react-universal-interface@0.6.2(react@18.2.0)(tslib@2.5.0): - resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} - peerDependencies: - react: '*' - tslib: '*' - dependencies: - react: 18.2.0 - tslib: 2.5.0 - dev: false - - /react-use@17.4.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@types/js-cookie': 2.2.7 - '@xobotyi/scrollbar-width': 1.9.5 - copy-to-clipboard: 3.3.3 - fast-deep-equal: 3.1.3 - fast-shallow-equal: 1.0.0 - js-cookie: 2.2.1 - nano-css: 5.3.5(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-universal-interface: 0.6.2(react@18.2.0)(tslib@2.5.0) - resize-observer-polyfill: 1.5.1 - screenfull: 5.2.0 - set-harmonic-interval: 1.0.1 - throttle-debounce: 3.0.1 - ts-easing: 0.2.0 - tslib: 2.5.0 - dev: false - /react@18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} @@ -3568,10 +3351,6 @@ packages: resolution: {integrity: sha512-q54ra2QutYDZpuSnFjmeagmEiN9IMo56/zz5dDNitzKD23oFRw77cWo4TsrAdmdkPiEn8mxlrTqxnkujDbEGww==} dev: false - /resize-observer-polyfill@1.5.1: - resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} - dev: false - /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3607,12 +3386,6 @@ packages: glob: 7.2.3 dev: true - /rtl-css-js@1.16.1: - resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} - dependencies: - '@babel/runtime': 7.21.0 - dev: false - /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -3640,11 +3413,6 @@ packages: loose-envify: 1.4.0 dev: false - /screenfull@5.2.0: - resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} - engines: {node: '>=0.10.0'} - dev: false - /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true @@ -3658,11 +3426,6 @@ packages: lru-cache: 6.0.0 dev: true - /set-harmonic-interval@1.0.1: - resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} - engines: {node: '>=6.9'} - dev: false - /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -3697,50 +3460,10 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - /source-map@0.5.6: - resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} - engines: {node: '>=0.10.0'} - dev: false - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: false - - /sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: false - /space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} dev: false - /stack-generator@2.0.10: - resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} - dependencies: - stackframe: 1.3.4 - dev: false - - /stackframe@1.3.4: - resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - dev: false - - /stacktrace-gps@3.1.2: - resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} - dependencies: - source-map: 0.5.6 - stackframe: 1.3.4 - dev: false - - /stacktrace-js@2.0.2: - resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} - dependencies: - error-stack-parser: 2.1.4 - stack-generator: 2.0.10 - stacktrace-gps: 3.1.2 - dev: false - /stop-iteration-iterator@1.0.0: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} @@ -3748,6 +3471,11 @@ packages: internal-slot: 1.0.5 dev: true + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false + /string.prototype.matchall@4.0.8: resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} dependencies: @@ -3826,10 +3554,6 @@ packages: react: 18.2.0 dev: false - /stylis@4.1.3: - resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} - dev: false - /sucrase@3.31.0: resolution: {integrity: sha512-6QsHnkqyVEzYcaiHsOKkzOtOgdJcb8i54x6AV2hDwyZcY9ZyykGZVw6L/YN98xC0evwTP6utsWWrKRaa8QlfEQ==} engines: {node: '>=8'} @@ -3933,11 +3657,6 @@ packages: any-promise: 1.3.0 dev: true - /throttle-debounce@3.0.1: - resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} - engines: {node: '>=10'} - dev: false - /tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} dependencies: @@ -3952,10 +3671,6 @@ packages: is-number: 7.0.0 dev: true - /toggle-selection@1.0.6: - resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} - dev: false - /trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} dev: false @@ -3964,10 +3679,6 @@ packages: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} dev: false - /ts-easing@0.2.0: - resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} - dev: false - /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true @@ -3998,10 +3709,6 @@ packages: typescript: 4.9.5 dev: true - /tween-functions@1.2.0: - resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==} - dev: false - /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} diff --git a/ui/AppLink.tsx b/ui/AppLink.tsx index 018d898..6bcd38e 100644 --- a/ui/AppLink.tsx +++ b/ui/AppLink.tsx @@ -7,9 +7,6 @@ const AppLink = forwardRef[0]>((props if (props.target === '_blank') { return ; } - if (props['aria-disabled']) { - return ; - } return ; }); diff --git a/ui/Card.tsx b/ui/Card.tsx index be78a5b..e8dbb01 100644 --- a/ui/Card.tsx +++ b/ui/Card.tsx @@ -1,23 +1,28 @@ +import { getURL } from '@/lib/utils'; + +import AppLink from './AppLink'; import Icon from './Icon'; export default function Card({ isLoading, icon, title, - data + data, + link }: { isLoading: boolean; icon: string; title: string; data: any; + link?: string; }) { if (isLoading) return (
- - + +
); @@ -25,9 +30,19 @@ export default function Card({ return (
-
-

{data}

-

{title}

+
+
+

{data}

+

{title}

+
+ {link && ( + + + + )}
); diff --git a/ui/CardTable.tsx b/ui/CardTable.tsx deleted file mode 100644 index 6a4afca..0000000 --- a/ui/CardTable.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { type Puzzle } from '@/lib/puzzles'; - -import AppLink from './AppLink'; - -export default function CardTable({ puzzles }: { puzzles: Puzzle[] }) { - return ( - <> - //
- // - // {/* - // - // - // - // - // - // - // - // */} - // - // {puzzles.length && - // puzzles.map((puzzle) => ( - // - // - // - // - // - // - // - // ))} - // - //
ExerciceTentativeScoreDernier essai - // Reprendre - //
- // {puzzle.name} - // 3030010/10/2010 - // - // Reprendre - // - //
- //
- ); -} diff --git a/ui/Leaderboard.tsx b/ui/Leaderboard.tsx index 25b74ac..a0dd8f3 100644 --- a/ui/Leaderboard.tsx +++ b/ui/Leaderboard.tsx @@ -1,37 +1,40 @@ 'use client'; import { AnimatePresence, motion } from 'framer-motion'; -import useSWRSubscription, { type SWRSubscription } from 'swr/subscription'; -import { type ScoreEvent } from '@/lib/leaderboard'; +import { useLeaderboardEvent } from '@/lib/hooks/use-leaderboard'; import { cn } from '@/lib/utils'; import Podium from '@/ui/events/podium/Podium'; import { Timer } from './Timer'; +import { type ScoreEvent } from '@/lib/leaderboard'; +import useSWRSubscription, { type SWRSubscription } from 'swr/subscription'; const SCORE_COLORS = ['text-yellow-400', 'text-gray-400', 'text-orange-400']; -export default function Leaderboard() { +export default function Leaderboard({ token }: { token: string }) { // TODO CHANGER CECI const CHAPITRE_EVENT = 1; - const subscription: SWRSubscription = (key, { next }) => { - const socket = new WebSocket(key); + // const subscription: SWRSubscription = (key, { next }) => { + // const socket = new WebSocket(key); - socket.addEventListener('message', (event) => { - next(null, JSON.parse(event.data)); - }); + // socket.addEventListener('message', (event) => { + // next(null, JSON.parse(event.data)); + // }); - socket.addEventListener('error', (event) => { - console.error(event); - }); + // socket.addEventListener('error', (event) => { + // console.error(event); + // }); - return () => socket.close(); - }; + // return () => socket.close(); + // }; - const { data } = useSWRSubscription( - `wss://${process.env.NEXT_PUBLIC_API_URL?.split('//')[1]}/rleaderboard/${CHAPITRE_EVENT}`, - subscription - ); + // const { data } = useSWRSubscription( + // `wss://${process.env.NEXT_PUBLIC_API_URL?.split('//')[1]}/rleaderboard/${CHAPITRE_EVENT}`, + // subscription + // ); + + const { data, isLoading } = useLeaderboardEvent({ token: token, id: CHAPITRE_EVENT }); const scores = [data?.groups] .flat() @@ -60,8 +63,8 @@ export default function Leaderboard() { const tries = group.players.reduce((a, b) => a + b.tries, 0) || 0; return (
- + {group.rank}
{group.name} - + {group.players && group.players.length > 1 ? group.players .map((player) => player.pseudo || 'Anonyme') @@ -89,15 +97,15 @@ export default function Leaderboard() {
{/*
Puzzle{puzzles > 1 ? 's' : ''} - {puzzles} + {puzzles}
*/}
Essai{tries > 1 ? 's' : ''} - {tries} + {tries}
Score - + {group.players.reduce((a, b) => a + b.score, 0)}
diff --git a/ui/Puzzles.tsx b/ui/Puzzles.tsx index ffa520e..5246b30 100644 --- a/ui/Puzzles.tsx +++ b/ui/Puzzles.tsx @@ -257,14 +257,14 @@ function PuzzleProp({ puzzle, chapter }: { puzzle: Puzzle; chapter: Chapter }) { {puzzle.tags .filter((tag) => !['easy', 'medium', 'hard'].includes(tag.name)) .map((tag, i) => ( - + {tag.name} ))}
)}
@@ -292,7 +292,7 @@ function PuzzleProp({ puzzle, chapter }: { puzzle: Puzzle; chapter: Chapter }) {
)}
diff --git a/ui/Timer.tsx b/ui/Timer.tsx index 3e50744..7f63c3b 100644 --- a/ui/Timer.tsx +++ b/ui/Timer.tsx @@ -1,7 +1,5 @@ import clsx from 'clsx'; import { useEffect, useReducer } from 'react'; -import { useWindowSize } from 'react-use'; -import Confetti from 'react-confetti'; type State = { hours: number; @@ -24,8 +22,6 @@ function reducer(state: State, action: Action): State { } export function Timer({ targetDate, className }: { targetDate: Date; className?: string }) { - const { width, height } = useWindowSize(); - const [timeRemaining, dispatch] = useReducer(reducer, { hours: 0, minutes: 0, @@ -52,7 +48,6 @@ export function Timer({ targetDate, className }: { targetDate: Date; className?: if (timeRemaining.hours < 0) { return ( <> - {/* */} Terminé ); diff --git a/ui/ToHTML.tsx b/ui/ToHTML.tsx index 76ec86d..d4396e0 100644 --- a/ui/ToHTML.tsx +++ b/ui/ToHTML.tsx @@ -13,7 +13,7 @@ export default function ToHTML({ data, className }: { data: string; className?: a: ({ node, ...props }) => (
{!isSignIn && ( <> diff --git a/ui/dashboard/Sidenav.tsx b/ui/dashboard/Sidenav.tsx index 39cf498..77c3ec4 100644 --- a/ui/dashboard/Sidenav.tsx +++ b/ui/dashboard/Sidenav.tsx @@ -90,13 +90,12 @@ function NavItem({ onClick?: () => void; }) { const segment = useSelectedLayoutSegment(); - const pathname = segment?.split('/').pop() || ''; const isHttp = item.slug.includes('http'); - const isActive = pathname === item.slug || (item.slug === '' && !segment); + const pathname = item.slug.split('/').pop(); + const isActive = segment === pathname || (segment === null && pathname === 'dashboard'); return (