feat: check update
This commit is contained in:
		
							parent
							
								
									49da9100d2
								
							
						
					
					
						commit
						b7d64cba7b
					
				| @ -9,13 +9,17 @@ | ||||
|     "preview": "vite preview" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@radix-ui/react-alert-dialog": "^1.1.1", | ||||
|     "@radix-ui/react-checkbox": "^1.1.1", | ||||
|     "@radix-ui/react-slot": "^1.1.0", | ||||
|     "@radix-ui/react-toast": "^1.2.1", | ||||
|     "class-variance-authority": "^0.7.0", | ||||
|     "clsx": "^2.1.1", | ||||
|     "lucide-react": "^0.408.0", | ||||
|     "next-themes": "^0.3.0", | ||||
|     "react": "^18.2.0", | ||||
|     "react-dom": "^18.2.0", | ||||
|     "sonner": "^1.5.0", | ||||
|     "tailwind-merge": "^2.4.0", | ||||
|     "tailwindcss-animate": "^1.0.7" | ||||
|   }, | ||||
|  | ||||
							
								
								
									
										420
									
								
								frontend/pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										420
									
								
								frontend/pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							| @ -8,12 +8,18 @@ importers: | ||||
| 
 | ||||
|   .: | ||||
|     dependencies: | ||||
|       '@radix-ui/react-alert-dialog': | ||||
|         specifier: ^1.1.1 | ||||
|         version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       '@radix-ui/react-checkbox': | ||||
|         specifier: ^1.1.1 | ||||
|         version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       '@radix-ui/react-slot': | ||||
|         specifier: ^1.1.0 | ||||
|         version: 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       '@radix-ui/react-toast': | ||||
|         specifier: ^1.2.1 | ||||
|         version: 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       class-variance-authority: | ||||
|         specifier: ^0.7.0 | ||||
|         version: 0.7.0 | ||||
| @ -23,12 +29,18 @@ importers: | ||||
|       lucide-react: | ||||
|         specifier: ^0.408.0 | ||||
|         version: 0.408.0(react@18.3.1) | ||||
|       next-themes: | ||||
|         specifier: ^0.3.0 | ||||
|         version: 0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       react: | ||||
|         specifier: ^18.2.0 | ||||
|         version: 18.3.1 | ||||
|       react-dom: | ||||
|         specifier: ^18.2.0 | ||||
|         version: 18.3.1(react@18.3.1) | ||||
|       sonner: | ||||
|         specifier: ^1.5.0 | ||||
|         version: 1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       tailwind-merge: | ||||
|         specifier: ^2.4.0 | ||||
|         version: 2.4.0 | ||||
| @ -252,6 +264,19 @@ packages: | ||||
|   '@radix-ui/primitive@1.1.0': | ||||
|     resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} | ||||
| 
 | ||||
|   '@radix-ui/react-alert-dialog@1.1.1': | ||||
|     resolution: {integrity: sha512-wmCoJwj7byuVuiLKqDLlX7ClSUU0vd9sdCeM+2Ls+uf13+cpSJoMgwysHq1SGVVkJj5Xn0XWi1NoRCdkMpr6Mw==} | ||||
|     peerDependencies: | ||||
|       '@types/react': '*' | ||||
|       '@types/react-dom': '*' | ||||
|       react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|       react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|     peerDependenciesMeta: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
|       '@types/react-dom': | ||||
|         optional: true | ||||
| 
 | ||||
|   '@radix-ui/react-checkbox@1.1.1': | ||||
|     resolution: {integrity: sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==} | ||||
|     peerDependencies: | ||||
| @ -265,6 +290,19 @@ packages: | ||||
|       '@types/react-dom': | ||||
|         optional: true | ||||
| 
 | ||||
|   '@radix-ui/react-collection@1.1.0': | ||||
|     resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==} | ||||
|     peerDependencies: | ||||
|       '@types/react': '*' | ||||
|       '@types/react-dom': '*' | ||||
|       react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|       react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|     peerDependenciesMeta: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
|       '@types/react-dom': | ||||
|         optional: true | ||||
| 
 | ||||
|   '@radix-ui/react-compose-refs@1.1.0': | ||||
|     resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} | ||||
|     peerDependencies: | ||||
| @ -283,6 +321,76 @@ packages: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
| 
 | ||||
|   '@radix-ui/react-dialog@1.1.1': | ||||
|     resolution: {integrity: sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==} | ||||
|     peerDependencies: | ||||
|       '@types/react': '*' | ||||
|       '@types/react-dom': '*' | ||||
|       react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|       react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|     peerDependenciesMeta: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
|       '@types/react-dom': | ||||
|         optional: true | ||||
| 
 | ||||
|   '@radix-ui/react-dismissable-layer@1.1.0': | ||||
|     resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} | ||||
|     peerDependencies: | ||||
|       '@types/react': '*' | ||||
|       '@types/react-dom': '*' | ||||
|       react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|       react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|     peerDependenciesMeta: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
|       '@types/react-dom': | ||||
|         optional: true | ||||
| 
 | ||||
|   '@radix-ui/react-focus-guards@1.1.0': | ||||
|     resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} | ||||
|     peerDependencies: | ||||
|       '@types/react': '*' | ||||
|       react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|     peerDependenciesMeta: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
| 
 | ||||
|   '@radix-ui/react-focus-scope@1.1.0': | ||||
|     resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} | ||||
|     peerDependencies: | ||||
|       '@types/react': '*' | ||||
|       '@types/react-dom': '*' | ||||
|       react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|       react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|     peerDependenciesMeta: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
|       '@types/react-dom': | ||||
|         optional: true | ||||
| 
 | ||||
|   '@radix-ui/react-id@1.1.0': | ||||
|     resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} | ||||
|     peerDependencies: | ||||
|       '@types/react': '*' | ||||
|       react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|     peerDependenciesMeta: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
| 
 | ||||
|   '@radix-ui/react-portal@1.1.1': | ||||
|     resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} | ||||
|     peerDependencies: | ||||
|       '@types/react': '*' | ||||
|       '@types/react-dom': '*' | ||||
|       react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|       react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|     peerDependenciesMeta: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
|       '@types/react-dom': | ||||
|         optional: true | ||||
| 
 | ||||
|   '@radix-ui/react-presence@1.1.0': | ||||
|     resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} | ||||
|     peerDependencies: | ||||
| @ -318,6 +426,19 @@ packages: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
| 
 | ||||
|   '@radix-ui/react-toast@1.2.1': | ||||
|     resolution: {integrity: sha512-5trl7piMXcZiCq7MW6r8YYmu0bK5qDpTWz+FdEPdKyft2UixkspheYbjbrLXVN5NGKHFbOP7lm8eD0biiSqZqg==} | ||||
|     peerDependencies: | ||||
|       '@types/react': '*' | ||||
|       '@types/react-dom': '*' | ||||
|       react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|       react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|     peerDependenciesMeta: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
|       '@types/react-dom': | ||||
|         optional: true | ||||
| 
 | ||||
|   '@radix-ui/react-use-callback-ref@1.1.0': | ||||
|     resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} | ||||
|     peerDependencies: | ||||
| @ -336,6 +457,15 @@ packages: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
| 
 | ||||
|   '@radix-ui/react-use-escape-keydown@1.1.0': | ||||
|     resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} | ||||
|     peerDependencies: | ||||
|       '@types/react': '*' | ||||
|       react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|     peerDependenciesMeta: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
| 
 | ||||
|   '@radix-ui/react-use-layout-effect@1.1.0': | ||||
|     resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} | ||||
|     peerDependencies: | ||||
| @ -363,6 +493,19 @@ packages: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
| 
 | ||||
|   '@radix-ui/react-visually-hidden@1.1.0': | ||||
|     resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==} | ||||
|     peerDependencies: | ||||
|       '@types/react': '*' | ||||
|       '@types/react-dom': '*' | ||||
|       react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|       react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|     peerDependenciesMeta: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
|       '@types/react-dom': | ||||
|         optional: true | ||||
| 
 | ||||
|   '@types/node@20.14.10': | ||||
|     resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} | ||||
| 
 | ||||
| @ -411,6 +554,10 @@ packages: | ||||
|   arg@5.0.2: | ||||
|     resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} | ||||
| 
 | ||||
|   aria-hidden@1.2.4: | ||||
|     resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} | ||||
|     engines: {node: '>=10'} | ||||
| 
 | ||||
|   autoprefixer@10.4.19: | ||||
|     resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} | ||||
|     engines: {node: ^10 || ^12 || >=14} | ||||
| @ -504,6 +651,9 @@ packages: | ||||
|       supports-color: | ||||
|         optional: true | ||||
| 
 | ||||
|   detect-node-es@1.1.0: | ||||
|     resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} | ||||
| 
 | ||||
|   didyoumean@1.2.2: | ||||
|     resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} | ||||
| 
 | ||||
| @ -685,6 +835,10 @@ packages: | ||||
|     resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} | ||||
|     engines: {node: '>=6.9.0'} | ||||
| 
 | ||||
|   get-nonce@1.0.1: | ||||
|     resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} | ||||
|     engines: {node: '>=6'} | ||||
| 
 | ||||
|   glob-parent@5.1.2: | ||||
|     resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} | ||||
|     engines: {node: '>= 6'} | ||||
| @ -709,6 +863,9 @@ packages: | ||||
|     resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} | ||||
|     engines: {node: '>= 0.4'} | ||||
| 
 | ||||
|   invariant@2.2.4: | ||||
|     resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} | ||||
| 
 | ||||
|   is-binary-path@2.1.0: | ||||
|     resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} | ||||
|     engines: {node: '>=8'} | ||||
| @ -813,6 +970,12 @@ packages: | ||||
|     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} | ||||
|     hasBin: true | ||||
| 
 | ||||
|   next-themes@0.3.0: | ||||
|     resolution: {integrity: sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==} | ||||
|     peerDependencies: | ||||
|       react: ^16.8 || ^17 || ^18 | ||||
|       react-dom: ^16.8 || ^17 || ^18 | ||||
| 
 | ||||
|   node-releases@2.0.14: | ||||
|     resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} | ||||
| 
 | ||||
| @ -914,6 +1077,36 @@ packages: | ||||
|     resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} | ||||
|     engines: {node: '>=0.10.0'} | ||||
| 
 | ||||
|   react-remove-scroll-bar@2.3.6: | ||||
|     resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} | ||||
|     engines: {node: '>=10'} | ||||
|     peerDependencies: | ||||
|       '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 | ||||
|       react: ^16.8.0 || ^17.0.0 || ^18.0.0 | ||||
|     peerDependenciesMeta: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
| 
 | ||||
|   react-remove-scroll@2.5.7: | ||||
|     resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} | ||||
|     engines: {node: '>=10'} | ||||
|     peerDependencies: | ||||
|       '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 | ||||
|       react: ^16.8.0 || ^17.0.0 || ^18.0.0 | ||||
|     peerDependenciesMeta: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
| 
 | ||||
|   react-style-singleton@2.2.1: | ||||
|     resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} | ||||
|     engines: {node: '>=10'} | ||||
|     peerDependencies: | ||||
|       '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 | ||||
|       react: ^16.8.0 || ^17.0.0 || ^18.0.0 | ||||
|     peerDependenciesMeta: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
| 
 | ||||
|   react@18.3.1: | ||||
|     resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} | ||||
|     engines: {node: '>=0.10.0'} | ||||
| @ -960,6 +1153,12 @@ packages: | ||||
|     resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} | ||||
|     engines: {node: '>=14'} | ||||
| 
 | ||||
|   sonner@1.5.0: | ||||
|     resolution: {integrity: sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA==} | ||||
|     peerDependencies: | ||||
|       react: ^18.0.0 | ||||
|       react-dom: ^18.0.0 | ||||
| 
 | ||||
|   source-map-js@1.2.0: | ||||
|     resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} | ||||
|     engines: {node: '>=0.10.0'} | ||||
| @ -1028,6 +1227,9 @@ packages: | ||||
|   ts-interface-checker@0.1.13: | ||||
|     resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} | ||||
| 
 | ||||
|   tslib@2.6.3: | ||||
|     resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} | ||||
| 
 | ||||
|   typescript@4.9.5: | ||||
|     resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} | ||||
|     engines: {node: '>=4.2.0'} | ||||
| @ -1042,6 +1244,26 @@ packages: | ||||
|     peerDependencies: | ||||
|       browserslist: '>= 4.21.0' | ||||
| 
 | ||||
|   use-callback-ref@1.3.2: | ||||
|     resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} | ||||
|     engines: {node: '>=10'} | ||||
|     peerDependencies: | ||||
|       '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 | ||||
|       react: ^16.8.0 || ^17.0.0 || ^18.0.0 | ||||
|     peerDependenciesMeta: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
| 
 | ||||
|   use-sidecar@1.1.2: | ||||
|     resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} | ||||
|     engines: {node: '>=10'} | ||||
|     peerDependencies: | ||||
|       '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 | ||||
|       react: ^16.8.0 || ^17.0.0 || ^18.0.0 | ||||
|     peerDependenciesMeta: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
| 
 | ||||
|   util-deprecate@1.0.2: | ||||
|     resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} | ||||
| 
 | ||||
| @ -1321,6 +1543,20 @@ snapshots: | ||||
| 
 | ||||
|   '@radix-ui/primitive@1.1.0': {} | ||||
| 
 | ||||
|   '@radix-ui/react-alert-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': | ||||
|     dependencies: | ||||
|       '@radix-ui/primitive': 1.1.0 | ||||
|       '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       '@radix-ui/react-dialog': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       react: 18.3.1 | ||||
|       react-dom: 18.3.1(react@18.3.1) | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
|       '@types/react-dom': 18.3.0 | ||||
| 
 | ||||
|   '@radix-ui/react-checkbox@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': | ||||
|     dependencies: | ||||
|       '@radix-ui/primitive': 1.1.0 | ||||
| @ -1337,6 +1573,18 @@ snapshots: | ||||
|       '@types/react': 18.3.3 | ||||
|       '@types/react-dom': 18.3.0 | ||||
| 
 | ||||
|   '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': | ||||
|     dependencies: | ||||
|       '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       react: 18.3.1 | ||||
|       react-dom: 18.3.1(react@18.3.1) | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
|       '@types/react-dom': 18.3.0 | ||||
| 
 | ||||
|   '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.3)(react@18.3.1)': | ||||
|     dependencies: | ||||
|       react: 18.3.1 | ||||
| @ -1349,6 +1597,75 @@ snapshots: | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
| 
 | ||||
|   '@radix-ui/react-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': | ||||
|     dependencies: | ||||
|       '@radix-ui/primitive': 1.1.0 | ||||
|       '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       aria-hidden: 1.2.4 | ||||
|       react: 18.3.1 | ||||
|       react-dom: 18.3.1(react@18.3.1) | ||||
|       react-remove-scroll: 2.5.7(@types/react@18.3.3)(react@18.3.1) | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
|       '@types/react-dom': 18.3.0 | ||||
| 
 | ||||
|   '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': | ||||
|     dependencies: | ||||
|       '@radix-ui/primitive': 1.1.0 | ||||
|       '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       react: 18.3.1 | ||||
|       react-dom: 18.3.1(react@18.3.1) | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
|       '@types/react-dom': 18.3.0 | ||||
| 
 | ||||
|   '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.3)(react@18.3.1)': | ||||
|     dependencies: | ||||
|       react: 18.3.1 | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
| 
 | ||||
|   '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': | ||||
|     dependencies: | ||||
|       '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       react: 18.3.1 | ||||
|       react-dom: 18.3.1(react@18.3.1) | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
|       '@types/react-dom': 18.3.0 | ||||
| 
 | ||||
|   '@radix-ui/react-id@1.1.0(@types/react@18.3.3)(react@18.3.1)': | ||||
|     dependencies: | ||||
|       '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       react: 18.3.1 | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
| 
 | ||||
|   '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': | ||||
|     dependencies: | ||||
|       '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       react: 18.3.1 | ||||
|       react-dom: 18.3.1(react@18.3.1) | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
|       '@types/react-dom': 18.3.0 | ||||
| 
 | ||||
|   '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': | ||||
|     dependencies: | ||||
|       '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
| @ -1375,6 +1692,26 @@ snapshots: | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
| 
 | ||||
|   '@radix-ui/react-toast@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': | ||||
|     dependencies: | ||||
|       '@radix-ui/primitive': 1.1.0 | ||||
|       '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       react: 18.3.1 | ||||
|       react-dom: 18.3.1(react@18.3.1) | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
|       '@types/react-dom': 18.3.0 | ||||
| 
 | ||||
|   '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.3)(react@18.3.1)': | ||||
|     dependencies: | ||||
|       react: 18.3.1 | ||||
| @ -1388,6 +1725,13 @@ snapshots: | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
| 
 | ||||
|   '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.3)(react@18.3.1)': | ||||
|     dependencies: | ||||
|       '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) | ||||
|       react: 18.3.1 | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
| 
 | ||||
|   '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.3)(react@18.3.1)': | ||||
|     dependencies: | ||||
|       react: 18.3.1 | ||||
| @ -1407,6 +1751,15 @@ snapshots: | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
| 
 | ||||
|   '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': | ||||
|     dependencies: | ||||
|       '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) | ||||
|       react: 18.3.1 | ||||
|       react-dom: 18.3.1(react@18.3.1) | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
|       '@types/react-dom': 18.3.0 | ||||
| 
 | ||||
|   '@types/node@20.14.10': | ||||
|     dependencies: | ||||
|       undici-types: 5.26.5 | ||||
| @ -1458,6 +1811,10 @@ snapshots: | ||||
| 
 | ||||
|   arg@5.0.2: {} | ||||
| 
 | ||||
|   aria-hidden@1.2.4: | ||||
|     dependencies: | ||||
|       tslib: 2.6.3 | ||||
| 
 | ||||
|   autoprefixer@10.4.19(postcss@8.4.39): | ||||
|     dependencies: | ||||
|       browserslist: 4.23.2 | ||||
| @ -1547,6 +1904,8 @@ snapshots: | ||||
|     dependencies: | ||||
|       ms: 2.1.2 | ||||
| 
 | ||||
|   detect-node-es@1.1.0: {} | ||||
| 
 | ||||
|   didyoumean@1.2.2: {} | ||||
| 
 | ||||
|   dlv@1.1.3: {} | ||||
| @ -1678,6 +2037,8 @@ snapshots: | ||||
| 
 | ||||
|   gensync@1.0.0-beta.2: {} | ||||
| 
 | ||||
|   get-nonce@1.0.1: {} | ||||
| 
 | ||||
|   glob-parent@5.1.2: | ||||
|     dependencies: | ||||
|       is-glob: 4.0.3 | ||||
| @ -1703,6 +2064,10 @@ snapshots: | ||||
|     dependencies: | ||||
|       function-bind: 1.1.2 | ||||
| 
 | ||||
|   invariant@2.2.4: | ||||
|     dependencies: | ||||
|       loose-envify: 1.4.0 | ||||
| 
 | ||||
|   is-binary-path@2.1.0: | ||||
|     dependencies: | ||||
|       binary-extensions: 2.3.0 | ||||
| @ -1784,6 +2149,11 @@ snapshots: | ||||
| 
 | ||||
|   nanoid@3.3.7: {} | ||||
| 
 | ||||
|   next-themes@0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): | ||||
|     dependencies: | ||||
|       react: 18.3.1 | ||||
|       react-dom: 18.3.1(react@18.3.1) | ||||
| 
 | ||||
|   node-releases@2.0.14: {} | ||||
| 
 | ||||
|   normalize-path@3.0.0: {} | ||||
| @ -1860,6 +2230,34 @@ snapshots: | ||||
| 
 | ||||
|   react-refresh@0.14.2: {} | ||||
| 
 | ||||
|   react-remove-scroll-bar@2.3.6(@types/react@18.3.3)(react@18.3.1): | ||||
|     dependencies: | ||||
|       react: 18.3.1 | ||||
|       react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) | ||||
|       tslib: 2.6.3 | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
| 
 | ||||
|   react-remove-scroll@2.5.7(@types/react@18.3.3)(react@18.3.1): | ||||
|     dependencies: | ||||
|       react: 18.3.1 | ||||
|       react-remove-scroll-bar: 2.3.6(@types/react@18.3.3)(react@18.3.1) | ||||
|       react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) | ||||
|       tslib: 2.6.3 | ||||
|       use-callback-ref: 1.3.2(@types/react@18.3.3)(react@18.3.1) | ||||
|       use-sidecar: 1.1.2(@types/react@18.3.3)(react@18.3.1) | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
| 
 | ||||
|   react-style-singleton@2.2.1(@types/react@18.3.3)(react@18.3.1): | ||||
|     dependencies: | ||||
|       get-nonce: 1.0.1 | ||||
|       invariant: 2.2.4 | ||||
|       react: 18.3.1 | ||||
|       tslib: 2.6.3 | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
| 
 | ||||
|   react@18.3.1: | ||||
|     dependencies: | ||||
|       loose-envify: 1.4.0 | ||||
| @ -1902,6 +2300,11 @@ snapshots: | ||||
| 
 | ||||
|   signal-exit@4.1.0: {} | ||||
| 
 | ||||
|   sonner@1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): | ||||
|     dependencies: | ||||
|       react: 18.3.1 | ||||
|       react-dom: 18.3.1(react@18.3.1) | ||||
| 
 | ||||
|   source-map-js@1.2.0: {} | ||||
| 
 | ||||
|   sourcemap-codec@1.4.8: {} | ||||
| @ -1991,6 +2394,8 @@ snapshots: | ||||
| 
 | ||||
|   ts-interface-checker@0.1.13: {} | ||||
| 
 | ||||
|   tslib@2.6.3: {} | ||||
| 
 | ||||
|   typescript@4.9.5: {} | ||||
| 
 | ||||
|   undici-types@5.26.5: {} | ||||
| @ -2001,6 +2406,21 @@ snapshots: | ||||
|       escalade: 3.1.2 | ||||
|       picocolors: 1.0.1 | ||||
| 
 | ||||
|   use-callback-ref@1.3.2(@types/react@18.3.3)(react@18.3.1): | ||||
|     dependencies: | ||||
|       react: 18.3.1 | ||||
|       tslib: 2.6.3 | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
| 
 | ||||
|   use-sidecar@1.1.2(@types/react@18.3.3)(react@18.3.1): | ||||
|     dependencies: | ||||
|       detect-node-es: 1.1.0 | ||||
|       react: 18.3.1 | ||||
|       tslib: 2.6.3 | ||||
|     optionalDependencies: | ||||
|       '@types/react': 18.3.3 | ||||
| 
 | ||||
|   util-deprecate@1.0.2: {} | ||||
| 
 | ||||
|   vite@3.2.10(@types/node@20.14.10): | ||||
|  | ||||
| @ -1,9 +1,12 @@ | ||||
| import { ThemeProvider } from "@/components/theme-provider" | ||||
| import { Toaster } from "@/components/ui/sonner" | ||||
| 
 | ||||
| import Panel from "@/pages/Panel" | ||||
| 
 | ||||
| function App() { | ||||
|   return ( | ||||
|     <ThemeProvider defaultTheme="system" storageKey="vite-ui-theme"> | ||||
|       <Toaster /> | ||||
|       <Panel /> | ||||
|     </ThemeProvider> | ||||
|   ) | ||||
|  | ||||
							
								
								
									
										139
									
								
								frontend/src/components/ui/alert-dialog.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								frontend/src/components/ui/alert-dialog.tsx
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,139 @@ | ||||
| import * as React from "react" | ||||
| import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog" | ||||
| 
 | ||||
| import { cn } from "@/lib/utils" | ||||
| import { buttonVariants } from "@/components/ui/button" | ||||
| 
 | ||||
| const AlertDialog = AlertDialogPrimitive.Root | ||||
| 
 | ||||
| const AlertDialogTrigger = AlertDialogPrimitive.Trigger | ||||
| 
 | ||||
| const AlertDialogPortal = AlertDialogPrimitive.Portal | ||||
| 
 | ||||
| const AlertDialogOverlay = React.forwardRef< | ||||
|   React.ElementRef<typeof AlertDialogPrimitive.Overlay>, | ||||
|   React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay> | ||||
| >(({ className, ...props }, ref) => ( | ||||
|   <AlertDialogPrimitive.Overlay | ||||
|     className={cn( | ||||
|       "fixed inset-0 z-50 bg-black/80  data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", | ||||
|       className | ||||
|     )} | ||||
|     {...props} | ||||
|     ref={ref} | ||||
|   /> | ||||
| )) | ||||
| AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName | ||||
| 
 | ||||
| const AlertDialogContent = React.forwardRef< | ||||
|   React.ElementRef<typeof AlertDialogPrimitive.Content>, | ||||
|   React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content> | ||||
| >(({ className, ...props }, ref) => ( | ||||
|   <AlertDialogPortal> | ||||
|     <AlertDialogOverlay /> | ||||
|     <AlertDialogPrimitive.Content | ||||
|       ref={ref} | ||||
|       className={cn( | ||||
|         "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg", | ||||
|         className | ||||
|       )} | ||||
|       {...props} | ||||
|     /> | ||||
|   </AlertDialogPortal> | ||||
| )) | ||||
| AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName | ||||
| 
 | ||||
| const AlertDialogHeader = ({ | ||||
|   className, | ||||
|   ...props | ||||
| }: React.HTMLAttributes<HTMLDivElement>) => ( | ||||
|   <div | ||||
|     className={cn( | ||||
|       "flex flex-col space-y-2 text-center sm:text-left", | ||||
|       className | ||||
|     )} | ||||
|     {...props} | ||||
|   /> | ||||
| ) | ||||
| AlertDialogHeader.displayName = "AlertDialogHeader" | ||||
| 
 | ||||
| const AlertDialogFooter = ({ | ||||
|   className, | ||||
|   ...props | ||||
| }: React.HTMLAttributes<HTMLDivElement>) => ( | ||||
|   <div | ||||
|     className={cn( | ||||
|       "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", | ||||
|       className | ||||
|     )} | ||||
|     {...props} | ||||
|   /> | ||||
| ) | ||||
| AlertDialogFooter.displayName = "AlertDialogFooter" | ||||
| 
 | ||||
| const AlertDialogTitle = React.forwardRef< | ||||
|   React.ElementRef<typeof AlertDialogPrimitive.Title>, | ||||
|   React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title> | ||||
| >(({ className, ...props }, ref) => ( | ||||
|   <AlertDialogPrimitive.Title | ||||
|     ref={ref} | ||||
|     className={cn("text-lg font-semibold", className)} | ||||
|     {...props} | ||||
|   /> | ||||
| )) | ||||
| AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName | ||||
| 
 | ||||
| const AlertDialogDescription = React.forwardRef< | ||||
|   React.ElementRef<typeof AlertDialogPrimitive.Description>, | ||||
|   React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description> | ||||
| >(({ className, ...props }, ref) => ( | ||||
|   <AlertDialogPrimitive.Description | ||||
|     ref={ref} | ||||
|     className={cn("text-sm text-muted-foreground", className)} | ||||
|     {...props} | ||||
|   /> | ||||
| )) | ||||
| AlertDialogDescription.displayName = | ||||
|   AlertDialogPrimitive.Description.displayName | ||||
| 
 | ||||
| const AlertDialogAction = React.forwardRef< | ||||
|   React.ElementRef<typeof AlertDialogPrimitive.Action>, | ||||
|   React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action> | ||||
| >(({ className, ...props }, ref) => ( | ||||
|   <AlertDialogPrimitive.Action | ||||
|     ref={ref} | ||||
|     className={cn(buttonVariants(), className)} | ||||
|     {...props} | ||||
|   /> | ||||
| )) | ||||
| AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName | ||||
| 
 | ||||
| const AlertDialogCancel = React.forwardRef< | ||||
|   React.ElementRef<typeof AlertDialogPrimitive.Cancel>, | ||||
|   React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel> | ||||
| >(({ className, ...props }, ref) => ( | ||||
|   <AlertDialogPrimitive.Cancel | ||||
|     ref={ref} | ||||
|     className={cn( | ||||
|       buttonVariants({ variant: "outline" }), | ||||
|       "mt-2 sm:mt-0", | ||||
|       className | ||||
|     )} | ||||
|     {...props} | ||||
|   /> | ||||
| )) | ||||
| AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName | ||||
| 
 | ||||
| export { | ||||
|   AlertDialog, | ||||
|   AlertDialogPortal, | ||||
|   AlertDialogOverlay, | ||||
|   AlertDialogTrigger, | ||||
|   AlertDialogContent, | ||||
|   AlertDialogHeader, | ||||
|   AlertDialogFooter, | ||||
|   AlertDialogTitle, | ||||
|   AlertDialogDescription, | ||||
|   AlertDialogAction, | ||||
|   AlertDialogCancel, | ||||
| } | ||||
							
								
								
									
										29
									
								
								frontend/src/components/ui/sonner.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								frontend/src/components/ui/sonner.tsx
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| import { useTheme } from "next-themes" | ||||
| import { Toaster as Sonner } from "sonner" | ||||
| 
 | ||||
| type ToasterProps = React.ComponentProps<typeof Sonner> | ||||
| 
 | ||||
| const Toaster = ({ ...props }: ToasterProps) => { | ||||
|   const { theme = "system" } = useTheme() | ||||
| 
 | ||||
|   return ( | ||||
|     <Sonner | ||||
|       theme={theme as ToasterProps["theme"]} | ||||
|       className="toaster group" | ||||
|       toastOptions={{ | ||||
|         classNames: { | ||||
|           toast: | ||||
|             "group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg", | ||||
|           description: "group-[.toast]:text-muted-foreground", | ||||
|           actionButton: | ||||
|             "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground", | ||||
|           cancelButton: | ||||
|             "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground", | ||||
|         }, | ||||
|       }} | ||||
|       {...props} | ||||
|     /> | ||||
|   ) | ||||
| } | ||||
| 
 | ||||
| export { Toaster } | ||||
| @ -1,9 +1,13 @@ | ||||
| import React, { useEffect, useState } from 'react' | ||||
| 
 | ||||
| import { Button } from '@/components/ui/button' | ||||
| import { Input } from '@/components/ui/input' | ||||
| import { Checkbox } from '@/components/ui/checkbox' | ||||
| 
 | ||||
| import { toast } from 'sonner' | ||||
| 
 | ||||
| import { QueryMacAddressByPrefix, QueryVersion } from '../../wailsjs/go/service/SQLiteHelper' | ||||
| import { GetLatestVersion } from '../../wailsjs/go/service/UpdateService' | ||||
| 
 | ||||
| const Panel: React.FC = () => { | ||||
|   const [macAddress, setMacAddress] = useState('') | ||||
| @ -14,6 +18,8 @@ const Panel: React.FC = () => { | ||||
|   const [lastUpdate, setLastUpdate] = useState('') | ||||
|   const [databaseDate, setDatabaseDate] = useState('') | ||||
| 
 | ||||
|   const [checkDisabled, setCheckDisabled] = useState(false) | ||||
| 
 | ||||
|   useEffect(() => { | ||||
|     QueryVersion().then(res => { | ||||
|       setDatabaseDate(res) | ||||
| @ -49,7 +55,31 @@ const Panel: React.FC = () => { | ||||
|   } | ||||
| 
 | ||||
|   const handleCheck = () => { | ||||
|     console.log('check') | ||||
|     setCheckDisabled(true) | ||||
|     GetLatestVersion().then(res => { | ||||
|       if (res.Version === null) { | ||||
|         setCheckDisabled(false) | ||||
|         toast('Check update failed.', { | ||||
|           description: 'Please check your internet connection.', | ||||
|           action: { | ||||
|             label: 'Close', | ||||
|             onClick: () => {}, | ||||
|           }, | ||||
|         }) | ||||
|       } else { | ||||
|         setCheckDisabled(false) | ||||
|         if (res === databaseDate) { | ||||
|           toast('No new version available', { | ||||
|             description: '🎉 You are using the latest version.', | ||||
|             action: { | ||||
|               label: 'Close', | ||||
|               onClick: () => {}, | ||||
|             }, | ||||
|           }) | ||||
|         } else { | ||||
|         } | ||||
|       } | ||||
|     }) | ||||
|   } | ||||
| 
 | ||||
|   return ( | ||||
| @ -85,7 +115,11 @@ const Panel: React.FC = () => { | ||||
|       <div className="flex items-center"> | ||||
|         <label className="w-1/3 select-none">Database</label> | ||||
|         <Input className="w-5/12 p-1 border h-8" value={databaseDate} readOnly /> | ||||
|         <Button className="ml-2 p-1 h-8 w-1/4 select-none" onClick={handleCheck}> | ||||
|         <Button | ||||
|           className="ml-2 p-1 h-8 w-1/4 select-none" | ||||
|           onClick={handleCheck} | ||||
|           disabled={checkDisabled} | ||||
|         > | ||||
|           Check | ||||
|         </Button> | ||||
|       </div> | ||||
|  | ||||
| @ -7,3 +7,5 @@ export function Close():Promise<void>; | ||||
| export function QueryMacAddressByPrefix(arg1:string):Promise<service.MacAddress>; | ||||
| 
 | ||||
| export function QueryVersion():Promise<string>; | ||||
| 
 | ||||
| export function ReloadDatabase():Promise<boolean>; | ||||
|  | ||||
| @ -13,3 +13,7 @@ export function QueryMacAddressByPrefix(arg1) { | ||||
| export function QueryVersion() { | ||||
|   return window['go']['service']['SQLiteHelper']['QueryVersion'](); | ||||
| } | ||||
| 
 | ||||
| export function ReloadDatabase() { | ||||
|   return window['go']['service']['SQLiteHelper']['ReloadDatabase'](); | ||||
| } | ||||
|  | ||||
							
								
								
									
										4
									
								
								frontend/wailsjs/go/service/UpdateService.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								frontend/wailsjs/go/service/UpdateService.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
 | ||||
| // This file is automatically generated. DO NOT EDIT
 | ||||
| 
 | ||||
| export function GetLatestVersion():Promise<any>; | ||||
							
								
								
									
										7
									
								
								frontend/wailsjs/go/service/UpdateService.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								frontend/wailsjs/go/service/UpdateService.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| // @ts-check
 | ||||
| // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
 | ||||
| // This file is automatically generated. DO NOT EDIT
 | ||||
| 
 | ||||
| export function GetLatestVersion() { | ||||
|   return window['go']['service']['UpdateService']['GetLatestVersion'](); | ||||
| } | ||||
							
								
								
									
										8
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								main.go
									
									
									
									
									
								
							| @ -23,7 +23,10 @@ func main() { | ||||
| 	userHomeDir, _ := os.UserHomeDir() | ||||
| 	dbFileName := "mac_vendors.sqlite3" | ||||
| 	dbFilePath := filepath.Join(userHomeDir, dbFileDir, dbFileName) | ||||
| 	service := service.NewSQLiteHelper(dbFilePath) | ||||
| 	dbService := service.NewSQLiteHelper(dbFilePath) | ||||
| 
 | ||||
| 	// create update service | ||||
| 	updateService := service.NewUpdateService("https://tools.taurusxin.com/macfastlookup/latest_version.txt") | ||||
| 
 | ||||
| 	// Create application with options | ||||
| 	err := wails.Run(&options.App{ | ||||
| @ -37,7 +40,8 @@ func main() { | ||||
| 		OnStartup:        app.startup, | ||||
| 		Bind: []interface{}{ | ||||
| 			app, | ||||
| 			service, | ||||
| 			dbService, | ||||
| 			updateService, | ||||
| 		}, | ||||
| 	}) | ||||
| 
 | ||||
|  | ||||
| @ -39,6 +39,17 @@ func (helper *SQLiteHelper) Close() { | ||||
| 	helper.db.Close() | ||||
| } | ||||
| 
 | ||||
| func (helper *SQLiteHelper) ReloadDatabase() bool { | ||||
| 	helper.db.Close() | ||||
| 	db, err := sql.Open("sqlite3", helper.connectionString) | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err) | ||||
| 		return false | ||||
| 	} | ||||
| 	helper.db = db | ||||
| 	return true | ||||
| } | ||||
| 
 | ||||
| func (helper *SQLiteHelper) QueryMacAddressByPrefix(prefix string) (*MacAddress, error) { | ||||
| 	const tableName = "MacAddresses" | ||||
| 	query := fmt.Sprintf("SELECT * FROM %s WHERE Prefix = ?", tableName) | ||||
|  | ||||
							
								
								
									
										28
									
								
								service/update.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								service/update.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| package service | ||||
| 
 | ||||
| import ( | ||||
| 	"io" | ||||
| 	"net/http" | ||||
| ) | ||||
| 
 | ||||
| type UpdateService struct { | ||||
| 	Url string | ||||
| } | ||||
| 
 | ||||
| func NewUpdateService(url string) *UpdateService { | ||||
| 	return &UpdateService{Url: url} | ||||
| } | ||||
| 
 | ||||
| func (updater *UpdateService) GetLatestVersion() *string { | ||||
| 	res, err := http.Get(updater.Url) | ||||
| 	if err != nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	defer res.Body.Close() | ||||
| 	body, err := io.ReadAll(res.Body) | ||||
| 	if err != nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	str := string(body) | ||||
| 	return &str | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user