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}

+ )} +
+ ); +} +