useDatabaseuseCollectionsManagement.ts 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { useState, useEffect, useContext, useCallback } from 'react';
  2. import { DatabaseService } from '@/http';
  3. import { authContext } from '@/context';
  4. import type { DatabaseObject } from '@server/types';
  5. export const useDatabaseManagement = () => {
  6. const { authReq, isAuth, logout, setAuthReq } = useContext(authContext);
  7. const [databases, setDatabases] = useState<DatabaseObject[]>([]);
  8. const [loadingDatabases, setLoadingDatabases] = useState(true);
  9. const [database, setDatabase] = useState<string>(authReq.database);
  10. // API: fetch databases
  11. const fetchDatabases = useCallback(
  12. async (updateLoading?: boolean) => {
  13. try {
  14. updateLoading && setLoadingDatabases(true);
  15. const newDatabases = await DatabaseService.listDatabases();
  16. // if no database, logout
  17. if (newDatabases.length === 0) {
  18. logout();
  19. }
  20. setDatabases(newDatabases);
  21. return newDatabases;
  22. } finally {
  23. updateLoading && setLoadingDatabases(false);
  24. }
  25. },
  26. [logout]
  27. ); // Added logout dependency
  28. // API: create database
  29. const createDatabase = useCallback(
  30. async (params: { db_name: string }) => {
  31. const res = await DatabaseService.createDatabase(params);
  32. await fetchDatabases();
  33. return res;
  34. },
  35. [fetchDatabases]
  36. ); // Added fetchDatabases dependency
  37. // API: delete database
  38. const dropDatabase = useCallback(
  39. async (params: { db_name: string }) => {
  40. const res = await DatabaseService.dropDatabase(params);
  41. const newDatabases = await fetchDatabases();
  42. // Switch to the first available database after deletion
  43. if (newDatabases.length > 0) {
  44. setDatabase(newDatabases[0].name);
  45. } else {
  46. // Handle case where no databases are left (e.g., logout or show message)
  47. logout();
  48. }
  49. return res;
  50. },
  51. [fetchDatabases, logout]
  52. ); // Added fetchDatabases and logout dependencies
  53. // Effect to fetch initial databases when authenticated
  54. useEffect(() => {
  55. if (isAuth) {
  56. // Update database from auth context when auth state changes
  57. setDatabase(authReq.database);
  58. // Fetch databases immediately when authenticated
  59. fetchDatabases(true);
  60. } else {
  61. // Clear data when not authenticated
  62. setDatabases([]);
  63. setLoadingDatabases(true);
  64. }
  65. }, [isAuth, authReq.database, fetchDatabases]); // Added fetchDatabases dependency
  66. // Effect to update auth context when local database state changes
  67. useEffect(() => {
  68. // Only update if the database actually changed from the auth context one
  69. if (authReq.database !== database) {
  70. setAuthReq({ ...authReq, database });
  71. }
  72. }, [database, authReq, setAuthReq]);
  73. return {
  74. databases,
  75. loadingDatabases,
  76. database,
  77. setDatabase,
  78. fetchDatabases,
  79. createDatabase,
  80. dropDatabase,
  81. setDatabaseList: setDatabases, // Keep setDatabaseList for compatibility if needed, though setDatabases is standard
  82. };
  83. };