diff --git a/src/components/auth/NostrExtensionCheck/NostrExtensionCheck.tsx b/src/components/auth/NostrExtensionCheck/NostrExtensionCheck.tsx index 417e9da4..881abd6d 100644 --- a/src/components/auth/NostrExtensionCheck/NostrExtensionCheck.tsx +++ b/src/components/auth/NostrExtensionCheck/NostrExtensionCheck.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useCallback } from 'react'; import { Alert, Card, Button, Space, Typography } from 'antd'; import { ExclamationCircleOutlined, CheckCircleOutlined, ReloadOutlined } from '@ant-design/icons'; import styled from 'styled-components'; @@ -109,7 +109,7 @@ export const NostrExtensionCheck: React.FC = ({ onExte const [hasExtension, setHasExtension] = useState(false); const [isChecking, setIsChecking] = useState(true); - const checkExtension = () => { + const checkExtension = useCallback(() => { setIsChecking(true); // Check if window.nostr exists @@ -120,7 +120,7 @@ export const NostrExtensionCheck: React.FC = ({ onExte if (extensionExists && onExtensionReady) { onExtensionReady(); } - }; + }, [onExtensionReady]); useEffect(() => { // Initial check @@ -135,7 +135,7 @@ export const NostrExtensionCheck: React.FC = ({ onExte }, 1000); return () => clearInterval(pollInterval); - }, [hasExtension, onExtensionReady]); + }, [hasExtension, checkExtension]); const extensions = [ { diff --git a/src/components/settings/panels/ImageModerationPanel.tsx b/src/components/settings/panels/ImageModerationPanel.tsx index 887c5dcd..29eda13e 100644 --- a/src/components/settings/panels/ImageModerationPanel.tsx +++ b/src/components/settings/panels/ImageModerationPanel.tsx @@ -113,7 +113,7 @@ const ImageModerationPanel: React.FC = () => { > - + @@ -128,9 +128,9 @@ const ImageModerationPanel: React.FC = () => { marginBottom: '16px' }}>

Moderation Mode Details:

-

Basic Mode: Only detects genitals, anus, and exposed breasts. Fastest processing (no Llama Vision used). Best for initial screening in high-volume applications.

-

Strict Mode: Includes all "basic" detection plus automatic blocking of all detected buttocks with confidence ≥ 0.4. Fast processing (no Llama Vision used). Best for zero-tolerance platforms.

-

Full Mode (Default): Complete analysis with nuanced context evaluation. Slower due to Llama Vision processing, but most accurate and reduces false positives.

+

Basic Mode: Only detects genitals, anus, and exposed breasts. Fastest processing (no AI vision analysis). Best for initial screening in high-volume applications.

+

Strict Mode: Includes all "basic" detection plus automatic blocking of all detected buttocks with confidence ≥ 0.4. Fast processing (no AI vision analysis). Best for zero-tolerance platforms.

+

Full Mode (Default): Complete analysis with nuanced context evaluation. Slower due to AI vision model processing, but most accurate and reduces false positives.

diff --git a/src/hooks/useGenericSettings.ts b/src/hooks/useGenericSettings.ts index 1900a339..46b86f74 100644 --- a/src/hooks/useGenericSettings.ts +++ b/src/hooks/useGenericSettings.ts @@ -49,12 +49,12 @@ const extractSettingsForGroup = (settings: any, groupName: string) => { // Map backend fields to prefixed ones that the form expects // Based on the actual backend response, backend sends both prefixed and unprefixed versions const imageModerationMappings: Record = { - 'image_moderation_api': ['image_moderation_api'], + 'image_moderation_api': ['image_moderation_api', 'api'], 'image_moderation_check_interval': ['image_moderation_check_interval_seconds', 'check_interval_seconds'], 'image_moderation_concurrency': ['image_moderation_concurrency', 'concurrency'], 'image_moderation_enabled': ['image_moderation_enabled', 'enabled'], 'image_moderation_mode': ['image_moderation_mode', 'mode'], - 'image_moderation_temp_dir': ['image_moderation_temp_dir'], + 'image_moderation_temp_dir': ['image_moderation_temp_dir', 'temp_dir'], 'image_moderation_threshold': ['image_moderation_threshold', 'threshold'], 'image_moderation_timeout': ['image_moderation_timeout_seconds', 'timeout_seconds'] }; @@ -535,7 +535,9 @@ const useGenericSettings = ( if (groupName === 'content_filter' && key === 'full_text_kinds') { prefixedSettings[key] = value; } else { - prefixedSettings[`${prefix}${key}`] = value; + // Skip prefixing if key already has the prefix to avoid double-prefixing + const prefixedKey = key.startsWith(prefix) ? key : `${prefix}${key}`; + prefixedSettings[prefixedKey] = value; } });