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 ? (
+
+ ) : (
+ 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"