From 374a1ec4b864879569280f1b8753ba7861a4ffce Mon Sep 17 00:00:00 2001 From: Arthur Belleville Date: Fri, 10 Oct 2025 11:06:44 +0200 Subject: [PATCH] Fix lint --- .pre-commit-config.yaml | 2 +- ui/eslint.config.js | 18 -- ui/package.json | 13 +- ui/pnpm-lock.yaml | 200 ++++++++++++------ ui/src/App.tsx | 10 +- ui/src/components/AuthenticationGateway.tsx | 2 +- .../components/AuthenticationGateway.unit.tsx | 2 +- ui/src/components/AvailabilityCard.tsx | 11 +- .../BrandButtons/LoginWithGoogle.test.tsx | 6 +- ui/src/components/ChannelPreview.tsx | 2 +- ui/src/components/CreateTabloModal.tsx | 8 +- ui/src/components/CustomChannelHeader.tsx | 2 +- ui/src/components/DeleteTabloModal.tsx | 2 +- ui/src/components/EventDetailsModal.tsx | 6 +- ui/src/components/EventModal.tsx | 12 +- ui/src/components/EventTypeModal.tsx | 6 +- ui/src/components/ImportICSModal.tsx | 12 +- ui/src/components/Layout.test.tsx | 2 +- ui/src/components/Layout.tsx | 8 +- ui/src/components/NavigationBar.test.tsx | 5 +- ui/src/components/NavigationBar.tsx | 51 +++-- ui/src/components/ProtectedRoute.test.tsx | 2 +- ui/src/components/ProtectedRoute.tsx | 2 +- ui/src/components/RowActionMenu.tsx | 2 +- ui/src/components/SignOutButton.test.tsx | 6 +- ui/src/components/SignOutButton.tsx | 6 +- ui/src/components/TabloModal.tsx | 22 +- ui/src/components/TabloTutorial.tsx | 4 +- ui/src/components/ThemeSwitcher.test.tsx | 2 +- ui/src/components/ThemeSwitcher.tsx | 4 +- ui/src/components/WebcalModal.tsx | 4 +- ui/src/components/devis/CreateDevisModal.tsx | 14 +- ui/src/components/devis/DeleteDevisModal.tsx | 14 +- ui/src/components/devis/ViewDevisModal.tsx | 14 +- ui/src/components/header.tsx | 4 +- ui/src/components/kanban/KanbanBoard.tsx | 13 +- ui/src/contexts/SessionContext.tsx | 2 +- ui/src/contexts/ThemeContext.tsx | 2 +- ui/src/hooks/auth.ts | 10 +- ui/src/hooks/availabilities.ts | 6 +- ui/src/hooks/channel.ts | 2 +- ui/src/hooks/devis.ts | 2 +- ui/src/hooks/event-types.ts | 4 +- ui/src/hooks/events.ts | 4 +- ui/src/hooks/feedback.ts | 4 +- ui/src/hooks/invite.ts | 2 +- ui/src/hooks/support.ts | 2 +- ui/src/hooks/tablos.ts | 18 +- ui/src/hooks/webcal.ts | 2 +- ui/src/lib/api.ts | 2 +- ui/src/lib/routes.tsx | 38 ++-- ui/src/main.tsx | 2 +- ui/src/pages/NotFoundPage.tsx | 2 +- ui/src/pages/PublicBookingPage.tsx | 32 +-- ui/src/pages/availabilities.tsx | 20 +- ui/src/pages/bookings.tsx | 29 ++- ui/src/pages/chat.tsx | 20 +- ui/src/pages/devis.test.tsx | 7 +- ui/src/pages/devis.tsx | 33 +-- ui/src/pages/event-types-page.tsx | 10 +- ui/src/pages/feedback.tsx | 18 +- ui/src/pages/join.tsx | 4 +- ui/src/pages/kanban.tsx | 8 +- ui/src/pages/landing.tsx | 7 +- ui/src/pages/login.tsx | 20 +- ui/src/pages/oauth-signin.tsx | 4 +- ui/src/pages/planning.tsx | 16 +- ui/src/pages/reset-password.tsx | 8 +- ui/src/pages/signup.tsx | 18 +- ui/src/pages/support.tsx | 10 +- ui/src/pages/tablo.tsx | 14 +- ui/src/providers/ChatProvider.tsx | 2 +- ui/src/providers/UserStoreProvider.tsx | 8 +- ui/src/types/tablos.types.ts | 2 +- ui/src/ui-library/avatar.tsx | 2 +- ui/src/ui-library/badge/index.ts | 6 +- ui/src/ui-library/breadcrumbs.tsx | 12 +- ui/src/ui-library/button.tsx | 8 +- ui/src/ui-library/calendar.tsx | 24 +-- ui/src/ui-library/checkbox.tsx | 2 +- ui/src/ui-library/clipboard.tsx | 4 +- ui/src/ui-library/combobox.tsx | 16 +- ui/src/ui-library/date-field.tsx | 8 +- ui/src/ui-library/date-picker.tsx | 12 +- ui/src/ui-library/date-range-picker.tsx | 6 +- ui/src/ui-library/dialog.tsx | 10 +- ui/src/ui-library/empty-state.tsx | 4 +- ui/src/ui-library/field.tsx | 16 +- ui/src/ui-library/grid-list.tsx | 2 +- ui/src/ui-library/hover-card.tsx | 22 +- ui/src/ui-library/list-box.tsx | 6 +- ui/src/ui-library/menu.tsx | 18 +- ui/src/ui-library/modal.tsx | 2 +- ui/src/ui-library/multi-select.tsx | 22 +- ui/src/ui-library/native-select.tsx | 6 +- ui/src/ui-library/number-field.tsx | 10 +- ui/src/ui-library/pagination.tsx | 4 +- ui/src/ui-library/password-input.tsx | 6 +- ui/src/ui-library/popover.tsx | 4 +- ui/src/ui-library/range-calendar.tsx | 12 +- ui/src/ui-library/search-field.tsx | 4 +- ui/src/ui-library/select.tsx | 26 +-- ui/src/ui-library/separator.tsx | 2 +- ui/src/ui-library/slider.tsx | 6 +- ui/src/ui-library/switch.tsx | 6 +- ui/src/ui-library/table.tsx | 4 +- ui/src/ui-library/tabs.tsx | 4 +- ui/src/ui-library/tag-group.tsx | 2 +- ui/src/ui-library/tag-input.tsx | 6 +- ui/src/ui-library/text.tsx | 6 +- ui/src/ui-library/time-field.tsx | 2 +- ui/src/ui-library/toast/toast-region.tsx | 16 +- ui/src/ui-library/tooltip.tsx | 2 +- ui/src/utils/testHelpers.tsx | 12 +- ui/vite.config.ts | 11 +- ui/worker/index.d.ts | 2 +- 116 files changed, 653 insertions(+), 589 deletions(-) delete mode 100644 ui/eslint.config.js diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 76ae768..3e40ca5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,7 +12,7 @@ repos: entry: just typecheck language: python pass_filenames: false - files: \.ts* + files: ^ui/.*\.(ts|tsx)$ - id: test-ui name: Test Frontend entry: just test-frontend diff --git a/ui/eslint.config.js b/ui/eslint.config.js deleted file mode 100644 index bb141d1..0000000 --- a/ui/eslint.config.js +++ /dev/null @@ -1,18 +0,0 @@ -import globals from "globals"; -import pluginJs from "@eslint/js"; -import tseslint from "typescript-eslint"; -import pluginReact from "eslint-plugin-react"; - -/** @type {import('eslint').Linter.Config[]} */ -export default [ - { files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"] }, - { languageOptions: { globals: globals.browser } }, - pluginJs.configs.recommended, - ...tseslint.configs.recommended, - pluginReact.configs.flat.recommended, - { - rules: { - "react/react-in-jsx-scope": "off", - }, - }, -]; diff --git a/ui/package.json b/ui/package.json index c04e29c..8d1ed7b 100644 --- a/ui/package.json +++ b/ui/package.json @@ -6,16 +6,18 @@ "scripts": { "dev": "vite dev", "typecheck": "npx tsgo --build .", - "lint": "eslint .", + "lint": "biome check .", + "lint:fix": "biome check --write .", + "format": "biome format --write .", "preview": "vite preview", "build:staging": "tsc -b && vite build --mode staging", "build:prod": "tsc -b && vite build --mode production", "deploy:staging": "pnpm run build:staging && wrangler deploy", "deploy:prod": "pnpm run build:prod && wrangler deploy", "cf-typegen": "wrangler types", - "test": "vitest run --mode dev", - "test:watch": "vitest watch", - "test:coverage": "vitest run --coverage" + "test": "vitest run --mode dev --passWithNoTests", + "test:watch": "vitest watch --passWithNoTests", + "test:coverage": "vitest run --coverage --passWithNoTests" }, "devDependencies": { "@biomejs/biome": "2.2.5", @@ -42,6 +44,7 @@ "eslint": "^9.22.0", "eslint-plugin-react": "^7.37.4", "globals": "^16.0.0", + "happy-dom": "^20.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "lucide-react": "^0.460.0", @@ -58,7 +61,7 @@ "typescript-eslint": "^8.26.1", "vite": "^6.2.2", "vite-tsconfig-paths": "^5.1.4", - "vitest": "^3.1.1", + "vitest": "^3.2.4", "wrangler": "^4.24.3" }, "dependencies": { diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml index 484af9e..5c0ea9a 100644 --- a/ui/pnpm-lock.yaml +++ b/ui/pnpm-lock.yaml @@ -144,6 +144,9 @@ importers: globals: specifier: ^16.0.0 version: 16.0.0 + happy-dom: + specifier: ^20.0.0 + version: 20.0.0 jest: specifier: ^29.7.0 version: 29.7.0(@types/node@22.13.10) @@ -193,8 +196,8 @@ importers: specifier: ^5.1.4 version: 5.1.4(typescript@5.7.3)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) vitest: - specifier: ^3.1.1 - version: 3.1.1(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.29.2) + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.13.10)(happy-dom@20.0.0)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.29.2) wrangler: specifier: ^4.24.3 version: 4.24.3 @@ -2065,12 +2068,18 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -2122,6 +2131,9 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@20.19.20': + resolution: {integrity: sha512-2Q7WS25j4pS1cS8yw3d6buNCVJukOTeQ39bAnwR6sOJbaxvyCGebzTMypDFN82CxBLnl+lSWVdCCWbRY6y9yZQ==} + '@types/node@22.13.10': resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} @@ -2160,6 +2172,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/whatwg-mimetype@3.0.2': + resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + '@types/ws@8.18.0': resolution: {integrity: sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==} @@ -2331,34 +2346,34 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 - '@vitest/expect@3.1.1': - resolution: {integrity: sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/mocker@3.1.1': - resolution: {integrity: sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==} + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.1.1': - resolution: {integrity: sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==} + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/runner@3.1.1': - resolution: {integrity: sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==} + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - '@vitest/snapshot@3.1.1': - resolution: {integrity: sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==} + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} - '@vitest/spy@3.1.1': - resolution: {integrity: sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/utils@3.1.1': - resolution: {integrity: sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} @@ -2778,6 +2793,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decimal.js@10.5.0: resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} @@ -2926,8 +2950,8 @@ packages: resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} - es-module-lexer@1.6.0: - resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} @@ -3239,6 +3263,10 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + happy-dom@20.0.0: + resolution: {integrity: sha512-GkWnwIFxVGCf2raNrxImLo397RdGhLapj5cT3R2PT7FwL62Ze1DROhzmYW7+J3p9105DYMVenEejEbnq5wA37w==} + engines: {node: '>=20.0.0'} + has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -3718,6 +3746,9 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -3943,6 +3974,9 @@ packages: loupe@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -4852,6 +4886,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + style-to-js@1.1.17: resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} @@ -4916,16 +4953,16 @@ packages: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} - tinypool@1.0.2: - resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} tmpl@1.0.5: @@ -5036,6 +5073,9 @@ packages: undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici@5.29.0: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} @@ -5153,8 +5193,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.1.1: - resolution: {integrity: sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true @@ -5206,16 +5246,16 @@ packages: yaml: optional: true - vitest@3.1.1: - resolution: {integrity: sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==} + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.1.1 - '@vitest/ui': 3.1.1 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -7625,12 +7665,18 @@ snapshots: dependencies: '@babel/types': 7.26.8 + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + '@types/cookie@0.6.0': {} '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} + '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.6 @@ -7693,6 +7739,10 @@ snapshots: '@types/ms@2.1.0': {} + '@types/node@20.19.20': + dependencies: + undici-types: 6.21.0 + '@types/node@22.13.10': dependencies: undici-types: 6.20.0 @@ -7732,6 +7782,8 @@ snapshots: '@types/unist@3.0.3': {} + '@types/whatwg-mimetype@3.0.2': {} + '@types/ws@8.18.0': dependencies: '@types/node': 22.13.10 @@ -7951,44 +8003,46 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/expect@3.1.1': + '@vitest/expect@3.2.4': dependencies: - '@vitest/spy': 3.1.1 - '@vitest/utils': 3.1.1 + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.1(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2))': + '@vitest/mocker@3.2.4(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2))': dependencies: - '@vitest/spy': 3.1.1 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) - '@vitest/pretty-format@3.1.1': + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.1.1': + '@vitest/runner@3.2.4': dependencies: - '@vitest/utils': 3.1.1 + '@vitest/utils': 3.2.4 pathe: 2.0.3 + strip-literal: 3.1.0 - '@vitest/snapshot@3.1.1': + '@vitest/snapshot@3.2.4': dependencies: - '@vitest/pretty-format': 3.1.1 + '@vitest/pretty-format': 3.2.4 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.1.1': + '@vitest/spy@3.2.4': dependencies: - tinyspy: 3.0.2 + tinyspy: 4.0.4 - '@vitest/utils@3.1.1': + '@vitest/utils@3.2.4': dependencies: - '@vitest/pretty-format': 3.1.1 - loupe: 3.1.3 + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 tinyrainbow: 2.0.0 abab@2.0.6: {} @@ -8444,6 +8498,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + decimal.js@10.5.0: {} decode-named-character-reference@1.2.0: @@ -8639,7 +8697,7 @@ snapshots: iterator.prototype: 1.1.5 safe-array-concat: 1.1.3 - es-module-lexer@1.6.0: {} + es-module-lexer@1.7.0: {} es-object-atoms@1.1.1: dependencies: @@ -9036,6 +9094,12 @@ snapshots: graphemer@1.4.0: {} + happy-dom@20.0.0: + dependencies: + '@types/node': 20.19.20 + '@types/whatwg-mimetype': 3.0.2 + whatwg-mimetype: 3.0.0 + has-bigints@1.1.0: {} has-flag@4.0.0: {} @@ -9741,6 +9805,8 @@ snapshots: js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -9963,6 +10029,8 @@ snapshots: loupe@3.1.3: {} + loupe@3.2.1: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -11307,6 +11375,10 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + style-to-js@1.1.17: dependencies: style-to-object: 1.0.9 @@ -11364,11 +11436,11 @@ snapshots: fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 - tinypool@1.0.2: {} + tinypool@1.1.1: {} tinyrainbow@2.0.0: {} - tinyspy@3.0.2: {} + tinyspy@4.0.4: {} tmpl@1.0.5: {} @@ -11478,6 +11550,8 @@ snapshots: undici-types@6.20.0: {} + undici-types@6.21.0: {} + undici@5.29.0: dependencies: '@fastify/busboy': 2.1.1 @@ -11639,11 +11713,11 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.1.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2): + vite-node@3.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2): dependencies: cac: 6.7.14 - debug: 4.4.0 - es-module-lexer: 1.6.0 + debug: 4.4.3 + es-module-lexer: 1.7.0 pathe: 2.0.3 vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) transitivePeerDependencies: @@ -11682,31 +11756,35 @@ snapshots: jiti: 2.4.2 lightningcss: 1.29.2 - vitest@3.1.1(@types/debug@4.1.12)(@types/node@22.13.10)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.29.2): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.13.10)(happy-dom@20.0.0)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.29.2): dependencies: - '@vitest/expect': 3.1.1 - '@vitest/mocker': 3.1.1(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) - '@vitest/pretty-format': 3.1.1 - '@vitest/runner': 3.1.1 - '@vitest/snapshot': 3.1.1 - '@vitest/spy': 3.1.1 - '@vitest/utils': 3.1.1 + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.0 - debug: 4.4.0 + debug: 4.4.3 expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 + picomatch: 4.0.2 std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinypool: 1.0.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 tinyrainbow: 2.0.0 vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) - vite-node: 3.1.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) + vite-node: 3.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 '@types/node': 22.13.10 + happy-dom: 20.0.0 jsdom: 20.0.3 transitivePeerDependencies: - jiti diff --git a/ui/src/App.tsx b/ui/src/App.tsx index d155c79..6113afc 100644 --- a/ui/src/App.tsx +++ b/ui/src/App.tsx @@ -1,10 +1,10 @@ -import { BrowserRouter as Router, useRoutes } from "react-router-dom"; -import { ThemeProvider } from "@ui/contexts/ThemeContext"; import { SessionProvider } from "@ui/contexts/SessionContext"; -import { AllCommunityModule, ModuleRegistry } from "ag-grid-community"; -import { UserStoreProvider } from "@ui/providers/UserStoreProvider"; -import { DatadogRumProvider } from "@ui/providers/DatadogRumProvider"; +import { ThemeProvider } from "@ui/contexts/ThemeContext"; import { routes } from "@ui/lib/routes"; +import { DatadogRumProvider } from "@ui/providers/DatadogRumProvider"; +import { UserStoreProvider } from "@ui/providers/UserStoreProvider"; +import { AllCommunityModule, ModuleRegistry } from "ag-grid-community"; +import { BrowserRouter as Router, useRoutes } from "react-router-dom"; // Register all Community features ModuleRegistry.registerModules([AllCommunityModule]); diff --git a/ui/src/components/AuthenticationGateway.tsx b/ui/src/components/AuthenticationGateway.tsx index ca959d7..f54703b 100644 --- a/ui/src/components/AuthenticationGateway.tsx +++ b/ui/src/components/AuthenticationGateway.tsx @@ -1,7 +1,7 @@ import { useEffect, useState } from "react"; -import { useSession } from "../contexts/SessionContext"; import { Navigate, Outlet, useSearchParams } from "react-router-dom"; import { match } from "ts-pattern"; +import { useSession } from "../contexts/SessionContext"; import { LoadingSpinner } from "./LoadingSpinner"; export const AuthenticationGateway = () => { diff --git a/ui/src/components/AuthenticationGateway.unit.tsx b/ui/src/components/AuthenticationGateway.unit.tsx index 5a9c68e..9d3b590 100644 --- a/ui/src/components/AuthenticationGateway.unit.tsx +++ b/ui/src/components/AuthenticationGateway.unit.tsx @@ -1,8 +1,8 @@ import { screen, waitFor } from "@testing-library/react"; import { AuthenticationGateway } from "@ui/components/AuthenticationGateway"; -import { Routes, Route } from "react-router-dom"; import { SessionTestProvider } from "@ui/contexts/SessionContext"; import { renderWithRouter } from "@ui/utils/testHelpers"; +import { Route, Routes } from "react-router-dom"; describe("PublicRoute", () => { it("shows loading state initially", () => { diff --git a/ui/src/components/AvailabilityCard.tsx b/ui/src/components/AvailabilityCard.tsx index 38c4985..72b0040 100644 --- a/ui/src/components/AvailabilityCard.tsx +++ b/ui/src/components/AvailabilityCard.tsx @@ -1,16 +1,17 @@ -import { useState } from "react"; -import { Switch } from "@ui/ui-library/switch"; -import { Text } from "@ui/ui-library/text"; import { Button } from "@ui/ui-library/button"; -import { MinusIcon, PlusIcon, CopyIcon } from "@ui/ui-library/icons"; +import { CopyIcon, MinusIcon, PlusIcon } from "@ui/ui-library/icons"; import { Select, SelectButton, - SelectPopover, SelectListBox, SelectListItem, + SelectPopover, } from "@ui/ui-library/select"; +import { Switch } from "@ui/ui-library/switch"; +import { Text } from "@ui/ui-library/text"; import { useTimePicker } from "@ui/ui-library/time-picker"; +import { useState } from "react"; + interface TimeRange { start: string; end: string; diff --git a/ui/src/components/BrandButtons/LoginWithGoogle.test.tsx b/ui/src/components/BrandButtons/LoginWithGoogle.test.tsx index 3174855..728a0cc 100644 --- a/ui/src/components/BrandButtons/LoginWithGoogle.test.tsx +++ b/ui/src/components/BrandButtons/LoginWithGoogle.test.tsx @@ -1,6 +1,6 @@ -import { render, screen, fireEvent } from "@testing-library/react"; -import { LoginWithGoogle } from "./LoginWithGoogle"; -import { useLoginGoogle } from "../../hooks/auth"; +import { fireEvent, render, screen } from "@testing-library/react"; +import { LoginWithGoogle } from "@ui/components/BrandButtons/LoginWithGoogle"; +import { useLoginGoogle } from "@ui/hooks/auth"; import { vi } from "vitest"; vi.mock("../../hooks/auth", () => ({ diff --git a/ui/src/components/ChannelPreview.tsx b/ui/src/components/ChannelPreview.tsx index afa4c1e..41acae7 100644 --- a/ui/src/components/ChannelPreview.tsx +++ b/ui/src/components/ChannelPreview.tsx @@ -1,9 +1,9 @@ +import { ChannelBadge } from "@ui/components/ChannelBadge"; import { UserTablo } from "@ui/types/tablos.types"; import { Badge } from "@ui/ui-library/badge"; import { ReactNode } from "react"; import { Channel } from "stream-chat"; import { twMerge } from "tailwind-merge"; -import { ChannelBadge } from "@ui/components/ChannelBadge"; interface ChannelPreviewProps { channel: Channel; diff --git a/ui/src/components/CreateTabloModal.tsx b/ui/src/components/CreateTabloModal.tsx index d6b93ed..58a4dcb 100644 --- a/ui/src/components/CreateTabloModal.tsx +++ b/ui/src/components/CreateTabloModal.tsx @@ -1,8 +1,8 @@ -import { useState } from "react"; -import { ImageColorPicker } from "./ImageColorPicker"; -import { ClickOutside } from "./ClickOutside"; -import { StatusPicker } from "./StatusPicker"; import { Database } from "@ui/types/database.types"; +import { useState } from "react"; +import { ClickOutside } from "./ClickOutside"; +import { ImageColorPicker } from "./ImageColorPicker"; +import { StatusPicker } from "./StatusPicker"; type Tablo = Database["public"]["Tables"]["tablos"]["Row"]; type StatusType = "todo" | "in_progress" | "done"; diff --git a/ui/src/components/CustomChannelHeader.tsx b/ui/src/components/CustomChannelHeader.tsx index e57fbfc..22e9f06 100644 --- a/ui/src/components/CustomChannelHeader.tsx +++ b/ui/src/components/CustomChannelHeader.tsx @@ -1,6 +1,6 @@ +import { UserTablo } from "@ui/types/tablos.types"; import { ChannelHeader, useChannelStateContext } from "stream-chat-react"; import { ChannelBadge } from "./ChannelBadge"; -import { UserTablo } from "@ui/types/tablos.types"; interface CustomChannelHeaderProps { tablos: UserTablo[]; diff --git a/ui/src/components/DeleteTabloModal.tsx b/ui/src/components/DeleteTabloModal.tsx index 5fb0220..af8d4c5 100644 --- a/ui/src/components/DeleteTabloModal.tsx +++ b/ui/src/components/DeleteTabloModal.tsx @@ -1,5 +1,5 @@ -import { ClickOutside } from "./ClickOutside"; import { UserTablo } from "@ui/types/tablos.types"; +import { ClickOutside } from "./ClickOutside"; interface DeleteTabloModalProps { tablo: UserTablo | null; diff --git a/ui/src/components/EventDetailsModal.tsx b/ui/src/components/EventDetailsModal.tsx index d1ae12c..16f8ee9 100644 --- a/ui/src/components/EventDetailsModal.tsx +++ b/ui/src/components/EventDetailsModal.tsx @@ -1,10 +1,10 @@ import { EventAndTablo } from "@ui/types/events.types"; -import { DialogBody } from "@ui/ui-library/dialog"; -import { Text, Strong } from "@ui/ui-library/text"; import { Button } from "@ui/ui-library/button"; +import { DialogBody } from "@ui/ui-library/dialog"; +import { Strong, Text } from "@ui/ui-library/text"; import { CalendarIcon, User } from "lucide-react"; -import { CustomModal } from "./CustomModal"; import { twMerge } from "tailwind-merge"; +import { CustomModal } from "./CustomModal"; interface EventDetailsModalProps { event: EventAndTablo | null; diff --git a/ui/src/components/EventModal.tsx b/ui/src/components/EventModal.tsx index f1d5633..5195cdb 100644 --- a/ui/src/components/EventModal.tsx +++ b/ui/src/components/EventModal.tsx @@ -1,19 +1,19 @@ -import { Event, EventInsert } from "@ui/types/events.types"; -import { useState, useEffect } from "react"; -import { useTablosList } from "@ui/hooks/tablos"; +import { getLocalTimeZone, parseDate, today } from "@internationalized/date"; import { useCreateEvents, useEvent, useUpdateEvent } from "@ui/hooks/events"; +import { useTablosList } from "@ui/hooks/tablos"; import { useUser } from "@ui/providers/UserStoreProvider"; +import { Event, EventInsert } from "@ui/types/events.types"; +import { DatePicker, DatePickerButton } from "@ui/ui-library/date-picker"; import { Select, SelectButton, - SelectPopover, SelectListBox, SelectListItem, + SelectPopover, } from "@ui/ui-library/select"; import { useTimePicker } from "@ui/ui-library/time-picker"; -import { DatePicker, DatePickerButton } from "@ui/ui-library/date-picker"; +import { useEffect, useState } from "react"; import { Group } from "react-aria-components"; -import { getLocalTimeZone, parseDate, today } from "@internationalized/date"; import { useNavigate, useParams, useSearchParams } from "react-router-dom"; export const EventModal = ({ mode }: { mode: "create" | "edit" }) => { diff --git a/ui/src/components/EventTypeModal.tsx b/ui/src/components/EventTypeModal.tsx index 780e330..e26fecc 100644 --- a/ui/src/components/EventTypeModal.tsx +++ b/ui/src/components/EventTypeModal.tsx @@ -1,6 +1,6 @@ +import { EventTypeConfig } from "@ui/hooks/event-types"; import { Button } from "@ui/ui-library/button"; -import { CustomModal } from "./CustomModal"; -import { Label, TextField, TextArea, Description, Input } from "@ui/ui-library/field"; +import { Description, Input, Label, TextArea, TextField } from "@ui/ui-library/field"; import { NumberField, NumberInput } from "@ui/ui-library/number-field"; import { Select, @@ -9,7 +9,7 @@ import { SelectListItem, SelectPopover, } from "@ui/ui-library/select"; -import { EventTypeConfig } from "@ui/hooks/event-types"; +import { CustomModal } from "./CustomModal"; export function EventTypeModal({ isModalOpen, diff --git a/ui/src/components/ImportICSModal.tsx b/ui/src/components/ImportICSModal.tsx index 9e46d31..41a68bd 100644 --- a/ui/src/components/ImportICSModal.tsx +++ b/ui/src/components/ImportICSModal.tsx @@ -1,18 +1,18 @@ -import { useState, useRef } from "react"; -import { useTablosList, useCreateTablo } from "@ui/hooks/tablos"; import { useCreateEvents } from "@ui/hooks/events"; +import { useCreateTablo, useTablosList } from "@ui/hooks/tablos"; import { useUser } from "@ui/providers/UserStoreProvider"; +import { EventInsert } from "@ui/types/events.types"; +import { CreateTablo } from "@ui/types/tablos.types"; import { Select, SelectButton, - SelectPopover, SelectListBox, SelectListItem, + SelectPopover, } from "@ui/ui-library/select"; -import { parseICSFile, ParsedICSEvent } from "@ui/utils/helpers"; -import { EventInsert } from "@ui/types/events.types"; -import { CreateTablo } from "@ui/types/tablos.types"; import { toast } from "@ui/ui-library/toast/toast-queue"; +import { ParsedICSEvent, parseICSFile } from "@ui/utils/helpers"; +import { useRef, useState } from "react"; interface ImportICSModalProps { onClose: () => void; diff --git a/ui/src/components/Layout.test.tsx b/ui/src/components/Layout.test.tsx index f4665f8..3231961 100644 --- a/ui/src/components/Layout.test.tsx +++ b/ui/src/components/Layout.test.tsx @@ -1,4 +1,4 @@ -import { render, screen, fireEvent } from "@testing-library/react"; +import { fireEvent, render, screen } from "@testing-library/react"; import { Layout } from "@ui/components/Layout"; import { SessionProvider } from "@ui/contexts/SessionContext"; import { renderWithProviders } from "@ui/utils/testHelpers"; diff --git a/ui/src/components/Layout.tsx b/ui/src/components/Layout.tsx index b2067f1..34547fa 100644 --- a/ui/src/components/Layout.tsx +++ b/ui/src/components/Layout.tsx @@ -1,10 +1,10 @@ +import { MenuIcon } from "lucide-react"; import { useState } from "react"; -import { SideNavigation } from "./NavigationBar"; +import { Outlet } from "react-router-dom"; +import { twMerge } from "tailwind-merge"; import { Button } from "../ui-library/button"; import { Icon } from "../ui-library/icon"; -import { MenuIcon } from "lucide-react"; -import { twMerge } from "tailwind-merge"; -import { Outlet } from "react-router-dom"; +import { SideNavigation } from "./NavigationBar"; export function Layout() { const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); diff --git a/ui/src/components/NavigationBar.test.tsx b/ui/src/components/NavigationBar.test.tsx index e1f4218..b3d110c 100644 --- a/ui/src/components/NavigationBar.test.tsx +++ b/ui/src/components/NavigationBar.test.tsx @@ -1,6 +1,7 @@ -import { screen, fireEvent } from "@testing-library/react"; -import { SideNavigation, MainNavigation, UserMenuPopover } from "@ui/components/NavigationBar"; +import { fireEvent, screen } from "@testing-library/react"; +import { MainNavigation, SideNavigation, UserMenuPopover } from "@ui/components/NavigationBar"; import { renderWithProviders } from "@ui/utils/testHelpers"; + describe("NavigationBar", () => { describe("SideNavigation", () => { it("renders the side navigation with correct initial state", () => { diff --git a/ui/src/components/NavigationBar.tsx b/ui/src/components/NavigationBar.tsx index 888f4fd..f936f62 100644 --- a/ui/src/components/NavigationBar.tsx +++ b/ui/src/components/NavigationBar.tsx @@ -1,38 +1,37 @@ -import { twMerge } from "tailwind-merge"; +import { useUser } from "@ui/providers/UserStoreProvider"; +import { Avatar, AvatarBadge } from "@ui/ui-library/avatar"; +import { Button } from "@ui/ui-library/button"; +import { Dialog } from "@ui/ui-library/dialog"; +import { Disclosure, DisclosureControl, DisclosurePanel } from "@ui/ui-library/disclosure"; +import { Icon } from "@ui/ui-library/icon"; +import { AvailableIcon } from "@ui/ui-library/icons"; +import { Link } from "@ui/ui-library/link"; +import { Popover } from "@ui/ui-library/popover"; +import { Text } from "@ui/ui-library/text"; +import { isProd, isStaging } from "@ui/utils/helpers"; +import { getXtabloIcon } from "@ui/utils/iconHelpers"; import { - SendIcon, + CalendarCheckIcon, + CalendarIcon, ChevronRightIcon, ConstructionIcon, - PlusIcon, - MinusIcon, - ReceiptTextIcon, Grid2X2Icon, - NotebookPenIcon, - MessageCircleIcon, - SquareKanban, Kanban, - CalendarIcon, - CalendarCheckIcon, ListCheckIcon, + MessageCircleIcon, + MinusIcon, + NotebookPenIcon, + PlusIcon, + ReceiptTextIcon, + SendIcon, + SquareKanban, } from "lucide-react"; +import { useRef, useState } from "react"; +import { LinkProps, Separator } from "react-aria-components"; import { Link as RouterLink, useLocation } from "react-router-dom"; -import { Separator } from "react-aria-components"; -import { Link } from "@ui/ui-library/link"; -import { Icon } from "@ui/ui-library/icon"; -import { Avatar, AvatarBadge } from "@ui/ui-library/avatar"; -import { Dialog } from "@ui/ui-library/dialog"; -import { Button } from "@ui/ui-library/button"; -import { DisclosurePanel, DisclosureControl, Disclosure } from "@ui/ui-library/disclosure"; -import { LinkProps } from "react-aria-components"; -import { Popover } from "@ui/ui-library/popover"; -import { AvailableIcon } from "@ui/ui-library/icons"; -import { useState, useRef } from "react"; -import { getXtabloIcon } from "@ui/utils/iconHelpers"; -import { ThemeSwitcher } from "./ThemeSwitcher"; -import { Text } from "@ui/ui-library/text"; +import { twMerge } from "tailwind-merge"; import { SignOutButton } from "./SignOutButton"; -import { useUser } from "@ui/providers/UserStoreProvider"; -import { isProd, isStaging } from "@ui/utils/helpers"; +import { ThemeSwitcher } from "./ThemeSwitcher"; type NavLinkItem = { isActive?: boolean; diff --git a/ui/src/components/ProtectedRoute.test.tsx b/ui/src/components/ProtectedRoute.test.tsx index a5a672e..7de09ef 100644 --- a/ui/src/components/ProtectedRoute.test.tsx +++ b/ui/src/components/ProtectedRoute.test.tsx @@ -2,7 +2,7 @@ import { screen, waitFor } from "@testing-library/react"; import { ProtectedRoute } from "@ui/components/ProtectedRoute"; import { SessionTestProvider } from "@ui/contexts/SessionContext"; import { renderWithRouter } from "@ui/utils/testHelpers"; -import { Routes, Route } from "react-router-dom"; +import { Route, Routes } from "react-router-dom"; describe("ProtectedRoute", () => { beforeEach(() => { diff --git a/ui/src/components/ProtectedRoute.tsx b/ui/src/components/ProtectedRoute.tsx index 4089d25..4213f26 100644 --- a/ui/src/components/ProtectedRoute.tsx +++ b/ui/src/components/ProtectedRoute.tsx @@ -1,7 +1,7 @@ +import { useSession } from "@ui/contexts/SessionContext"; import { useEffect, useState } from "react"; import { Navigate, Outlet } from "react-router-dom"; import { match } from "ts-pattern"; -import { useSession } from "@ui/contexts/SessionContext"; import { LoadingSpinner } from "./LoadingSpinner"; interface ProtectedRouteProps { diff --git a/ui/src/components/RowActionMenu.tsx b/ui/src/components/RowActionMenu.tsx index 07aafe6..00f92be 100644 --- a/ui/src/components/RowActionMenu.tsx +++ b/ui/src/components/RowActionMenu.tsx @@ -1,9 +1,9 @@ -import React from "react"; import { DeleteDevisModalButton } from "@ui/components/devis/DeleteDevisModal"; import { ViewDevisModalButton } from "@ui/components/devis/ViewDevisModal"; import { Database } from "@ui/types/database.types"; import { Button } from "@ui/ui-library/button"; import { Download } from "lucide-react"; +import React from "react"; type Devis = Database["public"]["Tables"]["devis"]["Row"]; interface RowActionMenuProps { diff --git a/ui/src/components/SignOutButton.test.tsx b/ui/src/components/SignOutButton.test.tsx index 2c66030..e2468e6 100644 --- a/ui/src/components/SignOutButton.test.tsx +++ b/ui/src/components/SignOutButton.test.tsx @@ -1,9 +1,9 @@ -import { screen, fireEvent } from "@testing-library/react"; +import { UseMutationResult } from "@tanstack/react-query"; +import { fireEvent, screen } from "@testing-library/react"; import { SignOutButton } from "@ui/components/SignOutButton"; import * as AuthHooks from "@ui/hooks/auth"; -import { UseMutationResult } from "@tanstack/react-query"; -import { vi } from "vitest"; import { renderWithRouter } from "@ui/utils/testHelpers"; +import { vi } from "vitest"; // Create a mock mutation result const createMockMutationResult = ( diff --git a/ui/src/components/SignOutButton.tsx b/ui/src/components/SignOutButton.tsx index 8a151f7..12012d3 100644 --- a/ui/src/components/SignOutButton.tsx +++ b/ui/src/components/SignOutButton.tsx @@ -1,7 +1,7 @@ -import { Button } from "../ui-library/button"; -import { useLogout } from "../hooks/auth"; -import { LogOutIcon, AlertCircleIcon, CheckCircleIcon } from "lucide-react"; +import { AlertCircleIcon, CheckCircleIcon, LogOutIcon } from "lucide-react"; import { useState } from "react"; +import { useLogout } from "../hooks/auth"; +import { Button } from "../ui-library/button"; import { toast } from "../ui-library/toast/toast-queue"; export const SignOutButton = () => { diff --git a/ui/src/components/TabloModal.tsx b/ui/src/components/TabloModal.tsx index 6795e05..2790bf8 100644 --- a/ui/src/components/TabloModal.tsx +++ b/ui/src/components/TabloModal.tsx @@ -1,21 +1,21 @@ -import { ClickOutside } from "./ClickOutside"; -import { useState, useEffect, useRef } from "react"; -import { ImageColorPicker } from "./ImageColorPicker"; -import { StatusPicker } from "./StatusPicker"; import { useInviteUser } from "@ui/hooks/invite"; -import { TabloUpdate, UserTablo } from "@ui/types/tablos.types"; -import { useTabloMembers } from "@ui/hooks/tablos"; -import { useUser } from "@ui/providers/UserStoreProvider"; import { - useTabloFileNames, useCreateTabloFile, useDeleteTabloFile, useDownloadTabloFile, + useTabloFileNames, } from "@ui/hooks/tablo_data"; -import { toast } from "@ui/ui-library/toast/toast-queue"; -import { FileTrigger } from "@ui/ui-library/file-trigger"; +import { useTabloMembers } from "@ui/hooks/tablos"; +import { useUser } from "@ui/providers/UserStoreProvider"; +import { TabloUpdate, UserTablo } from "@ui/types/tablos.types"; import { Button } from "@ui/ui-library/button"; -import { Trash2Icon, DownloadIcon } from "lucide-react"; +import { FileTrigger } from "@ui/ui-library/file-trigger"; +import { toast } from "@ui/ui-library/toast/toast-queue"; +import { DownloadIcon, Trash2Icon } from "lucide-react"; +import { useEffect, useRef, useState } from "react"; +import { ClickOutside } from "./ClickOutside"; +import { ImageColorPicker } from "./ImageColorPicker"; +import { StatusPicker } from "./StatusPicker"; type StatusType = "todo" | "in_progress" | "done"; diff --git a/ui/src/components/TabloTutorial.tsx b/ui/src/components/TabloTutorial.tsx index a64e908..c7f9fea 100644 --- a/ui/src/components/TabloTutorial.tsx +++ b/ui/src/components/TabloTutorial.tsx @@ -1,7 +1,7 @@ -import React, { useState } from "react"; import { Button } from "@ui/ui-library/button"; +import { ArrowLeft, ArrowRight, HelpCircle, X } from "lucide-react"; +import React, { useState } from "react"; import { twMerge } from "tailwind-merge"; -import { X, ArrowRight, ArrowLeft, HelpCircle } from "lucide-react"; interface TutorialStep { id: string; diff --git a/ui/src/components/ThemeSwitcher.test.tsx b/ui/src/components/ThemeSwitcher.test.tsx index 1d256e3..a30fe27 100644 --- a/ui/src/components/ThemeSwitcher.test.tsx +++ b/ui/src/components/ThemeSwitcher.test.tsx @@ -1,4 +1,4 @@ -import { render, screen, fireEvent } from "@testing-library/react"; +import { fireEvent, render, screen } from "@testing-library/react"; import { ThemeSwitcher } from "@ui/components/ThemeSwitcher"; import * as ThemeContext from "@ui/contexts/ThemeContext"; import { vi } from "vitest"; diff --git a/ui/src/components/ThemeSwitcher.tsx b/ui/src/components/ThemeSwitcher.tsx index bfd96b3..0e87c20 100644 --- a/ui/src/components/ThemeSwitcher.tsx +++ b/ui/src/components/ThemeSwitcher.tsx @@ -1,7 +1,7 @@ -import { ToggleButtonGroup, ToggleButton } from "../ui-library/button"; -import { twMerge } from "tailwind-merge"; import { useTheme } from "@ui/contexts/ThemeContext"; import { Text } from "@ui/ui-library/text"; +import { twMerge } from "tailwind-merge"; +import { ToggleButton, ToggleButtonGroup } from "../ui-library/button"; const translation = { light: "Clair", diff --git a/ui/src/components/WebcalModal.tsx b/ui/src/components/WebcalModal.tsx index 3503056..5a81eaf 100644 --- a/ui/src/components/WebcalModal.tsx +++ b/ui/src/components/WebcalModal.tsx @@ -1,14 +1,14 @@ -import { useState } from "react"; import { useTablosList } from "@ui/hooks/tablos"; import { useGenerateWebcalToken } from "@ui/hooks/webcal"; import { Select, SelectButton, - SelectPopover, SelectListBox, SelectListItem, + SelectPopover, } from "@ui/ui-library/select"; import { toast } from "@ui/ui-library/toast/toast-queue"; +import { useState } from "react"; interface WebcalModalProps { onClose: () => void; diff --git a/ui/src/components/devis/CreateDevisModal.tsx b/ui/src/components/devis/CreateDevisModal.tsx index eea6336..9ed563b 100644 --- a/ui/src/components/devis/CreateDevisModal.tsx +++ b/ui/src/components/devis/CreateDevisModal.tsx @@ -1,4 +1,6 @@ +import { CalendarDate } from "@internationalized/date"; import { Button } from "@ui/ui-library/button"; +import { DateField, DateInput } from "@ui/ui-library/date-field"; import { Dialog, DialogBody, @@ -6,16 +8,12 @@ import { DialogFooter, DialogHeader, } from "@ui/ui-library/dialog"; -import { Modal } from "@ui/ui-library/modal"; -import { PlusIcon } from "lucide-react"; +import { FieldError, Input, Label, TextArea, TextField } from "@ui/ui-library/field"; import { Form } from "@ui/ui-library/form"; -import { DateField, DateInput } from "@ui/ui-library/date-field"; -import { FieldError, Input, Label } from "@ui/ui-library/field"; -import { TextField, TextArea } from "@ui/ui-library/field"; +import { Modal } from "@ui/ui-library/modal"; +import { calculateTax, calculateTotal } from "@ui/utils/helpers"; +import { PlusIcon } from "lucide-react"; import { useState } from "react"; -import { CalendarDate } from "@internationalized/date"; -import { calculateTotal } from "@ui/utils/helpers"; -import { calculateTax } from "@ui/utils/helpers"; const now = new Date(); const defaultFormData = { diff --git a/ui/src/components/devis/DeleteDevisModal.tsx b/ui/src/components/devis/DeleteDevisModal.tsx index bcf679b..220f1db 100644 --- a/ui/src/components/devis/DeleteDevisModal.tsx +++ b/ui/src/components/devis/DeleteDevisModal.tsx @@ -1,11 +1,13 @@ import { Button } from "@ui/ui-library/button"; -import { DialogBody, DialogFooter } from "@ui/ui-library/dialog"; - -import { DialogCloseButton } from "@ui/ui-library/dialog"; -import { DialogHeader } from "@ui/ui-library/dialog"; -import { Dialog } from "@ui/ui-library/dialog"; -import { TrashIcon } from "lucide-react"; +import { + Dialog, + DialogBody, + DialogCloseButton, + DialogFooter, + DialogHeader, +} from "@ui/ui-library/dialog"; import { Modal } from "@ui/ui-library/modal"; +import { TrashIcon } from "lucide-react"; import { useState } from "react"; export const DeleteDevisModalButton = ({ diff --git a/ui/src/components/devis/ViewDevisModal.tsx b/ui/src/components/devis/ViewDevisModal.tsx index 61fc9d7..6aecc99 100644 --- a/ui/src/components/devis/ViewDevisModal.tsx +++ b/ui/src/components/devis/ViewDevisModal.tsx @@ -1,12 +1,14 @@ import { Database } from "@ui/types/database.types"; import { Button } from "@ui/ui-library/button"; -import { DialogBody, DialogFooter } from "@ui/ui-library/dialog"; - -import { DialogCloseButton } from "@ui/ui-library/dialog"; - -import { Dialog, DialogHeader } from "@ui/ui-library/dialog"; -import { EyeIcon } from "lucide-react"; +import { + Dialog, + DialogBody, + DialogCloseButton, + DialogFooter, + DialogHeader, +} from "@ui/ui-library/dialog"; import { Modal } from "@ui/ui-library/modal"; +import { EyeIcon } from "lucide-react"; import { useState } from "react"; type Devis = Database["public"]["Tables"]["devis"]["Row"]; diff --git a/ui/src/components/header.tsx b/ui/src/components/header.tsx index adae508..ba71191 100644 --- a/ui/src/components/header.tsx +++ b/ui/src/components/header.tsx @@ -1,7 +1,7 @@ import { Button } from "@ui/ui-library/button"; -import { twMerge } from "tailwind-merge"; -import { Link } from "react-router-dom"; import { getXtabloIcon } from "@ui/utils/iconHelpers"; +import { Link } from "react-router-dom"; +import { twMerge } from "tailwind-merge"; export function Header() { const logo = getXtabloIcon(); diff --git a/ui/src/components/kanban/KanbanBoard.tsx b/ui/src/components/kanban/KanbanBoard.tsx index 68f03ed..610853f 100644 --- a/ui/src/components/kanban/KanbanBoard.tsx +++ b/ui/src/components/kanban/KanbanBoard.tsx @@ -1,14 +1,13 @@ -import React, { useState, useCallback } from "react"; -import { Plus, Filter } from "lucide-react"; -import { Button } from "@ui/ui-library/button"; -import { Icon } from "@ui/ui-library/icon"; -import { SearchField } from "@ui/ui-library/search-field"; -import { SearchInput } from "@ui/ui-library/search-field"; import { KanbanBoard as KanbanBoardType, - KanbanTask, KanbanFilters as KanbanFiltersType, + KanbanTask, } from "@ui/types/kanban.types"; +import { Button } from "@ui/ui-library/button"; +import { Icon } from "@ui/ui-library/icon"; +import { SearchField, SearchInput } from "@ui/ui-library/search-field"; +import { Filter, Plus } from "lucide-react"; +import React, { useCallback, useState } from "react"; interface KanbanBoardProps { board: KanbanBoardType; diff --git a/ui/src/contexts/SessionContext.tsx b/ui/src/contexts/SessionContext.tsx index fa85645..decf57f 100644 --- a/ui/src/contexts/SessionContext.tsx +++ b/ui/src/contexts/SessionContext.tsx @@ -1,6 +1,6 @@ -import { createContext, useContext, useEffect, useState } from "react"; import { Session, User } from "@supabase/supabase-js"; import { supabase } from "@ui/hooks/auth"; +import { createContext, useContext, useEffect, useState } from "react"; const SessionContext = createContext<{ session: Session | null; diff --git a/ui/src/contexts/ThemeContext.tsx b/ui/src/contexts/ThemeContext.tsx index d7a6a46..55b3a67 100644 --- a/ui/src/contexts/ThemeContext.tsx +++ b/ui/src/contexts/ThemeContext.tsx @@ -1,4 +1,4 @@ -import { createContext, useContext, useState, useEffect, ReactNode } from "react"; +import { createContext, ReactNode, useContext, useEffect, useState } from "react"; type Theme = "dark" | "light" | "system"; diff --git a/ui/src/hooks/auth.ts b/ui/src/hooks/auth.ts index 8080077..2da3157 100644 --- a/ui/src/hooks/auth.ts +++ b/ui/src/hooks/auth.ts @@ -1,10 +1,10 @@ +import { createClient, Session, User as SupabaseUser } from "@supabase/supabase-js"; import { useMutation } from "@tanstack/react-query"; -import { useNavigate } from "react-router-dom"; -import { useState } from "react"; -import { match } from "ts-pattern"; -import { toast } from "@ui/ui-library/toast/toast-queue"; -import { User as SupabaseUser, Session, createClient } from "@supabase/supabase-js"; import { api, queryClient } from "@ui/lib/api"; +import { toast } from "@ui/ui-library/toast/toast-queue"; +import { useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { match } from "ts-pattern"; export type User = SupabaseUser & { user_metadata: { diff --git a/ui/src/hooks/availabilities.ts b/ui/src/hooks/availabilities.ts index c548ec6..dde0e1e 100644 --- a/ui/src/hooks/availabilities.ts +++ b/ui/src/hooks/availabilities.ts @@ -1,9 +1,9 @@ import { useMutation, useQuery } from "@tanstack/react-query"; -import { queryClient } from "@ui/lib/api"; -import { supabase } from "@ui/hooks/auth"; import { useSession } from "@ui/contexts/SessionContext"; -import { useEffect, useState } from "react"; +import { supabase } from "@ui/hooks/auth"; +import { queryClient } from "@ui/lib/api"; import { Database } from "@ui/types/database.types"; +import { useEffect, useState } from "react"; export type TimeRange = { start: string; diff --git a/ui/src/hooks/channel.ts b/ui/src/hooks/channel.ts index 6cd13b9..6a80cc1 100644 --- a/ui/src/hooks/channel.ts +++ b/ui/src/hooks/channel.ts @@ -1,6 +1,6 @@ import { useEffect, useState } from "react"; -import { Channel, StreamChat } from "stream-chat"; import { useParams } from "react-router-dom"; +import { Channel, StreamChat } from "stream-chat"; export const useChannelFromUrl = (client: StreamChat) => { const [channel, setChannel] = useState(null); diff --git a/ui/src/hooks/devis.ts b/ui/src/hooks/devis.ts index 879653a..5638dcf 100644 --- a/ui/src/hooks/devis.ts +++ b/ui/src/hooks/devis.ts @@ -1,7 +1,7 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { useSession } from "@ui/contexts/SessionContext"; import { Database } from "@ui/types/database.types"; import { supabase } from "./auth"; -import { useSession } from "@ui/contexts/SessionContext"; type Devis = Database["public"]["Tables"]["devis"]; diff --git a/ui/src/hooks/event-types.ts b/ui/src/hooks/event-types.ts index 07f46cb..efdc417 100644 --- a/ui/src/hooks/event-types.ts +++ b/ui/src/hooks/event-types.ts @@ -1,9 +1,9 @@ import { useMutation, useQuery } from "@tanstack/react-query"; -import { supabase } from "./auth"; import { useSession } from "@ui/contexts/SessionContext"; -import { Database } from "@ui/types/database.types"; import { queryClient } from "@ui/lib/api"; +import { Database } from "@ui/types/database.types"; import { useMemo } from "react"; +import { supabase } from "./auth"; export type EventTypeData = { id: string; diff --git a/ui/src/hooks/events.ts b/ui/src/hooks/events.ts index bf7a109..dc5880c 100644 --- a/ui/src/hooks/events.ts +++ b/ui/src/hooks/events.ts @@ -1,8 +1,8 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import { supabase } from "./auth"; import { useUser } from "@ui/providers/UserStoreProvider"; -import { toast } from "@ui/ui-library/toast/toast-queue"; import { Event, EventAndTablo, EventInsert, EventUpdate } from "@ui/types/events.types"; +import { toast } from "@ui/ui-library/toast/toast-queue"; +import { supabase } from "./auth"; // Fetch events for a specific tablo export const useEventsByTablo = (tabloId: string | null) => { diff --git a/ui/src/hooks/feedback.ts b/ui/src/hooks/feedback.ts index 276c578..c6ecdfb 100644 --- a/ui/src/hooks/feedback.ts +++ b/ui/src/hooks/feedback.ts @@ -1,7 +1,7 @@ import { useMutation } from "@tanstack/react-query"; -import { supabase } from "./auth"; -import { useUser } from "@ui/providers/UserStoreProvider"; import { FeedbackData } from "@ui/pages/feedback"; +import { useUser } from "@ui/providers/UserStoreProvider"; +import { supabase } from "./auth"; // Create new feedback export const useCreateFeedback = () => { diff --git a/ui/src/hooks/invite.ts b/ui/src/hooks/invite.ts index f584928..2fbf268 100644 --- a/ui/src/hooks/invite.ts +++ b/ui/src/hooks/invite.ts @@ -1,6 +1,6 @@ import { useMutation } from "@tanstack/react-query"; -import { api } from "@ui/lib/api"; import { useSession } from "@ui/contexts/SessionContext"; +import { api } from "@ui/lib/api"; import { toast } from "@ui/ui-library/toast/toast-queue"; // Invite user by email diff --git a/ui/src/hooks/support.ts b/ui/src/hooks/support.ts index bcc3340..80d0b01 100644 --- a/ui/src/hooks/support.ts +++ b/ui/src/hooks/support.ts @@ -1,6 +1,6 @@ import { useMutation } from "@tanstack/react-query"; -import { supabase } from "./auth"; import { useUser } from "@ui/providers/UserStoreProvider"; +import { supabase } from "./auth"; export interface SupportTicketData { issue_type: "bug" | "performance" | "security" | "feature_request" | "account" | "other"; diff --git a/ui/src/hooks/tablos.ts b/ui/src/hooks/tablos.ts index 3f4fa6f..1d88114 100644 --- a/ui/src/hooks/tablos.ts +++ b/ui/src/hooks/tablos.ts @@ -1,15 +1,15 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import { Database } from "@ui/types/database.types"; -import { supabase } from "./auth"; import { useSession } from "@ui/contexts/SessionContext"; -import { api } from "@ui/lib/api"; -import { toast } from "@ui/ui-library/toast/toast-queue"; -import { RemoveNullFromObject } from "@ui/types/removeNull"; -import { useUser } from "@ui/providers/UserStoreProvider"; -import { CreateTablo } from "@ui/types/tablos.types"; -import { EventInsertInTablo } from "@ui/types/events.types"; -import { useNavigate } from "react-router-dom"; import { invalidatePublicSlots } from "@ui/hooks/public"; +import { api } from "@ui/lib/api"; +import { useUser } from "@ui/providers/UserStoreProvider"; +import { Database } from "@ui/types/database.types"; +import { EventInsertInTablo } from "@ui/types/events.types"; +import { RemoveNullFromObject } from "@ui/types/removeNull"; +import { CreateTablo } from "@ui/types/tablos.types"; +import { toast } from "@ui/ui-library/toast/toast-queue"; +import { useNavigate } from "react-router-dom"; +import { supabase } from "./auth"; type Tablo = Database["public"]["Tables"]["tablos"]; diff --git a/ui/src/hooks/webcal.ts b/ui/src/hooks/webcal.ts index 5237ffb..b62ce37 100644 --- a/ui/src/hooks/webcal.ts +++ b/ui/src/hooks/webcal.ts @@ -1,7 +1,7 @@ import { useMutation } from "@tanstack/react-query"; import { useSession } from "@ui/contexts/SessionContext"; -import { toast } from "@ui/ui-library/toast/toast-queue"; import { api } from "@ui/lib/api"; +import { toast } from "@ui/ui-library/toast/toast-queue"; export interface WebcalToken { token: string; diff --git a/ui/src/lib/api.ts b/ui/src/lib/api.ts index c902b4d..200574c 100644 --- a/ui/src/lib/api.ts +++ b/ui/src/lib/api.ts @@ -1,5 +1,5 @@ -import axios from "axios"; import { QueryClient } from "@tanstack/react-query"; +import axios from "axios"; // Create axios instance with default config export const api = axios.create({ diff --git a/ui/src/lib/routes.tsx b/ui/src/lib/routes.tsx index 5273726..ef07610 100644 --- a/ui/src/lib/routes.tsx +++ b/ui/src/lib/routes.tsx @@ -1,28 +1,28 @@ -import { RouteObject } from "react-router-dom"; -import { ProtectedRoute } from "@ui/components/ProtectedRoute"; -import { Layout } from "@ui/components/Layout"; -import { TabloPage } from "@ui/pages/tablo"; -import { DevisPage } from "@ui/pages/devis"; -import { FacturesPage } from "@ui/pages/factures"; -import { PlanningPage } from "@ui/pages/planning"; -import { NotFoundPage } from "@ui/pages/NotFoundPage"; -import { JoinPage } from "@ui/pages/join"; -import { OAuthSigninPage } from "@ui/pages/oauth-signin"; -import { LandingPage } from "@ui/pages/landing"; -import { LoginPage } from "@ui/pages/login"; -import { SignUpPage } from "@ui/pages/signup"; -import { ResetPasswordPage } from "@ui/pages/reset-password"; import { AuthenticationGateway } from "@ui/components/AuthenticationGateway"; -import ChatProvider from "@ui/providers/ChatProvider"; import { EventModal } from "@ui/components/EventModal"; -import { ChantiersPage } from "@ui/pages/chantiers"; -import { ChatPage } from "@ui/pages/chat"; -import { FeedbackPage } from "@ui/pages/feedback"; -import { SupportPage } from "@ui/pages/support"; +import { Layout } from "@ui/components/Layout"; +import { ProtectedRoute } from "@ui/components/ProtectedRoute"; import { AvailabilitiesPage } from "@ui/pages/availabilities"; import { BookingsPage } from "@ui/pages/bookings"; +import { ChantiersPage } from "@ui/pages/chantiers"; +import { ChatPage } from "@ui/pages/chat"; +import { DevisPage } from "@ui/pages/devis"; import { EventTypesPage } from "@ui/pages/event-types-page"; +import { FacturesPage } from "@ui/pages/factures"; +import { FeedbackPage } from "@ui/pages/feedback"; +import { JoinPage } from "@ui/pages/join"; +import { LandingPage } from "@ui/pages/landing"; +import { LoginPage } from "@ui/pages/login"; +import { NotFoundPage } from "@ui/pages/NotFoundPage"; +import { OAuthSigninPage } from "@ui/pages/oauth-signin"; import { PublicBookingPage } from "@ui/pages/PublicBookingPage"; +import { PlanningPage } from "@ui/pages/planning"; +import { ResetPasswordPage } from "@ui/pages/reset-password"; +import { SignUpPage } from "@ui/pages/signup"; +import { SupportPage } from "@ui/pages/support"; +import { TabloPage } from "@ui/pages/tablo"; +import ChatProvider from "@ui/providers/ChatProvider"; +import { RouteObject } from "react-router-dom"; export const routes: RouteObject[] = [ // Protected routes diff --git a/ui/src/main.tsx b/ui/src/main.tsx index f0d44aa..91e0f61 100644 --- a/ui/src/main.tsx +++ b/ui/src/main.tsx @@ -1,7 +1,7 @@ +import { QueryClientProvider } from "@tanstack/react-query"; import { StrictMode } from "react"; import { createRoot } from "react-dom/client"; import { App } from "./App"; -import { QueryClientProvider } from "@tanstack/react-query"; import { queryClient } from "./lib/api"; import { GlobalToastRegion } from "./ui-library/toast/toast-region"; diff --git a/ui/src/pages/NotFoundPage.tsx b/ui/src/pages/NotFoundPage.tsx index f31a5b3..e3cdcb6 100644 --- a/ui/src/pages/NotFoundPage.tsx +++ b/ui/src/pages/NotFoundPage.tsx @@ -1,6 +1,6 @@ -import { twMerge } from "tailwind-merge"; import { Button } from "@ui/ui-library/button"; import { useNavigate } from "react-router-dom"; +import { twMerge } from "tailwind-merge"; export const NotFoundPage = () => { const navigate = useNavigate(); diff --git a/ui/src/pages/PublicBookingPage.tsx b/ui/src/pages/PublicBookingPage.tsx index 6f15d8a..97f96ad 100644 --- a/ui/src/pages/PublicBookingPage.tsx +++ b/ui/src/pages/PublicBookingPage.tsx @@ -1,28 +1,28 @@ -import { useParams } from "react-router-dom"; -import { useState } from "react"; -import { LoadingSpinner } from "@ui/components/LoadingSpinner"; -import { Strong, Text } from "@ui/ui-library/text"; -import { Button } from "@ui/ui-library/button"; import { CustomModal } from "@ui/components/CustomModal"; -import { TextField, Label, Input, FieldError } from "@ui/ui-library/field"; +import { LoadingSpinner } from "@ui/components/LoadingSpinner"; +import { useSession } from "@ui/contexts/SessionContext"; import { useTheme } from "@ui/contexts/ThemeContext"; +import { useSignUpWithoutPassword } from "@ui/hooks/auth"; +import { TimeSlot, usePublicSlots } from "@ui/hooks/public"; +import { useCreateTabloWithOwner } from "@ui/hooks/tablos"; import { useMaybeUser } from "@ui/providers/UserStoreProvider"; +import { EventInsertInTablo } from "@ui/types/events.types"; +import { Button } from "@ui/ui-library/button"; +import { FieldError, Input, Label, TextField } from "@ui/ui-library/field"; +import { Strong, Text } from "@ui/ui-library/text"; import { CalendarIcon, - ClockIcon, - MapPinIcon, - UserIcon, ChevronLeftIcon, ChevronRightIcon, - SunIcon, - MoonIcon, + ClockIcon, + MapPinIcon, MonitorIcon, + MoonIcon, + SunIcon, + UserIcon, } from "lucide-react"; -import { usePublicSlots, TimeSlot } from "@ui/hooks/public"; -import { useSignUpWithoutPassword } from "@ui/hooks/auth"; -import { useCreateTabloWithOwner } from "@ui/hooks/tablos"; -import { EventInsertInTablo } from "@ui/types/events.types"; -import { useSession } from "@ui/contexts/SessionContext"; +import { useState } from "react"; +import { useParams } from "react-router-dom"; export function PublicBookingPage() { const { user_info, event_type_standard_name } = useParams<{ diff --git a/ui/src/pages/availabilities.tsx b/ui/src/pages/availabilities.tsx index 3949e22..2ce5904 100644 --- a/ui/src/pages/availabilities.tsx +++ b/ui/src/pages/availabilities.tsx @@ -1,23 +1,23 @@ -import { Strong, Text } from "@ui/ui-library/text"; +import { DateValue, getLocalTimeZone, today } from "@internationalized/date"; import { AvailabilityCard } from "@ui/components/AvailabilityCard"; -import { Button } from "@ui/ui-library/button"; +import { AvailabilityVisualization } from "@ui/components/AvailabilityVisualization"; +import { CustomModal } from "@ui/components/CustomModal"; import { DEFAULT_AVAILABILITIES, Exception, useAvailabilities, WeeklyAvailability, } from "@ui/hooks/availabilities"; -import { toast } from "@ui/ui-library/toast/toast-queue"; -import { useState } from "react"; +import { Button } from "@ui/ui-library/button"; import { Checkbox } from "@ui/ui-library/checkbox"; -import { PlusIcon } from "@ui/ui-library/icons"; -import { AvailabilityVisualization } from "@ui/components/AvailabilityVisualization"; -import { SaveIcon } from "lucide-react"; import { DatePicker, DatePickerInput } from "@ui/ui-library/date-picker"; import { Label } from "@ui/ui-library/field"; -import { DateValue, getLocalTimeZone, today } from "@internationalized/date"; -import { RadioGroup, Radios, Radio } from "@ui/ui-library/radio-group"; -import { CustomModal } from "@ui/components/CustomModal"; +import { PlusIcon } from "@ui/ui-library/icons"; +import { Radio, RadioGroup, Radios } from "@ui/ui-library/radio-group"; +import { Strong, Text } from "@ui/ui-library/text"; +import { toast } from "@ui/ui-library/toast/toast-queue"; +import { SaveIcon } from "lucide-react"; +import { useState } from "react"; const DAYS_OF_WEEK = [0, 1, 2, 3, 4, 5, 6]; const DAYS_OF_WEEK_DISPLAY = [ diff --git a/ui/src/pages/bookings.tsx b/ui/src/pages/bookings.tsx index 7450527..d454c8b 100644 --- a/ui/src/pages/bookings.tsx +++ b/ui/src/pages/bookings.tsx @@ -1,7 +1,13 @@ -import { useState, useMemo, useEffect } from "react"; -import { useParams, useNavigate } from "react-router-dom"; -import { Text, Strong } from "@ui/ui-library/text"; +import { EventDetailsModal } from "@ui/components/EventDetailsModal"; +import { LoadingSpinner } from "@ui/components/LoadingSpinner"; +import { useEventsByTablo } from "@ui/hooks/events"; +import { useGetAllTabloAccess, useTablosList } from "@ui/hooks/tablos"; +import { EventAndTablo } from "@ui/types/events.types"; +import { Badge } from "@ui/ui-library/badge"; import { Button } from "@ui/ui-library/button"; +import { Input } from "@ui/ui-library/field"; +import { CalendarIcon } from "@ui/ui-library/icons/outline/calendar"; +import { Radio, RadioGroup, Radios } from "@ui/ui-library/radio-group"; import { Select, SelectButton, @@ -11,19 +17,12 @@ import { SelectPopover, StatusIcon, } from "@ui/ui-library/select"; -import { Input } from "@ui/ui-library/field"; -import { SearchIcon } from "lucide-react"; -import { CalendarIcon } from "@ui/ui-library/icons/outline/calendar"; -import { ChevronLeft, ChevronRight } from "lucide-react"; -import { useEventsByTablo } from "@ui/hooks/events"; -import { useTablosList, useGetAllTabloAccess } from "@ui/hooks/tablos"; -import { EventAndTablo } from "@ui/types/events.types"; -import { LoadingSpinner } from "@ui/components/LoadingSpinner"; -import { EventDetailsModal } from "@ui/components/EventDetailsModal"; -import { RadioGroup, Radios, Radio } from "@ui/ui-library/radio-group"; -import { Badge } from "@ui/ui-library/badge"; -import { twMerge } from "tailwind-merge"; +import { Strong, Text } from "@ui/ui-library/text"; import { getTextColorFromTabloColor } from "@ui/utils/helpers"; +import { ChevronLeft, ChevronRight, SearchIcon } from "lucide-react"; +import { useEffect, useMemo, useState } from "react"; +import { useNavigate, useParams } from "react-router-dom"; +import { twMerge } from "tailwind-merge"; type BookingStatus = "all" | "upcoming" | "past"; diff --git a/ui/src/pages/chat.tsx b/ui/src/pages/chat.tsx index 3345035..a467a9f 100644 --- a/ui/src/pages/chat.tsx +++ b/ui/src/pages/chat.tsx @@ -1,17 +1,17 @@ -import { - ChannelList, - MessageList, - MessageInput, - Window, - Channel, - useChatContext, -} from "stream-chat-react"; -import { useUser } from "@ui/providers/UserStoreProvider"; import { ChannelPreview } from "@ui/components/ChannelPreview"; +import { CustomChannelHeader } from "@ui/components/CustomChannelHeader"; import { useChannelFromUrl } from "@ui/hooks/channel"; import { useTablosList } from "@ui/hooks/tablos"; -import { CustomChannelHeader } from "@ui/components/CustomChannelHeader"; +import { useUser } from "@ui/providers/UserStoreProvider"; import { useEffect, useState } from "react"; +import { + Channel, + ChannelList, + MessageInput, + MessageList, + useChatContext, + Window, +} from "stream-chat-react"; export function ChatPage() { const user = useUser(); diff --git a/ui/src/pages/devis.test.tsx b/ui/src/pages/devis.test.tsx index ecf57e2..d2da254 100644 --- a/ui/src/pages/devis.test.tsx +++ b/ui/src/pages/devis.test.tsx @@ -1,9 +1,10 @@ import { screen, waitFor, within } from "@testing-library/react"; -import { describe, it, expect, beforeEach, vi } from "vitest"; -import { DevisPage } from "@ui/pages/devis"; -import { useDevisList, useCreateDevis, useDeleteDevis, useUpdateDevis } from "@ui/hooks/devis"; import userEvent from "@testing-library/user-event"; +import { useCreateDevis, useDeleteDevis, useDevisList, useUpdateDevis } from "@ui/hooks/devis"; +import { DevisPage } from "@ui/pages/devis"; import { renderWithProviders, waitForGridToBeInTheDOM } from "@ui/utils/testHelpers"; +import { beforeEach, describe, expect, it, vi } from "vitest"; + // Mock the hooks vi.mock("@ui/hooks/devis"); diff --git a/ui/src/pages/devis.tsx b/ui/src/pages/devis.tsx index 69e4b61..2be8e3b 100644 --- a/ui/src/pages/devis.tsx +++ b/ui/src/pages/devis.tsx @@ -1,12 +1,11 @@ -import { NotebookPenIcon } from "lucide-react"; -import { AllCommunityModule, ColDef, ModuleRegistry, themeQuartz } from "ag-grid-community"; -import { AgGridReact } from "ag-grid-react"; -import { useDevisList, useCreateDevis, useDeleteDevis, useUpdateDevis } from "@ui/hooks/devis"; -import { useState } from "react"; -import { Database } from "@ui/types/database.types"; import { CalendarDate, DateValue } from "@internationalized/date"; -import { RowActionMenu } from "@ui/components/RowActionMenu"; import { CustomLoadingOverlay } from "@ui/components/CustomLoadingOverlay"; +import { CreateDevisModal } from "@ui/components/devis/CreateDevisModal"; +import { ViewDevisModal } from "@ui/components/devis/ViewDevisModal"; +import { RowActionMenu } from "@ui/components/RowActionMenu"; +import { useCreateDevis, useDeleteDevis, useDevisList, useUpdateDevis } from "@ui/hooks/devis"; +import { Database } from "@ui/types/database.types"; +import { Badge, BadgeColor } from "@ui/ui-library/badge"; import { EmptyState, EmptyStateActions, @@ -14,14 +13,18 @@ import { EmptyStateHeading, EmptyStateIcon, } from "@ui/ui-library/empty-state"; -import { CreateDevisModal } from "@ui/components/devis/CreateDevisModal"; -import { calculateTotal, calculateTax, exportDevisToPdf, statusToText } from "@ui/utils/helpers"; -import { ViewDevisModal } from "@ui/components/devis/ViewDevisModal"; -import { Badge, BadgeColor } from "@ui/ui-library/badge"; -import { Select, SelectButton } from "@ui/ui-library/select"; -import { SelectListBox } from "@ui/ui-library/select"; -import { SelectPopover } from "@ui/ui-library/select"; -import { SelectListItem } from "@ui/ui-library/select"; +import { + Select, + SelectButton, + SelectListBox, + SelectListItem, + SelectPopover, +} from "@ui/ui-library/select"; +import { calculateTax, calculateTotal, exportDevisToPdf, statusToText } from "@ui/utils/helpers"; +import { AllCommunityModule, ColDef, ModuleRegistry, themeQuartz } from "ag-grid-community"; +import { AgGridReact } from "ag-grid-react"; +import { NotebookPenIcon } from "lucide-react"; +import { useState } from "react"; ModuleRegistry.registerModules([AllCommunityModule]); diff --git a/ui/src/pages/event-types-page.tsx b/ui/src/pages/event-types-page.tsx index d000637..5c0ed15 100644 --- a/ui/src/pages/event-types-page.tsx +++ b/ui/src/pages/event-types-page.tsx @@ -1,12 +1,12 @@ -import { useState } from "react"; -import { Strong, Text } from "@ui/ui-library/text"; -import { Button, ToggleButton } from "@ui/ui-library/button"; -import { PlusIcon, EditIcon, TrashIcon, CheckIcon, XIcon, ExternalLinkIcon } from "lucide-react"; -import { toast } from "@ui/ui-library/toast/toast-queue"; import { EventTypeModal } from "@ui/components/EventTypeModal"; import { EventTypeConfig, useEventTypes } from "@ui/hooks/event-types"; import { useUser } from "@ui/providers/UserStoreProvider"; +import { Button, ToggleButton } from "@ui/ui-library/button"; import { CopyButton } from "@ui/ui-library/clipboard"; +import { Strong, Text } from "@ui/ui-library/text"; +import { toast } from "@ui/ui-library/toast/toast-queue"; +import { CheckIcon, EditIcon, ExternalLinkIcon, PlusIcon, TrashIcon, XIcon } from "lucide-react"; +import { useState } from "react"; export function EventTypesPage() { const user = useUser(); diff --git a/ui/src/pages/feedback.tsx b/ui/src/pages/feedback.tsx index d83fdfb..fea7725 100644 --- a/ui/src/pages/feedback.tsx +++ b/ui/src/pages/feedback.tsx @@ -1,13 +1,13 @@ -import React, { useState } from "react"; -import { Button } from "@ui/ui-library/button"; -import { Form } from "@ui/ui-library/form"; -import { TextField, Label, TextArea, Description } from "@ui/ui-library/field"; -import { Text } from "@ui/ui-library/text"; -import { Separator } from "react-aria-components"; -import { SendIcon, ArrowLeftIcon } from "lucide-react"; -import { twMerge } from "tailwind-merge"; -import { useNavigate } from "react-router-dom"; import { useCreateFeedback } from "@ui/hooks/feedback"; +import { Button } from "@ui/ui-library/button"; +import { Description, Label, TextArea, TextField } from "@ui/ui-library/field"; +import { Form } from "@ui/ui-library/form"; +import { Text } from "@ui/ui-library/text"; +import { ArrowLeftIcon, SendIcon } from "lucide-react"; +import React, { useState } from "react"; +import { Separator } from "react-aria-components"; +import { useNavigate } from "react-router-dom"; +import { twMerge } from "tailwind-merge"; export interface FeedbackData { fd_type: "bug" | "feature" | "improvement" | "other"; diff --git a/ui/src/pages/join.tsx b/ui/src/pages/join.tsx index 12100ec..4f5aae0 100644 --- a/ui/src/pages/join.tsx +++ b/ui/src/pages/join.tsx @@ -1,7 +1,7 @@ -import { useParams, useNavigate, useSearchParams } from "react-router-dom"; -import { useUser } from "@ui/providers/UserStoreProvider"; import { useJoinTablo } from "@ui/hooks/invite"; +import { useUser } from "@ui/providers/UserStoreProvider"; import { toast } from "@ui/ui-library/toast/toast-queue"; +import { useNavigate, useParams, useSearchParams } from "react-router-dom"; export const JoinPage = () => { const { tablo_name } = useParams<{ tablo_name: string }>(); diff --git a/ui/src/pages/kanban.tsx b/ui/src/pages/kanban.tsx index 448dcf5..fc312fa 100644 --- a/ui/src/pages/kanban.tsx +++ b/ui/src/pages/kanban.tsx @@ -1,21 +1,21 @@ -import React, { useState, useEffect } from "react"; -import { useParams } from "react-router-dom"; import { KanbanBoard } from "@ui/components/kanban/KanbanBoard"; import { LoadingSpinner } from "@ui/components/LoadingSpinner"; import { useTablosList } from "@ui/hooks/tablos"; import { KanbanBoard as KanbanBoardType, - KanbanTask, KanbanColumn, + KanbanTask, TaskStatus, } from "@ui/types/kanban.types"; import { Select, SelectButton, - SelectPopover, SelectListBox, SelectListItem, + SelectPopover, } from "@ui/ui-library/select"; +import React, { useEffect, useState } from "react"; +import { useParams } from "react-router-dom"; // Mock data for demonstration const createMockKanbanBoard = (tabloId: string, tabloName: string): KanbanBoardType => { diff --git a/ui/src/pages/landing.tsx b/ui/src/pages/landing.tsx index 41e4c20..ee327c9 100644 --- a/ui/src/pages/landing.tsx +++ b/ui/src/pages/landing.tsx @@ -1,9 +1,8 @@ -import { Button } from "@ui/ui-library/button"; -import { twMerge } from "tailwind-merge"; - -import logo from "../assets/icon.jpg"; import { Header } from "@ui/components/header"; +import { Button } from "@ui/ui-library/button"; import { Link } from "react-router-dom"; +import { twMerge } from "tailwind-merge"; +import logo from "../assets/icon.jpg"; export const LandingPage = () => { window.location.href = "https://www.xtablo.com"; diff --git a/ui/src/pages/login.tsx b/ui/src/pages/login.tsx index 7120b53..0c471dd 100644 --- a/ui/src/pages/login.tsx +++ b/ui/src/pages/login.tsx @@ -1,14 +1,14 @@ -import { Button } from "@ui/ui-library/button"; -import { twMerge } from "tailwind-merge"; -import { useState } from "react"; -import { Label, Input, TextField, FieldError } from "@ui/ui-library/field"; -import { useLoginEmail } from "@ui/hooks/auth"; -import { Form } from "@ui/ui-library/form"; -import { LoginWithGoogle } from "@ui/components/BrandButtons/LoginWithGoogle"; -import { Link } from "react-router-dom"; -import { useTheme } from "@ui/contexts/ThemeContext"; -import { SunIcon, MoonIcon, MonitorIcon } from "lucide-react"; import { AnimatedBackground } from "@ui/components/AnimatedBackground"; +import { LoginWithGoogle } from "@ui/components/BrandButtons/LoginWithGoogle"; +import { useTheme } from "@ui/contexts/ThemeContext"; +import { useLoginEmail } from "@ui/hooks/auth"; +import { Button } from "@ui/ui-library/button"; +import { FieldError, Input, Label, TextField } from "@ui/ui-library/field"; +import { Form } from "@ui/ui-library/form"; +import { MonitorIcon, MoonIcon, SunIcon } from "lucide-react"; +import { useState } from "react"; +import { Link } from "react-router-dom"; +import { twMerge } from "tailwind-merge"; export function LoginPage() { const redirectUrl = localStorage.getItem("redirectUrl"); diff --git a/ui/src/pages/oauth-signin.tsx b/ui/src/pages/oauth-signin.tsx index f4794f5..94c5c31 100644 --- a/ui/src/pages/oauth-signin.tsx +++ b/ui/src/pages/oauth-signin.tsx @@ -1,7 +1,7 @@ -import { useEffect } from "react"; -import { useNavigate } from "react-router-dom"; import { useSession } from "@ui/contexts/SessionContext"; import { useSignUpToStream } from "@ui/hooks/auth"; +import { useEffect } from "react"; +import { useNavigate } from "react-router-dom"; export const OAuthSigninPage = () => { const navigate = useNavigate(); diff --git a/ui/src/pages/planning.tsx b/ui/src/pages/planning.tsx index 98c3b21..e330c7e 100644 --- a/ui/src/pages/planning.tsx +++ b/ui/src/pages/planning.tsx @@ -1,19 +1,19 @@ -import { useState, useEffect } from "react"; +import { ImportICSModal } from "@ui/components/ImportICSModal"; +import { WebcalModal } from "@ui/components/WebcalModal"; +import { useDeleteEvent, useEventsByTablo } from "@ui/hooks/events"; import { useGetAllTabloAccess, useTablosList } from "@ui/hooks/tablos"; -import { useEventsByTablo, useDeleteEvent } from "@ui/hooks/events"; +import { EventAndTablo } from "@ui/types/events.types"; import { Select, SelectButton, - SelectPopover, SelectListBox, SelectListItem, + SelectPopover, } from "@ui/ui-library/select"; -import { Outlet, useNavigate, useParams } from "react-router-dom"; -import { generateICSFromEvents, downloadICSFile } from "@ui/utils/helpers"; -import { ImportICSModal } from "@ui/components/ImportICSModal"; -import { WebcalModal } from "@ui/components/WebcalModal"; +import { downloadICSFile, generateICSFromEvents } from "@ui/utils/helpers"; import { FolderInputIcon, PlusIcon } from "lucide-react"; -import { EventAndTablo } from "@ui/types/events.types"; +import { useEffect, useState } from "react"; +import { Outlet, useNavigate, useParams } from "react-router-dom"; type ViewType = "month" | "week" | "day"; diff --git a/ui/src/pages/reset-password.tsx b/ui/src/pages/reset-password.tsx index 999c651..e788e7d 100644 --- a/ui/src/pages/reset-password.tsx +++ b/ui/src/pages/reset-password.tsx @@ -1,10 +1,10 @@ import { Button } from "@ui/ui-library/button"; -import { twMerge } from "tailwind-merge"; -import { Link, useNavigate } from "react-router-dom"; -import { useState } from "react"; -import { Label, Input, TextField, FieldError } from "@ui/ui-library/field"; +import { FieldError, Input, Label, TextField } from "@ui/ui-library/field"; import { Form } from "@ui/ui-library/form"; import { Text } from "@ui/ui-library/text"; +import { useState } from "react"; +import { Link, useNavigate } from "react-router-dom"; +import { twMerge } from "tailwind-merge"; export function ResetPasswordPage() { const navigate = useNavigate(); diff --git a/ui/src/pages/signup.tsx b/ui/src/pages/signup.tsx index 754f4b7..f907223 100644 --- a/ui/src/pages/signup.tsx +++ b/ui/src/pages/signup.tsx @@ -1,15 +1,15 @@ -import { Button } from "@ui/ui-library/button"; -import { twMerge } from "tailwind-merge"; -import { Link, useNavigate } from "react-router-dom"; -import { useState } from "react"; -import { Label, Input, TextField, FieldError } from "@ui/ui-library/field"; +import { AnimatedBackground } from "@ui/components/AnimatedBackground"; +import { LoginWithGoogle } from "@ui/components/BrandButtons/LoginWithGoogle"; +import { useTheme } from "@ui/contexts/ThemeContext"; import { useSignUp } from "@ui/hooks/auth"; +import { Button } from "@ui/ui-library/button"; +import { FieldError, Input, Label, TextField } from "@ui/ui-library/field"; import { Form } from "@ui/ui-library/form"; import { Text } from "@ui/ui-library/text"; -import { LoginWithGoogle } from "@ui/components/BrandButtons/LoginWithGoogle"; -import { AnimatedBackground } from "@ui/components/AnimatedBackground"; -import { useTheme } from "@ui/contexts/ThemeContext"; -import { SunIcon, MoonIcon, MonitorIcon } from "lucide-react"; +import { MonitorIcon, MoonIcon, SunIcon } from "lucide-react"; +import { useState } from "react"; +import { Link, useNavigate } from "react-router-dom"; +import { twMerge } from "tailwind-merge"; export function SignUpPage() { const navigate = useNavigate(); diff --git a/ui/src/pages/support.tsx b/ui/src/pages/support.tsx index a20845a..93f4b55 100644 --- a/ui/src/pages/support.tsx +++ b/ui/src/pages/support.tsx @@ -1,13 +1,13 @@ -import React, { useState } from "react"; +import { SupportTicketData, useCreateSupportTicket } from "@ui/hooks/support"; import { Button } from "@ui/ui-library/button"; +import { Description, Label, TextArea, TextField } from "@ui/ui-library/field"; import { Form } from "@ui/ui-library/form"; -import { TextField, Label, TextArea, Description } from "@ui/ui-library/field"; import { Text } from "@ui/ui-library/text"; +import { ArrowLeftIcon, SendIcon } from "lucide-react"; +import React, { useState } from "react"; import { Separator } from "react-aria-components"; -import { SendIcon, ArrowLeftIcon } from "lucide-react"; -import { twMerge } from "tailwind-merge"; import { useNavigate } from "react-router-dom"; -import { useCreateSupportTicket, SupportTicketData } from "@ui/hooks/support"; +import { twMerge } from "tailwind-merge"; export function SupportPage() { const navigate = useNavigate(); diff --git a/ui/src/pages/tablo.tsx b/ui/src/pages/tablo.tsx index 172b128..d4926e7 100644 --- a/ui/src/pages/tablo.tsx +++ b/ui/src/pages/tablo.tsx @@ -1,20 +1,20 @@ import { CreateTabloModal } from "@ui/components/CreateTabloModal"; -import { TabloModal } from "@ui/components/TabloModal"; import { DeleteTabloModal } from "@ui/components/DeleteTabloModal"; +import { LoadingSpinner } from "@ui/components/LoadingSpinner"; +import { TabloModal } from "@ui/components/TabloModal"; import { TabloTutorial } from "@ui/components/TabloTutorial"; +import { useCreateTablo, useDeleteTablo, useTablosList, useUpdateTablo } from "@ui/hooks/tablos"; +import { TabloInsert, TabloUpdate, UserTablo } from "@ui/types/tablos.types"; import { Select, SelectButton, - SelectPopover, SelectListBox, SelectListItem, + SelectPopover, } from "@ui/ui-library/select"; -import { useState, useEffect } from "react"; -import { useTablosList, useCreateTablo, useUpdateTablo, useDeleteTablo } from "@ui/hooks/tablos"; -import { LoadingSpinner } from "@ui/components/LoadingSpinner"; -import { TabloInsert, TabloUpdate, UserTablo } from "@ui/types/tablos.types"; -import { useNavigate } from "react-router-dom"; import { HelpCircle } from "lucide-react"; +import { useEffect, useState } from "react"; +import { useNavigate } from "react-router-dom"; type FilterOption = { id: "all" | "todo" | "in_progress" | "done"; diff --git a/ui/src/providers/ChatProvider.tsx b/ui/src/providers/ChatProvider.tsx index be92ce6..037f953 100644 --- a/ui/src/providers/ChatProvider.tsx +++ b/ui/src/providers/ChatProvider.tsx @@ -1,6 +1,6 @@ +import { LoadingSpinner } from "@ui/components/LoadingSpinner"; import { Chat, useCreateChatClient } from "stream-chat-react"; import { useUser } from "./UserStoreProvider"; -import { LoadingSpinner } from "@ui/components/LoadingSpinner"; export default function ChatProvider({ children }: { children: React.ReactNode }) { const apiKey = import.meta.env.VITE_STREAM_CHAT_API_KEY as string; diff --git a/ui/src/providers/UserStoreProvider.tsx b/ui/src/providers/UserStoreProvider.tsx index 078fd3d..c3aae1c 100644 --- a/ui/src/providers/UserStoreProvider.tsx +++ b/ui/src/providers/UserStoreProvider.tsx @@ -1,10 +1,10 @@ -import { createStore, StoreApi, useStore } from "zustand"; -import React from "react"; import { useQuery } from "@tanstack/react-query"; -import { Tables } from "@ui/types/database.types"; +import { LoadingSpinner } from "@ui/components/LoadingSpinner"; import { useSession } from "@ui/contexts/SessionContext"; import { api } from "@ui/lib/api"; -import { LoadingSpinner } from "@ui/components/LoadingSpinner"; +import { Tables } from "@ui/types/database.types"; +import React from "react"; +import { createStore, StoreApi, useStore } from "zustand"; export type User = Tables<"profiles"> & { streamToken: string | null; diff --git a/ui/src/types/tablos.types.ts b/ui/src/types/tablos.types.ts index e9b9406..03f907e 100644 --- a/ui/src/types/tablos.types.ts +++ b/ui/src/types/tablos.types.ts @@ -1,6 +1,6 @@ import { Database } from "@ui/types/database.types"; -import { RemoveNullFromObject } from "@ui/types/removeNull"; import { EventInsertInTablo } from "@ui/types/events.types"; +import { RemoveNullFromObject } from "@ui/types/removeNull"; export type UserTablo = RemoveNullFromObject< Database["public"]["Views"]["user_tablos"]["Row"], diff --git a/ui/src/ui-library/avatar.tsx b/ui/src/ui-library/avatar.tsx index 9a1fcd9..82e10b8 100644 --- a/ui/src/ui-library/avatar.tsx +++ b/ui/src/ui-library/avatar.tsx @@ -1,7 +1,7 @@ import React from "react"; -import { FallbackAvatarProps, getFallbackAvatarDataUrl } from "./initials"; import { twMerge } from "tailwind-merge"; import { useImageLoadingStatus } from "./hooks/use-image-loading-status"; +import { FallbackAvatarProps, getFallbackAvatarDataUrl } from "./initials"; const AvatarContext = React.createContext<{ badgeId: string; diff --git a/ui/src/ui-library/badge/index.ts b/ui/src/ui-library/badge/index.ts index e81d39f..a1119b0 100644 --- a/ui/src/ui-library/badge/index.ts +++ b/ui/src/ui-library/badge/index.ts @@ -1,5 +1,3 @@ -export type { BadgeColor } from "./badge.styles"; - -export { getBadgeStyles } from "./badge.styles"; - export { Badge } from "./badge"; +export type { BadgeColor } from "./badge.styles"; +export { getBadgeStyles } from "./badge.styles"; diff --git a/ui/src/ui-library/breadcrumbs.tsx b/ui/src/ui-library/breadcrumbs.tsx index efe3b99..3003d66 100644 --- a/ui/src/ui-library/breadcrumbs.tsx +++ b/ui/src/ui-library/breadcrumbs.tsx @@ -1,14 +1,14 @@ import { - Breadcrumb as RACBreadcrumb, - Breadcrumbs as RACBreadcrumbs, - BreadcrumbProps as RACBreadcrumbProps, - BreadcrumbsProps as RACBreadcrumbsProps, - LinkProps, composeRenderProps, + LinkProps, + Breadcrumb as RACBreadcrumb, + BreadcrumbProps as RACBreadcrumbProps, + Breadcrumbs as RACBreadcrumbs, + BreadcrumbsProps as RACBreadcrumbsProps, } from "react-aria-components"; import { twMerge } from "tailwind-merge"; -import { Link } from "./link"; import { ChevronRightIcon } from "./icons"; +import { Link } from "./link"; export function Breadcrumbs({ className, ...props }: RACBreadcrumbsProps) { return ; diff --git a/ui/src/ui-library/button.tsx b/ui/src/ui-library/button.tsx index cb8ad60..3613121 100644 --- a/ui/src/ui-library/button.tsx +++ b/ui/src/ui-library/button.tsx @@ -1,17 +1,17 @@ import React from "react"; import { + composeRenderProps, Button as RACButton, ButtonProps as RACButtonProps, ToggleButton as RACToggleButton, - ToggleButtonProps as RACToggleButtonProps, ToggleButtonGroup as RACToggleButtonGroup, + ToggleButtonProps as RACToggleButtonProps, ToggleButtonGroupProps, - composeRenderProps, } from "react-aria-components"; import { twMerge } from "tailwind-merge"; -import { AsChildProps, Slot } from "./slot"; import { SpinnerIcon } from "./icons"; -import { NonFousableTooltipTarget, TooltipTrigger, Tooltip } from "./tooltip"; +import { AsChildProps, Slot } from "./slot"; +import { NonFousableTooltipTarget, Tooltip, TooltipTrigger } from "./tooltip"; type Color = "accent" | "success" | "destructive"; diff --git a/ui/src/ui-library/calendar.tsx b/ui/src/ui-library/calendar.tsx index 1911d02..87f44f8 100644 --- a/ui/src/ui-library/calendar.tsx +++ b/ui/src/ui-library/calendar.tsx @@ -1,27 +1,27 @@ +import { CalendarDate, getLocalTimeZone, isToday } from "@internationalized/date"; +import { useDateFormatter } from "@react-aria/i18n"; +import { CalendarState } from "@react-stately/calendar"; import React from "react"; import { - Heading, - Calendar as RACCalendar, - CalendarGridHeader as RACCalendarGridHeader, - CalendarProps as RACCalendarProps, CalendarCell, CalendarGrid, CalendarGridBody, CalendarHeaderCell, + CalendarStateContext, + composeRenderProps, DateValue, + Heading, + Calendar as RACCalendar, + CalendarGridHeader as RACCalendarGridHeader, + CalendarProps as RACCalendarProps, Text, useLocale, - composeRenderProps, - CalendarStateContext, } from "react-aria-components"; -import { Button, ButtonGroup } from "./button"; import { twMerge } from "tailwind-merge"; -import { ChevronLeftIcon, ChevronRightIcon } from "./icons"; -import { CalendarDate, getLocalTimeZone, isToday } from "@internationalized/date"; -import { CalendarState } from "@react-stately/calendar"; -import { useDateFormatter } from "@react-aria/i18n"; -import { NativeSelect, NativeSelectField } from "./native-select"; +import { Button, ButtonGroup } from "./button"; import { Label } from "./field"; +import { ChevronLeftIcon, ChevronRightIcon } from "./icons"; +import { NativeSelect, NativeSelectField } from "./native-select"; export type YearRange = number | [yearsBefore: number, yearsAfter: number]; diff --git a/ui/src/ui-library/checkbox.tsx b/ui/src/ui-library/checkbox.tsx index 6487f1f..216294e 100644 --- a/ui/src/ui-library/checkbox.tsx +++ b/ui/src/ui-library/checkbox.tsx @@ -7,10 +7,10 @@ import { CheckboxGroupProps as RACCheckboxGroupProps, CheckboxProps as RACCheckboxProps, } from "react-aria-components"; -import { groupBox } from "./utils"; import { twMerge } from "tailwind-merge"; import { DescriptionContext, DescriptionProvider } from "./field"; import { CheckIcon, MinusIcon } from "./icons"; +import { groupBox } from "./utils"; export interface CheckboxGroupProps extends Omit { children?: ReactNode; diff --git a/ui/src/ui-library/clipboard.tsx b/ui/src/ui-library/clipboard.tsx index e63969e..c94eb1b 100644 --- a/ui/src/ui-library/clipboard.tsx +++ b/ui/src/ui-library/clipboard.tsx @@ -1,9 +1,9 @@ import React from "react"; +import { twMerge } from "tailwind-merge"; import { Button, ButtonProps } from "./button"; import { useCopyToClipboard } from "./hooks/use-clipboard"; -import { TooltipTrigger, Tooltip } from "./tooltip"; import { CheckIcon, CopyIcon } from "./icons"; -import { twMerge } from "tailwind-merge"; +import { Tooltip, TooltipTrigger } from "./tooltip"; export type ClipboardProps = { timeout?: number; diff --git a/ui/src/ui-library/combobox.tsx b/ui/src/ui-library/combobox.tsx index 4f90ded..79a4a1e 100644 --- a/ui/src/ui-library/combobox.tsx +++ b/ui/src/ui-library/combobox.tsx @@ -1,15 +1,16 @@ import React from "react"; import { + ComboBoxStateContext, + composeRenderProps, + Group, + GroupProps, ComboBox as RACComboBox, ComboBoxProps as RACComboBoxProps, - ComboBoxStateContext, - GroupProps, - Group, - composeRenderProps, } from "react-aria-components"; -import { ButtonProps, Button } from "./button"; -import { inputField } from "./utils"; import { twMerge } from "tailwind-merge"; +import { Button, ButtonProps } from "./button"; +import { Input } from "./field"; +import { ChevronDownIcon, XIcon } from "./icons"; import { SelectListBox, SelectListItemDescription, @@ -17,8 +18,7 @@ import { SelectPopover, SelectSection, } from "./select"; -import { Input } from "./field"; -import { ChevronDownIcon, XIcon } from "./icons"; +import { inputField } from "./utils"; export function ComboBox(props: RACComboBoxProps) { return ( diff --git a/ui/src/ui-library/date-field.tsx b/ui/src/ui-library/date-field.tsx index 35b6334..9855869 100644 --- a/ui/src/ui-library/date-field.tsx +++ b/ui/src/ui-library/date-field.tsx @@ -1,14 +1,14 @@ import { + composeRenderProps, + DateSegment, + DateValue, DateField as RACDateField, DateFieldProps as RACDateFieldProps, DateInput as RACDateInput, DateInputProps as RACDateInputProps, - DateSegment, - DateValue, - composeRenderProps, } from "react-aria-components"; -import { inputField } from "./utils"; import { twMerge } from "tailwind-merge"; +import { inputField } from "./utils"; export interface DateFieldProps extends RACDateFieldProps {} diff --git a/ui/src/ui-library/date-picker.tsx b/ui/src/ui-library/date-picker.tsx index ea62cb1..0d07e7a 100644 --- a/ui/src/ui-library/date-picker.tsx +++ b/ui/src/ui-library/date-picker.tsx @@ -1,21 +1,21 @@ import React from "react"; import { + composeRenderProps, + DatePickerStateContext, + DateValue, + Group, DatePicker as RACDatePicker, DatePickerProps as RACDatePickerProps, - DateValue, - DatePickerStateContext, useLocale, - Group, - composeRenderProps, } from "react-aria-components"; +import { twMerge } from "tailwind-merge"; import { Button } from "./button"; import { Calendar, YearRange } from "./calendar"; import { DateInput, DateInputProps } from "./date-field"; import { Dialog } from "./dialog"; +import { CalendarIcon } from "./icons/outline/calendar"; import { Popover } from "./popover"; import { inputField } from "./utils"; -import { twMerge } from "tailwind-merge"; -import { CalendarIcon } from "./icons/outline/calendar"; export interface DatePickerProps extends RACDatePickerProps {} diff --git a/ui/src/ui-library/date-range-picker.tsx b/ui/src/ui-library/date-range-picker.tsx index 964943f..b541d94 100644 --- a/ui/src/ui-library/date-range-picker.tsx +++ b/ui/src/ui-library/date-range-picker.tsx @@ -4,17 +4,17 @@ import { DateRangePickerProps as AriaDateRangePickerProps, DateRangePickerStateContext, DateValue, - useLocale, Group, + useLocale, } from "react-aria-components"; +import { twMerge } from "tailwind-merge"; import { Button } from "./button"; import { DateInput } from "./date-field"; import { Dialog } from "./dialog"; +import { CalendarIcon } from "./icons"; import { Popover } from "./popover"; import { RangeCalendar } from "./range-calendar"; import { composeTailwindRenderProps, inputField } from "./utils"; -import { twMerge } from "tailwind-merge"; -import { CalendarIcon } from "./icons"; export interface DateRangePickerProps extends AriaDateRangePickerProps {} diff --git a/ui/src/ui-library/dialog.tsx b/ui/src/ui-library/dialog.tsx index 05b7a30..cf6fbdc 100644 --- a/ui/src/ui-library/dialog.tsx +++ b/ui/src/ui-library/dialog.tsx @@ -1,14 +1,14 @@ +import React from "react"; import { - DialogProps as RACDialogProps, - Dialog as RACDialog, composeRenderProps, + Dialog as RACDialog, + DialogProps as RACDialogProps, } from "react-aria-components"; import { twMerge } from "tailwind-merge"; -import React from "react"; -import { BaseHeadingProps, Heading } from "./heading"; import { Button, ButtonProps } from "./button"; -import { Text } from "./text"; +import { BaseHeadingProps, Heading } from "./heading"; import { XIcon } from "./icons"; +import { Text } from "./text"; export { DialogTrigger } from "react-aria-components"; diff --git a/ui/src/ui-library/empty-state.tsx b/ui/src/ui-library/empty-state.tsx index d833993..9b172b1 100644 --- a/ui/src/ui-library/empty-state.tsx +++ b/ui/src/ui-library/empty-state.tsx @@ -1,7 +1,7 @@ -import { twMerge } from "tailwind-merge"; import { TextProps } from "react-aria-components"; -import { Text } from "./text"; +import { twMerge } from "tailwind-merge"; import { Heading, HeadingProps } from "./heading"; +import { Text } from "./text"; export function EmptyState({ className, ...props }: React.JSX.IntrinsicElements["div"]) { return ( diff --git a/ui/src/ui-library/field.tsx b/ui/src/ui-library/field.tsx index 115e45a..e3428a6 100644 --- a/ui/src/ui-library/field.tsx +++ b/ui/src/ui-library/field.tsx @@ -1,24 +1,24 @@ import React from "react"; import { + composeRenderProps, FieldErrorProps, + GroupContext, InputProps, + LabelContext, LabelProps, FieldError as RACFieldError, Input as RACInput, Label as RACLabel, - TextProps, - LabelContext, - GroupContext, - TextFieldProps as RACTextFieldProps, - TextField as RACTextField, + Text as RACText, TextArea as RACTextArea, TextAreaProps as RACTextAreaProps, - Text as RACText, - composeRenderProps, + TextField as RACTextField, + TextFieldProps as RACTextFieldProps, + TextProps, } from "react-aria-components"; import { twMerge } from "tailwind-merge"; -import { DisplayLevel, displayLevels, inputField } from "./utils"; import { Text } from "./text"; +import { DisplayLevel, displayLevels, inputField } from "./utils"; // https://react-spectrum.adobe.com/react-aria/Group.html#advanced-customization export function LabeledGroup({ diff --git a/ui/src/ui-library/grid-list.tsx b/ui/src/ui-library/grid-list.tsx index 99aeb27..c2ed6df 100644 --- a/ui/src/ui-library/grid-list.tsx +++ b/ui/src/ui-library/grid-list.tsx @@ -6,9 +6,9 @@ import { GridListItemProps, GridListProps, } from "react-aria-components"; +import { twMerge } from "tailwind-merge"; import { Checkbox } from "./checkbox"; import { composeTailwindRenderProps } from "./utils"; -import { twMerge } from "tailwind-merge"; export function GridList({ children, ...props }: GridListProps) { return ( diff --git a/ui/src/ui-library/hover-card.tsx b/ui/src/ui-library/hover-card.tsx index 4cfc5fa..bb9c007 100644 --- a/ui/src/ui-library/hover-card.tsx +++ b/ui/src/ui-library/hover-card.tsx @@ -1,21 +1,21 @@ -import React from "react"; import { - useFloating, autoUpdate, - offset, - flip, - shift, - useDismiss, - useRole, - useInteractions, FloatingFocusManager, - useHover, - safePolygon, + flip, + offset, Placement, ReferenceType, + safePolygon, + shift, + useDismiss, + useFloating, + useHover, + useInteractions, + useRole, } from "@floating-ui/react"; -import { Heading, HeadingProps } from "./heading"; +import React from "react"; import { twMerge } from "tailwind-merge"; +import { Heading, HeadingProps } from "./heading"; interface PopoverOptions { placement?: Placement; diff --git a/ui/src/ui-library/list-box.tsx b/ui/src/ui-library/list-box.tsx index 9c2a38e..ffd9cb3 100644 --- a/ui/src/ui-library/list-box.tsx +++ b/ui/src/ui-library/list-box.tsx @@ -1,13 +1,13 @@ import React from "react"; import { + composeRenderProps, + ListBoxItemProps, ListBox as RACListBox, ListBoxItem as RACListBoxItem, ListBoxProps as RACListBoxProps, - ListBoxItemProps, - composeRenderProps, } from "react-aria-components"; -import { composeTailwindRenderProps } from "./utils"; import { twMerge } from "tailwind-merge"; +import { composeTailwindRenderProps } from "./utils"; export interface ListBoxProps extends Omit, "layout" | "orientation"> {} diff --git a/ui/src/ui-library/menu.tsx b/ui/src/ui-library/menu.tsx index a0f6944..a4f4d6a 100644 --- a/ui/src/ui-library/menu.tsx +++ b/ui/src/ui-library/menu.tsx @@ -1,22 +1,22 @@ import React from "react"; import { + Collection, + composeRenderProps, + Header, Menu as RACMenu, MenuItem as RACMenuItem, - MenuProps as RACMenuProps, MenuItemProps as RACMenuItemProps, - composeRenderProps, - Separator, - Header, - MenuSectionProps as RACMenuSectionProps, + MenuProps as RACMenuProps, MenuSection as RACMenuSection, - Collection, + MenuSectionProps as RACMenuSectionProps, + Separator, } from "react-aria-components"; import { twMerge } from "tailwind-merge"; -import { Popover, PopoverProps } from "./popover"; import { Button, ButtonProps } from "./button"; -import { composeTailwindRenderProps } from "./utils"; -import { Small } from "./text"; import { CheckIcon, ChevronDownIcon, ChevronRightIcon } from "./icons"; +import { Popover, PopoverProps } from "./popover"; +import { Small } from "./text"; +import { composeTailwindRenderProps } from "./utils"; export { MenuTrigger, SubmenuTrigger } from "react-aria-components"; diff --git a/ui/src/ui-library/modal.tsx b/ui/src/ui-library/modal.tsx index a33e5cc..e443715 100644 --- a/ui/src/ui-library/modal.tsx +++ b/ui/src/ui-library/modal.tsx @@ -1,8 +1,8 @@ import React from "react"; import { + Modal as RACModal, ModalOverlay as RACModalOverlay, ModalOverlayProps as RACModalOverlayProps, - Modal as RACModal, } from "react-aria-components"; import { composeTailwindRenderProps } from "./utils"; diff --git a/ui/src/ui-library/multi-select.tsx b/ui/src/ui-library/multi-select.tsx index bb0e4eb..44155fa 100644 --- a/ui/src/ui-library/multi-select.tsx +++ b/ui/src/ui-library/multi-select.tsx @@ -1,21 +1,21 @@ import React, { useState } from "react"; +import { useFilter } from "react-aria"; import { ComboBox, - ComboBoxProps as RACComboBoxProps, - Key, - ListBoxItemProps, composeRenderProps, - GroupProps, - LabelContext, Group, + GroupProps, + Key, + LabelContext, + ListBoxItemProps, + ComboBoxProps as RACComboBoxProps, } from "react-aria-components"; -import { useListData, ListData } from "react-stately"; -import { useFilter } from "react-aria"; -import { DescriptionProvider, LabeledGroup, Input, DescriptionContext } from "./field"; -import { Popover } from "./popover"; -import { ListBox, ListBoxItem } from "./list-box"; -import { Button } from "./button"; +import { ListData, useListData } from "react-stately"; import { twMerge } from "tailwind-merge"; +import { Button } from "./button"; +import { DescriptionContext, DescriptionProvider, Input, LabeledGroup } from "./field"; +import { ListBox, ListBoxItem } from "./list-box"; +import { Popover } from "./popover"; import { TagGroup, TagList } from "./tag-group"; import { composeTailwindRenderProps, inputField } from "./utils"; diff --git a/ui/src/ui-library/native-select.tsx b/ui/src/ui-library/native-select.tsx index 3612aea..31e0645 100644 --- a/ui/src/ui-library/native-select.tsx +++ b/ui/src/ui-library/native-select.tsx @@ -1,9 +1,9 @@ import React from "react"; import { useFocusRing } from "react-aria"; -import { twMerge } from "tailwind-merge"; -import { inputField } from "./utils"; -import { DescriptionContext, DescriptionProvider } from "./field"; import { LabelContext } from "react-aria-components"; +import { twMerge } from "tailwind-merge"; +import { DescriptionContext, DescriptionProvider } from "./field"; +import { inputField } from "./utils"; export function NativeSelectField({ className, ...props }: React.JSX.IntrinsicElements["div"]) { const labelId = React.useId(); diff --git a/ui/src/ui-library/number-field.tsx b/ui/src/ui-library/number-field.tsx index 2c0b535..fce6b9a 100644 --- a/ui/src/ui-library/number-field.tsx +++ b/ui/src/ui-library/number-field.tsx @@ -1,14 +1,14 @@ import { + Group, + InputProps, NumberField as RACNumberField, NumberFieldProps as RACNumberFieldProps, - InputProps, - Group, } from "react-aria-components"; -import { Input } from "./field"; -import { composeTailwindRenderProps, inputField } from "./utils"; import { Button } from "./button"; -import { Separator } from "./separator"; +import { Input } from "./field"; import { MinusIcon, PlusIcon } from "./icons"; +import { Separator } from "./separator"; +import { composeTailwindRenderProps, inputField } from "./utils"; export interface NumberFieldProps extends RACNumberFieldProps {} diff --git a/ui/src/ui-library/pagination.tsx b/ui/src/ui-library/pagination.tsx index 17d87b5..7574cae 100644 --- a/ui/src/ui-library/pagination.tsx +++ b/ui/src/ui-library/pagination.tsx @@ -1,8 +1,8 @@ +import { LinkProps } from "react-aria-components"; import { twMerge } from "tailwind-merge"; import { Button } from "./button"; -import { Link } from "./link"; -import { LinkProps } from "react-aria-components"; import { ChevronLeftIcon, ChevronRightIcon } from "./icons"; +import { Link } from "./link"; export function Pagination({ className, diff --git a/ui/src/ui-library/password-input.tsx b/ui/src/ui-library/password-input.tsx index b5d37b7..d4f3c01 100644 --- a/ui/src/ui-library/password-input.tsx +++ b/ui/src/ui-library/password-input.tsx @@ -1,9 +1,9 @@ import React from "react"; -import { InputProps, Group } from "react-aria-components"; -import { Input } from "./field"; +import { Group, InputProps } from "react-aria-components"; import { ToggleButton } from "./button"; -import { composeTailwindRenderProps } from "./utils"; +import { Input } from "./field"; import { EyeIcon, EyeOffIcon } from "./icons"; +import { composeTailwindRenderProps } from "./utils"; export function PasswordInput({ className, ...props }: InputProps) { const [isPasswordVisible, setIsPasswordVisible] = React.useState(false); diff --git a/ui/src/ui-library/popover.tsx b/ui/src/ui-library/popover.tsx index 6d2172b..4c79669 100644 --- a/ui/src/ui-library/popover.tsx +++ b/ui/src/ui-library/popover.tsx @@ -1,10 +1,10 @@ +import React from "react"; import { + PopoverContext, Popover as RACPopover, PopoverProps as RACPopoverProps, useSlottedContext, - PopoverContext, } from "react-aria-components"; -import React from "react"; import { composeTailwindRenderProps } from "./utils"; export interface PopoverProps extends Omit { diff --git a/ui/src/ui-library/range-calendar.tsx b/ui/src/ui-library/range-calendar.tsx index 4caae24..9f2c484 100644 --- a/ui/src/ui-library/range-calendar.tsx +++ b/ui/src/ui-library/range-calendar.tsx @@ -1,16 +1,16 @@ +import { getLocalTimeZone, isToday } from "@internationalized/date"; import { - RangeCalendar as RACRangeCalendar, - RangeCalendarProps as RACRangeCalendarProps, CalendarCell, CalendarGrid, CalendarGridBody, - DateValue, - Text, composeRenderProps, + DateValue, + RangeCalendar as RACRangeCalendar, + RangeCalendarProps as RACRangeCalendarProps, + Text, } from "react-aria-components"; -import { CalendarGridHeader, CalendarHeader } from "./calendar"; import { twMerge } from "tailwind-merge"; -import { getLocalTimeZone, isToday } from "@internationalized/date"; +import { CalendarGridHeader, CalendarHeader } from "./calendar"; export interface RangeCalendarProps extends Omit, "visibleDuration"> { diff --git a/ui/src/ui-library/search-field.tsx b/ui/src/ui-library/search-field.tsx index faf9b8a..fe9e14e 100644 --- a/ui/src/ui-library/search-field.tsx +++ b/ui/src/ui-library/search-field.tsx @@ -1,13 +1,13 @@ import { - InputProps, Group, + InputProps, SearchField as RACSearchField, SearchFieldProps as RACSearchFieldProps, } from "react-aria-components"; -import { composeTailwindRenderProps, inputField } from "./utils"; import { Button } from "./button"; import { Input } from "./field"; import { SearchIcon, SpinnerIcon, XIcon } from "./icons"; +import { composeTailwindRenderProps, inputField } from "./utils"; export interface SearchFieldProps extends RACSearchFieldProps {} diff --git a/ui/src/ui-library/select.tsx b/ui/src/ui-library/select.tsx index b3e5cdd..42ffbdd 100644 --- a/ui/src/ui-library/select.tsx +++ b/ui/src/ui-library/select.tsx @@ -1,24 +1,24 @@ import React from "react"; import { + Button, + Collection, + composeRenderProps, + Header, + ListBoxItemProps, + ListBoxItem as RACListBoxItem, + ListBoxSection as RACListBoxSection, + ListBoxSectionProps as RACListBoxSectionProps, Select as RACSelect, SelectProps as RACSelectProps, - Header, - Button, - ListBoxItemProps, SelectValue, - composeRenderProps, - Collection, - ListBoxSectionProps as RACListBoxSectionProps, - ListBoxSection as RACListBoxSection, - ListBoxItem as RACListBoxItem, } from "react-aria-components"; -import { ListBoxProps, ListBox } from "./list-box"; -import { Popover, PopoverProps } from "./popover"; -import { composeTailwindRenderProps, inputField } from "./utils"; import { twMerge } from "tailwind-merge"; -import { Small } from "./text"; -import { CheckIcon, ChevronDownIcon } from "./icons"; import { Icon } from "./icon"; +import { CheckIcon, ChevronDownIcon } from "./icons"; +import { ListBox, ListBoxProps } from "./list-box"; +import { Popover, PopoverProps } from "./popover"; +import { Small } from "./text"; +import { composeTailwindRenderProps, inputField } from "./utils"; export function Select(props: RACSelectProps) { return ( diff --git a/ui/src/ui-library/separator.tsx b/ui/src/ui-library/separator.tsx index 35f4b95..a1e2e98 100644 --- a/ui/src/ui-library/separator.tsx +++ b/ui/src/ui-library/separator.tsx @@ -1,6 +1,6 @@ import { useSeparator } from "react-aria"; -import { twMerge } from "tailwind-merge"; import { SeparatorProps as RACSeparatorProps } from "react-aria-components"; +import { twMerge } from "tailwind-merge"; export type SeparatorProps = RACSeparatorProps & { children?: React.ReactNode; diff --git a/ui/src/ui-library/slider.tsx b/ui/src/ui-library/slider.tsx index 6bbe993..1feedbd 100644 --- a/ui/src/ui-library/slider.tsx +++ b/ui/src/ui-library/slider.tsx @@ -1,13 +1,13 @@ import { + composeRenderProps, Slider as RACSlider, SliderProps as RACSliderProps, - SliderThumb, SliderTrack as RACSliderTrack, SliderRenderProps, - composeRenderProps, + SliderThumb, } from "react-aria-components"; -import { composeTailwindRenderProps } from "./utils"; import { twMerge } from "tailwind-merge"; +import { composeTailwindRenderProps } from "./utils"; export { SliderOutput } from "react-aria-components"; diff --git a/ui/src/ui-library/switch.tsx b/ui/src/ui-library/switch.tsx index e787800..6ebb0fc 100644 --- a/ui/src/ui-library/switch.tsx +++ b/ui/src/ui-library/switch.tsx @@ -1,5 +1,4 @@ import React from "react"; -import { twMerge } from "tailwind-merge"; import { composeRenderProps, Group, @@ -8,8 +7,9 @@ import { SwitchProps as RACSwitchProps, SwitchRenderProps, } from "react-aria-components"; -import { groupBox, composeTailwindRenderProps } from "./utils"; -import { DescriptionProvider, DescriptionContext, LabeledGroup } from "./field"; +import { twMerge } from "tailwind-merge"; +import { DescriptionContext, DescriptionProvider, LabeledGroup } from "./field"; +import { composeTailwindRenderProps, groupBox } from "./utils"; export function SwitchGroup(props: GroupProps) { return ( diff --git a/ui/src/ui-library/table.tsx b/ui/src/ui-library/table.tsx index 41b6f43..5d78317 100644 --- a/ui/src/ui-library/table.tsx +++ b/ui/src/ui-library/table.tsx @@ -9,18 +9,18 @@ import { Collection, ColumnProps, ColumnResizer, + composeRenderProps, Group, ResizableTableContainer, RowProps, TableHeaderProps, TableProps, - composeRenderProps, useTableOptions, } from "react-aria-components"; import { twMerge } from "tailwind-merge"; import { Checkbox } from "./checkbox"; -import { composeTailwindRenderProps } from "./utils"; import { ChevronUpIcon } from "./icons"; +import { composeTailwindRenderProps } from "./utils"; export function Table(props: TableProps) { return ( diff --git a/ui/src/ui-library/tabs.tsx b/ui/src/ui-library/tabs.tsx index 365ca37..da5ef2d 100644 --- a/ui/src/ui-library/tabs.tsx +++ b/ui/src/ui-library/tabs.tsx @@ -1,14 +1,14 @@ import React from "react"; import { + composeRenderProps, Tab as RACTab, TabList as RACTabList, TabPanel as RACTabPanel, + TabsProps as RACTabProps, Tabs as RACTabs, TabListProps, TabPanelProps, TabProps, - TabsProps as RACTabProps, - composeRenderProps, TabRenderProps, } from "react-aria-components"; import { twMerge } from "tailwind-merge"; diff --git a/ui/src/ui-library/tag-group.tsx b/ui/src/ui-library/tag-group.tsx index 2c84d78..ba54dca 100644 --- a/ui/src/ui-library/tag-group.tsx +++ b/ui/src/ui-library/tag-group.tsx @@ -10,8 +10,8 @@ import { TagListProps, } from "react-aria-components"; import { twMerge } from "tailwind-merge"; -import { composeTailwindRenderProps } from "./utils"; import { XIcon } from "./icons"; +import { composeTailwindRenderProps } from "./utils"; const colors = { default: "[--tag:var(--color-accent)]", diff --git a/ui/src/ui-library/tag-input.tsx b/ui/src/ui-library/tag-input.tsx index 59ce790..d547874 100644 --- a/ui/src/ui-library/tag-input.tsx +++ b/ui/src/ui-library/tag-input.tsx @@ -1,9 +1,9 @@ import React from "react"; -import { LabelContext, TextFieldProps, type Key } from "react-aria-components"; -import { Tag, TagGroup, TagList } from "./tag-group"; +import { type Key, LabelContext, TextFieldProps } from "react-aria-components"; import { ListData } from "react-stately"; -import { Input, TextField } from "./field"; import { twMerge } from "tailwind-merge"; +import { Input, TextField } from "./field"; +import { Tag, TagGroup, TagList } from "./tag-group"; interface TagItem { id: number; diff --git a/ui/src/ui-library/text.tsx b/ui/src/ui-library/text.tsx index 565c323..8a84acf 100644 --- a/ui/src/ui-library/text.tsx +++ b/ui/src/ui-library/text.tsx @@ -1,7 +1,7 @@ -import { LinkProps, TextProps } from "react-aria-components"; -import { Link } from "./link"; -import { twMerge } from "tailwind-merge"; import React from "react"; +import { LinkProps, TextProps } from "react-aria-components"; +import { twMerge } from "tailwind-merge"; +import { Link } from "./link"; import { composeTailwindRenderProps } from "./utils"; export function Text({ className, elementType, children, ...props }: TextProps) { diff --git a/ui/src/ui-library/time-field.tsx b/ui/src/ui-library/time-field.tsx index eff936f..8133e8e 100644 --- a/ui/src/ui-library/time-field.tsx +++ b/ui/src/ui-library/time-field.tsx @@ -1,8 +1,8 @@ import { + composeRenderProps, TimeField as RACTimeField, TimeFieldProps as RACTimeFieldProps, TimeValue, - composeRenderProps, } from "react-aria-components"; import { twMerge } from "tailwind-merge"; import { inputField } from "./utils"; diff --git a/ui/src/ui-library/toast/toast-region.tsx b/ui/src/ui-library/toast/toast-region.tsx index 63280fb..2b3819b 100644 --- a/ui/src/ui-library/toast/toast-region.tsx +++ b/ui/src/ui-library/toast/toast-region.tsx @@ -1,16 +1,14 @@ -import React from "react"; -import { createPortal } from "react-dom"; -import { useToastQueue } from "@react-stately/toast"; -import type { AriaToastRegionProps, ToastAria } from "@react-aria/toast"; +import type { AriaToastProps, AriaToastRegionProps, ToastAria } from "@react-aria/toast"; +import { useToast, useToastRegion } from "@react-aria/toast"; import type { ToastState } from "@react-stately/toast"; -import { useToastRegion } from "@react-aria/toast"; -import type { AriaToastProps } from "@react-aria/toast"; -import { useToast } from "@react-aria/toast"; +import { useToastQueue } from "@react-stately/toast"; +import React from "react"; import { ButtonProps as AriaButtonProps, composeRenderProps } from "react-aria-components"; -import { Button, ButtonProps } from "../button"; +import { createPortal } from "react-dom"; import { twMerge } from "tailwind-merge"; -import { toast, ToastConfig } from "./toast-queue"; +import { Button, ButtonProps } from "../button"; import { CircleCheckIcon, CircleInfoIcon, CircleXIcon, OctagonAlertIcon, XIcon } from "../icons"; +import { ToastConfig, toast } from "./toast-queue"; interface ToastRegionProps extends AriaToastRegionProps { state: ToastState; diff --git a/ui/src/ui-library/tooltip.tsx b/ui/src/ui-library/tooltip.tsx index 376125f..9ce11b4 100644 --- a/ui/src/ui-library/tooltip.tsx +++ b/ui/src/ui-library/tooltip.tsx @@ -1,7 +1,7 @@ import React from "react"; +import { FocusableOptions, mergeProps, useFocusable } from "react-aria"; import { Tooltip as RACTooltip, TooltipProps as RACTooltipProps } from "react-aria-components"; import { composeTailwindRenderProps } from "./utils"; -import { FocusableOptions, mergeProps, useFocusable } from "react-aria"; export { TooltipTrigger } from "react-aria-components"; diff --git a/ui/src/utils/testHelpers.tsx b/ui/src/utils/testHelpers.tsx index eb77ae2..0c2aa8f 100644 --- a/ui/src/utils/testHelpers.tsx +++ b/ui/src/utils/testHelpers.tsx @@ -1,11 +1,11 @@ -import { render, RenderResult, waitFor } from "@testing-library/react"; -import { SessionTestProvider } from "@ui/contexts/SessionContext"; -import { BrowserRouter } from "react-router-dom"; -import { ThemeProvider } from "@ui/contexts/ThemeContext"; -import userEvent from "@testing-library/user-event"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import React from "react"; +import { RenderResult, render, waitFor } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { SessionTestProvider } from "@ui/contexts/SessionContext"; +import { ThemeProvider } from "@ui/contexts/ThemeContext"; import { TestUserStoreProvider } from "@ui/providers/UserStoreProvider"; +import React from "react"; +import { BrowserRouter } from "react-router-dom"; const defaultUser = { id: "123", diff --git a/ui/vite.config.ts b/ui/vite.config.ts index 706b47a..6eade10 100644 --- a/ui/vite.config.ts +++ b/ui/vite.config.ts @@ -1,10 +1,11 @@ /// -import { defineConfig, type PluginOption } from "vite"; -import react from "@vitejs/plugin-react"; -import tailwindcss from "@tailwindcss/vite"; -import { visualizer } from "rollup-plugin-visualizer"; -import tsconfigPaths from "vite-tsconfig-paths"; + import { cloudflare } from "@cloudflare/vite-plugin"; +import tailwindcss from "@tailwindcss/vite"; +import react from "@vitejs/plugin-react"; +import { visualizer } from "rollup-plugin-visualizer"; +import { defineConfig, type PluginOption } from "vite"; +import tsconfigPaths from "vite-tsconfig-paths"; // https://vitejs.dev/config/ export default defineConfig({ diff --git a/ui/worker/index.d.ts b/ui/worker/index.d.ts index 0ea1a9f..6245015 100644 --- a/ui/worker/index.d.ts +++ b/ui/worker/index.d.ts @@ -1,4 +1,4 @@ declare const _default: { - fetch(request: Request>): Response; + fetch(request: Request>): Response; }; export default _default;