diff --git a/src/app/components/DeviceDetailOverlay.tsx b/src/app/components/DeviceDetailOverlay.tsx
index 2dfd3f4..52c1764 100644
--- a/src/app/components/DeviceDetailOverlay.tsx
+++ b/src/app/components/DeviceDetailOverlay.tsx
@@ -413,7 +413,9 @@ export default function DeviceDetailOverlay({
)}
- {deviceData.cache !== undefined && (
+ {(deviceData.cache !== undefined ||
+ (deviceData.base_url ?? '').includes('://') ||
+ (deviceData.url ?? '').includes('://')) && (
diff --git a/src/app/settings.ts b/src/app/settings.ts
index 6b402d5..3c7c73b 100644
--- a/src/app/settings.ts
+++ b/src/app/settings.ts
@@ -167,6 +167,8 @@ export async function readSettings(): Promise {
export interface SavedJson {
configJson: string;
devicesJson: string;
+ /** True if at least one file was actually written. */
+ wrote: boolean;
}
/** Serialize config into the two canonical JSON strings without writing anything. */
@@ -175,6 +177,7 @@ export function serializeConfig(config: SettingsConfig): SavedJson {
return {
configJson: JSON.stringify(mainConfig, null, 2) + '\n',
devicesJson: JSON.stringify({ devices }, null, 2) + '\n',
+ wrote: false,
};
}
@@ -195,7 +198,7 @@ export async function writeSettings(
const writeConfig = !lastSaved || next.configJson !== lastSaved.configJson;
const writeDevices = !lastSaved || next.devicesJson !== lastSaved.devicesJson;
- if (!writeConfig && !writeDevices) return next;
+ if (!writeConfig && !writeDevices) return { ...next, wrote: false };
try { await createFolder(SETTINGS_DIR, true); } catch { /* exists */ }
@@ -216,7 +219,7 @@ export async function writeSettings(
}
} catch { /* /sd unreachable — skip mirror */ }
- return next;
+ return { ...next, wrote: true };
}
export type SaveStatus =
@@ -327,12 +330,16 @@ export function useSettings(): UseSettingsResult {
setPendingCount(0);
setSaveStatus('saving');
try {
- lastSavedRef.current = await writeSettings(configRef.current, lastSavedRef.current);
- setSaveStatus('saved');
- // Drop the "saved" badge after a short delay so it doesn't linger.
- savedTimerRef.current = window.setTimeout(() => {
- setSaveStatus((s) => (s === 'saved' ? 'idle' : s));
- }, SAVED_INDICATOR_MS);
+ const result = await writeSettings(configRef.current, lastSavedRef.current);
+ lastSavedRef.current = result;
+ if (result.wrote) {
+ setSaveStatus('saved');
+ savedTimerRef.current = window.setTimeout(() => {
+ setSaveStatus((s) => (s === 'saved' ? 'idle' : s));
+ }, SAVED_INDICATOR_MS);
+ } else {
+ setSaveStatus('idle');
+ }
} catch (e) {
// Roll back: the change is still pending.
dirtyRef.current = true;