Skip to content

Commit 137d5bf

Browse files
committed
Fix settings display issues by adding property name transformation layer. This resolves the issue where image moderation and other settings values weren't displaying properly in the advanced settings panels.
1 parent 0ab5867 commit 137d5bf

9 files changed

Lines changed: 271 additions & 22 deletions

src/components/settings/ContentFilterSettings.tsx

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,30 @@ const ContentFilterSettings: React.FC = () => {
2222
// Update form values when settings change
2323
useEffect(() => {
2424
if (settings) {
25-
form.setFieldsValue(settings);
25+
console.log('ContentFilterSettings - Received settings:', settings);
26+
27+
// Transform property names to match form field names
28+
// The API returns properties without the prefix, but the form expects prefixed names
29+
const settingsObj = settings as Record<string, any>;
30+
31+
const formValues = {
32+
content_filter_enabled: settingsObj.enabled,
33+
content_filter_cache_size: typeof settingsObj.cache_size === 'string'
34+
? parseInt(settingsObj.cache_size)
35+
: settingsObj.cache_size,
36+
content_filter_cache_ttl: typeof settingsObj.cache_ttl === 'string'
37+
? parseInt(settingsObj.cache_ttl)
38+
: settingsObj.cache_ttl,
39+
full_text_kinds: settingsObj.full_text_kinds || []
40+
};
41+
42+
console.log('ContentFilterSettings - Transformed form values:', formValues);
43+
44+
// Set form values with a slight delay to ensure the form is ready
45+
setTimeout(() => {
46+
form.setFieldsValue(formValues);
47+
console.log('ContentFilterSettings - Form values after set:', form.getFieldsValue());
48+
}, 100);
2649
}
2750
}, [settings, form]);
2851

@@ -53,6 +76,7 @@ const ContentFilterSettings: React.FC = () => {
5376
layout="vertical"
5477
onValuesChange={handleValuesChange}
5578
initialValues={settings || {}}
79+
onFinish={(values) => console.log('Form submitted with values:', values)}
5680
>
5781
<Form.Item
5882
name="content_filter_enabled"

src/components/settings/ImageModerationSettings.tsx

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,38 @@ const ImageModerationSettings: React.FC = () => {
2222
// Update form values when settings change
2323
useEffect(() => {
2424
if (settings) {
25-
form.setFieldsValue(settings);
25+
console.log('ImageModerationSettings - Received settings:', settings);
26+
27+
// Transform property names to match form field names
28+
// The API returns properties without the prefix, but the form expects prefixed names
29+
const settingsObj = settings as Record<string, any>;
30+
31+
const formValues = {
32+
image_moderation_api: settingsObj.api,
33+
image_moderation_check_interval: typeof settingsObj.check_interval === 'string'
34+
? parseFloat(settingsObj.check_interval)
35+
: settingsObj.check_interval,
36+
image_moderation_concurrency: typeof settingsObj.concurrency === 'string'
37+
? parseFloat(settingsObj.concurrency)
38+
: settingsObj.concurrency,
39+
image_moderation_enabled: settingsObj.enabled,
40+
image_moderation_mode: settingsObj.mode,
41+
image_moderation_temp_dir: settingsObj.temp_dir,
42+
image_moderation_threshold: typeof settingsObj.threshold === 'string'
43+
? parseFloat(settingsObj.threshold)
44+
: settingsObj.threshold,
45+
image_moderation_timeout: typeof settingsObj.timeout === 'string'
46+
? parseFloat(settingsObj.timeout)
47+
: settingsObj.timeout
48+
};
49+
50+
console.log('ImageModerationSettings - Transformed form values:', formValues);
51+
52+
// Set form values with a slight delay to ensure the form is ready
53+
setTimeout(() => {
54+
form.setFieldsValue(formValues);
55+
console.log('ImageModerationSettings - Form values after set:', form.getFieldsValue());
56+
}, 100);
2657
}
2758
}, [settings, form]);
2859

@@ -44,6 +75,7 @@ const ImageModerationSettings: React.FC = () => {
4475
layout="vertical"
4576
onValuesChange={handleValuesChange}
4677
initialValues={settings || {}}
78+
onFinish={(values) => console.log('Form submitted with values:', values)}
4779
>
4880
<Form.Item
4981
name="image_moderation_enabled"
@@ -65,9 +97,11 @@ const ImageModerationSettings: React.FC = () => {
6597
}
6698
>
6799
<Select>
68-
<Option value="full">Full</Option>
69-
<Option value="basic">Basic</Option>
70-
<Option value="minimal">Minimal</Option>
100+
<Option value="full">Full (Check all images)</Option>
101+
<Option value="basic">Basic (Limited checks)</Option>
102+
<Option value="minimal">Minimal (Essential checks only)</Option>
103+
<Option value="sample">Sample (Check random images)</Option>
104+
<Option value="flagged">Flagged Only (Check only reported images)</Option>
71105
</Select>
72106
</Form.Item>
73107

src/components/settings/NestFeederSettings.tsx

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,33 @@ const NestFeederSettings: React.FC = () => {
2020
// Update form values when settings change
2121
useEffect(() => {
2222
if (settings) {
23-
form.setFieldsValue(settings);
23+
console.log('NestFeederSettings - Received settings:', settings);
24+
25+
// Transform property names to match form field names
26+
// The API returns properties without the prefix, but the form expects prefixed names
27+
const settingsObj = settings as Record<string, any>;
28+
29+
const formValues = {
30+
nest_feeder_enabled: settingsObj.enabled,
31+
nest_feeder_url: settingsObj.url,
32+
nest_feeder_timeout: typeof settingsObj.timeout === 'string'
33+
? parseInt(settingsObj.timeout)
34+
: settingsObj.timeout,
35+
nest_feeder_cache_size: typeof settingsObj.cache_size === 'string'
36+
? parseInt(settingsObj.cache_size)
37+
: settingsObj.cache_size,
38+
nest_feeder_cache_ttl: typeof settingsObj.cache_ttl === 'string'
39+
? parseInt(settingsObj.cache_ttl)
40+
: settingsObj.cache_ttl
41+
};
42+
43+
console.log('NestFeederSettings - Transformed form values:', formValues);
44+
45+
// Set form values with a slight delay to ensure the form is ready
46+
setTimeout(() => {
47+
form.setFieldsValue(formValues);
48+
console.log('NestFeederSettings - Form values after set:', form.getFieldsValue());
49+
}, 100);
2450
}
2551
}, [settings, form]);
2652

@@ -42,6 +68,7 @@ const NestFeederSettings: React.FC = () => {
4268
layout="vertical"
4369
onValuesChange={handleValuesChange}
4470
initialValues={settings || {}}
71+
onFinish={(values) => console.log('Form submitted with values:', values)}
4572
>
4673
<Form.Item
4774
name="nest_feeder_enabled"

src/components/settings/OllamaSettings.tsx

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,27 @@ const OllamaSettings: React.FC = () => {
2222
// Update form values when settings change
2323
useEffect(() => {
2424
if (settings) {
25-
form.setFieldsValue(settings);
25+
console.log('OllamaSettings - Received settings:', settings);
26+
27+
// Transform property names to match form field names
28+
// The API returns properties without the prefix, but the form expects prefixed names
29+
const settingsObj = settings as Record<string, any>;
30+
31+
const formValues = {
32+
ollama_url: settingsObj.url,
33+
ollama_model: settingsObj.model,
34+
ollama_timeout: typeof settingsObj.timeout === 'string'
35+
? parseInt(settingsObj.timeout)
36+
: settingsObj.timeout
37+
};
38+
39+
console.log('OllamaSettings - Transformed form values:', formValues);
40+
41+
// Set form values with a slight delay to ensure the form is ready
42+
setTimeout(() => {
43+
form.setFieldsValue(formValues);
44+
console.log('OllamaSettings - Form values after set:', form.getFieldsValue());
45+
}, 100);
2646
}
2747
}, [settings, form]);
2848

@@ -62,6 +82,7 @@ const OllamaSettings: React.FC = () => {
6282
layout="vertical"
6383
onValuesChange={handleValuesChange}
6484
initialValues={settings || {}}
85+
onFinish={(values) => console.log('Form submitted with values:', values)}
6586
>
6687
<Form.Item
6788
name="ollama_url"

src/components/settings/WalletSettings.tsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,24 @@ const WalletSettings: React.FC = () => {
2020
// Update form values when settings change
2121
useEffect(() => {
2222
if (settings) {
23-
form.setFieldsValue(settings);
23+
console.log('WalletSettings - Received settings:', settings);
24+
25+
// Transform property names to match form field names
26+
// The API returns properties without the prefix, but the form expects prefixed names
27+
const settingsObj = settings as Record<string, any>;
28+
29+
const formValues = {
30+
wallet_name: settingsObj.name,
31+
wallet_api_key: settingsObj.api_key
32+
};
33+
34+
console.log('WalletSettings - Transformed form values:', formValues);
35+
36+
// Set form values with a slight delay to ensure the form is ready
37+
setTimeout(() => {
38+
form.setFieldsValue(formValues);
39+
console.log('WalletSettings - Form values after set:', form.getFieldsValue());
40+
}, 100);
2441
}
2542
}, [settings, form]);
2643

@@ -42,6 +59,7 @@ const WalletSettings: React.FC = () => {
4259
layout="vertical"
4360
onValuesChange={handleValuesChange}
4461
initialValues={settings || {}}
62+
onFinish={(values) => console.log('Form submitted with values:', values)}
4563
>
4664
<Form.Item
4765
name="wallet_name"

src/components/settings/XNostrSettings.tsx

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,45 @@ const XNostrSettingsComponent: React.FC = () => {
4646
// Update form values when settings change
4747
useEffect(() => {
4848
if (settings) {
49-
// Set form values from settings
50-
form.setFieldsValue({
51-
...settings,
49+
console.log('XNostrSettings - Received settings:', settings);
50+
51+
// Transform property names to match form field names
52+
// The API returns properties without the prefix, but the form expects prefixed names
53+
const settingsObj = settings as Record<string, any>;
54+
55+
// Create a transformed settings object with prefixed property names
56+
const formValues = {
57+
xnostr_enabled: settingsObj.enabled,
58+
xnostr_browser_path: settingsObj.browser_path,
59+
xnostr_browser_pool_size: typeof settingsObj.browser_pool_size === 'string'
60+
? parseInt(settingsObj.browser_pool_size)
61+
: settingsObj.browser_pool_size,
62+
xnostr_check_interval: typeof settingsObj.check_interval === 'string'
63+
? parseInt(settingsObj.check_interval)
64+
: settingsObj.check_interval,
65+
xnostr_concurrency: typeof settingsObj.concurrency === 'string'
66+
? parseInt(settingsObj.concurrency)
67+
: settingsObj.concurrency,
68+
xnostr_temp_dir: settingsObj.temp_dir,
69+
xnostr_update_interval: typeof settingsObj.update_interval === 'string'
70+
? parseInt(settingsObj.update_interval)
71+
: settingsObj.update_interval,
5272
// Handle nested objects
53-
xnostr_verification_intervals: settings.xnostr_verification_intervals || {},
73+
xnostr_verification_intervals: settingsObj.verification_intervals || {},
5474
// Don't set nitter instances here, we'll handle them separately
55-
});
75+
};
76+
77+
console.log('XNostrSettings - Transformed form values:', formValues);
78+
79+
// Set form values with a slight delay to ensure the form is ready
80+
setTimeout(() => {
81+
form.setFieldsValue(formValues);
82+
console.log('XNostrSettings - Form values after set:', form.getFieldsValue());
83+
}, 100);
5684

5785
// Set nitter instances
58-
if (settings.xnostr_nitter?.instances) {
59-
setNitterInstances(settings.xnostr_nitter.instances);
86+
if (settingsObj.nitter?.instances) {
87+
setNitterInstances(settingsObj.nitter.instances);
6088
} else {
6189
setNitterInstances([]);
6290
}
@@ -230,6 +258,7 @@ const XNostrSettingsComponent: React.FC = () => {
230258
layout="vertical"
231259
onValuesChange={handleValuesChange}
232260
initialValues={settings || {}}
261+
onFinish={(values) => console.log('Form submitted with values:', values)}
233262
>
234263
{/* General XNostr Settings */}
235264
<Form.Item

src/components/settings/layouts/AdvancedSettingsLayout.tsx

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState } from 'react';
1+
import React, { useState, useEffect } from 'react';
22
import { Collapse, Button, Space, Spin } from 'antd';
33
import { BaseRow } from '@app/components/common/BaseRow/BaseRow';
44
import { BaseCol } from '@app/components/common/BaseCol/BaseCol';
@@ -32,7 +32,7 @@ const AdvancedSettingsLayout: React.FC<AdvancedSettingsLayoutProps> = ({
3232
}) => {
3333
const [saveLoading, setSaveLoading] = useState(false);
3434
const [resetLoading, setResetLoading] = useState(false);
35-
const [activeKeys, setActiveKeys] = useState<string[]>(['general']);
35+
const [activeKeys, setActiveKeys] = useState<string[]>(['general', 'image-moderation']);
3636

3737
// Use the generic settings hook to handle saving all settings
3838
const {
@@ -45,19 +45,41 @@ const AdvancedSettingsLayout: React.FC<AdvancedSettingsLayoutProps> = ({
4545
const loading = propLoading || hookLoading;
4646
const error = propError || (hookError ? hookError.toString() : null);
4747

48+
// Ensure image-moderation panel is expanded when needed
49+
useEffect(() => {
50+
// Check URL for any parameters indicating we should expand image moderation
51+
const urlParams = new URLSearchParams(window.location.search);
52+
if (urlParams.has('section') && urlParams.get('section') === 'image-moderation') {
53+
if (!activeKeys.includes('image-moderation')) {
54+
setActiveKeys([...activeKeys, 'image-moderation']);
55+
}
56+
}
57+
58+
// Log for debugging
59+
console.log('AdvancedSettingsLayout - Active panels:', activeKeys);
60+
}, [activeKeys]);
61+
4862
const handleSave = async () => {
63+
console.log('Saving all settings...');
4964
setSaveLoading(true);
5065
try {
5166
await saveSettings();
67+
console.log('Settings saved successfully');
68+
} catch (error) {
69+
console.error('Error saving settings:', error);
5270
} finally {
5371
setSaveLoading(false);
5472
}
5573
};
5674

5775
const handleReset = async () => {
76+
console.log('Resetting all settings...');
5877
setResetLoading(true);
5978
try {
6079
await fetchSettings();
80+
console.log('Settings reset successfully');
81+
} catch (error) {
82+
console.error('Error resetting settings:', error);
6183
} finally {
6284
setResetLoading(false);
6385
}
@@ -88,7 +110,10 @@ const AdvancedSettingsLayout: React.FC<AdvancedSettingsLayoutProps> = ({
88110
<Collapse
89111
accordion={false}
90112
activeKey={activeKeys}
91-
onChange={(keys) => setActiveKeys(keys as string[])}
113+
onChange={(keys) => {
114+
console.log('Collapse panels changed:', keys);
115+
setActiveKeys(keys as string[]);
116+
}}
92117
>
93118
<Panel header="General Settings" key="general">
94119
<GeneralSettingsPanel />

0 commit comments

Comments
 (0)