Move conffile_parser from services to utils

This commit is contained in:
2026-03-17 11:11:08 +01:00
parent a2b8e14cbc
commit 29762664d7
11 changed files with 226 additions and 62 deletions

View File

@@ -0,0 +1,86 @@
/**
* Hook for the initial BanGUI setup flow.
*
* Exposes the current setup completion status and a submission handler.
*/
import { useCallback, useEffect, useState } from "react";
import { ApiError } from "../api/client";
import { getSetupStatus, submitSetup } from "../api/setup";
import type {
SetupRequest,
SetupStatusResponse,
} from "../types/setup";
export interface UseSetupResult {
/** Known setup status, or null while loading. */
status: SetupStatusResponse | null;
/** Whether the initial status check is in progress. */
loading: boolean;
/** User-facing error message from the last status check. */
error: string | null;
/** Refresh the setup status from the backend. */
refresh: () => void;
/** Whether a submit request is currently in flight. */
submitting: boolean;
/** User-facing error message from the last submit attempt. */
submitError: string | null;
/** Submit the initial setup payload. */
submit: (payload: SetupRequest) => Promise<void>;
}
export function useSetup(): UseSetupResult {
const [status, setStatus] = useState<SetupStatusResponse | null>(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
const [submitting, setSubmitting] = useState(false);
const [submitError, setSubmitError] = useState<string | null>(null);
const refresh = useCallback(async (): Promise<void> => {
setLoading(true);
setError(null);
try {
const resp = await getSetupStatus();
setStatus(resp);
} catch (err: unknown) {
setError(err instanceof Error ? err.message : "Failed to fetch setup status");
} finally {
setLoading(false);
}
}, []);
useEffect(() => {
void refresh();
}, [refresh]);
const submit = useCallback(async (payload: SetupRequest): Promise<void> => {
setSubmitting(true);
setSubmitError(null);
try {
await submitSetup(payload);
} catch (err: unknown) {
if (err instanceof ApiError) {
setSubmitError(err.message);
} else if (err instanceof Error) {
setSubmitError(err.message);
} else {
setSubmitError("An unexpected error occurred.");
}
throw err;
} finally {
setSubmitting(false);
}
}, []);
return {
status,
loading,
error,
refresh,
submitting,
submitError,
submit,
};
}