fix(config-profiles): show Git mount refresh progress
Disable duplicate refresh requests and show in-progress feedback while Git mount sources are refreshed.
This commit is contained in:
@@ -14,6 +14,7 @@ interface Props {
|
||||
saveStatus: "idle" | "saving" | "saved" | "error";
|
||||
previewData: ResolvedProfile | null;
|
||||
previewingId: string | null;
|
||||
isRefreshingGitMounts: boolean;
|
||||
projects: ProjectWithRepos[];
|
||||
toolTypes: ToolType[];
|
||||
availableProfiles: ConfigProfile[];
|
||||
@@ -55,6 +56,7 @@ export const ConfigProfileEditorPanel = ({
|
||||
saveStatus,
|
||||
previewData,
|
||||
previewingId,
|
||||
isRefreshingGitMounts,
|
||||
projects,
|
||||
toolTypes,
|
||||
availableProfiles,
|
||||
@@ -116,8 +118,16 @@ export const ConfigProfileEditorPanel = ({
|
||||
</div>
|
||||
{!isCreating && selectedProfile && (
|
||||
<div className="row row-sm">
|
||||
<button className="btn btn-secondary" onClick={onRefreshGitMounts}>
|
||||
<Icon name="refresh" size="sm" /> Refresh Git mounts
|
||||
<button className="btn btn-secondary" onClick={onRefreshGitMounts} disabled={isRefreshingGitMounts}>
|
||||
{isRefreshingGitMounts ? (
|
||||
<>
|
||||
<Icon name="loading" size="sm" /> Refreshing Git mounts...
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Icon name="refresh" size="sm" /> Refresh Git mounts
|
||||
</>
|
||||
)}
|
||||
</button>
|
||||
<button className="btn btn-secondary" onClick={onPreview} disabled={previewingId === selectedProfile.id}>
|
||||
{previewingId === selectedProfile.id ? (
|
||||
|
||||
@@ -28,6 +28,7 @@ interface Props {
|
||||
availableProfiles: ConfigProfile[];
|
||||
previewData: ResolvedProfile | null;
|
||||
previewingId: string | null;
|
||||
isRefreshingGitMounts: boolean;
|
||||
saveStatus: "idle" | "saving" | "saved" | "error";
|
||||
error: string | null;
|
||||
onViewChange: (view: MobileView) => void;
|
||||
@@ -80,6 +81,7 @@ export const ConfigProfilesMobileView = ({
|
||||
availableProfiles,
|
||||
previewData,
|
||||
previewingId,
|
||||
isRefreshingGitMounts,
|
||||
saveStatus,
|
||||
error,
|
||||
onViewChange,
|
||||
@@ -368,9 +370,19 @@ export const ConfigProfilesMobileView = ({
|
||||
<button
|
||||
type="button"
|
||||
className="secondary-button"
|
||||
disabled={isRefreshingGitMounts}
|
||||
onClick={() => onRefreshGitMounts(selectedProfile.id)}
|
||||
>
|
||||
<Icon name="refresh" size="sm" /> Refresh Git mounts
|
||||
{isRefreshingGitMounts ? (
|
||||
<>
|
||||
<Icon name="loading" size="sm" />
|
||||
Refreshing Git mounts...
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Icon name="refresh" size="sm" /> Refresh Git mounts
|
||||
</>
|
||||
)}
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
|
||||
@@ -43,6 +43,7 @@ export const useConfigProfiles = () => {
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
const [previewData, setPreviewData] = useState<ResolvedProfile | null>(null);
|
||||
const [previewingId, setPreviewingId] = useState<string | null>(null);
|
||||
const [isRefreshingGitMounts, setIsRefreshingGitMounts] = useState(false);
|
||||
const [formData, setFormData] =
|
||||
useState<CreateConfigProfileRequest>(defaultForm);
|
||||
const [includedProfileIds, setIncludedProfileIds] = useState<string[]>([]);
|
||||
@@ -275,7 +276,10 @@ export const useConfigProfiles = () => {
|
||||
};
|
||||
|
||||
const handleRefreshGitMounts = async (id: string): Promise<boolean> => {
|
||||
if (isRefreshingGitMounts) return false;
|
||||
|
||||
setError(null);
|
||||
setIsRefreshingGitMounts(true);
|
||||
try {
|
||||
const result = await refreshConfigProfileGitMounts(id);
|
||||
const refreshed = result.refresh_outcomes.filter(
|
||||
@@ -290,6 +294,8 @@ export const useConfigProfiles = () => {
|
||||
} catch (err) {
|
||||
setError(extractErrorMessage(err));
|
||||
return false;
|
||||
} finally {
|
||||
setIsRefreshingGitMounts(false);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -445,6 +451,7 @@ export const useConfigProfiles = () => {
|
||||
error,
|
||||
previewData,
|
||||
previewingId,
|
||||
isRefreshingGitMounts,
|
||||
formData,
|
||||
includedProfileIds,
|
||||
dragOverIndex,
|
||||
|
||||
@@ -23,6 +23,7 @@ export const ConfigProfilesPage = () => {
|
||||
error,
|
||||
previewData,
|
||||
previewingId,
|
||||
isRefreshingGitMounts,
|
||||
formData,
|
||||
includedProfileIds,
|
||||
dragOverIndex,
|
||||
@@ -111,6 +112,7 @@ export const ConfigProfilesPage = () => {
|
||||
availableProfiles={availableProfilesForInclude()}
|
||||
previewData={previewData}
|
||||
previewingId={previewingId}
|
||||
isRefreshingGitMounts={isRefreshingGitMounts}
|
||||
saveStatus={saveStatus}
|
||||
error={error}
|
||||
onViewChange={setMobileView}
|
||||
@@ -169,6 +171,7 @@ export const ConfigProfilesPage = () => {
|
||||
saveStatus={saveStatus}
|
||||
previewData={previewData}
|
||||
previewingId={previewingId}
|
||||
isRefreshingGitMounts={isRefreshingGitMounts}
|
||||
projects={projects}
|
||||
toolTypes={toolTypes}
|
||||
availableProfiles={availableProfilesForInclude()}
|
||||
@@ -178,7 +181,9 @@ export const ConfigProfilesPage = () => {
|
||||
onSubmit={handleSubmit}
|
||||
onReset={handleReset}
|
||||
onPreview={() => selectedProfile && handlePreview(selectedProfile.id)}
|
||||
onRefreshGitMounts={() => selectedProfile && handleRefreshGitMounts(selectedProfile.id)}
|
||||
onRefreshGitMounts={() =>
|
||||
selectedProfile && handleRefreshGitMounts(selectedProfile.id)
|
||||
}
|
||||
onAddInclude={addInclude}
|
||||
onRemoveInclude={removeInclude}
|
||||
onDragStart={handleDragStart}
|
||||
|
||||
Reference in New Issue
Block a user