diff --git a/backend/bun.lockb b/backend/bun.lockb index e507ff5..6bcabc8 100755 Binary files a/backend/bun.lockb and b/backend/bun.lockb differ diff --git a/backend/package-lock.json b/backend/package-lock.json new file mode 100644 index 0000000..0029d92 --- /dev/null +++ b/backend/package-lock.json @@ -0,0 +1,1531 @@ +{ + "name": "fitplanconnect-backend", + "version": "1.0.50", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "fitplanconnect-backend", + "version": "1.0.50", + "license": "MIT", + "dependencies": { + "@elysiajs/cors": "^1.0.2", + "@elysiajs/swagger": "^1.0.3", + "@lucia-auth/adapter-drizzle": "^1.0.7", + "@neondatabase/serverless": "^0.9.1", + "@paralleldrive/cuid2": "^2.2.2", + "arctic": "^1.8.0", + "dotenv": "^16.4.5", + "drizzle-orm": "^0.30.9", + "drizzle-typebox": "^0.1.1", + "elysia": "latest", + "elysia-autoload": "^0.2.3", + "elysia-compression": "^0.0.7", + "elysia-decorators": "^1.0.0", + "elysia-rate-limit": "^3.2.2", + "logestic": "^1.1.1", + "lucia": "^3.2.0", + "pg": "^8.11.5", + "postgres": "^3.4.4", + "react": "^18.3.1", + "studio": "^0.13.5", + "uuid": "^9.0.1" + }, + "devDependencies": { + "@types/pg": "^8.11.5", + "@types/uuid": "^9.0.8", + "bun-types": "latest", + "drizzle-kit": "^0.20.17", + "prettier": "^3.2.5", + "tsx": "^4.7.3" + } + }, + "node_modules/@elysiajs/cors": { + "version": "1.0.2", + "license": "MIT", + "peerDependencies": { + "elysia": ">= 1.0.2" + } + }, + "node_modules/@elysiajs/swagger": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "openapi-types": "^12.1.3" + }, + "peerDependencies": { + "elysia": ">= 1.0.2" + } + }, + "node_modules/@esbuild-kit/core-utils": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.18.20", + "source-map-support": "^0.5.21" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { + "version": "0.18.20", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/esm-loader": { + "version": "2.6.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@esbuild-kit/core-utils": "^3.3.2", + "get-tsconfig": "^4.7.0" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@hono/node-server": { + "version": "1.11.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.14.1" + } + }, + "node_modules/@hono/zod-validator": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "hono": ">=3.9.0", + "zod": "^3.19.1" + } + }, + "node_modules/@lucia-auth/adapter-drizzle": { + "version": "1.0.7", + "license": "MIT", + "peerDependencies": { + "lucia": "3.x" + } + }, + "node_modules/@neondatabase/serverless": { + "version": "0.9.1", + "license": "MIT", + "dependencies": { + "@types/pg": "8.6.6" + } + }, + "node_modules/@neondatabase/serverless/node_modules/@types/pg": { + "version": "8.6.6", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@neondatabase/serverless/node_modules/@types/pg/node_modules/pg-types": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@neondatabase/serverless/node_modules/@types/pg/node_modules/pg-types/node_modules/postgres-array": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@neondatabase/serverless/node_modules/@types/pg/node_modules/pg-types/node_modules/postgres-bytea": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@neondatabase/serverless/node_modules/@types/pg/node_modules/pg-types/node_modules/postgres-date": { + "version": "1.0.7", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@neondatabase/serverless/node_modules/@types/pg/node_modules/pg-types/node_modules/postgres-interval": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.4.0", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@node-rs/argon2": { + "version": "1.7.0", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@node-rs/argon2-android-arm-eabi": "1.7.0", + "@node-rs/argon2-android-arm64": "1.7.0", + "@node-rs/argon2-darwin-arm64": "1.7.0", + "@node-rs/argon2-darwin-x64": "1.7.0", + "@node-rs/argon2-freebsd-x64": "1.7.0", + "@node-rs/argon2-linux-arm-gnueabihf": "1.7.0", + "@node-rs/argon2-linux-arm64-gnu": "1.7.0", + "@node-rs/argon2-linux-arm64-musl": "1.7.0", + "@node-rs/argon2-linux-x64-gnu": "1.7.0", + "@node-rs/argon2-linux-x64-musl": "1.7.0", + "@node-rs/argon2-wasm32-wasi": "1.7.0", + "@node-rs/argon2-win32-arm64-msvc": "1.7.0", + "@node-rs/argon2-win32-ia32-msvc": "1.7.0", + "@node-rs/argon2-win32-x64-msvc": "1.7.0" + } + }, + "node_modules/@node-rs/argon2-darwin-arm64": { + "version": "1.7.0", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt": { + "version": "1.9.0", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@node-rs/bcrypt-android-arm-eabi": "1.9.0", + "@node-rs/bcrypt-android-arm64": "1.9.0", + "@node-rs/bcrypt-darwin-arm64": "1.9.0", + "@node-rs/bcrypt-darwin-x64": "1.9.0", + "@node-rs/bcrypt-freebsd-x64": "1.9.0", + "@node-rs/bcrypt-linux-arm-gnueabihf": "1.9.0", + "@node-rs/bcrypt-linux-arm64-gnu": "1.9.0", + "@node-rs/bcrypt-linux-arm64-musl": "1.9.0", + "@node-rs/bcrypt-linux-x64-gnu": "1.9.0", + "@node-rs/bcrypt-linux-x64-musl": "1.9.0", + "@node-rs/bcrypt-wasm32-wasi": "1.9.0", + "@node-rs/bcrypt-win32-arm64-msvc": "1.9.0", + "@node-rs/bcrypt-win32-ia32-msvc": "1.9.0", + "@node-rs/bcrypt-win32-x64-msvc": "1.9.0" + } + }, + "node_modules/@node-rs/bcrypt-darwin-arm64": { + "version": "1.9.0", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.2.2", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.32.22", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/pg": { + "version": "8.11.5", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^4.0.1" + } + }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/arctic": { + "version": "1.8.0", + "license": "MIT", + "dependencies": { + "oslo": "1.2.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/bun-types": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.1.9.tgz", + "integrity": "sha512-3YuLiH4Ne/ghk7K6mHiaqCqKOMrtB0Z5p1WAskHSVgi0iMZgsARV4yGkbfi565YsStvUq6GXTWB3ga7M8cznkA==", + "devOptional": true, + "dependencies": { + "@types/node": "~20.12.8", + "@types/ws": "~8.5.10" + } + }, + "node_modules/camelcase": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "5.3.0", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-color": { + "version": "2.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.64", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/commander": { + "version": "9.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/d": { + "version": "1.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/difflib": { + "version": "0.2.4", + "dev": true, + "dependencies": { + "heap": ">= 0.2.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dreamopt": { + "version": "0.8.0", + "dev": true, + "dependencies": { + "wordwrap": ">=0.0.2" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/drizzle-kit": { + "version": "0.20.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@esbuild-kit/esm-loader": "^2.5.5", + "@hono/node-server": "^1.9.0", + "@hono/zod-validator": "^0.2.0", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "commander": "^9.4.1", + "env-paths": "^3.0.0", + "esbuild": "^0.19.7", + "esbuild-register": "^3.5.0", + "glob": "^8.1.0", + "hanji": "^0.0.5", + "hono": "^4.1.4", + "json-diff": "0.9.0", + "minimatch": "^7.4.3", + "semver": "^7.5.4", + "superjson": "^2.2.1", + "zod": "^3.20.2" + }, + "bin": { + "drizzle-kit": "bin.cjs" + } + }, + "node_modules/drizzle-orm": { + "version": "0.30.9", + "license": "Apache-2.0", + "peerDependencies": { + "@aws-sdk/client-rds-data": ">=3", + "@cloudflare/workers-types": ">=3", + "@electric-sql/pglite": ">=0.1.1", + "@libsql/client": "*", + "@neondatabase/serverless": ">=0.1", + "@op-engineering/op-sqlite": ">=2", + "@opentelemetry/api": "^1.4.1", + "@planetscale/database": ">=1", + "@types/better-sqlite3": "*", + "@types/pg": "*", + "@types/react": ">=18", + "@types/sql.js": "*", + "@vercel/postgres": ">=0.8.0", + "@xata.io/client": "*", + "better-sqlite3": ">=7", + "bun-types": "*", + "expo-sqlite": ">=13.2.0", + "knex": "*", + "kysely": "*", + "mysql2": ">=2", + "pg": ">=8", + "postgres": ">=3", + "react": ">=18", + "sql.js": ">=1", + "sqlite3": ">=5" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-rds-data": { + "optional": true + }, + "@cloudflare/workers-types": { + "optional": true + }, + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@neondatabase/serverless": { + "optional": true + }, + "@op-engineering/op-sqlite": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@types/better-sqlite3": { + "optional": true + }, + "@types/pg": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "@types/sql.js": { + "optional": true + }, + "@vercel/postgres": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "bun-types": { + "optional": true + }, + "expo-sqlite": { + "optional": true + }, + "knex": { + "optional": true + }, + "kysely": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "postgres": { + "optional": true + }, + "react": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + } + } + }, + "node_modules/drizzle-typebox": { + "version": "0.1.1", + "license": "Apache-2.0", + "peerDependencies": { + "@sinclair/typebox": ">=0.17.6", + "drizzle-orm": ">=0.23.13" + } + }, + "node_modules/elysia": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/elysia/-/elysia-1.0.22.tgz", + "integrity": "sha512-bEdO6glElFciGvtYGzZoQ4mZyfTCNGm63jpCvPYIs+cC65i37qP93DFT+ZasB3s4m5HnavklCuXHKtuo5X2o8A==", + "dependencies": { + "@sinclair/typebox": "^0.32.15", + "cookie": "^0.6.0", + "eventemitter3": "^5.0.1", + "fast-decode-uri-component": "^1.0.1", + "fast-querystring": "^1.1.2", + "openapi-types": "^12.1.3" + }, + "peerDependencies": { + "@sinclair/typebox": ">= 0.31.0", + "openapi-types": ">= 12.0.0", + "typescript": ">= 5.0.0" + }, + "peerDependenciesMeta": { + "openapi-types": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/elysia-autoload": { + "version": "0.2.3", + "peerDependencies": { + "elysia": "^1.0.0" + } + }, + "node_modules/elysia-compression": { + "version": "0.0.7", + "license": "MIT", + "dependencies": { + "compressible": "2.0.18" + }, + "peerDependencies": { + "elysia": ">= 0.7.15" + } + }, + "node_modules/elysia-decorators": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "reflect-metadata": "^0.2.1" + } + }, + "node_modules/elysia-rate-limit": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "debug": "4.3.4", + "lru-cache": "10.2.0" + }, + "peerDependencies": { + "elysia": ">= 1.0.0" + } + }, + "node_modules/env-paths": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "dev": true, + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/esbuild": { + "version": "0.19.12", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/esbuild-register": { + "version": "3.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "license": "MIT" + }, + "node_modules/ext": { + "version": "1.7.0", + "dev": true, + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hanji": { + "version": "0.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "lodash.throttle": "^4.1.1", + "sisteransi": "^1.0.5" + } + }, + "node_modules/harmony-proxy": { + "version": "1.0.1", + "license": "LGPL-3.0" + }, + "node_modules/heap": { + "version": "0.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/hono": { + "version": "4.2.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/is-promise": { + "version": "2.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/is-what": { + "version": "4.1.16", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/json-diff": { + "version": "0.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-color": "^2.0.0", + "difflib": "~0.2.1", + "dreamopt": "~0.8.0" + }, + "bin": { + "json-diff": "bin/json-diff.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "license": "MIT" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/logestic": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0" + }, + "peerDependencies": { + "elysia": "^1.0.9", + "typescript": "^5.0.0" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "10.2.0", + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/lucia": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "oslo": "1.2.0" + } + }, + "node_modules/memoizee": { + "version": "0.4.15", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "7.4.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/next-tick": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/obuf": { + "version": "1.1.2", + "devOptional": true, + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "license": "MIT" + }, + "node_modules/oslo": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "@node-rs/argon2": "1.7.0", + "@node-rs/bcrypt": "1.9.0" + } + }, + "node_modules/pg": { + "version": "8.11.5", + "license": "MIT", + "dependencies": { + "pg-connection-string": "^2.6.4", + "pg-pool": "^3.6.2", + "pg-protocol": "^1.6.1", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.6.4", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-numeric": { + "version": "1.0.2", + "devOptional": true, + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/pg-pool": { + "version": "3.6.2", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.1", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "4.0.2", + "devOptional": true, + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "pg-numeric": "1.0.2", + "postgres-array": "~3.0.1", + "postgres-bytea": "~3.0.0", + "postgres-date": "~2.1.0", + "postgres-interval": "^3.0.0", + "postgres-range": "^1.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pg/node_modules/pg-types": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pg/node_modules/pg-types/node_modules/postgres-array": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pg/node_modules/pg-types/node_modules/postgres-bytea": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pg/node_modules/pg-types/node_modules/postgres-date": { + "version": "1.0.7", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pg/node_modules/pg-types/node_modules/postgres-interval": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/postgres": { + "version": "3.4.4", + "license": "Unlicense", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/porsager" + } + }, + "node_modules/postgres-array": { + "version": "3.0.2", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/postgres-bytea": { + "version": "3.0.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "obuf": "~1.1.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postgres-date": { + "version": "2.1.0", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/postgres-interval": { + "version": "3.0.0", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/postgres-range": { + "version": "1.1.4", + "devOptional": true, + "license": "MIT" + }, + "node_modules/prettier": { + "version": "3.2.5", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/react": { + "version": "18.3.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "license": "Apache-2.0" + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/studio": { + "version": "0.13.5", + "license": "MIT", + "dependencies": { + "bluebird": "^3.2.2", + "debug": "^2.6.3", + "harmony-proxy": "^1.0.0" + } + }, + "node_modules/studio/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/studio/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/superjson": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/timers-ext": { + "version": "0.1.7", + "dev": true, + "license": "ISC", + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "node_modules/tsx": { + "version": "4.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.19.10", + "get-tsconfig": "^4.7.2" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type": { + "version": "2.7.2", + "dev": true, + "license": "ISC" + }, + "node_modules/typescript": { + "version": "5.4.5", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "9.0.1", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/xtend": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/zod": { + "version": "3.23.4", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/backend/package.json b/backend/package.json index 086a51e..6ef2798 100644 --- a/backend/package.json +++ b/backend/package.json @@ -28,10 +28,12 @@ "pg": "^8.11.5", "postgres": "^3.4.4", "react": "^18.3.1", - "studio": "^0.13.5" + "studio": "^0.13.5", + "uuid": "^9.0.1" }, "devDependencies": { "@types/pg": "^8.11.5", + "@types/uuid": "^9.0.8", "bun-types": "latest", "drizzle-kit": "^0.20.17", "prettier": "^3.2.5", diff --git a/backend/src/app.ts b/backend/src/app.ts index 441b91e..565d188 100644 --- a/backend/src/app.ts +++ b/backend/src/app.ts @@ -10,7 +10,7 @@ const app = new Elysia() .use(Logestic.preset('common')) .use(cors()) .use(swagger({ - path: '/docs', + path: '/api/docs', documentation: { info: { title: 'FitPlan Connect API Documentation', diff --git a/backend/src/db/schema.ts b/backend/src/db/schema.ts index 8905b47..8818f49 100644 --- a/backend/src/db/schema.ts +++ b/backend/src/db/schema.ts @@ -32,6 +32,6 @@ export const meetings = dbSchema.table('meetings', { id: text('id').primaryKey(), userId: text('user_id').notNull().references(() => users.id), trainerID: text('trainer_id').notNull().references(() => trainers.id), - startTime: timestamp('start_time', { withTimezone: true }).notNull(), - endTime: timestamp('end_time', { withTimezone: true }).notNull(), + startTime: timestamp('start_time', { withTimezone: true, mode: 'date' }).notNull(), + endTime: timestamp('end_time', { withTimezone: true, mode: 'date' }).notNull(), }) diff --git a/backend/src/routes/admin/index.ts b/backend/src/routes/admin/index.ts deleted file mode 100644 index 71f94c4..0000000 --- a/backend/src/routes/admin/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { ElysiaApp } from '@/app' - -export default (app: ElysiaApp) => app.get('/tak', { hello: 'world' }) diff --git a/backend/src/routes/admin/users/index.ts b/backend/src/routes/admin/users/index.ts deleted file mode 100644 index 4287d72..0000000 --- a/backend/src/routes/admin/users/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { ElysiaApp } from '@/app' - -export default (app: ElysiaApp) => app.get('/', async ({ set }) => { - set.status = 200 - return { hello: 'world' } -}) diff --git a/backend/src/routes/meetings/index.ts b/backend/src/routes/meetings/index.ts new file mode 100644 index 0000000..744fab2 --- /dev/null +++ b/backend/src/routes/meetings/index.ts @@ -0,0 +1,68 @@ +import { ElysiaApp } from '@/app' +import { db } from '@/utils/db' +import { eq } from 'drizzle-orm' +import { meetings, sessions, users } from '@/db/schema' +import { t } from 'elysia' +import { v4 as uuid } from 'uuid' +import { validateRequest } from '@/utils/validateRequest' + +export default (app: ElysiaApp) => + app + .get('/', async ({ set, cookie: { auth_session } }) => { + const userSession = await db.query.sessions.findFirst({ where: eq(sessions.id, auth_session.value) }) + const { user, session } = await validateRequest(auth_session) + + if (user && session && userSession) { + const userData = await db.query.users.findFirst({ where: eq(users.id, userSession.userId) }) + + if (userData?.accessToken) { + const data = await db.select().from(meetings) + set.status = 200 + return data + } + + if (!userData) { + set.status = 401 + return { message: 'unauthorized' } + } + } else { + set.status = 401 + return { message: 'unauthorized' } + } + }) + .post( + '/', + async ({ set, body: { userId, trainerID, startTime, endTime }, cookie: { auth_session } }) => { + const userSession = await db.query.sessions.findFirst({ where: eq(sessions.id, auth_session.value) }) + + if (userSession) { + const userData = await db.query.users.findFirst({ where: eq(users.id, userSession.userId) }) + + if (userData?.accessToken) { + const id = uuid() + type NewMeeting = typeof meetings.$inferInsert + const newMeeting: NewMeeting = { id, userId, trainerID, startTime, endTime } + const meetingID = await db.insert(meetings).values(newMeeting).returning({ id: meetings.id }) + + set.status = 200 + return meetingID + } + + if (!userData) { + set.status = 401 + return { message: 'unauthorized' } + } + } else { + set.status = 401 + return { message: 'unauthorized' } + } + }, + { + body: t.Object({ + userId: t.String(), + trainerID: t.String(), + startTime: t.Date(), + endTime: t.Date(), + }), + }, + ) diff --git a/backend/src/routes/oauth/logout/index.ts b/backend/src/routes/oauth/logout/index.ts index f3abd09..e5ddc95 100644 --- a/backend/src/routes/oauth/logout/index.ts +++ b/backend/src/routes/oauth/logout/index.ts @@ -1,80 +1,19 @@ import 'dotenv/config' import { ElysiaApp } from '@/app' import { db } from '@/utils/db' -import { meetings, sessions, users } from '@/db/schema' +import { sessions } from '@/db/schema' import { eq } from 'drizzle-orm' -import user from '@/routes/user' -import { lucia } from '@/utils/lucia' +import { validateRequest } from '@/utils/validateRequest' +import { clearAuthCookies } from '@/utils/clearAuthCookies' export default (app: ElysiaApp) => app .get('/', async ({ set, cookie: { github_oauth_state, auth_session } }) => { try { - const validateRequest = async () => { - const sessionId = auth_session?.value ?? null - - if (!sessionId) - return { - user: null, - session: null, - } - - const { user, session } = await lucia.validateSession(sessionId) - try { - if (session && session.fresh) { - const sessionCookie = lucia.createSessionCookie(session.id) - auth_session.set({ - value: sessionCookie.value, - httpOnly: sessionCookie.attributes.httpOnly, - secure: sessionCookie.attributes.secure, - sameSite: sessionCookie.attributes.sameSite, - path: sessionCookie.attributes.path, - maxAge: sessionCookie.attributes.maxAge, - }) - } - if (!session) { - const sessionCookie = lucia.createBlankSessionCookie() - auth_session.set({ - value: sessionCookie.value, - httpOnly: sessionCookie.attributes.httpOnly, - secure: sessionCookie.attributes.secure, - sameSite: sessionCookie.attributes.sameSite, - path: sessionCookie.attributes.path, - maxAge: sessionCookie.attributes.maxAge, - }) - } - } catch (error: any) { - console.log(error) - } - - return { - user, - session, - } - } - const userSession = await db.query.sessions.findFirst({ where: eq(sessions.id, auth_session.value) }) - - const { user, session } = await validateRequest() + const { user, session } = await validateRequest(auth_session) if (user && session && userSession) { - github_oauth_state.set({ - value: '', - httpOnly: true, - secure: true, - sameSite: 'strict', - path: '/', - maxAge: 0, - }) - - auth_session.set({ - value: '', - httpOnly: true, - secure: true, - sameSite: 'strict', - path: '/', - maxAge: 0, - }) - + clearAuthCookies(github_oauth_state, auth_session) await db.delete(sessions).where(eq(sessions.userId, user.id)).returning() set.status = 200 set.headers.location = '/' diff --git a/backend/src/routes/trainers/index.ts b/backend/src/routes/trainers/index.ts new file mode 100644 index 0000000..7b4ce55 --- /dev/null +++ b/backend/src/routes/trainers/index.ts @@ -0,0 +1,35 @@ +import { ElysiaApp } from '@/app' +import { db } from '@/utils/db' +import { eq } from 'drizzle-orm' +import { sessions, trainers, users } from '@/db/schema' +import { validateRequest } from '@/utils/validateRequest' + +export default (app: ElysiaApp) => + app.get('/', async ({ set, cookie: { auth_session } }) => { + const userSession = await db.query.sessions.findFirst({ where: eq(sessions.id, auth_session.value) }) + const { user, session } = await validateRequest(auth_session) + + if (user && session && userSession) { + const userData = await db.query.users.findFirst({ where: eq(users.id, userSession.userId) }) + + if (userData?.accessToken) { + const data = await db.select({ + id: trainers.id, + name: trainers.name, + username: trainers.username, + email: trainers.email, + profilePicture: trainers.profilePictureUrl, + }).from(trainers) + set.status = 200 + return data + } + + if (!userData) { + set.status = 401 + return { message: 'unauthorized' } + } + } else { + set.status = 401 + return { message: 'unauthorized' } + } + }) diff --git a/backend/src/routes/user/delete.ts b/backend/src/routes/user/delete.ts index 7c71d06..6f91cd6 100644 --- a/backend/src/routes/user/delete.ts +++ b/backend/src/routes/user/delete.ts @@ -2,76 +2,16 @@ import { ElysiaApp } from '@/app' import { db } from '@/utils/db' import { eq } from 'drizzle-orm' import { meetings, sessions, users } from '@/db/schema' -import { lucia } from '@/utils/lucia' +import { validateRequest } from '@/utils/validateRequest' +import { clearAuthCookies } from '@/utils/clearAuthCookies' export default (app: ElysiaApp) => app.get('/', async ({ set, cookie: { github_oauth_state, auth_session } }) => { - const validateRequest = async () => { - const sessionId = auth_session?.value ?? null - - if (!sessionId) - return { - user: null, - session: null, - } - - const { user, session } = await lucia.validateSession(sessionId) - try { - if (session && session.fresh) { - const sessionCookie = lucia.createSessionCookie(session.id) - auth_session.set({ - value: sessionCookie.value, - httpOnly: sessionCookie.attributes.httpOnly, - secure: sessionCookie.attributes.secure, - sameSite: sessionCookie.attributes.sameSite, - path: sessionCookie.attributes.path, - maxAge: sessionCookie.attributes.maxAge, - }) - } - if (!session) { - const sessionCookie = lucia.createBlankSessionCookie() - auth_session.set({ - value: sessionCookie.value, - httpOnly: sessionCookie.attributes.httpOnly, - secure: sessionCookie.attributes.secure, - sameSite: sessionCookie.attributes.sameSite, - path: sessionCookie.attributes.path, - maxAge: sessionCookie.attributes.maxAge, - }) - } - } catch (error: any) { - console.log(error) - } - - return { - user, - session, - } - } - const userSession = await db.query.sessions.findFirst({ where: eq(sessions.id, auth_session.value) }) - - const { user, session } = await validateRequest() + const { user, session } = await validateRequest(auth_session) if (user && session && userSession) { - github_oauth_state.set({ - value: '', - httpOnly: true, - secure: true, - sameSite: 'strict', - path: '/', - maxAge: 0, - }) - - auth_session.set({ - value: '', - httpOnly: true, - secure: true, - sameSite: 'strict', - path: '/', - maxAge: 0, - }) - + clearAuthCookies(github_oauth_state, auth_session) await db.delete(meetings).where(eq(meetings.userId, user.id)).returning() await db.delete(sessions).where(eq(sessions.userId, user.id)).returning() await db.delete(users).where(eq(users.id, user.id)).returning() diff --git a/backend/src/routes/user/index.ts b/backend/src/routes/user/index.ts index 54a9e9d..0bac5ba 100644 --- a/backend/src/routes/user/index.ts +++ b/backend/src/routes/user/index.ts @@ -1,66 +1,13 @@ import { ElysiaApp } from '@/app' import { db } from '@/utils/db' import { eq } from 'drizzle-orm' -import { sessions, users } from '@/db/schema' -import { lucia } from '@/utils/lucia' - -type UserResponse = { - name: string - username: string - email: string - profile_picture_url: string - selected_trainer_id: string - subscription_expiration_date: string -} +import { meetings, sessions, users } from '@/db/schema' +import { validateRequest } from '@/utils/validateRequest' export default (app: ElysiaApp) => app.get('/', async ({ set, cookie: { auth_session } }) => { - const validateRequest = async () => { - const sessionId = auth_session?.value ?? null - - if (!sessionId) - return { - user: null, - session: null, - } - - const { user, session } = await lucia.validateSession(sessionId) - try { - if (session && session.fresh) { - const sessionCookie = lucia.createSessionCookie(session.id) - auth_session.set({ - value: sessionCookie.value, - httpOnly: sessionCookie.attributes.httpOnly, - secure: sessionCookie.attributes.secure, - sameSite: sessionCookie.attributes.sameSite, - path: sessionCookie.attributes.path, - maxAge: sessionCookie.attributes.maxAge, - }) - } - if (!session) { - const sessionCookie = lucia.createBlankSessionCookie() - auth_session.set({ - value: sessionCookie.value, - httpOnly: sessionCookie.attributes.httpOnly, - secure: sessionCookie.attributes.secure, - sameSite: sessionCookie.attributes.sameSite, - path: sessionCookie.attributes.path, - maxAge: sessionCookie.attributes.maxAge, - }) - } - } catch (error: any) { - console.log(error) - } - - return { - user, - session, - } - } - const userSession = await db.query.sessions.findFirst({ where: eq(sessions.id, auth_session.value) }) - - const { user, session } = await validateRequest() + const { user, session } = await validateRequest(auth_session) if (user && session && userSession) { const userData = await db.query.users.findFirst({ where: eq(users.id, userSession.userId) }) @@ -84,32 +31,23 @@ export default (app: ElysiaApp) => .where(eq(users.accessToken, userData?.accessToken)) const userNewData = await db.query.users.findFirst({ where: eq(users.id, userSession.userId) }) + const userMeetings = await db.query.meetings.findMany({ where: eq(meetings.userId, userSession.userId) }) set.status = 200 return { + id: userNewData?.id, name: userNewData?.name, username: userNewData?.username, email: userNewData?.email, profile_picture_url: userNewData?.profilePictureUrl, selected_trainer_id: userNewData?.selectedTrainerId || '', subscription_expiration_date: userNewData?.subscriptionExpirationDate || '', + meetings: userMeetings, } - } - - if (!userData) { + } else { set.status = 401 return { message: 'unauthorized' } } - - set.status = 200 - return { - name: userData.name, - username: userData.username, - email: userData.email, - profile_picture_url: userData.profilePictureUrl, - selected_trainer_id: userData.selectedTrainerId || '', - subscription_expiration_date: userData.subscriptionExpirationDate || '', - } } else { set.status = 401 return { message: 'unauthorized' } diff --git a/backend/src/utils/clearAuthCookies.ts b/backend/src/utils/clearAuthCookies.ts new file mode 100644 index 0000000..8869dc6 --- /dev/null +++ b/backend/src/utils/clearAuthCookies.ts @@ -0,0 +1,18 @@ +export const clearAuthCookies = (github_oauth_state: any, auth_session: any) => { + github_oauth_state.set({ + value: '', + httpOnly: true, + secure: true, + sameSite: 'strict', + path: '/', + maxAge: 0, + }) + auth_session.set({ + value: '', + httpOnly: true, + secure: true, + sameSite: 'strict', + path: '/', + maxAge: 0, + }) +} diff --git a/backend/src/utils/validateRequest.ts b/backend/src/utils/validateRequest.ts new file mode 100644 index 0000000..36323f4 --- /dev/null +++ b/backend/src/utils/validateRequest.ts @@ -0,0 +1,37 @@ +import { lucia } from '@/utils/lucia' + +export const validateRequest = async (auth_session: any) => { + const sessionId = auth_session?.value ?? null + + if (!sessionId) return { user: null, session: null } + + const { user, session } = await lucia.validateSession(sessionId) + try { + if (session && session.fresh) { + const sessionCookie = lucia.createSessionCookie(session.id) + auth_session.set({ + value: sessionCookie.value, + httpOnly: sessionCookie.attributes.httpOnly, + secure: sessionCookie.attributes.secure, + sameSite: sessionCookie.attributes.sameSite, + path: sessionCookie.attributes.path, + maxAge: sessionCookie.attributes.maxAge, + }) + } + if (!session) { + const sessionCookie = lucia.createBlankSessionCookie() + auth_session.set({ + value: sessionCookie.value, + httpOnly: sessionCookie.attributes.httpOnly, + secure: sessionCookie.attributes.secure, + sameSite: sessionCookie.attributes.sameSite, + path: sessionCookie.attributes.path, + maxAge: sessionCookie.attributes.maxAge, + }) + } + } catch (error: any) { + console.log(error) + } + + return { user, session } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..d25de19 --- /dev/null +++ b/package.json @@ -0,0 +1,11 @@ +{ + "dependencies": { + "date-fns": "^3.6.0", + "lodash-es": "^4.17.21", + "moment": "^2.30.1", + "react-schedule-meeting": "^4.2.3" + }, + "devDependencies": { + "@types/lodash-es": "^4.17.12" + } +} diff --git a/website/index.html b/website/index.html index b062b92..496dec7 100644 --- a/website/index.html +++ b/website/index.html @@ -6,7 +6,7 @@ FitPlan Connect - + @@ -25,7 +25,7 @@ - + diff --git a/website/package.json b/website/package.json index 00d6aac..3e06b25 100644 --- a/website/package.json +++ b/website/package.json @@ -11,26 +11,29 @@ "preview": "vite preview" }, "dependencies": { - "@gsap/react": "^2.1.0", + "@gsap/react": "^2.1.1", "@hookform/error-message": "^2.0.1", - "@reduxjs/toolkit": "^2.2.3", + "@reduxjs/toolkit": "^2.2.5", "@studio-freight/lenis": "^1.0.42", - "arctic": "^1.8.0", - "framer-motion": "^11.1.7", + "alert": "^6.0.1", + "arctic": "^1.9.0", + "framer-motion": "^11.2.6", "gsap": "^3.12.5", - "i18next": "^23.11.2", - "i18next-browser-languagedetector": "^7.2.1", - "i18next-http-backend": "^2.5.1", + "i18next": "^23.11.5", + "i18next-browser-languagedetector": "^8.0.0", + "i18next-http-backend": "^2.5.2", "js-cookie": "^3.0.5", "lucia": "^3.2.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-helmet-async": "^2.0.4", - "react-hook-form": "^7.51.3", - "react-i18next": "^14.1.0", - "react-redux": "^9.1.1", - "react-router-dom": "^6.22.3", - "sass": "^1.75.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-helmet-async": "^2.0.5", + "react-hook-form": "^7.51.5", + "react-i18next": "^14.1.2", + "react-redux": "^9.1.2", + "react-router-dom": "^6.23.1", + "react-toastify": "^10.0.5", + "sass": "^1.77.2", + "sweetalert2": "^11.11.0", "swr": "^2.2.5", "wretch": "^2.8.1", "zustand": "^4.5.2" @@ -39,19 +42,19 @@ "@svgr/rollup": "^8.1.0", "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@types/js-cookie": "^3.0.6", - "@types/node": "^20.12.7", - "@types/react": "^18.2.79", - "@types/react-dom": "^18.2.25", - "@typescript-eslint/eslint-plugin": "^7.7.0", - "@typescript-eslint/parser": "^7.7.0", - "@vitejs/plugin-react": "^4.2.1", - "eslint": "^9.1.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.6", + "@types/node": "^20.12.12", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@typescript-eslint/eslint-plugin": "^7.10.0", + "@typescript-eslint/parser": "^7.10.0", + "@vitejs/plugin-react": "^4.3.0", + "eslint": "^9.3.0", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.7", "prettier": "^3.2.5", "rollup-plugin-visualizer": "^5.12.0", "typescript": "^5.4.5", "typescript-plugin-css-modules": "^5.1.0", - "vite": "^5.2.10" + "vite": "^5.2.11" } } diff --git a/website/src/app.tsx b/website/src/app.tsx index c3a1683..714ee17 100644 --- a/website/src/app.tsx +++ b/website/src/app.tsx @@ -6,13 +6,16 @@ import { ScrollTrigger } from 'gsap/ScrollTrigger' import { HelmetProvider } from 'react-helmet-async' import { Provider } from 'react-redux' import { BrowserRouter, Route, Routes } from 'react-router-dom' +import { ToastContainer } from 'react-toastify' +import 'react-toastify/dist/ReactToastify.css' import { Header } from '@/components/header/header.tsx' import { useScrollTop } from '@/hooks/useScrollTop.ts' import { store } from '@/utils/store.ts' gsap.registerPlugin(useGSAP, ScrollTrigger) -const AppSettings = lazy(() => import('@/pages/app/app.settings.tsx')) +const Settings = lazy(() => import('@/pages/app/settings.tsx')) +const Calendar = lazy(() => import('@/pages/app/calendar.tsx')) const NotFound = lazy(() => import('@/pages/notFound')) export default function App() { @@ -23,13 +26,14 @@ export default function App() {
+ loading

}> landing} /> - calendar} /> + } /> trainers} /> billing} /> - } /> + } /> } />
diff --git a/website/src/assets/react.svg b/website/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/website/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/website/src/components/container/container.module.scss b/website/src/components/container/container.module.scss index df242ee..9cb844c 100644 --- a/website/src/components/container/container.module.scss +++ b/website/src/components/container/container.module.scss @@ -2,4 +2,8 @@ margin: 0 auto; padding: 64px 40px 0; max-width: 1360px; + + @media (width <= 1024px) { + padding: 64px 20px 0; + } } diff --git a/website/src/components/header/header.tsx b/website/src/components/header/header.tsx index 49c5dcf..581fe76 100644 --- a/website/src/components/header/header.tsx +++ b/website/src/components/header/header.tsx @@ -6,6 +6,7 @@ import { UserDropdown } from '@/components/userDropdown/userDropdown.tsx'; import { setUser, UserTypes } from '@/utils/slices/userSlice.ts' import { useAppDispatch, useAppSelector } from '@/utils/store.ts'; import { Tooltip } from '@/components/tooltip/tooltip.tsx' +import { setTrainers } from '@/utils/slices/trainersSlice.ts' type OAuthResponse = { error?: string @@ -24,6 +25,8 @@ export const Header = () => { try { const data: UserTypes = await wretch('/api/user').get().json() dispatch(setUser(data)) + const trainers = await wretch('/api/trainers').get().json() + dispatch(setTrainers(trainers)) } catch {} } diff --git a/website/src/components/tooltip/tooltip.module.scss b/website/src/components/tooltip/tooltip.module.scss index 6e07ee1..c371a36 100644 --- a/website/src/components/tooltip/tooltip.module.scss +++ b/website/src/components/tooltip/tooltip.module.scss @@ -29,7 +29,7 @@ z-index: 3; border: 1px solid $gray-100; - background-color: $gray-900; + background-color: $white; border-radius: 12px; box-shadow: $drop-shadow-medium; @@ -38,7 +38,8 @@ transform: scale(.4) translateX(-50%); transform-origin: left top; - font: 500 14px/20px 'SF Pro Display', sans-serif; color: white; + font: 500 14px/20px $font-family; + color: $gray-700; transition: opacity .15s, transform .15s; } diff --git a/website/src/components/tooltip/tooltip.tsx b/website/src/components/tooltip/tooltip.tsx index 14db68c..ffc13df 100644 --- a/website/src/components/tooltip/tooltip.tsx +++ b/website/src/components/tooltip/tooltip.tsx @@ -1,4 +1,4 @@ -import styles from './tooltip.module.scss'; +import styles from './tooltip.module.scss' import { FC, ReactNode } from 'react' type TooltipProps = { @@ -11,7 +11,7 @@ export const Tooltip: FC = ({ title, children, place = 'bottom' })
{children} - {place === 'bottom' &&

{title}

} - {place === 'left' &&

{title}

} + {place === 'bottom' && title &&

{title}

} + {place === 'left' && title &&

{title}

}
) diff --git a/website/src/pages/app/calendar.tsx b/website/src/pages/app/calendar.tsx new file mode 100644 index 0000000..f57ad98 --- /dev/null +++ b/website/src/pages/app/calendar.tsx @@ -0,0 +1,417 @@ +import styles from '@/styles/calendar.module.scss' +import { useEffect, useMemo, useReducer, useState } from 'react' +import { range } from 'lodash-es' +import moment from 'moment' +import { useNavigate } from 'react-router-dom' +import { ScheduleMeeting } from 'react-schedule-meeting' +import Swal from 'sweetalert2' +import wretch from 'wretch' +import { AnimateWrapper } from '@/components/animateWrapper/animateWrapper.tsx' +import { Button } from '@/components/button/button.tsx' +import { Container } from '@/components/container/container.tsx' +import { Overlay } from '@/components/overlay/overlay.tsx' +import { SEO } from '@/components/seo.tsx' +import { Tooltip } from '@/components/tooltip/tooltip.tsx' +import { useAppSelector } from '@/utils/store.ts' + +const metaData = { + title: 'Calendar', + description: '', + path: '/app/calendar', +} + +type Timeslot = { + id: number + startTime: Date + endTime: Date +} + +type Meetings = { + available: Timeslot[] + unavailable: Timeslot[] +} + +type DayData = { + displayDate: string + selectedDate: Date +} + +type AllMeetings = { + id: string + userId: string + trainerID: string + startTime: string + endTime: string +}[] + +export default function Calendar() { + const navigate = useNavigate() + const user = useAppSelector(state => state.user.data) + const trainers = useAppSelector(state => state.trainers.data) + const [view, setView] = useState('upcoming') + const availableTimeslots: Timeslot[] = useMemo( + () => + Array.from({ length: 30 }, (_, i) => { + const date = new Date() + date.setDate(date.getDate() + i) + return { + id: i, + startTime: new Date(new Date(date).setHours(8, 0, 0, 0)), + endTime: new Date(new Date(date).setHours(17, 0, 0, 0)), + } + }), + [], + ) + const [meetings, setMeetings] = useReducer((prev: Meetings, next: Meetings) => ({ ...prev, ...next }), { + available: availableTimeslots, + unavailable: [], + }) + const eventDuration: number = 60 + const eventGap: number = 0 + const [selectedTimeSlot, setSelectedTimeSlot] = useState([]) + const [allHoursPerDay, setAllHoursPerDay] = useState([]) + const [allGapsPerDay, setAllGapsPerDay] = useState([]) + const [dayData, setDayData] = useState(null) + + const changeDayData = ( + date: Date = new Date( + moment().get('year'), + moment().get('month'), + moment().get('date'), + moment().set('hour', 0).get('hour'), + moment().set('minute', 0).get('minute'), + moment().set('second', 0).get('second'), + ), + ) => { + const displayDate = moment(date).format('ddd. DD MMMM') + + setDayData({ displayDate, selectedDate: date }) + + const allHoursPerDay = meetings.available.reduce((hours: number[], meet) => { + if (moment(meet.startTime).isSame(date, 'day')) { + const startDay = Number(moment(meet.startTime).format('HH')) + const endDay = Number(moment(meet.endTime).format('HH')) + 1 + return [...hours, ...range(startDay, endDay)] + } + return hours + }, []) + + setAllHoursPerDay(allHoursPerDay) + + const allGapsPerDay = meetings.unavailable.reduce((gaps: Date[], meet) => { + if (moment(meet.startTime).startOf('day').isSame(date)) { + return [...gaps, meet.startTime] + } + return gaps + }, []) + + setAllGapsPerDay(allGapsPerDay) + } + + useEffect(() => { + changeDayData() + + if (user) { + if (isNaN(moment(user.subscription_expiration_date).unix())) { + navigate('/app/billing') + } else if (moment().unix() > moment(user.subscription_expiration_date).unix()) { + navigate('/app/billing') + } + } + }, []) + + useEffect(() => { + const fetchMeetings = async () => { + const data: AllMeetings = await wretch('/api/meetings').get().json() + if (!data) return + + setMeetings({ + available: availableTimeslots, + unavailable: data?.map(({ startTime, endTime }, index) => ({ + id: index, + startTime: new Date(startTime), + endTime: new Date(endTime), + })), + }) + } + + fetchMeetings().then() + }, []) + + return ( + <> + + + + + +
+
+
+ changeDayData(date)} + startTimeListStyle={'grid'} + /> + +
+ +
+

{dayData?.displayDate}

+ {dayData && ( +
+ {allHoursPerDay.length === 0 ? ( +
+

No available hours

+
+ ) : ( + allHoursPerDay.map((hour, index) => { + const buttonTime = Number(moment(dayData.selectedDate).set('hour', hour).format('HH')) + const isUnavailable = allGapsPerDay.some((day: Date) => buttonTime === day.getHours()) + const isPast = + moment(dayData.selectedDate).add(buttonTime, 'hour').unix() <= moment().unix() + const isSelected = + selectedTimeSlot[0] === moment(dayData.selectedDate).set('hour', hour).unix() + + const buttonClass = isSelected ? styles.hourButtonActive : styles.hourButton + const buttonOnClick = () => + setSelectedTimeSlot([ + moment(dayData.selectedDate).set('hour', hour).unix(), + moment(dayData.selectedDate).set('hour', hour).add(eventDuration, 'minute').unix(), + ]) + + return ( + + + + ) + }) + )} +
+ )} +
+
+ +
+
+
+ +
+
+ + + +
+ +
+ {view === 'upcoming' ? ( + <> + {user?.meetings.map(({ trainerID, startTime, endTime }, index) => { + if (moment(startTime).unix() > moment().unix()) { + return ( +
+
+

Training

+

w/ {trainers?.find(trainer => trainer.id === trainerID)?.name}

+
+ +
+

{moment(startTime).format('DD.MM.YYYY, HH:mm')} -{' '}{moment(endTime).format('HH:mm')}

+

 

+
+
+ ) + } + })} + + ) : ( + <> + {user?.meetings.map(({ trainerID, startTime, endTime }, index) => { + if (moment(endTime).unix() < moment().unix()) { + return ( +
+
+

Training

+

w/ {trainers?.find(trainer => trainer.id === trainerID)?.name}

+
+ +
+

{moment(startTime).format('DD.MM.YYYY, HH:mm')} -{' '}{moment(endTime).format('HH:mm')}

+

 

+
+
+ ) + } + })} + + )} +
+
+
+ + + + + ) +} diff --git a/website/src/pages/app/app.settings.tsx b/website/src/pages/app/settings.tsx similarity index 97% rename from website/src/pages/app/app.settings.tsx rename to website/src/pages/app/settings.tsx index 5d67ecd..20ca423 100644 --- a/website/src/pages/app/app.settings.tsx +++ b/website/src/pages/app/settings.tsx @@ -1,4 +1,4 @@ -import styles from '@/styles/app.settings.module.scss' +import styles from '@/styles/settings.module.scss' import { useState } from 'react' import wretch from 'wretch' import { AlertDialog } from '@/components/alertDialog/alertDialog.tsx' @@ -17,7 +17,7 @@ const metaData = { path: '/app/settings', } -const AppSettings = () => { +export default function Settings() { const dispatch = useAppDispatch() const user = useAppSelector(state => state.user.data) const [isOpenConfirmDeleteAccountAlertDialog, setIsOpenConfirmDeleteAccountAlertDialog] = useState(false) @@ -112,5 +112,3 @@ const AppSettings = () => { ) } - -export default AppSettings diff --git a/website/src/public/favicon.png b/website/src/public/favicon.png new file mode 100644 index 0000000..b1f0dc8 Binary files /dev/null and b/website/src/public/favicon.png differ diff --git a/website/src/styles/calendar.module.scss b/website/src/styles/calendar.module.scss new file mode 100644 index 0000000..50e31c3 --- /dev/null +++ b/website/src/styles/calendar.module.scss @@ -0,0 +1,259 @@ +@import 'variables'; +@import 'mixins'; + +.content { + padding: 0 0 64px 0; + + position: relative; + @include flex(row, center, start); + gap: 24px; + font-family: $font-family; + + @media (width <= 1000px) { + flex-direction: column-reverse; + } +} + +.scheduleMeeting { + height: max-content; + padding: 24px; + + display: flex; + flex-direction: column; + align-items: start; + gap: 16px; + + border: 1px solid $gray-200; + border-radius: 12px; + background: $white; + + .calenMain { + display: flex; + align-items: start; + gap: 16px; + + @media (width <= 680px) { + flex-direction: column; + } + } + + .actions { + width: 100%; + display: flex; + justify-content: right; + align-items: end; + gap: 24px; + } + + .scheduleMeetingDivider { + height: 400px; + width: 1px; + background-color: $gray-200; + + @media (width <= 680px) { + display: none; + } + } + + .selectedDayHoursContainer { + width: 100%; + + display: flex; + flex-direction: column; + gap: 20px; + + .headingDisplayDate { + padding: 4px 0 0 0; + + width: 100%; + + font: 700 24px/32px $font-family; + color: $gray-900; + text-align: center; + } + + .hoursListPerDay { + display: flex; + flex-wrap: wrap; + gap: 12px; + + + + .hourListError { + width: 100%; + height: 112px; + + display: flex; + justify-content: center; + align-items: center; + + p { + padding: 12px 16px; + + border: 1px solid $gray-200; + border-radius: 50px; + font: 500 14px/20px $font-family; + color: $gray-500; + } + } + + .hourButton { + padding: 12px 18px; + + display: flex; + justify-content: center; + align-items: center; + flex: 1 0; + + border: 1px solid transparent; + border-radius: 12px; + background-color: $branding-18; + cursor: pointer; + + font: 600 16px/24px $font-family; + color: $branding; + + transition: border .2s, transform .2s, background-color .2s; + + &:is(:hover) { + transform: scale(1.03); + border: 1px solid $branding; + } + + &:is(:disabled) { + opacity: .4; + background-color: $branding-18; + pointer-events: none; + } + } + + .hourButtonActive { + @extend .hourButton; + + color: $white; + background-color: $branding; + + &:is(:hover) { + transform: scale(1); + border: 1px solid transparent; + } + } + } + } +} + +.scheduleRightPanel { + max-width: 352px; + width: 100%; + min-width: 352px; + + display: flex; + justify-content: center; + flex-direction: column; + gap: 24px; + + @media (width <= 1000px) { + max-width: 100%; + } + + .scheduleRightPanelActions { + width: 100%; + display: flex; + justify-content: center; + align-items: center; + + .rightPanelButton:nth-child(1) { + border-radius: 8px 0 0 8px; + border-right: none; + } + + .rightPanelButton:nth-child(2) { + border-radius: 0 8px 8px 0; + } + + .rightPanelButton { + width: 100%; + padding: 6px 12px; + + display: flex; + justify-content: center; + align-items: center; + gap: 6px; + + border: 1px solid $gray-200; + background: $white; + font: 500 14px/16px $font-family; + color: $gray-700; + cursor: pointer; + + transition: background .2s, border .2s; + + span { + @include flex(row, center, center); + gap: 12px; + } + } + + .rightPanelButtonActive { + @extend .rightPanelButton; + + background: $branding-8; + border-color: $branding-18; + + svg path { + fill: $branding; + } + } + } + + .scheduleRightPanelActionsMeetings { + max-height: 448px; + height: 100%; + min-height: 448px; + + @media (width <= 1000px) { + min-height: fit-content; + } + + border-radius: 12px; + border: 1px solid $gray-200; + background: $white; + overflow-y: auto; + + .meeting { + padding: 16px; + + display: flex; + justify-content: space-between; + align-items: center; + + border-bottom: 1px solid $gray-200; + + .leftSide { + display: flex; + flex-direction: column; + + p:nth-child(1) { + font: 500 16px/24px $font-family; + color: $gray-900; + } + + p:nth-child(2) { + font: 500 16px/24px $font-family; + color: $gray-500; + } + } + + .rightSide { + @extend .leftSide; + + align-items: end; + } + } + + .meetingDisable { + @extend .meeting; + opacity: .5; + } + } +} diff --git a/website/src/styles/global.scss b/website/src/styles/global.scss index d4e0117..e217e52 100644 --- a/website/src/styles/global.scss +++ b/website/src/styles/global.scss @@ -56,3 +56,93 @@ html, div, h1, h2, h3, h4, h5, h6, ul, ol, li, p, blockquote, pre, form, fieldse display: none; } } + +.go135427820, +.go321821519 { + display: none; +} + +.go1318713726, .go2556357651, .go3964545171, .go241900306 { + font-weight: 500; +} + +.go321821519 .go1716137461 .go2080639341 { + justify-content: center; + align-items: center; + + button { + display: none !important + } +} + +.go241900306 { + transition: opacity .2s, background-color .2s +} + +.go241900306.disabled { + opacity: .5 !important; + cursor: not-allowed !important; + background-color: $red-50; +} + +.go3057346022 { + --border-radius: 0 !important; +} + +.go2556357651, .go2905247309, .rsm-next-available-date-button { + display: none !important +} + +.react-calendar__tile::after, +.go1923315045 { + border-radius: 12px !important; +} + +.go4247048326 .active-day-tile:hover { + opacity: 1 !important; +} + +.go4247048326.react-calendar { + min-height: 350px !important; +} + +.react-calendar__tile, +.react-calendar__month-view__days__day--neighboringMonth { + &:after { + transition: transform .2s, opacity .2s, background-color .2s; + } +} + +.go695645437 { + padding: 0 !important; + margin: 0 !important; + box-shadow: none !important; +} + +.react-calendar__month-view__days__day--weekend { + color: #EF4344 !important +} + +.react-calendar__month-view__days__day--neighboringMonth { + opacity: .5 !important +} + +.react-calendar__tile--now:after { + border: 1px solid $branding !important; + background-color: $branding-8 !important; +} + +.react-calendar__tile--active:after { + border: 1px solid $branding !important; + background-color: $branding !important; +} + +.react-calendar__tile--active abbr { + color: $white !important; +} + +.disabled { + opacity: .5 !important; + cursor: not-allowed !important; + pointer-events: none !important; +} diff --git a/website/src/styles/app.settings.module.scss b/website/src/styles/settings.module.scss similarity index 100% rename from website/src/styles/app.settings.module.scss rename to website/src/styles/settings.module.scss diff --git a/website/src/utils/constants.ts b/website/src/utils/constants.ts deleted file mode 100644 index e69de29..0000000 diff --git a/website/src/utils/slices/trainersSlice.ts b/website/src/utils/slices/trainersSlice.ts new file mode 100644 index 0000000..bb9b454 --- /dev/null +++ b/website/src/utils/slices/trainersSlice.ts @@ -0,0 +1,29 @@ +import { createSlice } from '@reduxjs/toolkit' + +export type TrainersTypes = { + data: { + id: string + name: string + username: string + email: string + profile_picture_url: string + }[] | null +} + +const initialState: TrainersTypes = { + data: null, +} + +export const trainersSlice = createSlice({ + name: 'trainers', + initialState, + reducers: { + setTrainers: (state, action) => { + state.data = action.payload + }, + }, +}) + +export const { setTrainers } = trainersSlice.actions + +export default trainersSlice.reducer diff --git a/website/src/utils/slices/userSlice.ts b/website/src/utils/slices/userSlice.ts index 8e6d489..ed88da5 100644 --- a/website/src/utils/slices/userSlice.ts +++ b/website/src/utils/slices/userSlice.ts @@ -2,17 +2,25 @@ import { createSlice } from '@reduxjs/toolkit' export type UserTypes = { data: { + id: string name: string username: string email: string profile_picture_url: string selected_trainer_id: string subscription_expiration_date: string + meetings: { + id: string + userId: string + trainerID: string + startTime: Date + endTime: Date + }[] } | null } const initialState: UserTypes = { - data: null + data: null, } export const userSlice = createSlice({ diff --git a/website/src/utils/store.ts b/website/src/utils/store.ts index de6e286..0903638 100644 --- a/website/src/utils/store.ts +++ b/website/src/utils/store.ts @@ -1,14 +1,14 @@ import { configureStore } from '@reduxjs/toolkit' import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux' +import trainers from '@/utils/slices/trainersSlice.ts' import user from '@/utils/slices/userSlice.ts' export const store = configureStore({ reducer: { user: user, + trainers: trainers, }, }) -// const dispatch = useAppDispatch() export const useAppDispatch: () => typeof store.dispatch = useDispatch -// const user = useAppSelector(state => state.user) export const useAppSelector: TypedUseSelectorHook> = useSelector diff --git a/website/yarn.lock b/website/yarn.lock index 3bea0b6..b0d256f 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -28,12 +28,25 @@ "@babel/highlight" "^7.24.2" picocolors "^1.0.0" +"@babel/code-frame@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.6.tgz#ab88da19344445c3d8889af2216606d3329f3ef2" + integrity sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA== + dependencies: + "@babel/highlight" "^7.24.6" + picocolors "^1.0.0" + "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== -"@babel/core@^7.21.3", "@babel/core@^7.23.5": +"@babel/compat-data@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.6.tgz#b3600217688cabb26e25f8e467019e66d71b7ae2" + integrity sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ== + +"@babel/core@^7.21.3": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717" integrity sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg== @@ -54,6 +67,27 @@ json5 "^2.2.3" semver "^6.3.1" +"@babel/core@^7.24.5": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.6.tgz#8650e0e4b03589ebe886c4e4a60398db0a7ec787" + integrity sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.6" + "@babel/generator" "^7.24.6" + "@babel/helper-compilation-targets" "^7.24.6" + "@babel/helper-module-transforms" "^7.24.6" + "@babel/helpers" "^7.24.6" + "@babel/parser" "^7.24.6" + "@babel/template" "^7.24.6" + "@babel/traverse" "^7.24.6" + "@babel/types" "^7.24.6" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/generator@7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad" @@ -73,6 +107,16 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" +"@babel/generator@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.6.tgz#dfac82a228582a9d30c959fe50ad28951d4737a7" + integrity sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg== + dependencies: + "@babel/types" "^7.24.6" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" @@ -98,6 +142,17 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-compilation-targets@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz#4a51d681f7680043d38e212715e2a7b1ad29cb51" + integrity sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg== + dependencies: + "@babel/compat-data" "^7.24.6" + "@babel/helper-validator-option" "^7.24.6" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz#c806f73788a6800a5cfbbc04d2df7ee4d927cce3" @@ -138,6 +193,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== +"@babel/helper-environment-visitor@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz#ac7ad5517821641550f6698dd5468f8cef78620d" + integrity sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g== + "@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" @@ -146,6 +206,14 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.23.0" +"@babel/helper-function-name@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz#cebdd063386fdb95d511d84b117e51fc68fec0c8" + integrity sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w== + dependencies: + "@babel/template" "^7.24.6" + "@babel/types" "^7.24.6" + "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" @@ -153,6 +221,13 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-hoist-variables@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz#8a7ece8c26756826b6ffcdd0e3cf65de275af7f9" + integrity sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA== + dependencies: + "@babel/types" "^7.24.6" + "@babel/helper-member-expression-to-functions@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" @@ -167,6 +242,13 @@ dependencies: "@babel/types" "^7.24.0" +"@babel/helper-module-imports@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz#65e54ffceed6a268dc4ce11f0433b82cfff57852" + integrity sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g== + dependencies: + "@babel/types" "^7.24.6" + "@babel/helper-module-transforms@^7.23.3": version "7.23.3" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" @@ -178,6 +260,17 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.20" +"@babel/helper-module-transforms@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz#22346ed9df44ce84dee850d7433c5b73fab1fe4e" + integrity sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA== + dependencies: + "@babel/helper-environment-visitor" "^7.24.6" + "@babel/helper-module-imports" "^7.24.6" + "@babel/helper-simple-access" "^7.24.6" + "@babel/helper-split-export-declaration" "^7.24.6" + "@babel/helper-validator-identifier" "^7.24.6" + "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" @@ -190,6 +283,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== +"@babel/helper-plugin-utils@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz#fa02a32410a15a6e8f8185bcbf608f10528d2a24" + integrity sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg== + "@babel/helper-remap-async-to-generator@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" @@ -215,6 +313,13 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-simple-access@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz#1d6e04d468bba4fc963b4906f6dac6286cfedff1" + integrity sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g== + dependencies: + "@babel/types" "^7.24.6" + "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" @@ -229,21 +334,43 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-split-export-declaration@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz#e830068f7ba8861c53b7421c284da30ae656d7a3" + integrity sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw== + dependencies: + "@babel/types" "^7.24.6" + "@babel/helper-string-parser@^7.23.4": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== +"@babel/helper-string-parser@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz#28583c28b15f2a3339cfafafeaad42f9a0e828df" + integrity sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q== + "@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@babel/helper-validator-identifier@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz#08bb6612b11bdec78f3feed3db196da682454a5e" + integrity sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw== + "@babel/helper-validator-option@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== +"@babel/helper-validator-option@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz#59d8e81c40b7d9109ab7e74457393442177f460a" + integrity sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ== + "@babel/helper-wrap-function@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" @@ -262,6 +389,14 @@ "@babel/traverse" "^7.24.1" "@babel/types" "^7.24.0" +"@babel/helpers@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.6.tgz#cd124245299e494bd4e00edda0e4ea3545c2c176" + integrity sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA== + dependencies: + "@babel/template" "^7.24.6" + "@babel/types" "^7.24.6" + "@babel/highlight@^7.24.2": version "7.24.2" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" @@ -272,11 +407,26 @@ js-tokens "^4.0.0" picocolors "^1.0.0" +"@babel/highlight@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.6.tgz#6d610c1ebd2c6e061cade0153bf69b0590b7b3df" + integrity sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ== + dependencies: + "@babel/helper-validator-identifier" "^7.24.6" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.20.5", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88" integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== +"@babel/parser@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.6.tgz#5e030f440c3c6c78d195528c3b688b101a365328" + integrity sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q== + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.4": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz#6125f0158543fb4edf1c22f322f3db67f21cb3e1" @@ -781,19 +931,19 @@ dependencies: "@babel/plugin-transform-react-jsx" "^7.22.5" -"@babel/plugin-transform-react-jsx-self@^7.23.3": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz#a21d866d8167e752c6a7c4555dba8afcdfce6268" - integrity sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w== +"@babel/plugin-transform-react-jsx-self@^7.24.5": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.6.tgz#4fa4870d594d6840d724d2006d0f98b19be6f502" + integrity sha512-FfZfHXtQ5jYPQsCRyLpOv2GeLIIJhs8aydpNh39vRDjhD411XcfWDni5i7OjP/Rs8GAtTn7sWFFELJSHqkIxYg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-react-jsx-source@^7.23.3": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz#a2dedb12b09532846721b5df99e52ef8dc3351d0" - integrity sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA== +"@babel/plugin-transform-react-jsx-source@^7.24.1": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.6.tgz#4e1503f24ca5fccb1fc7f20c57426899d5ce5c1f" + integrity sha512-BQTBCXmFRreU3oTUXcGKuPOfXAGb1liNY4AvvFKsOBAJ89RKcTsIrSsnMYkj59fNa66OFKnSa4AJZfy5Y4B9WA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" "@babel/plugin-transform-react-jsx@^7.22.5", "@babel/plugin-transform-react-jsx@^7.23.4": version "7.23.4" @@ -1046,6 +1196,15 @@ "@babel/parser" "^7.24.0" "@babel/types" "^7.24.0" +"@babel/template@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.6.tgz#048c347b2787a6072b24c723664c8d02b67a44f9" + integrity sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw== + dependencies: + "@babel/code-frame" "^7.24.6" + "@babel/parser" "^7.24.6" + "@babel/types" "^7.24.6" + "@babel/traverse@7.23.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" @@ -1078,6 +1237,22 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/traverse@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.6.tgz#0941ec50cdeaeacad0911eb67ae227a4f8424edc" + integrity sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw== + dependencies: + "@babel/code-frame" "^7.24.6" + "@babel/generator" "^7.24.6" + "@babel/helper-environment-visitor" "^7.24.6" + "@babel/helper-function-name" "^7.24.6" + "@babel/helper-hoist-variables" "^7.24.6" + "@babel/helper-split-export-declaration" "^7.24.6" + "@babel/parser" "^7.24.6" + "@babel/types" "^7.24.6" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@7.17.0": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" @@ -1095,6 +1270,15 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@babel/types@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.6.tgz#ba4e1f59870c10dc2fa95a274ac4feec23b21912" + integrity sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ== + dependencies: + "@babel/helper-string-parser" "^7.24.6" + "@babel/helper-validator-identifier" "^7.24.6" + to-fast-properties "^2.0.0" + "@emnapi/core@^0.45.0": version "0.45.0" resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-0.45.0.tgz#e58dc1f70ab3af3f6708991ba56d988088daf204" @@ -1236,10 +1420,10 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== -"@eslint/eslintrc@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.0.2.tgz#36180f8e85bf34d2fe3ccc2261e8e204a411ab4e" - integrity sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg== +"@eslint/eslintrc@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" + integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -1251,17 +1435,17 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.1.1": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.1.1.tgz#eb0f82461d12779bbafc1b5045cde3143d350a8a" - integrity sha512-5WoDz3Y19Bg2BnErkZTp0en+c/i9PvgFS7MBe1+m60HjFr0hrphlAGp4yzI7pxpt4xShln4ZyYp4neJm8hmOkQ== +"@eslint/js@9.3.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.3.0.tgz#2e8f65c9c55227abc4845b1513c69c32c679d8fe" + integrity sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw== -"@gsap/react@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@gsap/react/-/react-2.1.0.tgz#fe65901d64c00d2eea4e3e8b571ae293d781622f" - integrity sha512-pwdFXvOM5IsRZXpWTKkQoEjb3/iUjDCU1BCJDlE6pHgVjG+7Ep/7+sszUgqVZ2Jc0mR8gnhtDWyx5cQAT4kwQw== +"@gsap/react@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@gsap/react/-/react-2.1.1.tgz#219a81c84f93a2631c8aa324c0f5cce03cdf2ed9" + integrity sha512-apGPRrmpqxvl1T6Io1KgT8tFU+IuACI6z4zmT7t8+PASserJeLVRFJdSNUFA2Xb/eVkZI1noE8LIrY/w/oJECw== dependencies: - gsap "^3.12.4" + gsap "^3.12.5" react ">=16" "@hookform/error-message@^2.0.1": @@ -1288,10 +1472,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== -"@humanwhocodes/retry@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.2.3.tgz#c9aa036d1afa643f1250e83150f39efb3a15a631" - integrity sha512-X38nUbachlb01YMlvPFojKoiXq+LzZvuSce70KPMPdeM1Rj03k4dR7lDslhbqXn3Ang4EU3+EAmwEAsbrjHW3g== +"@humanwhocodes/retry@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" + integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" @@ -1536,20 +1720,20 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@reduxjs/toolkit@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.2.3.tgz#5ce71cbf162f98c5dafb49bd3f1e11c5486ab9c4" - integrity sha512-76dll9EnJXg4EVcI5YNxZA/9hSAmZsFqzMmNRHvIlzw2WS/twfcVX3ysYrWGJMClwEmChQFC4yRq74tn6fdzRA== +"@reduxjs/toolkit@^2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.2.5.tgz#c0d2d8482ef80722bebe015ff05b06c34bfb6e0d" + integrity sha512-aeFA/s5NCG7NoJe/MhmwREJxRkDs0ZaSqt0MxhWUrwCf1UQXpwR87RROJEql0uAkLI6U7snBOYOcKw83ew3FPg== dependencies: immer "^10.0.3" redux "^5.0.1" redux-thunk "^3.1.0" - reselect "^5.0.1" + reselect "^5.1.0" -"@remix-run/router@1.15.3": - version "1.15.3" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.15.3.tgz#d2509048d69dbb72d5389a14945339f1430b2d3c" - integrity sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w== +"@remix-run/router@1.16.1": + version "1.16.1" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.16.1.tgz#73db3c48b975eeb06d0006481bde4f5f2d17d1cd" + integrity sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig== "@rollup/pluginutils@^5.0.2": version "5.1.0" @@ -1819,15 +2003,10 @@ resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-3.0.6.tgz#a04ca19e877687bd449f5ad37d33b104b71fdf95" integrity sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ== -"@types/json-schema@^7.0.15": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/node@^20.12.7": - version "20.12.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" - integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== +"@types/node@^20.12.12": + version "20.12.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.12.tgz#7cbecdf902085cec634fdb362172dfe12b8f2050" + integrity sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw== dependencies: undici-types "~5.26.4" @@ -1850,14 +2029,14 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== -"@types/react-dom@^18.2.25": - version "18.2.25" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.25.tgz#2946a30081f53e7c8d585eb138277245caedc521" - integrity sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA== +"@types/react-dom@^18.3.0": + version "18.3.0" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" + integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18.2.79": +"@types/react@*": version "18.2.79" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.79.tgz#c40efb4f255711f554d47b449f796d1c7756d865" integrity sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w== @@ -1865,74 +2044,75 @@ "@types/prop-types" "*" csstype "^3.0.2" -"@types/semver@^7.5.8": - version "7.5.8" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" - integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== +"@types/react@^18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" + integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" "@types/use-sync-external-store@^0.0.3": version "0.0.3" resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== -"@typescript-eslint/eslint-plugin@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.0.tgz#bf34a02f221811505b8bf2f31060c8560c1bb0a3" - integrity sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ== +"@typescript-eslint/eslint-plugin@^7.10.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.10.0.tgz#07854a236f107bb45cbf4f62b89474cbea617f50" + integrity sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.7.0" - "@typescript-eslint/type-utils" "7.7.0" - "@typescript-eslint/utils" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" - debug "^4.3.4" + "@typescript-eslint/scope-manager" "7.10.0" + "@typescript-eslint/type-utils" "7.10.0" + "@typescript-eslint/utils" "7.10.0" + "@typescript-eslint/visitor-keys" "7.10.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" - semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@^7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.7.0.tgz#6b1b3ce76c5de002c43af8ae933613b0f2b4bcc6" - integrity sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg== +"@typescript-eslint/parser@^7.10.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.10.0.tgz#e6ac1cba7bc0400a4459e7eb5b23115bd71accfb" + integrity sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w== dependencies: - "@typescript-eslint/scope-manager" "7.7.0" - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/typescript-estree" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" + "@typescript-eslint/scope-manager" "7.10.0" + "@typescript-eslint/types" "7.10.0" + "@typescript-eslint/typescript-estree" "7.10.0" + "@typescript-eslint/visitor-keys" "7.10.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz#3f0db079b275bb8b0cb5be7613fb3130cfb5de77" - integrity sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw== +"@typescript-eslint/scope-manager@7.10.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz#054a27b1090199337a39cf755f83d9f2ce26546b" + integrity sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg== dependencies: - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" + "@typescript-eslint/types" "7.10.0" + "@typescript-eslint/visitor-keys" "7.10.0" -"@typescript-eslint/type-utils@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.7.0.tgz#36792ff4209a781b058de61631a48df17bdefbc5" - integrity sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg== +"@typescript-eslint/type-utils@7.10.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.10.0.tgz#8a75accce851d0a331aa9331268ef64e9b300270" + integrity sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g== dependencies: - "@typescript-eslint/typescript-estree" "7.7.0" - "@typescript-eslint/utils" "7.7.0" + "@typescript-eslint/typescript-estree" "7.10.0" + "@typescript-eslint/utils" "7.10.0" debug "^4.3.4" ts-api-utils "^1.3.0" -"@typescript-eslint/types@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.7.0.tgz#23af4d24bf9ce15d8d301236e3e3014143604f27" - integrity sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w== +"@typescript-eslint/types@7.10.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.10.0.tgz#da92309c97932a3a033762fd5faa8b067de84e3b" + integrity sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg== -"@typescript-eslint/typescript-estree@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz#b5dd6383b4c6a852d7b256a37af971e8982be97f" - integrity sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ== +"@typescript-eslint/typescript-estree@7.10.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz#6dcdc5de3149916a6a599fa89dde5c471b88b8bb" + integrity sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g== dependencies: - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" + "@typescript-eslint/types" "7.10.0" + "@typescript-eslint/visitor-keys" "7.10.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -1940,37 +2120,34 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.7.0.tgz#3d2b6606a60ac34f3c625facfb3b3ab7e126f58d" - integrity sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig== +"@typescript-eslint/utils@7.10.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.10.0.tgz#8ee43e5608c9f439524eaaea8de5b358b15c51b3" + integrity sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.15" - "@types/semver" "^7.5.8" - "@typescript-eslint/scope-manager" "7.7.0" - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/typescript-estree" "7.7.0" - semver "^7.6.0" + "@typescript-eslint/scope-manager" "7.10.0" + "@typescript-eslint/types" "7.10.0" + "@typescript-eslint/typescript-estree" "7.10.0" -"@typescript-eslint/visitor-keys@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz#950148cf1ac11562a2d903fdf7acf76714a2dc9e" - integrity sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA== +"@typescript-eslint/visitor-keys@7.10.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz#2af2e91e73a75dd6b70b4486c48ae9d38a485a78" + integrity sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg== dependencies: - "@typescript-eslint/types" "7.7.0" + "@typescript-eslint/types" "7.10.0" eslint-visitor-keys "^3.4.3" -"@vitejs/plugin-react@^4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz#744d8e4fcb120fc3dbaa471dadd3483f5a304bb9" - integrity sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ== +"@vitejs/plugin-react@^4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.0.tgz#f20ec2369a92d8abaaefa60da8b7157819d20481" + integrity sha512-KcEbMsn4Dpk+LIbHMj7gDPRKaTMStxxWRkRmxsg/jVdFdJCZWt1SchZcf0M4t8lIKdwwMsEyzhrcOXRrDPtOBw== dependencies: - "@babel/core" "^7.23.5" - "@babel/plugin-transform-react-jsx-self" "^7.23.3" - "@babel/plugin-transform-react-jsx-source" "^7.23.3" + "@babel/core" "^7.24.5" + "@babel/plugin-transform-react-jsx-self" "^7.24.5" + "@babel/plugin-transform-react-jsx-source" "^7.24.1" "@types/babel__core" "^7.20.5" - react-refresh "^0.14.0" + react-refresh "^0.14.2" acorn-jsx@^5.3.2: version "5.3.2" @@ -1992,6 +2169,11 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +alert@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/alert/-/alert-6.0.1.tgz#8514c26114426af89db34131d87f8a5641baeba4" + integrity sha512-7ZPECX89zu30g+83dDs487Dyw3ZxtZmsyQdUFP+07CNHp+xf/YOJvb3YZx4r5alLyCbftehbHj1Udbpmj9MICw== + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -2019,10 +2201,10 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -arctic@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/arctic/-/arctic-1.8.0.tgz#cf6bcf771ed15c393aaa607a7683c89b7b476ca1" - integrity sha512-gFzu67CMG7PvBrxv5E1FetiG+OeDAgc3dRDY+xTus+qnH+ip1qJVMRaJ4OSiYRx54/LWVR/B7Bdym0uPhrmIzg== +arctic@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/arctic/-/arctic-1.9.0.tgz#17cda26673f490798c70c128b2cc4b0b217e5869" + integrity sha512-5llm2EMDM4wYv9q20JG19qnNAzEZj68MTYmZvfyKRivTHZqpR2uYHmN6umcaZjURvaaukwm5W6K1KH++qcdDRg== dependencies: oslo "1.2.0" @@ -2168,6 +2350,11 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" +clsx@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -2441,15 +2628,15 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-plugin-react-hooks@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== +eslint-plugin-react-hooks@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== -eslint-plugin-react-refresh@^0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.6.tgz#e8e8accab681861baed00c5c12da70267db0936f" - integrity sha512-NjGXdm7zgcKRkKMua34qVO9doI7VOxZ6ancSvBELJSSoX97jyndXcSoa8XBh69JoB31dNz3EEzlMcizZl7LaMA== +eslint-plugin-react-refresh@^0.4.7: + version "0.4.7" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.7.tgz#1f597f9093b254f10ee0961c139a749acb19af7d" + integrity sha512-yrj+KInFmwuQS2UQcg1SF83ha1tuHC1jMQbRNyuWtlEzzKRDgAl7L4Yp4NlDUZTZNlWvHEzOtJhMi40R7JxcSw== eslint-scope@^8.0.1: version "8.0.1" @@ -2469,18 +2656,18 @@ eslint-visitor-keys@^4.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== -eslint@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.1.0.tgz#262625f6b0921f7550f128a0098d05ecaad989c6" - integrity sha512-1TCBecGFQtItia2o39P7Z4BK1X7ByNPxAiWJvwiyTGcOwYnTiiASgMpNA6a+beu8cFPhEDWvPf6mIlYUJv6sgA== +eslint@^9.3.0: + version "9.3.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.3.0.tgz#36a96db84592618d6ed9074d677e92f4e58c08b9" + integrity sha512-5Iv4CsZW030lpUqHBapdPo3MJetAPtejVW8B84GIcIIv8+ohFaddXsrn1Gn8uD9ijDb+kcYKFUVmC8qG8B2ORQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^3.0.2" - "@eslint/js" "9.1.1" + "@eslint/eslintrc" "^3.1.0" + "@eslint/js" "9.3.0" "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.2.3" + "@humanwhocodes/retry" "^0.3.0" "@nodelib/fs.walk" "^1.2.8" ajv "^6.12.4" chalk "^4.0.0" @@ -2615,10 +2802,10 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== -framer-motion@^11.1.7: - version "11.1.7" - resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-11.1.7.tgz#ad970c1296e7b5fb26db222fd65d1329aef115a6" - integrity sha512-cW11Pu53eDAXUEhv5hEiWuIXWhfkbV32PlgVISn7jRdcAiVrJ1S03YQQ0/DzoswGYYwKi4qYmHHjCzAH52eSdQ== +framer-motion@^11.2.6: + version "11.2.6" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-11.2.6.tgz#ab693b24d1f6cf34ef83494ab2df59fd39b7c87e" + integrity sha512-XUrjjBt57e5YoHQtjwc3eNchFBuHvIgN/cS8SC4oIaAn2J/0+bLanUxXizidJKZVeHJam/JrmMnPRjYMglVn5g== dependencies: tslib "^2.4.0" @@ -2710,7 +2897,7 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -gsap@^3.12.4, gsap@^3.12.5: +gsap@^3.12.5: version "3.12.5" resolved "https://registry.yarnpkg.com/gsap/-/gsap-3.12.5.tgz#136c02dad4c673b441bdb1ca00104bfcb4eae7f4" integrity sha512-srBfnk4n+Oe/ZnMIOXt3gT605BX9x5+rh/prT2F1SsNJsU1XuMiP0E2aptW481OnonOGACZWBqseH5Z7csHxhQ== @@ -2739,24 +2926,24 @@ html-parse-stringify@^3.0.1: dependencies: void-elements "3.1.0" -i18next-browser-languagedetector@^7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.1.tgz#1968196d437b4c8db847410c7c33554f6c448f6f" - integrity sha512-h/pM34bcH6tbz8WgGXcmWauNpQupCGr25XPp9cZwZInR9XHSjIFDYp1SIok7zSPsTOMxdvuLyu86V+g2Kycnfw== +i18next-browser-languagedetector@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.0.0.tgz#b6fdd9b43af67c47f2c26c9ba27710a1eaf31e2f" + integrity sha512-zhXdJXTTCoG39QsrOCiOabnWj2jecouOqbchu3EfhtSHxIB5Uugnm9JaizenOy39h7ne3+fLikIjeW88+rgszw== dependencies: "@babel/runtime" "^7.23.2" -i18next-http-backend@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/i18next-http-backend/-/i18next-http-backend-2.5.1.tgz#97141b65d860a124b6c9feee181e565c753b0629" - integrity sha512-+rNX1tghdVxdfjfPt0bI1sNg5ahGW9kA7OboG7b4t03Fp69NdDlRIze6yXhIbN8rbHxJ8IP4dzRm/okZ15lkQg== +i18next-http-backend@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/i18next-http-backend/-/i18next-http-backend-2.5.2.tgz#3d846cc239987fe7700d1cf0f17975807bfd25d3" + integrity sha512-+K8HbDfrvc1/2X8jpb7RLhI9ZxBDpx3xogYkQwGKlWAUXLSEGXzgdt3EcUjLlBCdMwdQY+K+EUF6oh8oB6rwHw== dependencies: cross-fetch "4.0.0" -i18next@^23.11.2: - version "23.11.2" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.11.2.tgz#4c0e8192a9ba230fe7dc68b76459816ab601826e" - integrity sha512-qMBm7+qT8jdpmmDw/kQD16VpmkL9BdL+XNAK5MNbNFaf1iQQq35ZbPrSlqmnNPOSUY4m342+c0t0evinF5l7sA== +i18next@^23.11.5: + version "23.11.5" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.11.5.tgz#d71eb717a7e65498d87d0594f2664237f9e361ef" + integrity sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA== dependencies: "@babel/runtime" "^7.23.2" @@ -3366,76 +3553,90 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -react-dom@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== +react-dom@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" - scheduler "^0.23.0" + scheduler "^0.23.2" react-fast-compare@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== -react-helmet-async@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-2.0.4.tgz#50a4377778f380ed1d0136303916b38eff1bf153" - integrity sha512-yxjQMWposw+akRfvpl5+8xejl4JtUlHnEBcji6u8/e6oc7ozT+P9PNTWMhCbz2y9tc5zPegw2BvKjQA+NwdEjQ== +react-helmet-async@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-2.0.5.tgz#cfc70cd7bb32df7883a8ed55502a1513747223ec" + integrity sha512-rYUYHeus+i27MvFE+Jaa4WsyBKGkL6qVgbJvSBoX8mbsWoABJXdEO0bZyi0F6i+4f0NuIb8AvqPMj3iXFHkMwg== dependencies: invariant "^2.2.4" react-fast-compare "^3.2.2" shallowequal "^1.1.0" -react-hook-form@^7.51.3: - version "7.51.3" - resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.51.3.tgz#7486dd2d52280b6b28048c099a98d2545931cab3" - integrity sha512-cvJ/wbHdhYx8aviSWh28w9ImjmVsb5Y05n1+FW786vEZQJV5STNM0pW6ujS+oiBecb0ARBxJFyAnXj9+GHXACQ== +react-hook-form@^7.51.5: + version "7.51.5" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.51.5.tgz#4afbfb819312db9fea23e8237a3a0d097e128b43" + integrity sha512-J2ILT5gWx1XUIJRETiA7M19iXHlG74+6O3KApzvqB/w8S5NQR7AbU8HVZrMALdmDgWpRPYiZJl0zx8Z4L2mP6Q== -react-i18next@^14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-14.1.0.tgz#44da74fbffd416f5d0c5307ef31735cf10cc91d9" - integrity sha512-3KwX6LHpbvGQ+sBEntjV4sYW3Zovjjl3fpoHbUwSgFHf0uRBcbeCBLR5al6ikncI5+W0EFb71QXZmfop+J6NrQ== +react-i18next@^14.1.2: + version "14.1.2" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-14.1.2.tgz#cd57a755f25a32a5fcc3dbe546cf3cc62b4f3ebd" + integrity sha512-FSIcJy6oauJbGEXfhUgVeLzvWBhIBIS+/9c6Lj4niwKZyGaGb4V4vUbATXSlsHJDXXB+ociNxqFNiFuV1gmoqg== dependencies: "@babel/runtime" "^7.23.9" html-parse-stringify "^3.0.1" -react-redux@^9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.1.1.tgz#852ec13084bd7375e26db697d2fc9027ffada204" - integrity sha512-5ynfGDzxxsoV73+4czQM56qF43vsmgJsO22rmAvU5tZT2z5Xow/A2uhhxwXuGTxgdReF3zcp7A80gma2onRs1A== +react-redux@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.1.2.tgz#deba38c64c3403e9abd0c3fbeab69ffd9d8a7e4b" + integrity sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w== dependencies: "@types/use-sync-external-store" "^0.0.3" use-sync-external-store "^1.0.0" -react-refresh@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" - integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== +react-refresh@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" + integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== -react-router-dom@^6.22.3: - version "6.22.3" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.22.3.tgz#9781415667fd1361a475146c5826d9f16752a691" - integrity sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw== +react-router-dom@^6.23.1: + version "6.23.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.23.1.tgz#30cbf266669693e9492aa4fc0dde2541ab02322f" + integrity sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ== dependencies: - "@remix-run/router" "1.15.3" - react-router "6.22.3" + "@remix-run/router" "1.16.1" + react-router "6.23.1" -react-router@6.22.3: - version "6.22.3" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.22.3.tgz#9d9142f35e08be08c736a2082db5f0c9540a885e" - integrity sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ== +react-router@6.23.1: + version "6.23.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.23.1.tgz#d08cbdbd9d6aedc13eea6e94bc6d9b29cb1c4be9" + integrity sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ== dependencies: - "@remix-run/router" "1.15.3" + "@remix-run/router" "1.16.1" -react@>=16, react@^18.2.0: +react-toastify@^10.0.5: + version "10.0.5" + resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-10.0.5.tgz#6b8f8386060c5c856239f3036d1e76874ce3bd1e" + integrity sha512-mNKt2jBXJg4O7pSdbNUfDdTsK9FIdikfsIE/yUCxbAEXl4HMyJaivrVFcn3Elvt5xvCQYhUZm+hqTIu1UXM3Pw== + dependencies: + clsx "^2.1.0" + +react@>=16: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" +react@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -3501,7 +3702,7 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -reselect@^5.0.1: +reselect@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.0.tgz#c479139ab9dd91be4d9c764a7f3868210ef8cd21" integrity sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg== @@ -3577,7 +3778,7 @@ run-parallel@^1.1.9: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass@^1.70.0, sass@^1.75.0: +sass@^1.70.0: version "1.75.0" resolved "https://registry.yarnpkg.com/sass/-/sass-1.75.0.tgz#91bbe87fb02dfcc34e052ddd6ab80f60d392be6c" integrity sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw== @@ -3586,15 +3787,24 @@ sass@^1.70.0, sass@^1.75.0: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" +sass@^1.77.2: + version "1.77.2" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.2.tgz#18d4ed2eefc260cdc8099c5439ec1303fd5863aa" + integrity sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + sax@^1.2.4, sax@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" @@ -3739,6 +3949,11 @@ svgo@^3.0.2: csso "^5.0.5" picocolors "^1.0.0" +sweetalert2@^11.11.0: + version "11.11.0" + resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-11.11.0.tgz#0bbae4330f5e423c942639bb0e9dc2d748eb88fd" + integrity sha512-wKCTtoE6lQVDKaJ5FFq+znk/YykJmJlD8RnLZps8C7DyivctCoRlVeeOwnKfgwKS+QJYon7s++3dmNi3/am1tw== + swr@^2.2.5: version "2.2.5" resolved "https://registry.yarnpkg.com/swr/-/swr-2.2.5.tgz#063eea0e9939f947227d5ca760cc53696f46446b" @@ -3880,10 +4095,10 @@ util-deprecate@^1.0.2: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -vite@^5.2.10: - version "5.2.10" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.10.tgz#2ac927c91e99d51b376a5c73c0e4b059705f5bd7" - integrity sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw== +vite@^5.2.11: + version "5.2.11" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.11.tgz#726ec05555431735853417c3c0bfb36003ca0cbd" + integrity sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ== dependencies: esbuild "^0.20.1" postcss "^8.4.38" diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..0e53a11 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,167 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/runtime@^7.21.0": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" + integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== + dependencies: + regenerator-runtime "^0.14.0" + +"@types/lodash-es@^4.17.12": + version "4.17.12" + resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.12.tgz#65f6d1e5f80539aa7cfbfc962de5def0cf4f341b" + integrity sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.17.4" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.4.tgz#0303b64958ee070059e3a7184048a55159fe20b7" + integrity sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ== + +"@wojtekmaj/date-utils@^1.0.2": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@wojtekmaj/date-utils/-/date-utils-1.5.1.tgz#c3cd67177ac781cfa5736219d702a55a2aea5f2b" + integrity sha512-+i7+JmNiE/3c9FKxzWFi2IjRJ+KzZl1QPu6QNrsgaa2MuBgXvUy4gA1TVzf/JMdIIloB76xSKikTWuyYAIVLww== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + +date-fns@^2.14.0: + version "2.30.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + +date-fns@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf" + integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== + +get-user-locale@^1.2.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/get-user-locale/-/get-user-locale-1.5.1.tgz#18a9ba2cfeed0e713ea00968efa75d620523a5ea" + integrity sha512-WiNpoFRcHn1qxP9VabQljzGwkAQDrcpqUtaP0rNBEkFxJdh4f3tik6MfZsMYZc+UgQJdGCxWEjL9wnCUlRQXag== + dependencies: + lodash.memoize "^4.1.1" + +goober@^2.1.11: + version "2.1.14" + resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.14.tgz#4a5c94fc34dc086a8e6035360ae1800005135acd" + integrity sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash.memoize@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +merge-class-names@^1.1.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/merge-class-names/-/merge-class-names-1.4.2.tgz#78d6d95ab259e7e647252a7988fd25a27d5a8835" + integrity sha512-bOl98VzwCGi25Gcn3xKxnR5p/WrhWFQB59MS/aGENcmUc6iSm96yrFDF0XSNurX9qN4LbJm0R9kfvsQ17i8zCw== + +moment@^2.30.1: + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +prop-types@^15.6.0: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +react-calendar@^3.1.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/react-calendar/-/react-calendar-3.9.0.tgz#4dfe342ef61574c0e819e49847981076c7af58ea" + integrity sha512-g6RJCEaPovHTiV2bMhBUfm0a1YoMj4bOUpL8hQSLmR1Glhc7lgRLtZBd4mcC4jkoGsb+hv9uA/QH4pZcm5l9lQ== + dependencies: + "@wojtekmaj/date-utils" "^1.0.2" + get-user-locale "^1.2.0" + merge-class-names "^1.1.1" + prop-types "^15.6.0" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-schedule-meeting@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/react-schedule-meeting/-/react-schedule-meeting-4.2.3.tgz#21ffe27f0bca6158cc3182149abf4b859f54b6fb" + integrity sha512-GnuhecQUNzFsXIGp8JYtSI/rgfe+2CvXDkTclGpPGCKnya/DtG19QC04YA49h8+danTwX0aLyqThKZOXI4n9AQ== + dependencies: + color "^4.2.3" + date-fns "^2.14.0" + goober "^2.1.11" + react-calendar "^3.1.0" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1"