From b80bf9cd3fb8ec48b8b82c3d708e8d326f5c94c0 Mon Sep 17 00:00:00 2001 From: Gib Date: Fri, 13 Jun 2025 11:38:33 -0500 Subject: [PATCH] Tech Table & History components completely rewritten & cleaned up. Just need to implement the realtime subscription now. --- package.json | 6 +- pnpm-lock.yaml | 170 ++++++------- src/app/(auth-pages)/forgot-password/page.tsx | 4 +- src/app/(auth-pages)/profile/page.tsx | 6 +- src/app/(auth-pages)/sign-in/page.tsx | 4 +- src/app/(auth-pages)/sign-up/page.tsx | 6 +- src/app/page.tsx | 14 +- src/components/default/footer/index.tsx | 34 +-- .../default/header/AvatarDropdown.tsx | 4 +- src/components/status/HistoryDrawer.tsx | 106 ++++----- src/components/status/TechTable.tsx | 96 +++++--- src/components/ui/drawer.tsx | 76 +++--- src/components/ui/pagination.tsx | 84 +++---- src/components/ui/progress.tsx | 22 +- src/components/ui/scroll-area.tsx | 42 ++-- src/components/ui/table.tsx | 84 +++---- src/lib/actions/status.ts | 98 +++++--- src/lib/hooks/auth.ts | 5 +- src/lib/hooks/status.ts | 99 +++++--- src/utils/supabase/types.ts | 224 +++++++++--------- 20 files changed, 639 insertions(+), 545 deletions(-) diff --git a/package.json b/package.json index 5dd6cb6..9928f13 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@radix-ui/react-scroll-area": "^1.2.9", "@radix-ui/react-separator": "^1.1.7", "@radix-ui/react-slot": "^1.2.3", - "@sentry/nextjs": "^9.28.1", + "@sentry/nextjs": "^9.29.0", "@supabase/ssr": "^0.6.1", "@supabase/supabase-js": "^2.50.0", "@t3-oss/env-nextjs": "^0.12.0", @@ -43,7 +43,7 @@ "require-in-the-middle": "^7.5.2", "sonner": "^2.0.5", "vaul": "^1.1.2", - "zod": "^3.25.63" + "zod": "^3.25.64" }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", @@ -57,7 +57,7 @@ "eslint-config-next": "^15.3.3", "eslint-config-prettier": "^10.1.5", "eslint-plugin-prettier": "^5.4.1", - "import-in-the-middle": "^1.14.0", + "import-in-the-middle": "^1.14.2", "postcss": "^8.5.5", "prettier": "^3.5.3", "prettier-plugin-tailwindcss": "^0.6.12", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a418bf..9b0aa49 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,8 +39,8 @@ importers: specifier: ^1.2.3 version: 1.2.3(@types/react@19.1.8)(react@19.1.0) '@sentry/nextjs': - specifier: ^9.28.1 - version: 9.28.1(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(webpack@5.99.9) + specifier: ^9.29.0 + version: 9.29.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(webpack@5.99.9) '@supabase/ssr': specifier: ^0.6.1 version: 0.6.1(@supabase/supabase-js@2.50.0) @@ -49,7 +49,7 @@ importers: version: 2.50.0 '@t3-oss/env-nextjs': specifier: ^0.12.0 - version: 0.12.0(typescript@5.8.3)(zod@3.25.63) + version: 0.12.0(typescript@5.8.3)(zod@3.25.64) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -87,8 +87,8 @@ importers: specifier: ^1.1.2 version: 1.1.2(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) zod: - specifier: ^3.25.63 - version: 3.25.63 + specifier: ^3.25.64 + version: 3.25.64 devDependencies: '@eslint/eslintrc': specifier: ^3.3.1 @@ -124,8 +124,8 @@ importers: specifier: ^5.4.1 version: 5.4.1(@types/eslint@9.6.1)(eslint-config-prettier@10.1.5(eslint@9.28.0(jiti@2.4.2)))(eslint@9.28.0(jiti@2.4.2))(prettier@3.5.3) import-in-the-middle: - specifier: ^1.14.0 - version: 1.14.0 + specifier: ^1.14.2 + version: 1.14.2 postcss: specifier: ^8.5.5 version: 8.5.5 @@ -1226,28 +1226,28 @@ packages: '@rushstack/eslint-patch@1.11.0': resolution: {integrity: sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==} - '@sentry-internal/browser-utils@9.28.1': - resolution: {integrity: sha512-P/FEZkT7UqTw9P/2n/Y4Aa1OtGP6dnCvyqzPPkjiRdVa7Ep7S5ElBJloGv7077TLLBtAfCsEUVRlM1F6/jQoaA==} + '@sentry-internal/browser-utils@9.29.0': + resolution: {integrity: sha512-Wp6UJCDVV2KVK+TG8GwdLZyDy4GtUYDmVhGMpHKPS3G/Qgpf36cY/XHwChwaHZ5P9Bk1sjS9Ok698J59S8L2nw==} engines: {node: '>=18'} - '@sentry-internal/feedback@9.28.1': - resolution: {integrity: sha512-HOk/c26D3nlClO/xEefev8fIJzRA621PFQvNFPu/y0Z5HujEqSmIsrff0cXszPPYD95h4Mwk63E0ZYdspdeXcw==} + '@sentry-internal/feedback@9.29.0': + resolution: {integrity: sha512-ADvetGrtr+RfYcQKrQxah4fHs/xDJ/VjbStVMSuaNllzwWPYNkWIGFE6YjQ7wZszj0DQIu5/H+B6lZKsFYk4xw==} engines: {node: '>=18'} - '@sentry-internal/replay-canvas@9.28.1': - resolution: {integrity: sha512-RtkogfcIpXLFCyV8CTnXmVTH2QauT/KwmUAXBbeOz3rRWsM19yjN1moHrsjxn7OdjTv+D4qWSCA8Ka1aKSpr7g==} + '@sentry-internal/replay-canvas@9.29.0': + resolution: {integrity: sha512-TrQYhSAVPhyenvu0fNkon7BznFibu1mzS5bCudxhgOWajZluUVrXcbp8Q3WZ3R+AogrcgA3Vy6aumP/+fMKdwg==} engines: {node: '>=18'} - '@sentry-internal/replay@9.28.1': - resolution: {integrity: sha512-Tv9pkfAX+1bmhxF42TL0c4uTiK2+rp5LMYEPdz6JBfpfvG/Z1unPGsuB7fQmHYKyfHBQJmi92DZV+smljm7w/g==} + '@sentry-internal/replay@9.29.0': + resolution: {integrity: sha512-we/1JPRje8sNowQCyogOV1OYWuDOP/3XmDi48XoFG2HB0XMl2HfL5LI8AvgAvC/5nrqVAAo4ktbjoVLm1fb7rg==} engines: {node: '>=18'} '@sentry/babel-plugin-component-annotate@3.5.0': resolution: {integrity: sha512-s2go8w03CDHbF9luFGtBHKJp4cSpsQzNVqgIa9Pfa4wnjipvrK6CxVT4icpLA3YO6kg5u622Yoa5GF3cJdippw==} engines: {node: '>= 14'} - '@sentry/browser@9.28.1': - resolution: {integrity: sha512-XAS46iQSq8lXTnv9udQP025JTf3PwSVRE9ePJVQhx25QBWxedqGhEOv5qqX9b1Ijf8KiZYXXhBWMQxBBXVzUaw==} + '@sentry/browser@9.29.0': + resolution: {integrity: sha512-+GFX/yb+rh6V1fSgTYM6ttAgledl2aUR3T3Rg86HNuegbdX8ym6lOtUOIZ0j9jPK015HR47KIPyIZVZZJ7Rj9g==} engines: {node: '>=18'} '@sentry/bundler-plugin-core@3.5.0': @@ -1300,22 +1300,22 @@ packages: engines: {node: '>= 10'} hasBin: true - '@sentry/core@9.28.1': - resolution: {integrity: sha512-6q59r/71MeE+4StkvwdKAAyhBBNpWcii0HeiWBZ3l1gaFYQlb6bChjZJRZmxSzF5dnvkdF4duQbAC3JmjeIbPA==} + '@sentry/core@9.29.0': + resolution: {integrity: sha512-wDyNe45PM+RCGtUn1tK7LzJ08ksv8i8KRUHrst7lsinEfRm83YH+wbWrPmwkVNEngUZvYkHwGLbNXM7xgFUuDQ==} engines: {node: '>=18'} - '@sentry/nextjs@9.28.1': - resolution: {integrity: sha512-3ryNddo0S+Ni2pcUx9u3hxhXvbGpjU8dLO8lemH3chlDMG787URD/IpO9o+mN/WXJcA/UnNFgDMebQ4bXSRj1g==} + '@sentry/nextjs@9.29.0': + resolution: {integrity: sha512-chMSvo/CWsUw3bkGnURiOejW2hI95sofvFQQL2W98KGRhznfkfXhIh6U60fDpO2KaAbXDbbUCgcvBALdmILu9g==} engines: {node: '>=18'} peerDependencies: next: ^13.2.0 || ^14.0 || ^15.0.0-rc.0 - '@sentry/node@9.28.1': - resolution: {integrity: sha512-1bC8ywFPs1EIKzRlUhLoreTR/fUU45O+ezVNvOu0I6JURMwjyC8uT23f0Xkiolx4WjKZXER+d0el3HojPaYkYw==} + '@sentry/node@9.29.0': + resolution: {integrity: sha512-oABipgC/fClRuvyMeK43rigv9F+OAaoR84UaMKB7aPXN6iz634wBRVsaoZAwiR3xLL+R7MafEPPA/s9XqlG7ag==} engines: {node: '>=18'} - '@sentry/opentelemetry@9.28.1': - resolution: {integrity: sha512-1xxriB2diNSlNpkMosdgIKzPOPwAiyFg7XgEWKpLtDYWj7WVbLNyLkUWriFr4JgU40uZp3LW+sGgnshA48/zQQ==} + '@sentry/opentelemetry@9.29.0': + resolution: {integrity: sha512-QTUmre8i5+832RjzQW+g8IQ3UmBe5fbQXGbCF5hQ0UNuHle9r3Z8UZcIff5W8tm5AXMxPqvptTnDEZUUXHgBiA==} engines: {node: '>=18'} peerDependencies: '@opentelemetry/api': ^1.9.0 @@ -1325,14 +1325,14 @@ packages: '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.0.0 '@opentelemetry/semantic-conventions': ^1.34.0 - '@sentry/react@9.28.1': - resolution: {integrity: sha512-XnEURhb2wG7FFCGMuW/IJc8YeDMb9LM7cZSBwBDcplR11mCRsLpf4AGm6K1nWmAn5ZvWrXRO/TBAf9DNRAfnfg==} + '@sentry/react@9.29.0': + resolution: {integrity: sha512-Wb8oKkIr/1yZ0GRz1UH4CRcjIU48iQLSDLXFKZ8YwPpPdC5qq7l4ALraxlcdB+uWq0JIgEjN5FSLamdt/NHX/w==} engines: {node: '>=18'} peerDependencies: react: ^16.14.0 || 17.x || 18.x || 19.x - '@sentry/vercel-edge@9.28.1': - resolution: {integrity: sha512-fX4Zc3uzpnJxcallZrWCvXFaMDBy710KlnPll3ja82QJVIhyzCf2ot109jGW8mKlpMXXBbDSKGZlY0v4pQW+lg==} + '@sentry/vercel-edge@9.29.0': + resolution: {integrity: sha512-Op31XnkkLwWImIXPVpX2ErEPGmXaWt5YvVxiikyCgH0OzfWUnBKXDl9lcPC2Kn02JCQOop8o9tmQUyOagfJrog==} engines: {node: '>=18'} '@sentry/webpack-plugin@3.5.0': @@ -1937,8 +1937,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001722: - resolution: {integrity: sha512-DCQHBBZtiK6JVkAGw7drvAMK0Q0POD/xZvEmDp6baiMMP6QXXk9HpD6mNYBZWhOPG6LvIDb82ITqtWjhDckHCA==} + caniuse-lite@1.0.30001723: + resolution: {integrity: sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==} chalk@3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} @@ -2072,8 +2072,8 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - electron-to-chromium@1.5.166: - resolution: {integrity: sha512-QPWqHL0BglzPYyJJ1zSSmwFFL6MFXhbACOCcsCdUMCkzPdS9/OIBVxg516X/Ado2qwAq8k0nJJ7phQPCqiaFAw==} + electron-to-chromium@1.5.167: + resolution: {integrity: sha512-LxcRvnYO5ez2bMOFpbuuVuAI5QNeY1ncVytE/KXaL6ZNfzX1yPlAO0nSOyIHx2fVAuUprMqPs/TdVhUFZy7SIQ==} emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} @@ -2460,8 +2460,8 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - import-in-the-middle@1.14.0: - resolution: {integrity: sha512-g5zLT0HaztRJWysayWYiUq/7E5H825QIiecMD2pI5QO7Wzr847l6GDvPvmZaDIdrDtS2w7qRczywxiK6SL5vRw==} + import-in-the-middle@1.14.2: + resolution: {integrity: sha512-5tCuY9BV8ujfOpwtAGgsTx9CGUapcFMEEyByLv1B+v2+6DhAcw+Zr0nhQT7uwaZ7DiourxFEscghOR8e1aPLQw==} imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} @@ -3594,8 +3594,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod@3.25.63: - resolution: {integrity: sha512-3ttCkqhtpncYXfP0f6dsyabbYV/nEUW+Xlu89jiXbTBifUfjaSqXOG6JnQPLtqt87n7KAmnMqcjay6c0Wq0Vbw==} + zod@3.25.64: + resolution: {integrity: sha512-hbP9FpSZf7pkS7hRVUrOjhwKJNyampPgtXKc3AN6DsWtoHsg2Sb4SQaS4Tcay380zSwd2VPo9G9180emBACp5g==} snapshots: @@ -4172,7 +4172,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.57.2 '@types/shimmer': 1.2.0 - import-in-the-middle: 1.14.0 + import-in-the-middle: 1.14.2 require-in-the-middle: 7.5.2 semver: 7.7.2 shimmer: 1.2.1 @@ -4644,33 +4644,33 @@ snapshots: '@rushstack/eslint-patch@1.11.0': {} - '@sentry-internal/browser-utils@9.28.1': + '@sentry-internal/browser-utils@9.29.0': dependencies: - '@sentry/core': 9.28.1 + '@sentry/core': 9.29.0 - '@sentry-internal/feedback@9.28.1': + '@sentry-internal/feedback@9.29.0': dependencies: - '@sentry/core': 9.28.1 + '@sentry/core': 9.29.0 - '@sentry-internal/replay-canvas@9.28.1': + '@sentry-internal/replay-canvas@9.29.0': dependencies: - '@sentry-internal/replay': 9.28.1 - '@sentry/core': 9.28.1 + '@sentry-internal/replay': 9.29.0 + '@sentry/core': 9.29.0 - '@sentry-internal/replay@9.28.1': + '@sentry-internal/replay@9.29.0': dependencies: - '@sentry-internal/browser-utils': 9.28.1 - '@sentry/core': 9.28.1 + '@sentry-internal/browser-utils': 9.29.0 + '@sentry/core': 9.29.0 '@sentry/babel-plugin-component-annotate@3.5.0': {} - '@sentry/browser@9.28.1': + '@sentry/browser@9.29.0': dependencies: - '@sentry-internal/browser-utils': 9.28.1 - '@sentry-internal/feedback': 9.28.1 - '@sentry-internal/replay': 9.28.1 - '@sentry-internal/replay-canvas': 9.28.1 - '@sentry/core': 9.28.1 + '@sentry-internal/browser-utils': 9.29.0 + '@sentry-internal/feedback': 9.29.0 + '@sentry-internal/replay': 9.29.0 + '@sentry-internal/replay-canvas': 9.29.0 + '@sentry/core': 9.29.0 '@sentry/bundler-plugin-core@3.5.0': dependencies: @@ -4726,19 +4726,19 @@ snapshots: - encoding - supports-color - '@sentry/core@9.28.1': {} + '@sentry/core@9.29.0': {} - '@sentry/nextjs@9.28.1(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(webpack@5.99.9)': + '@sentry/nextjs@9.29.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(webpack@5.99.9)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.34.0 '@rollup/plugin-commonjs': 28.0.1(rollup@4.35.0) - '@sentry-internal/browser-utils': 9.28.1 - '@sentry/core': 9.28.1 - '@sentry/node': 9.28.1 - '@sentry/opentelemetry': 9.28.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.34.0) - '@sentry/react': 9.28.1(react@19.1.0) - '@sentry/vercel-edge': 9.28.1 + '@sentry-internal/browser-utils': 9.29.0 + '@sentry/core': 9.29.0 + '@sentry/node': 9.29.0 + '@sentry/opentelemetry': 9.29.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.34.0) + '@sentry/react': 9.29.0(react@19.1.0) + '@sentry/vercel-edge': 9.29.0 '@sentry/webpack-plugin': 3.5.0(webpack@5.99.9) chalk: 3.0.0 next: 15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -4755,7 +4755,7 @@ snapshots: - supports-color - webpack - '@sentry/node@9.28.1': + '@sentry/node@9.29.0': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) @@ -4787,14 +4787,14 @@ snapshots: '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.34.0 '@prisma/instrumentation': 6.8.2(@opentelemetry/api@1.9.0) - '@sentry/core': 9.28.1 - '@sentry/opentelemetry': 9.28.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.34.0) - import-in-the-middle: 1.14.0 + '@sentry/core': 9.29.0 + '@sentry/opentelemetry': 9.29.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.34.0) + import-in-the-middle: 1.14.2 minimatch: 9.0.5 transitivePeerDependencies: - supports-color - '@sentry/opentelemetry@9.28.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.34.0)': + '@sentry/opentelemetry@9.29.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.34.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) @@ -4802,19 +4802,19 @@ snapshots: '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.34.0 - '@sentry/core': 9.28.1 + '@sentry/core': 9.29.0 - '@sentry/react@9.28.1(react@19.1.0)': + '@sentry/react@9.29.0(react@19.1.0)': dependencies: - '@sentry/browser': 9.28.1 - '@sentry/core': 9.28.1 + '@sentry/browser': 9.29.0 + '@sentry/core': 9.29.0 hoist-non-react-statics: 3.3.2 react: 19.1.0 - '@sentry/vercel-edge@9.28.1': + '@sentry/vercel-edge@9.29.0': dependencies: '@opentelemetry/api': 1.9.0 - '@sentry/core': 9.28.1 + '@sentry/core': 9.29.0 '@sentry/webpack-plugin@3.5.0(webpack@5.99.9)': dependencies: @@ -4881,17 +4881,17 @@ snapshots: dependencies: tslib: 2.8.1 - '@t3-oss/env-core@0.12.0(typescript@5.8.3)(zod@3.25.63)': + '@t3-oss/env-core@0.12.0(typescript@5.8.3)(zod@3.25.64)': optionalDependencies: typescript: 5.8.3 - zod: 3.25.63 + zod: 3.25.64 - '@t3-oss/env-nextjs@0.12.0(typescript@5.8.3)(zod@3.25.63)': + '@t3-oss/env-nextjs@0.12.0(typescript@5.8.3)(zod@3.25.64)': dependencies: - '@t3-oss/env-core': 0.12.0(typescript@5.8.3)(zod@3.25.63) + '@t3-oss/env-core': 0.12.0(typescript@5.8.3)(zod@3.25.64) optionalDependencies: typescript: 5.8.3 - zod: 3.25.63 + zod: 3.25.64 '@tailwindcss/node@4.1.10': dependencies: @@ -5456,8 +5456,8 @@ snapshots: browserslist@4.25.0: dependencies: - caniuse-lite: 1.0.30001722 - electron-to-chromium: 1.5.166 + caniuse-lite: 1.0.30001723 + electron-to-chromium: 1.5.167 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.0) @@ -5486,7 +5486,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001722: {} + caniuse-lite@1.0.30001723: {} chalk@3.0.0: dependencies: @@ -5618,7 +5618,7 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - electron-to-chromium@1.5.166: {} + electron-to-chromium@1.5.167: {} emoji-regex@9.2.2: {} @@ -6140,7 +6140,7 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-in-the-middle@1.14.0: + import-in-the-middle@1.14.2: dependencies: acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) @@ -6489,7 +6489,7 @@ snapshots: '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001722 + caniuse-lite: 1.0.30001723 postcss: 8.4.31 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -7324,4 +7324,4 @@ snapshots: yocto-queue@0.1.0: {} - zod@3.25.63: {} + zod@3.25.64: {} diff --git a/src/app/(auth-pages)/forgot-password/page.tsx b/src/app/(auth-pages)/forgot-password/page.tsx index 48d388d..f27d6fb 100644 --- a/src/app/(auth-pages)/forgot-password/page.tsx +++ b/src/app/(auth-pages)/forgot-password/page.tsx @@ -2,12 +2,12 @@ import { ForgotPasswordCard } from '@/components/default/auth'; const ForgotPassword = () => { - return ( + return (
- ); + ); }; export default ForgotPassword; diff --git a/src/app/(auth-pages)/profile/page.tsx b/src/app/(auth-pages)/profile/page.tsx index 6abbbb0..977fff3 100644 --- a/src/app/(auth-pages)/profile/page.tsx +++ b/src/app/(auth-pages)/profile/page.tsx @@ -1,15 +1,15 @@ 'use client'; -import { ProfileCard } from "@/components/default/auth"; +import { ProfileCard } from '@/components/default/auth'; const ProfilePage = () => { - return ( + return (
- ); + ); }; export default ProfilePage; diff --git a/src/app/(auth-pages)/sign-in/page.tsx b/src/app/(auth-pages)/sign-in/page.tsx index 8e1caa6..600991c 100644 --- a/src/app/(auth-pages)/sign-in/page.tsx +++ b/src/app/(auth-pages)/sign-in/page.tsx @@ -2,13 +2,13 @@ import { SignInCard } from '@/components/default/auth'; const Login = () => { - return ( + return (
- ); + ); }; export default Login; diff --git a/src/app/(auth-pages)/sign-up/page.tsx b/src/app/(auth-pages)/sign-up/page.tsx index a54a478..b585d94 100644 --- a/src/app/(auth-pages)/sign-up/page.tsx +++ b/src/app/(auth-pages)/sign-up/page.tsx @@ -1,14 +1,14 @@ 'use client'; -import { SignUpCard } from "@/components/default/auth"; +import { SignUpCard } from '@/components/default/auth'; const SignUp = () => { - return ( + return (
- ); + ); }; export default SignUp; diff --git a/src/app/page.tsx b/src/app/page.tsx index 9ae1455..fc96bfe 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -9,8 +9,8 @@ const Home = async () => { redirect('/sign-in'); } else if (userResponse.data) { redirect('/status'); - } else return
; -} + } else return
; +}; export default Home; //'use client'; @@ -20,10 +20,10 @@ export default Home; //import { useAuth } from '@/components/context'; //const HomePage = () => { - //const { isAuthenticated } = useAuth(); - //if (!isAuthenticated) { - //redirect('/sign-in'); - //} - //redirect('/profile'); +//const { isAuthenticated } = useAuth(); +//if (!isAuthenticated) { +//redirect('/sign-in'); +//} +//redirect('/profile'); //}; //export default HomePage; diff --git a/src/components/default/footer/index.tsx b/src/components/default/footer/index.tsx index 1abd519..372b6d9 100644 --- a/src/components/default/footer/index.tsx +++ b/src/components/default/footer/index.tsx @@ -19,23 +19,23 @@ const Footer = () => {
-
-
- Tech Tracker Logo -

- Tech Tracker - City of Gulfport IT Department -

-
-

- Open Source • MIT Licensed • Self-Hosted -

-
+
+
+ Tech Tracker Logo +

+ Tech Tracker - City of Gulfport IT Department +

+
+

+ Open Source • MIT Licensed • Self-Hosted +

+
{/* Spacer to balance the layout */} diff --git a/src/components/default/header/AvatarDropdown.tsx b/src/components/default/header/AvatarDropdown.tsx index da160c4..787eca1 100644 --- a/src/components/default/header/AvatarDropdown.tsx +++ b/src/components/default/header/AvatarDropdown.tsx @@ -62,7 +62,9 @@ const AvatarDropdown = () => { - {profile?.full_name} + + {profile?.full_name} +
) : ( Array.from({ length: totalPages }).map((_, idx) => ( diff --git a/src/components/status/TechTable.tsx b/src/components/status/TechTable.tsx index 34fbecd..0268011 100644 --- a/src/components/status/TechTable.tsx +++ b/src/components/status/TechTable.tsx @@ -9,13 +9,10 @@ import { updateUserStatus, type UserWithStatus, } from '@/lib/hooks/status'; -import { - Drawer, - DrawerTrigger, - Progress, -} from '@/components/ui'; +import { Drawer, DrawerTrigger, Progress } from '@/components/ui'; import { toast } from 'sonner'; import { HistoryDrawer } from '@/components/status'; +import type { Profile } from '@/utils/supabase'; import type { RealtimeChannel } from '@supabase/supabase-js'; type TechTableProps = { @@ -33,10 +30,10 @@ export const TechTable = ({ const [selectedIds, setSelectedIds] = useState([]); const [selectAll, setSelectAll] = useState(false); const [statusInput, setStatusInput] = useState(''); - const [usersWithStatuses, setUsersWithStatuses] = useState(initialStatuses); - const [selectedHistoryUserId, setSelectedHistoryUserId] = useState(''); - - const supabase = createClient(); + const [usersWithStatuses, setUsersWithStatuses] = + useState(initialStatuses); + const [selectedHistoryUser, setSelectedHistoryUser] = + useState(null); const fetchRecentUsersWithStatuses = useCallback(async () => { try { @@ -44,7 +41,7 @@ export const TechTable = ({ if (!response.success) throw new Error(response.error); return response.data; } catch (error) { - toast.error(`Error fetching technicians: ${error as Error}`) + toast.error(`Error fetching technicians: ${error as Error}`); return []; } }, []); @@ -78,19 +75,24 @@ export const TechTable = ({ } else { const result = await updateStatuses(selectedIds, statusInput); if (!result.success) throw new Error(result.error); - toast.success(`Status updated for ${selectedIds.length} selected users.`); + toast.success( + `Status updated for ${selectedIds.length} selected users.`, + ); } setSelectedIds([]); setStatusInput(''); } catch (error) { - const errorMessage = error instanceof Error ? error.message : String(error); + const errorMessage = + error instanceof Error ? error.message : String(error); toast.error(`Failed to update status: ${errorMessage}`); } - }, [isAuthenticated, statusInput, selectedIds, usersWithStatuses, profile]); + }, [isAuthenticated, statusInput, selectedIds]); const handleCheckboxChange = (id: string) => { setSelectedIds((prev) => - prev.includes(id) ? prev.filter(prevId => prevId !== id) : [...prev, id] + prev.includes(id) + ? prev.filter((prevId) => prevId !== id) + : [...prev, id], ); }; @@ -98,7 +100,7 @@ export const TechTable = ({ if (selectAll) { setSelectedIds([]); } else { - setSelectedIds(usersWithStatuses.map(tech => tech.user.id)); + setSelectedIds(usersWithStatuses.map((tech) => tech.user.id)); } setSelectAll(!selectAll); }; @@ -106,7 +108,7 @@ export const TechTable = ({ useEffect(() => { setSelectAll( selectedIds.length === usersWithStatuses.length && - usersWithStatuses.length > 0 + usersWithStatuses.length > 0, ); }, [selectedIds.length, usersWithStatuses.length]); @@ -116,9 +118,9 @@ export const TechTable = ({ hour: 'numeric', minute: 'numeric', }); - const day = date.getDate() + const day = date.getDate(); const month = date.toLocaleString('default', { month: 'long' }); - return `${time} = ${month} ${day}`; + return `${time} - ${month} ${day}`; }; if (loading) { @@ -131,7 +133,10 @@ export const TechTable = ({ return (
- +
{!tvMode && ( @@ -150,7 +155,7 @@ export const TechTable = ({ Status - + @@ -171,7 +176,9 @@ export const TechTable = ({ type='checkbox' className='scale-125 cursor-pointer' checked={selectedIds.includes(userWithStatus.user.id)} - onChange={() => handleCheckboxChange(userWithStatus.user.id)} + onChange={() => + handleCheckboxChange(userWithStatus.user.id) + } /> )} @@ -182,15 +189,12 @@ export const TechTable = ({ setSelectedHistoryUserId(userWithStatus.user.id)} + onClick={() => setSelectedHistoryUser(userWithStatus.user)} > {userWithStatus.status} - {selectedHistoryUserId === userWithStatus.user.id && ( - + {selectedHistoryUser === userWithStatus.user && ( + )} @@ -201,7 +205,43 @@ export const TechTable = ({ ))}
Updated At
+ {!tvMode && ( +
+ setStatusInput(e.target.value)} + onKeyDown={(e) => { + if (e.key === 'Enter') { + updateStatus().catch((error) => { + toast.error(`Failed to update status: ${error as Error}`); + }); + } + }} + /> + +
+ )}
); - }; diff --git a/src/components/ui/drawer.tsx b/src/components/ui/drawer.tsx index 8aa6923..0e2eb3c 100644 --- a/src/components/ui/drawer.tsx +++ b/src/components/ui/drawer.tsx @@ -1,32 +1,32 @@ -"use client" +'use client'; -import * as React from "react" -import { Drawer as DrawerPrimitive } from "vaul" +import * as React from 'react'; +import { Drawer as DrawerPrimitive } from 'vaul'; -import { cn } from "@/lib/utils" +import { cn } from '@/lib/utils'; function Drawer({ ...props }: React.ComponentProps) { - return + return ; } function DrawerTrigger({ ...props }: React.ComponentProps) { - return + return ; } function DrawerPortal({ ...props }: React.ComponentProps) { - return + return ; } function DrawerClose({ ...props }: React.ComponentProps) { - return + return ; } function DrawerOverlay({ @@ -35,14 +35,14 @@ function DrawerOverlay({ }: React.ComponentProps) { return ( - ) + ); } function DrawerContent({ @@ -51,48 +51,48 @@ function DrawerContent({ ...props }: React.ComponentProps) { return ( - + -
+
{children} - ) + ); } -function DrawerHeader({ className, ...props }: React.ComponentProps<"div">) { +function DrawerHeader({ className, ...props }: React.ComponentProps<'div'>) { return (
- ) + ); } -function DrawerFooter({ className, ...props }: React.ComponentProps<"div">) { +function DrawerFooter({ className, ...props }: React.ComponentProps<'div'>) { return (
- ) + ); } function DrawerTitle({ @@ -101,11 +101,11 @@ function DrawerTitle({ }: React.ComponentProps) { return ( - ) + ); } function DrawerDescription({ @@ -114,11 +114,11 @@ function DrawerDescription({ }: React.ComponentProps) { return ( - ) + ); } export { @@ -132,4 +132,4 @@ export { DrawerFooter, DrawerTitle, DrawerDescription, -} +}; diff --git a/src/components/ui/pagination.tsx b/src/components/ui/pagination.tsx index 0d18541..f5b6188 100644 --- a/src/components/ui/pagination.tsx +++ b/src/components/ui/pagination.tsx @@ -1,68 +1,68 @@ -import * as React from "react" +import * as React from 'react'; import { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon, -} from "lucide-react" +} from 'lucide-react'; -import { cn } from "@/lib/utils" -import { Button, buttonVariants } from "@/components/ui/button" +import { cn } from '@/lib/utils'; +import { Button, buttonVariants } from '@/components/ui/button'; -function Pagination({ className, ...props }: React.ComponentProps<"nav">) { +function Pagination({ className, ...props }: React.ComponentProps<'nav'>) { return (