12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- import { useState, useEffect, useContext, useCallback } from 'react';
- import { DatabaseService } from '@/http';
- import { authContext } from '@/context';
- import type { DatabaseObject } from '@server/types';
- export const useDatabaseManagement = () => {
- const { authReq, isAuth, logout, setAuthReq } = useContext(authContext);
- const [databases, setDatabases] = useState<DatabaseObject[]>([]);
- const [loadingDatabases, setLoadingDatabases] = useState(true);
- const [database, setDatabase] = useState<string>(authReq.database);
- // API: fetch databases
- const fetchDatabases = useCallback(
- async (updateLoading?: boolean) => {
- try {
- updateLoading && setLoadingDatabases(true);
- const newDatabases = await DatabaseService.listDatabases();
- // if no database, logout
- if (newDatabases.length === 0) {
- logout();
- }
- setDatabases(newDatabases);
- return newDatabases;
- } finally {
- updateLoading && setLoadingDatabases(false);
- }
- },
- [logout]
- ); // Added logout dependency
- // API: create database
- const createDatabase = useCallback(
- async (params: { db_name: string }) => {
- const res = await DatabaseService.createDatabase(params);
- await fetchDatabases();
- return res;
- },
- [fetchDatabases]
- ); // Added fetchDatabases dependency
- // API: delete database
- const dropDatabase = useCallback(
- async (params: { db_name: string }) => {
- const res = await DatabaseService.dropDatabase(params);
- const newDatabases = await fetchDatabases();
- // Switch to the first available database after deletion
- if (newDatabases.length > 0) {
- setDatabase(newDatabases[0].name);
- } else {
- // Handle case where no databases are left (e.g., logout or show message)
- logout();
- }
- return res;
- },
- [fetchDatabases, logout]
- ); // Added fetchDatabases and logout dependencies
- // Effect to fetch initial databases when authenticated
- useEffect(() => {
- if (isAuth) {
- // Update database from auth context when auth state changes
- setDatabase(authReq.database);
- // Fetch databases immediately when authenticated
- fetchDatabases(true);
- } else {
- // Clear data when not authenticated
- setDatabases([]);
- setLoadingDatabases(true);
- }
- }, [isAuth, authReq.database, fetchDatabases]); // Added fetchDatabases dependency
- // Effect to update auth context when local database state changes
- useEffect(() => {
- // Only update if the database actually changed from the auth context one
- if (authReq.database !== database) {
- setAuthReq({ ...authReq, database });
- }
- }, [database, authReq, setAuthReq]);
- return {
- databases,
- loadingDatabases,
- database,
- setDatabase,
- fetchDatabases,
- createDatabase,
- dropDatabase,
- setDatabaseList: setDatabases, // Keep setDatabaseList for compatibility if needed, though setDatabases is standard
- };
- };
|