repo_description: A cross-platform desktop All-in-One assistant tool for Claude Code, Codex, OpenCode, openclaw & Gemini CLI.
repo_topics: ai-tools claude-code codex desktop-app mcp minimax omo open-source openclaw openclaw-ui opencode provider-management rust skills skills-management tauri typescript wsl-support
code: import { useCallback, useEffect, useState } from "react";
  import { settingsApi } from "@/lib/api";
  
  export interface UseSettingsMetadataResult {
    isPortable: boolean;
    requiresRestart: boolean;
    isLoading: boolean;
    acknowledgeRestart: () => void;
    setRequiresRestart: (value: boolean) => void;
  }
  
  /**
   * useSettingsMetadata - 元数据管理
   * 负责：
   * - isPortable（便携模式）
   * - requiresRestart（需要重启标志）
   */
  export function useSettingsMetadata(): UseSettingsMetadataResult {
    const [isPortable, setIsPortable] = useState(false);
    const [requiresRestart, setRequiresRestart] = useState(false);
    const [isLoading, setIsLoading] = useState(true);
  
    // 加载元数据
    useEffect(() => {
      let active = true;
      setIsLoading(true);
  
      const load = async () => {
        try {
          const portable = await settingsApi.isPortable();
  
          if (!active) return;
  
          setIsPortable(portable);
        } catch (error) {
          console.error("[useSettingsMetadata] Failed to load metadata", error);
        } finally {
          if (active) {
            setIsLoading(false);
          }
        }
      };
  
      void load();
      return () => {
        active = false;
      };
    }, []);
  
    const acknowledgeRestart = useCallback(() => {
      setRequiresRestart(false);
    }, []);
  
    return {
      isPortable,
      requiresRestart,
      isLoading,
      acknowledgeRestart,
      setRequiresRestart,
    };
  }
  