数据库 Hooks

用于数据库操作的 React Hooks

useDatabaseInit

初始化数据库的 Hook。

import { useDatabaseInit } from '@linch-tech/desktop-core';

function App() {
  const { isReady, error } = useDatabaseInit();

  if (error) {
    return <div>数据库初始化失败: {error.message}</div>;
  }

  if (!isReady) {
    return <div>正在初始化数据库...</div>;
  }

  return <MainApp />;
}

返回值

interface UseDatabaseInit {
  isReady: boolean;   // 数据库是否就绪
  error: Error | null; // 初始化错误
}

参数

useDatabaseInit(options?: DatabaseInitOptions)

interface DatabaseInitOptions {
  name?: string;           // 数据库名(默认 'app.db')
  migrations?: Migration[]; // 迁移列表
}

通常不需要手动调用此 Hook。LinchDesktopProvider 会自动处理数据库初始化。

useSetting

读写单个设置的 Hook。

import { useSetting } from '@linch-tech/desktop-core';

function SettingsPage() {
  const { value, setValue, isLoading, error } = useSetting<string>('theme', {
    defaultValue: 'light',
  });

  if (isLoading) return <div>加载中...</div>;

  return (
    <select
      value={value ?? 'light'}
      onChange={(e) => setValue(e.target.value)}
    >
      <option value="light">浅色</option>
      <option value="dark">深色</option>
    </select>
  );
}

返回值

interface UseSettingReturn<T> {
  value: T | null;                    // 当前值
  setValue: (value: T) => Promise<void>; // 更新值
  isLoading: boolean;                 // 是否加载中
  error: Error | null;                // 错误信息
}

参数

useSetting<T>(key: string, options?: UseSettingOptions<T>)

interface UseSettingOptions<T> {
  defaultValue?: T;  // 默认值
}

示例

// 布尔值设置
const { value: notifications, setValue: setNotifications } = useSetting<boolean>(
  'notifications',
  { defaultValue: true }
);

// JSON 对象设置
interface UserPreferences {
  fontSize: number;
  sidebarOpen: boolean;
}

const { value: prefs, setValue: setPrefs } = useSetting<UserPreferences>(
  'preferences',
  { defaultValue: { fontSize: 14, sidebarOpen: true } }
);

useAppState

持久化 UI 状态的 Hook。

import { useAppState } from '@linch-tech/desktop-core';

function Sidebar() {
  const { state: isOpen, setState: setIsOpen, isLoading } = useAppState<boolean>(
    'sidebarOpen',
    true
  );

  if (isLoading) return null;

  return (
    <aside style={{ width: isOpen ? 200 : 50 }}>
      <button onClick={() => setIsOpen(!isOpen)}>
        {isOpen ? '收起' : '展开'}
      </button>
    </aside>
  );
}

返回值

interface UseAppStateReturn<T> {
  state: T | null;                     // 当前状态
  setState: (value: T) => Promise<void>; // 更新状态
  isLoading: boolean;                  // 是否加载中
}

参数

useAppState<T>(key: string, defaultValue?: T)

useSetting vs useAppState

特性useSettinguseAppState
用途用户偏好设置UI 状态持久化
存储表settingsapp_state
典型场景主题、语言、通知开关侧边栏展开、列表排序

存储格式

设置和状态以 JSON 格式存储在 SQLite 数据库中:

-- settings 表
INSERT INTO settings (key, value) VALUES ('theme', '"dark"');

-- app_state 表
INSERT INTO app_state (key, value) VALUES ('sidebarOpen', 'true');

注意事项

这些 Hooks 需要 features.databasetrue(默认启用)才能使用。

复杂对象会自动序列化/反序列化为 JSON。