summaryrefslogtreecommitdiff
path: root/src/hooks/useProfileManagement.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/hooks/useProfileManagement.ts')
-rw-r--r--src/hooks/useProfileManagement.ts190
1 files changed, 190 insertions, 0 deletions
diff --git a/src/hooks/useProfileManagement.ts b/src/hooks/useProfileManagement.ts
new file mode 100644
index 0000000..4b10f0e
--- /dev/null
+++ b/src/hooks/useProfileManagement.ts
@@ -0,0 +1,190 @@
+import { useState, useEffect, useCallback } from "react";
+import {
+ getProfiles,
+ createProfile,
+ deleteProfile,
+ renameProfile,
+ setCurrentProfile,
+ updateProfileConfig,
+ type ProfilesResult,
+ type ProfileResult,
+ type ConfigUpdateResult
+} from "../api/lsfgApi";
+import { ConfigurationData } from "../config/configSchema";
+import { showSuccessToast, showErrorToast } from "../utils/toastUtils";
+
+export function useProfileManagement() {
+ const [profiles, setProfiles] = useState<string[]>([]);
+ const [currentProfile, setCurrentProfileState] = useState<string>("decky-lsfg-vk");
+ const [isLoading, setIsLoading] = useState(false);
+
+ // Load profiles on hook initialization
+ const loadProfiles = useCallback(async () => {
+ try {
+ const result: ProfilesResult = await getProfiles();
+ if (result.success && result.profiles) {
+ setProfiles(result.profiles);
+ if (result.current_profile) {
+ setCurrentProfileState(result.current_profile);
+ }
+ return result;
+ } else {
+ console.error("Failed to load profiles:", result.error);
+ showErrorToast("Failed to load profiles", result.error || "Unknown error");
+ return result;
+ }
+ } catch (error) {
+ console.error("Error loading profiles:", error);
+ showErrorToast("Error loading profiles", String(error));
+ return { success: false, error: String(error) };
+ }
+ }, []);
+
+ // Create a new profile
+ const handleCreateProfile = useCallback(async (profileName: string, sourceProfile?: string) => {
+ setIsLoading(true);
+ try {
+ const result: ProfileResult = await createProfile(profileName, sourceProfile || currentProfile);
+ if (result.success) {
+ showSuccessToast("Profile created", `Created profile: ${profileName}`);
+ await loadProfiles();
+ return result;
+ } else {
+ console.error("Failed to create profile:", result.error);
+ showErrorToast("Failed to create profile", result.error || "Unknown error");
+ return result;
+ }
+ } catch (error) {
+ console.error("Error creating profile:", error);
+ showErrorToast("Error creating profile", String(error));
+ return { success: false, error: String(error) };
+ } finally {
+ setIsLoading(false);
+ }
+ }, [currentProfile, loadProfiles]);
+
+ // Delete a profile
+ const handleDeleteProfile = useCallback(async (profileName: string) => {
+ if (profileName === "decky-lsfg-vk") {
+ showErrorToast("Cannot delete default profile", "The default profile cannot be deleted");
+ return { success: false, error: "Cannot delete default profile" };
+ }
+
+ setIsLoading(true);
+ try {
+ const result: ProfileResult = await deleteProfile(profileName);
+ if (result.success) {
+ showSuccessToast("Profile deleted", `Deleted profile: ${profileName}`);
+ await loadProfiles();
+ // If we deleted the current profile, it should have switched to default
+ if (currentProfile === profileName) {
+ setCurrentProfileState("decky-lsfg-vk");
+ }
+ return result;
+ } else {
+ console.error("Failed to delete profile:", result.error);
+ showErrorToast("Failed to delete profile", result.error || "Unknown error");
+ return result;
+ }
+ } catch (error) {
+ console.error("Error deleting profile:", error);
+ showErrorToast("Error deleting profile", String(error));
+ return { success: false, error: String(error) };
+ } finally {
+ setIsLoading(false);
+ }
+ }, [currentProfile, loadProfiles]);
+
+ // Rename a profile
+ const handleRenameProfile = useCallback(async (oldName: string, newName: string) => {
+ if (oldName === "decky-lsfg-vk") {
+ showErrorToast("Cannot rename default profile", "The default profile cannot be renamed");
+ return { success: false, error: "Cannot rename default profile" };
+ }
+
+ setIsLoading(true);
+ try {
+ const result: ProfileResult = await renameProfile(oldName, newName);
+ if (result.success) {
+ showSuccessToast("Profile renamed", `Renamed profile to: ${newName}`);
+ await loadProfiles();
+ // Update current profile if it was renamed
+ if (currentProfile === oldName) {
+ setCurrentProfileState(newName);
+ }
+ return result;
+ } else {
+ console.error("Failed to rename profile:", result.error);
+ showErrorToast("Failed to rename profile", result.error || "Unknown error");
+ return result;
+ }
+ } catch (error) {
+ console.error("Error renaming profile:", error);
+ showErrorToast("Error renaming profile", String(error));
+ return { success: false, error: String(error) };
+ } finally {
+ setIsLoading(false);
+ }
+ }, [currentProfile, loadProfiles]);
+
+ // Set the current active profile
+ const handleSetCurrentProfile = useCallback(async (profileName: string) => {
+ setIsLoading(true);
+ try {
+ const result: ProfileResult = await setCurrentProfile(profileName);
+ if (result.success) {
+ setCurrentProfileState(profileName);
+ showSuccessToast("Profile switched", `Switched to profile: ${profileName}`);
+ return result;
+ } else {
+ console.error("Failed to switch profile:", result.error);
+ showErrorToast("Failed to switch profile", result.error || "Unknown error");
+ return result;
+ }
+ } catch (error) {
+ console.error("Error switching profile:", error);
+ showErrorToast("Error switching profile", String(error));
+ return { success: false, error: String(error) };
+ } finally {
+ setIsLoading(false);
+ }
+ }, []);
+
+ // Update configuration for a specific profile
+ const handleUpdateProfileConfig = useCallback(async (profileName: string, config: ConfigurationData) => {
+ setIsLoading(true);
+ try {
+ const result: ConfigUpdateResult = await updateProfileConfig(profileName, config);
+ if (result.success) {
+ return result;
+ } else {
+ console.error("Failed to update profile config:", result.error);
+ showErrorToast("Failed to update profile config", result.error || "Unknown error");
+ return result;
+ }
+ } catch (error) {
+ console.error("Error updating profile config:", error);
+ showErrorToast("Error updating profile config", String(error));
+ return { success: false, error: String(error) };
+ } finally {
+ setIsLoading(false);
+ }
+ }, [currentProfile]);
+
+ // Initialize profiles on mount
+ useEffect(() => {
+ loadProfiles();
+ }, [loadProfiles]);
+
+ return {
+ profiles,
+ currentProfile,
+ isLoading,
+ loadProfiles,
+ createProfile: handleCreateProfile,
+ deleteProfile: handleDeleteProfile,
+ renameProfile: handleRenameProfile,
+ setCurrentProfile: handleSetCurrentProfile,
+ updateProfileConfig: handleUpdateProfileConfig
+ };
+}