diff --git a/src/components/settings/AdvancedSettings.tsx b/src/components/settings/AdvancedSettings.tsx
index e482318..62eba94 100644
--- a/src/components/settings/AdvancedSettings.tsx
+++ b/src/components/settings/AdvancedSettings.tsx
@@ -1,11 +1,9 @@
import { useTranslate } from "@/hooks/useTranslate";
import { usePreferences } from "@/contexts/PreferencesContext";
-import { Label } from "@/components/ui/label";
-import { Input } from "@/components/ui/input";
import { useToast } from "@/components/ui/use-toast";
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
-import { Activity, ImageIcon, Shield, Info } from "lucide-react";
-import { Badge } from "@/components/ui/badge";
+import { Activity, Shield } from "lucide-react";
+import { SliderControl } from "@/components/ui/slider-control";
import logger from "@/lib/logger";
export function AdvancedSettings() {
@@ -87,84 +85,27 @@ export function AdvancedSettings() {
- {/* Concurrent Requests */}
-
-
-
-
-
-
- {preferences.komgaMaxConcurrentRequests}
-
-
-
- {t("settings.advanced.maxConcurrentRequests.description")}
-
-
-
-
- handleMaxConcurrentChange(parseInt(e.target.value))}
- className="flex-1 cursor-pointer"
- />
- handleMaxConcurrentChange(parseInt(e.target.value) || 1)}
- className="w-20"
- />
-
-
+
- {/* Reader Prefetch Count */}
-
-
-
-
-
-
-
- {preferences.readerPrefetchCount}
-
-
-
- {t("settings.advanced.prefetchCount.description")}
-
-
-
-
- handlePrefetchChange(parseInt(e.target.value))}
- className="flex-1 cursor-pointer"
- />
- handlePrefetchChange(parseInt(e.target.value) || 0)}
- className="w-20"
- />
-
-
+
@@ -180,145 +121,41 @@ export function AdvancedSettings() {
- {/* Threshold */}
-
-
-
-
-
-
- {preferences.circuitBreakerConfig.threshold}
-
-
-
- {t("settings.advanced.circuitBreaker.threshold.description")}
-
-
-
-
-
- handleCircuitBreakerChange("threshold", parseInt(e.target.value))
- }
- className="flex-1 cursor-pointer"
- />
-
- handleCircuitBreakerChange("threshold", parseInt(e.target.value) || 5)
- }
- className="w-20"
- />
-
-
+ handleCircuitBreakerChange("threshold", value)}
+ />
- {/* Timeout */}
-
-
-
-
-
-
- {(preferences.circuitBreakerConfig.timeout ?? 30000) / 1000}s
-
-
-
- {t("settings.advanced.circuitBreaker.timeout.description")}
-
-
-
-
-
- handleCircuitBreakerChange("timeout", parseInt(e.target.value))
- }
- className="flex-1 cursor-pointer"
- />
-
- handleCircuitBreakerChange("timeout", (parseInt(e.target.value) || 30) * 1000)
- }
- className="w-20"
- />
-
-
-
- {t("settings.advanced.circuitBreaker.timeout.unit")}
-
-
+ handleCircuitBreakerChange("timeout", value)}
+ formatValue={(value) => `${value / 1000}s`}
+ />
- {/* Reset Timeout */}
-
-
-
-
-
-
- {(preferences.circuitBreakerConfig.resetTimeout ?? 60000) / 1000}s
-
-
-
- {t("settings.advanced.circuitBreaker.resetTimeout.description")}
-
-
-
-
-
- handleCircuitBreakerChange("resetTimeout", parseInt(e.target.value))
- }
- className="flex-1 cursor-pointer"
- />
-
- handleCircuitBreakerChange("resetTimeout", (parseInt(e.target.value) || 60) * 1000)
- }
- className="w-20"
- />
-
-
-
- {t("settings.advanced.circuitBreaker.resetTimeout.unit")}
-
-
+ handleCircuitBreakerChange("resetTimeout", value)}
+ formatValue={(value) => `${value / 1000}s`}
+ />
diff --git a/src/components/settings/BackgroundSettings.tsx b/src/components/settings/BackgroundSettings.tsx
index 9ece3da..e5b1c45 100644
--- a/src/components/settings/BackgroundSettings.tsx
+++ b/src/components/settings/BackgroundSettings.tsx
@@ -10,10 +10,10 @@ import { Button } from "@/components/ui/button";
import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group";
import { GRADIENT_PRESETS } from "@/types/preferences";
import type { BackgroundType } from "@/types/preferences";
-import { Check, Minus, Plus } from "lucide-react";
+import { Check } from "lucide-react";
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
-import { Slider } from "@/components/ui/slider";
import { Checkbox } from "@/components/ui/checkbox";
+import { SliderControl } from "@/components/ui/slider-control";
import type { KomgaLibrary } from "@/types/komga";
import logger from "@/lib/logger";
@@ -147,25 +147,6 @@ export function BackgroundSettings() {
}
};
- const adjustOpacity = async (delta: number) => {
- try {
- const currentOpacity = preferences.background.opacity || 10;
- const newOpacity = Math.max(0, Math.min(100, currentOpacity + delta));
- await handleOpacityChange([newOpacity]);
- } catch (error) {
- logger.error({ err: error }, "Erreur ajustement opacité:");
- }
- };
-
- const adjustBlur = async (delta: number) => {
- try {
- const currentBlur = preferences.background.blur || 0;
- const newBlur = Math.max(0, Math.min(20, currentBlur + delta));
- await handleBlurChange([newBlur]);
- } catch (error) {
- logger.error({ err: error }, "Erreur ajustement flou:");
- }
- };
const handleLibraryToggle = async (libraryId: string) => {
const newSelection = selectedLibraries.includes(libraryId)
@@ -317,81 +298,27 @@ export function BackgroundSettings() {
preferences.background.type === "image" ||
preferences.background.type === "komga-random") && (
<>
-
-
-
- {preferences.background.opacity || 10}%
-
-
-
-
-
-
-
-
-
- Contrôle la transparence du contenu par rapport au background
-
-
+ handleOpacityChange([value])}
+ />
-
-
-
- {preferences.background.blur || 0}px
-
-
-
-
-
-
-
-
-
- Applique un effet de flou au background
-
-
+ handleBlurChange([value])}
+ />
>
)}
diff --git a/src/components/ui/slider-control.tsx b/src/components/ui/slider-control.tsx
new file mode 100644
index 0000000..29dd2fc
--- /dev/null
+++ b/src/components/ui/slider-control.tsx
@@ -0,0 +1,78 @@
+"use client";
+
+import { Label } from "@/components/ui/label";
+import { Button } from "@/components/ui/button";
+import { Slider } from "@/components/ui/slider";
+import { Minus, Plus } from "lucide-react";
+
+interface SliderControlProps {
+ label: string;
+ value: number;
+ min: number;
+ max: number;
+ step?: number;
+ unit?: string;
+ description?: string;
+ onChange: (value: number) => void;
+ formatValue?: (value: number) => string;
+}
+
+export function SliderControl({
+ label,
+ value,
+ min,
+ max,
+ step = 1,
+ unit = "",
+ description,
+ onChange,
+ formatValue,
+}: SliderControlProps) {
+ const adjust = (delta: number) => {
+ const newValue = Math.max(min, Math.min(max, value + delta));
+ onChange(newValue);
+ };
+
+ const displayValue = formatValue ? formatValue(value) : `${value}${unit}`;
+
+ return (
+
+
+
+ {displayValue}
+
+
+
+
onChange(values[0])}
+ min={min}
+ max={max}
+ step={step}
+ className="flex-1"
+ />
+
+
+ {description && (
+
{description}
+ )}
+
+ );
+}
+