diff --git a/hotel-management/.husky/pre-commit b/hotel-management/.husky/pre-commit deleted file mode 100644 index 4e9fdf6..0000000 --- a/hotel-management/.husky/pre-commit +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" - -cd ./hotel-management && npx lint-staged diff --git a/hotel-management/package.json b/hotel-management/package.json index 2c613bd..7ce5172 100644 --- a/hotel-management/package.json +++ b/hotel-management/package.json @@ -7,27 +7,12 @@ "dev": "vite", "build": "tsc && vite build", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview", - "prepare": "cd .. && husky install hotel-management/.husky", - "format": "prettier --write \"src/**/*.{ts,tsx}\"" - }, - "husky": { - "hooks": { - "pre-commit": "lint-staged" - } - }, - "lint-staged": { - "*.tsx": [ - "pnpm run lint", - "pnpm run format" - ], - "*.ts": [ - "pnpm run lint", - "pnpm run format" - ] + "preview": "vite preview" }, "dependencies": { "@emotion/is-prop-valid": "^1.2.1", + "@supabase/supabase-js": "^2.38.4", + "@tanstack/react-query": "^5.8.4", "react": "^18.2.0", "react-dom": "^18.2.0", "react-hook-form": "^7.47.0", @@ -46,8 +31,6 @@ "eslint": "^8.51.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.3", - "husky": "^8.0.0", - "lint-staged": "^15.0.1", "typescript": "^5.0.2", "vite": "^4.4.5", "vite-tsconfig-paths": "^4.2.1" diff --git a/hotel-management/pnpm-lock.yaml b/hotel-management/pnpm-lock.yaml index 428134c..78ce6cc 100644 --- a/hotel-management/pnpm-lock.yaml +++ b/hotel-management/pnpm-lock.yaml @@ -8,6 +8,12 @@ dependencies: '@emotion/is-prop-valid': specifier: ^1.2.1 version: 1.2.1 + '@supabase/supabase-js': + specifier: ^2.38.4 + version: 2.38.4 + '@tanstack/react-query': + specifier: ^5.8.4 + version: 5.8.4(react-dom@18.2.0)(react@18.2.0) react: specifier: ^18.2.0 version: 18.2.0 @@ -58,12 +64,6 @@ devDependencies: eslint-plugin-react-refresh: specifier: ^0.4.3 version: 0.4.3(eslint@8.51.0) - husky: - specifier: ^8.0.0 - version: 8.0.3 - lint-staged: - specifier: ^15.0.1 - version: 15.0.1 typescript: specifier: ^5.0.2 version: 5.2.2 @@ -630,6 +630,82 @@ packages: engines: {node: '>=14.0.0'} dev: false + /@supabase/functions-js@2.1.5: + resolution: {integrity: sha512-BNzC5XhCzzCaggJ8s53DP+WeHHGT/NfTsx2wUSSGKR2/ikLFQTBCDzMvGz/PxYMqRko/LwncQtKXGOYp1PkPaw==} + dependencies: + '@supabase/node-fetch': 2.6.15 + dev: false + + /@supabase/gotrue-js@2.57.0: + resolution: {integrity: sha512-/CcAW40aPKgp9/w9WgXVUQFg1AOdvFR687ONOMjASPBuC6FsNbKlcXp4pc+rwKNtxyxDkBbR+x7zj/8g00r/Og==} + dependencies: + '@supabase/node-fetch': 2.6.15 + dev: false + + /@supabase/node-fetch@2.6.15: + resolution: {integrity: sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==} + engines: {node: 4.x || >=6.0.0} + dependencies: + whatwg-url: 5.0.0 + dev: false + + /@supabase/postgrest-js@1.8.5: + resolution: {integrity: sha512-XvoqN5e5Z4TsQOYWLQYLW0HIlZtFSzwAcwiuToaSBSTpLOGCg4NaZ7au5GfBzCQJZdZPY5vk5FvwthfDsQK/Jw==} + dependencies: + '@supabase/node-fetch': 2.6.15 + dev: false + + /@supabase/realtime-js@2.8.4: + resolution: {integrity: sha512-5C9slLTGikHnYmAnIBOaPogAgbcNY68vnIyE6GpqIKjHElVb6LIi4clwNcjHSj4z6szuvvzj8T/+ePEgGEGekw==} + dependencies: + '@supabase/node-fetch': 2.6.15 + '@types/phoenix': 1.6.4 + '@types/websocket': 1.0.9 + websocket: 1.0.34 + transitivePeerDependencies: + - supports-color + dev: false + + /@supabase/storage-js@2.5.4: + resolution: {integrity: sha512-yspHD19I9uQUgfTh0J94+/r/g6hnhdQmw6Y7OWqr/EbnL6uvicGV1i1UDkkmeUHqfF9Mbt2sLtuxRycYyKv2ew==} + dependencies: + '@supabase/node-fetch': 2.6.15 + dev: false + + /@supabase/supabase-js@2.38.4: + resolution: {integrity: sha512-bYwxm/GosvRqOMIv6YP7qUTZWi/trgHtDWUEZDEmyRHW24d0JYIb1GOt6RaO2hsWlecn88DAJIpjoNbprocgRA==} + dependencies: + '@supabase/functions-js': 2.1.5 + '@supabase/gotrue-js': 2.57.0 + '@supabase/node-fetch': 2.6.15 + '@supabase/postgrest-js': 1.8.5 + '@supabase/realtime-js': 2.8.4 + '@supabase/storage-js': 2.5.4 + transitivePeerDependencies: + - supports-color + dev: false + + /@tanstack/query-core@5.8.3: + resolution: {integrity: sha512-SWFMFtcHfttLYif6pevnnMYnBvxKf3C+MHMH7bevyYfpXpTMsLB9O6nNGBdWSoPwnZRXFNyNeVZOw25Wmdasow==} + dev: false + + /@tanstack/react-query@5.8.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-CD+AkXzg8J72JrE6ocmuBEJfGzEzu/bzkD6sFXFDDB5yji9N20JofXZlN6n0+CaPJuIi+e4YLCbGsyPFKkfNQA==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@tanstack/query-core': 5.8.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@types/babel__core@7.20.2: resolution: {integrity: sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==} dependencies: @@ -663,6 +739,16 @@ packages: resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} dev: true + /@types/node@20.9.1: + resolution: {integrity: sha512-HhmzZh5LSJNS5O8jQKpJ/3ZcrrlG6L70hpGqMIAoM9YVD0YBRNWYsfwcXq8VnSjlNpCpgLzMXdiPo+dxcvSmiA==} + dependencies: + undici-types: 5.26.5 + dev: false + + /@types/phoenix@1.6.4: + resolution: {integrity: sha512-B34A7uot1Cv0XtaHRYDATltAdKx0BvVKNgYNqE4WjtPUa4VQJM7kxeXcVKaH+KS+kCmZ+6w+QaUdcljiheiBJA==} + dev: false + /@types/prop-types@15.7.9: resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==} dev: true @@ -693,6 +779,12 @@ packages: resolution: {integrity: sha512-Rm17MsTpQQP5Jq4BF7CdrxJsDufoiL/q5IbJZYZmOZAJALyijgF7BzLgobXUqraNcQdqFYLYGeglDp6QzaxPpg==} dev: false + /@types/websocket@1.0.9: + resolution: {integrity: sha512-xrMBdqdKdlE+7L9Wg2PQblIkZGSgiMlEoP6UAaYKMHbbxqCJ6PV/pTZ2RcMcSSERurU2TtGbmO4lqpFOJd01ww==} + dependencies: + '@types/node': 20.9.1 + dev: false + /@typescript-eslint/eslint-plugin@6.7.5(@typescript-eslint/parser@6.7.5)(eslint@8.51.0)(typescript@5.2.2): resolution: {integrity: sha512-JhtAwTRhOUcP96D0Y6KYnwig/MRQbOoLGXTON2+LlyB/N35SP9j1boai2zzwXb7ypKELXMx3DVk9UTaEq1vHEw==} engines: {node: ^16.0.0 || >=18.0.0} @@ -872,23 +964,11 @@ packages: uri-js: 4.4.1 dev: true - /ansi-escapes@5.0.0: - resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} - engines: {node: '>=12'} - dependencies: - type-fest: 1.4.0 - dev: true - /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} dev: true - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true - /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -903,11 +983,6 @@ packages: color-convert: 2.0.1 dev: true - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true - /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true @@ -946,6 +1021,14 @@ packages: update-browserslist-db: 1.0.13(browserslist@4.22.1) dev: true + /bufferutil@4.0.8: + resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.6.1 + dev: false + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -976,26 +1059,6 @@ packages: supports-color: 7.2.0 dev: true - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - restore-cursor: 4.0.0 - dev: true - - /cli-truncate@3.1.0: - resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - slice-ansi: 5.0.0 - string-width: 5.1.2 - dev: true - /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -1017,15 +1080,6 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true - - /commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - dev: true - /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true @@ -1059,6 +1113,24 @@ packages: /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + dependencies: + es5-ext: 0.10.62 + type: 1.2.0 + dev: false + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -1089,17 +1161,34 @@ packages: esutils: 2.0.3 dev: true - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true - /electron-to-chromium@1.4.554: resolution: {integrity: sha512-Q0umzPJjfBrrj8unkONTgbKQXzXRrH7sVV7D9ea2yBV3Oaogz991yhbpfvo2LMNkJItmruXTEzVpP9cp7vaIiQ==} dev: true - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true + /es5-ext@0.10.62: + resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + dev: false + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-symbol: 3.1.3 + dev: false + + /es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.7.0 + dev: false /esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} @@ -1255,24 +1344,11 @@ packages: engines: {node: '>=0.10.0'} dev: true - /eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: true - - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.1.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - dev: true + type: 2.7.2 + dev: false /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1355,11 +1431,6 @@ packages: engines: {node: '>=6.9.0'} dev: true - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true - /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1435,17 +1506,6 @@ packages: engines: {node: '>=8'} dev: true - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true - - /husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} - hasBin: true - dev: true - /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} @@ -1480,11 +1540,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - dev: true - /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -1502,10 +1557,9 @@ packages: engines: {node: '>=8'} dev: true - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: false /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1559,42 +1613,6 @@ packages: type-check: 0.4.0 dev: true - /lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - dev: true - - /lint-staged@15.0.1: - resolution: {integrity: sha512-2IU5OWmCaxch0X0+IBF4/v7sutpB+F3qoXbro43pYjQTOo5wumckjxoxn47pQBqqBsCWrD5HnI2uG/zJA7isew==} - engines: {node: '>=18.12.0'} - hasBin: true - dependencies: - chalk: 5.3.0 - commander: 11.1.0 - debug: 4.3.4 - execa: 8.0.1 - lilconfig: 2.1.0 - listr2: 7.0.1 - micromatch: 4.0.5 - pidtree: 0.6.0 - string-argv: 0.3.2 - yaml: 2.3.2 - transitivePeerDependencies: - - supports-color - dev: true - - /listr2@7.0.1: - resolution: {integrity: sha512-nz+7hwgbDp8eWNoDgzdl4hA/xDSLrNRzPu1TLgOYs6l5Y+Ma6zVWWy9Oyt9TQFONwKoSPoka3H50D3vD5EuNwg==} - engines: {node: '>=16.0.0'} - dependencies: - cli-truncate: 3.1.0 - colorette: 2.0.20 - eventemitter3: 5.0.1 - log-update: 5.0.1 - rfdc: 1.3.0 - wrap-ansi: 8.1.0 - dev: true - /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -1610,17 +1628,6 @@ packages: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: true - /log-update@5.0.1: - resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - ansi-escapes: 5.0.0 - cli-cursor: 4.0.0 - slice-ansi: 5.0.0 - strip-ansi: 7.1.0 - wrap-ansi: 8.1.0 - dev: true - /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -1640,10 +1647,6 @@ packages: yallist: 4.0.0 dev: true - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1657,22 +1660,16 @@ packages: picomatch: 2.3.1 dev: true - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true - - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true - /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true @@ -1686,37 +1683,25 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: false + + /node-gyp-build@4.6.1: + resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==} + hasBin: true + dev: false + /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} dev: true - /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: 4.0.0 - dev: true - /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: true - - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 - dev: true - /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -1765,11 +1750,6 @@ packages: engines: {node: '>=8'} dev: true - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true - /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -1783,12 +1763,6 @@ packages: engines: {node: '>=8.6'} dev: true - /pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - dev: true - /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: false @@ -1895,23 +1869,11 @@ packages: engines: {node: '>=4'} dev: true - /restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: true - /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rfdc@1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} - dev: true - /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true @@ -1968,46 +1930,15 @@ packages: engines: {node: '>=8'} dev: true - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true - - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true - /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} dev: true - /slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 4.0.0 - dev: true - /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - dev: true - - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - dev: true - /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2015,18 +1946,6 @@ packages: ansi-regex: 5.0.1 dev: true - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - dev: true - - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true - /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -2086,6 +2005,10 @@ packages: is-number: 7.0.0 dev: true + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + /ts-api-utils@1.0.3(typescript@5.2.2): resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} engines: {node: '>=16.13.0'} @@ -2124,10 +2047,19 @@ packages: engines: {node: '>=10'} dev: true - /type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - dev: true + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: false + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: false + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: false /typescript@5.2.2: resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} @@ -2135,6 +2067,10 @@ packages: hasBin: true dev: true + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: false + /update-browserslist-db@1.0.13(browserslist@4.22.1): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -2152,6 +2088,14 @@ packages: punycode: 2.3.0 dev: true + /utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.6.1 + dev: false + /vite-tsconfig-paths@4.2.1(typescript@5.2.2)(vite@4.4.11): resolution: {integrity: sha512-GNUI6ZgPqT3oervkvzU+qtys83+75N/OuDaQl7HmOqFTb0pjZsuARrRipsyJhJ3enqV8beI1xhGbToR4o78nSQ==} peerDependencies: @@ -2204,6 +2148,31 @@ packages: fsevents: 2.3.3 dev: true + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /websocket@1.0.34: + resolution: {integrity: sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==} + engines: {node: '>=4.0.0'} + dependencies: + bufferutil: 4.0.8 + debug: 2.6.9 + es5-ext: 0.10.62 + typedarray-to-buffer: 3.1.5 + utf-8-validate: 5.0.10 + yaeti: 0.0.6 + transitivePeerDependencies: + - supports-color + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2212,19 +2181,15 @@ packages: isexe: 2.0.0 dev: true - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - dev: true - /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true + /yaeti@0.0.6: + resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} + engines: {node: '>=0.10.32'} + dev: false + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true @@ -2233,11 +2198,6 @@ packages: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yaml@2.3.2: - resolution: {integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==} - engines: {node: '>= 14'} - dev: true - /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} diff --git a/hotel-management/src/App.tsx b/hotel-management/src/App.tsx index eee378e..d0c2887 100644 --- a/hotel-management/src/App.tsx +++ b/hotel-management/src/App.tsx @@ -1,6 +1,7 @@ import { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom'; import isPropValid from '@emotion/is-prop-valid'; import { StyleSheetManager } from 'styled-components'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; // Components import AppLayout from './components/AppLayout'; @@ -13,9 +14,17 @@ import NotFound from './pages/NotFound'; import * as PATH from './constants/path'; import Toast from './components/Toast'; +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + staleTime: 60 * 1000, + } + } +}); + function App() { return ( - <> + @@ -31,7 +40,7 @@ function App() { - + ); } diff --git a/hotel-management/src/constants/commons.ts b/hotel-management/src/constants/commons.ts index eaaca99..70ce2e4 100644 --- a/hotel-management/src/constants/commons.ts +++ b/hotel-management/src/constants/commons.ts @@ -8,18 +8,10 @@ const USER_PAGE = { value: 'name', label: 'Sort by name', }, - { - value: 'identifiedCode', - label: 'Sort by identified code', - }, { value: 'phone', label: 'Sort by phone', }, - { - value: 'roomId', - label: 'Sort by room', - }, ], }; diff --git a/hotel-management/src/constants/path.ts b/hotel-management/src/constants/path.ts index 03014d3..7775173 100644 --- a/hotel-management/src/constants/path.ts +++ b/hotel-management/src/constants/path.ts @@ -2,6 +2,6 @@ export const DASHBOARD = '/dashboard'; export const USER = '/user'; export const ROOM = '/room'; export const OTHER_PATH = '*'; -export const BASE_URL = 'https://hotel-management-api.loiphan.com/'; +export const BASE_URL = 'http://localhost:3000/'; export const USER_PATH = 'users'; export const ROOM_PATH = 'rooms'; diff --git a/hotel-management/src/constants/supabaseConfig.ts b/hotel-management/src/constants/supabaseConfig.ts new file mode 100644 index 0000000..2a69e06 --- /dev/null +++ b/hotel-management/src/constants/supabaseConfig.ts @@ -0,0 +1,7 @@ +import { createClient } from '@supabase/supabase-js' +import { Database } from '@type/supabase'; +const supabaseUrl = 'https://pjqujsjzzdrlrgqbxepe.supabase.co' +const supabaseKey = import.meta.env.VITE_SUPABASE_KEY +const supabase = createClient(supabaseUrl, supabaseKey!) + +export default supabase; diff --git a/hotel-management/src/helpers/helper.ts b/hotel-management/src/helpers/helper.ts index f16cf6e..f08198d 100644 --- a/hotel-management/src/helpers/helper.ts +++ b/hotel-management/src/helpers/helper.ts @@ -1,47 +1,6 @@ // Constants import { REQUIRED_FIELD_ERROR } from '../constants/formValidateMessage'; -/** - * Create query url for search - * @param columnSearch Column want to search - * @param keySearch Keyword search - * @param sort Sort by - * @param order Order by - * @returns Return query url - */ -const searchQuery = ( - columnSearch: string, - keySearch: string, - sort: string, - order: string -) => { - const phoneParams = keySearch - ? `${columnSearch}_like=` + keySearch - : ''; - const sortParams = sort - ? '_sort=' + sort - : ''; - const orderParams = order - ? '_order=' + order - : ''; - const finalParam = [phoneParams, sortParams, orderParams]; - let query = ''; - let isFirstParam = true; - - finalParam.forEach((param) => { - if (param) { - if (isFirstParam) { - query = query.concat('', param); - isFirstParam = false; - } else { - query = query.concat('&', param); - } - } - }); - - return query; -}; - /** * Convert value to currency format with value * @param value Value need to be converted @@ -64,4 +23,4 @@ const errorMsg = (errorCode: number, msg: string) => { return `Error code: ${errorCode}. Message: ${msg}`; }; -export { errorMsg, searchQuery, formatCurrency, REQUIRED_FIELD_ERROR }; +export { errorMsg, formatCurrency, REQUIRED_FIELD_ERROR }; diff --git a/hotel-management/src/hooks/useFetch.ts b/hotel-management/src/hooks/useFetch.ts deleted file mode 100644 index 39b6b02..0000000 --- a/hotel-management/src/hooks/useFetch.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { useEffect, useState } from 'react'; - -// Constants -import { BASE_URL } from '@constant/path'; -import { DEFAULT_ORDER_BY, DEFAULT_SORT_BY } from '@constant/config'; - -// Helpers -import { searchQuery } from '@helper/helper'; - -// Types -import { Nullable } from '@type/common'; - -/** - * The function use to fetch data on server API. - * @param path The path of url - * @param columnSearch Column need to search - * @param keyWord The key word to search - * @param tempSortBy Sort by - * @param tempOrderBy Order by - * @param reload Fetch again - * @returns data: A data after fetch, isPending: A boolean indicating whether or not the progress of fetch data is done, errorMsg: A error message from the server. - */ -const useFetch = ( - path: string, - columnSearch: string = '', - keyWord: string = '', - tempSortBy?: string, - tempOrderBy?: string, - reload?: boolean -) => { - const [data, setData] = useState(null); - const [isPending, setIsPending] = useState(false); - const [errorFetchMsg, setErrorFetchMsg] = useState>(null); - - useEffect(() => { - // Clear data - setData(null); - - const fetchData = async () => { - setIsPending(true); - - // Set default value - const sortBy = tempSortBy - ? tempSortBy - : DEFAULT_SORT_BY; - const orderBy = tempOrderBy - ? tempOrderBy - : DEFAULT_ORDER_BY; - - // Query search - const query = searchQuery(columnSearch, keyWord, sortBy, orderBy); - - try { - const response = await fetch(BASE_URL + path + '?' + query); - const json = await response.json(); - - if (!response.ok) { - throw new Error( - `Error code: ${response.status} \n Messages: ${response.text}` - ); - } - - setIsPending(false); - setData(json); - setErrorFetchMsg(null); - } catch (error) { - setErrorFetchMsg(`Could not fetch data.\n ${error}`); - setIsPending(false); - } - }; - - fetchData(); - }, [path, reload, columnSearch, keyWord, tempOrderBy, tempSortBy]); - return { data, isPending, errorFetchMsg }; -}; - -export { useFetch }; diff --git a/hotel-management/src/pages/Room/RomTable.tsx b/hotel-management/src/pages/Room/RomTable.tsx index f6dd170..50fa356 100644 --- a/hotel-management/src/pages/Room/RomTable.tsx +++ b/hotel-management/src/pages/Room/RomTable.tsx @@ -14,7 +14,6 @@ import RoomRow from './RoomRow'; import { IRoom } from '@type/rooms'; // Constants -import { useFetch } from '@hook/useFetch'; import { ORDERBY_OPTIONS, ROOM_PAGE } from '@constant/commons'; // Styled @@ -39,28 +38,7 @@ const RoomTable = ({ reload, setReload }: IRoomTable) => { const orderByValue = searchParams.get('orderBy') ? searchParams.get('orderBy')! : ''; - - const { data, isPending, errorFetchMsg } = useFetch( - 'rooms', - 'name', - nameSearch, - sortByValue, - orderByValue, - reload - ); - - useEffect(() => { - if (data) { - setRooms(data); - } else { - setRooms([]); - } - - if (errorFetchMsg) { - console.error(errorFetchMsg); - } - }, [data, errorFetchMsg]); - + return ( <> diff --git a/hotel-management/src/pages/User/UserRow.tsx b/hotel-management/src/pages/User/UserRow.tsx index c21c3c5..a8e6536 100644 --- a/hotel-management/src/pages/User/UserRow.tsx +++ b/hotel-management/src/pages/User/UserRow.tsx @@ -1,21 +1,12 @@ -import toast from 'react-hot-toast'; import { Dispatch, SetStateAction } from 'react'; // Components import { RiEditBoxFill } from 'react-icons/ri'; -import { IoExit } from 'react-icons/io5'; import Modal from '@component/Modal'; import Table from '@component/Table'; import Menus from '@component/Menus'; import UserForm from './UserForm'; -// Constants -import { STATUS_CODE } from '@constant/responseStatus'; -import { CONFIRM_MESSAGE, DENIED_ACTION } from '@constant/messages'; - -// Services -import { updateRoomStatus } from '@service/roomServices'; -import { checkOutUser } from '@service/userServices'; // Types import { IUser } from '@type/users'; @@ -27,42 +18,13 @@ interface IUserRow { } const UserRow = ({ user, reload, setReload }: IUserRow) => { - const handleCheckOut = async (user: IUser) => { - if (user.roomId !== 0) { - if (confirm(CONFIRM_MESSAGE)) { - const resUpdateStatus = await updateRoomStatus(user.roomId, false); - const resCheckoutUser = await checkOutUser(user); - - if ( - resCheckoutUser?.statusCode === STATUS_CODE.OK && - resUpdateStatus?.statusCode === STATUS_CODE.OK - ) { - toast.success('Check out complete!'); - - // Reload table - setReload(!reload); - } - } - } else { - toast.error(DENIED_ACTION); - } - }; - - const { id, name, identifiedCode, phone, roomId } = user; + const { id, name, phone } = user; return (
{id}
{name}
-
{identifiedCode}
{phone}
-
- { - roomId - ? roomId - : 'None' - } -
@@ -77,12 +39,6 @@ const UserRow = ({ user, reload, setReload }: IUserRow) => { )} /> - } - onClick={() => handleCheckOut(user)} - > - Check out - diff --git a/hotel-management/src/pages/User/UserTable.tsx b/hotel-management/src/pages/User/UserTable.tsx index 645969e..b25d859 100644 --- a/hotel-management/src/pages/User/UserTable.tsx +++ b/hotel-management/src/pages/User/UserTable.tsx @@ -1,5 +1,5 @@ import { useSearchParams } from 'react-router-dom'; -import { Dispatch, SetStateAction, useEffect, useState } from 'react'; +import { Dispatch, SetStateAction, useCallback, useState } from 'react'; // Components import Menus from '@component/Menus'; @@ -13,9 +13,6 @@ import UserRow from './UserRow'; // Types import { IUser } from '@type/users'; -// Hooks -import { useFetch } from '@hook/useFetch'; - // Constants import { ORDERBY_OPTIONS, USER_PAGE } from '@constant/commons'; @@ -24,44 +21,52 @@ import Direction from '@commonStyle/Direction'; import { StyledOperationTable } from './styled'; import Spinner from '@commonStyle/Spinner'; +import { useQuery } from '@tanstack/react-query'; +import { getAllUsers } from '@service/userServices'; +import toast from 'react-hot-toast'; + interface IUserTable { reload: boolean; setReload: Dispatch>; } const UserTable = ({ reload, setReload }: IUserTable) => { - const columnName = ['Id', 'Name', 'Identified Code', 'Phone', 'Room Id']; - const [users, setUsers] = useState([]); + const columnName = ['Id', 'Name', 'Phone']; + const [phoneSearch, setPhoneSearch] = useState(''); const [searchParams] = useSearchParams(); const sortByValue = searchParams.get('sortBy') ? searchParams.get('sortBy')! - : ''; + : 'id'; const orderByValue = searchParams.get('orderBy') ? searchParams.get('orderBy')! - : ''; + : 'asc'; - const { data, isPending, errorFetchMsg } = useFetch( - 'users', - 'phone', - phoneSearch, - sortByValue, - orderByValue, - reload + const { + isLoading, + data: users, + error, + } = useQuery({ + queryKey: ['cabins', sortByValue, orderByValue, phoneSearch], + queryFn: () => getAllUsers(sortByValue, orderByValue, phoneSearch), + }); + + if(error) { + toast.error(error.message); + } + + const renderUserRow = useCallback( + (user: IUser) => ( + + ), + [reload, setReload] ); - useEffect(() => { - if (data) { - setUsers(data); - } else { - setUsers([]); - } - - if (errorFetchMsg) { - console.error(errorFetchMsg); - } - }, [data, errorFetchMsg, setUsers]); - return ( <> @@ -75,27 +80,17 @@ const UserTable = ({ reload, setReload }: IUserTable) => { /> - {isPending && } + {isLoading && } - {users.length ? ( + {users && users.length ? ( - +
- - data={users} - render={(user: IUser) => ( - - )} - /> + data={users} render={renderUserRow} />
) : ( - !isPending && No data to show here! + !isLoading && No data to show here! )}
diff --git a/hotel-management/src/services/userServices.ts b/hotel-management/src/services/userServices.ts index 94cc7b3..ab17094 100644 --- a/hotel-management/src/services/userServices.ts +++ b/hotel-management/src/services/userServices.ts @@ -12,6 +12,10 @@ import { IUser } from '@type/users'; // Helpers import { sendRequest } from '@helper/sendRequest'; import { errorMsg } from '@helper/helper'; +import supabase from '@constant/supabaseConfig'; + +const USERS_TABLE = 'users'; +const ERROR_FETCHING = "Users can't be loaded!"; /** * Create user to the server @@ -19,26 +23,26 @@ import { errorMsg } from '@helper/helper'; * @returns The IResponse object if success or null */ const createUser = async (user: IUser): Promise>> => { - try { - const response = await sendRequest( - USER_PATH, - 'POST', - JSON.stringify(user) - ); + // try { + // const response = await sendRequest( + // USER_PATH, + // 'POST', + // JSON.stringify(user) + // ); - if (response.statusCode !== STATUS_CODE.CREATE) { - throw new Error(errorMsg(response.statusCode, response.msg)); - } + // if (response.statusCode !== STATUS_CODE.CREATE) { + // throw new Error(errorMsg(response.statusCode, response.msg)); + // } - return response; - } catch (error: unknown) { - if (error instanceof Error) { - toast.error(error.message); - } - } + // return response; + // } catch (error: unknown) { + // if (error instanceof Error) { + // toast.error(error.message); + // } + // } return null; -} +}; /** * Update the user to the server @@ -46,23 +50,23 @@ const createUser = async (user: IUser): Promise>> => { * @returns The IResponse object if update success or null */ const updateUser = async (user: IUser): Promise>> => { - try { - const response = await sendRequest( - USER_PATH + '/' + user.id, - 'PUT', - JSON.stringify(user) - ); + // try { + // const response = await sendRequest( + // USER_PATH + '/' + user.id, + // 'PUT', + // JSON.stringify(user) + // ); - if (response.statusCode !== STATUS_CODE.OK) { - throw new Error(errorMsg(response.statusCode, response.msg)); - } + // if (response.statusCode !== STATUS_CODE.OK) { + // throw new Error(errorMsg(response.statusCode, response.msg)); + // } - return response; - } catch (error: unknown) { - if (error instanceof Error) { - toast.error(error.message); - } - } + // return response; + // } catch (error: unknown) { + // if (error instanceof Error) { + // toast.error(error.message); + // } + // } return null; }; @@ -72,17 +76,37 @@ const updateUser = async (user: IUser): Promise>> => { * @param user The user need to be checkout * @returns The IResponse object if checkout success or not */ -const checkOutUser = async (user: IUser): Promise>> => { - const tempUser = user; +const checkOutUser = async ( + user: IUser +): Promise>> => { + // const tempUser = user; - if (tempUser) { - tempUser.roomId = 0; - const resUpdateUser = await updateUser(tempUser); + // if (tempUser) { + // tempUser.roomId = 0; + // const resUpdateUser = await updateUser(tempUser); - return resUpdateUser; - } + // return resUpdateUser; + // } return null; }; -export { updateUser, checkOutUser, createUser }; +const getAllUsers = async ( + sortBy: string, + orderBy: string, + phoneSearch: string +): Promise => { + const { data, error } = await supabase + .from(USERS_TABLE) + .select('*') + .order(sortBy, { ascending: orderBy === 'asc' }) + .like('phone', `%${phoneSearch}%`); + + if (error) { + throw new Error(ERROR_FETCHING); + } + + return data; +}; + +export { updateUser, checkOutUser, createUser, getAllUsers }; diff --git a/hotel-management/src/types/supabase.ts b/hotel-management/src/types/supabase.ts new file mode 100644 index 0000000..b5203da --- /dev/null +++ b/hotel-management/src/types/supabase.ts @@ -0,0 +1,110 @@ +export type Json = + | string + | number + | boolean + | null + | { [key: string]: Json | undefined } + | Json[] + +export interface Database { + public: { + Tables: { + bookings: { + Row: { + amount: number + endDate: string + id: number + roomId: number + startDate: string + status: boolean + userId: number + } + Insert: { + amount: number + endDate: string + id?: number + roomId: number + startDate: string + status: boolean + userId: number + } + Update: { + amount?: number + endDate?: string + id?: number + roomId?: number + startDate?: string + status?: boolean + userId?: number + } + Relationships: [ + { + foreignKeyName: "bookings_roomId_fkey" + columns: ["roomId"] + isOneToOne: false + referencedRelation: "rooms" + referencedColumns: ["id"] + }, + { + foreignKeyName: "bookings_userId_fkey" + columns: ["userId"] + isOneToOne: false + referencedRelation: "users" + referencedColumns: ["id"] + } + ] + } + rooms: { + Row: { + id: number + name: string + price: number + status: boolean + } + Insert: { + id?: number + name: string + price: number + status: boolean + } + Update: { + id?: number + name?: string + price?: number + status?: boolean + } + Relationships: [] + } + users: { + Row: { + id: number + name: string + phone: string + } + Insert: { + id?: number + name: string + phone: string + } + Update: { + id?: number + name?: string + phone?: string + } + Relationships: [] + } + } + Views: { + [_ in never]: never + } + Functions: { + [_ in never]: never + } + Enums: { + [_ in never]: never + } + CompositeTypes: { + [_ in never]: never + } + } +} diff --git a/hotel-management/src/types/users.ts b/hotel-management/src/types/users.ts index 6d4a5b2..1725420 100644 --- a/hotel-management/src/types/users.ts +++ b/hotel-management/src/types/users.ts @@ -1,9 +1,7 @@ interface IUser { id: number; name: string; - identifiedCode: string; phone: string; - roomId: number; } export type { IUser };