Skip to content

Commit e340fbe

Browse files
committed
refactor: исправлены замечания code review
Изменения: - Исправлено форматирование Markdown в plugin-assistant-system-prompt.md (добавлены пустые строки вокруг блоков кода, исправлена нумерация) - Заменен оператор || на ?? для значений по умолчанию в select полях (предотвращает неожиданное поведение при falsy значениях) - Исправлен bug_risk: используется plugin.settings?.actionsPreset (опциональная цепочка для предотвращения ошибок при неинициализированных settings) - Извлечена функция shouldShowField в общую утилиту lib/pluginSettingsUtils.js (устранено дублирование кода между компонентами) Адресует замечания CodeRabbit и Sourcery.
1 parent 264c5cf commit e340fbe

4 files changed

Lines changed: 26 additions & 26 deletions

File tree

backend/src/ai/plugin-assistant-system-prompt.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,11 +482,13 @@ bot.events.on('core:raw_message', (rawText, jsonMsg) => {
482482
**Формат options:**
483483

484484
1. **Простой массив строк** - когда значение и label совпадают:
485+
485486
```javascript
486487
"options": ["easy", "normal", "hard"]
487488
```
488489

489-
2. **Массив объектов** - когда нужны разные value и label:
490+
1. **Массив объектов** - когда нужны разные value и label:
491+
490492
```javascript
491493
"options": [
492494
{ "value": "ru", "label": "Русский" },
@@ -499,6 +501,7 @@ bot.events.on('core:raw_message', (rawText, jsonMsg) => {
499501
Сохраненное значение всегда будет строкой (например: `"normal"`, `"ru"`)
500502

501503
**Пример использования в плагине:**
504+
502505
```javascript
503506
module.exports = (bot, { settings }) => {
504507
const mode = settings.mode; // "easy" | "normal" | "hard"

frontend/src/components/PluginSettingsDialog.jsx

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { apiHelper } from '@/lib/api';
1515
import PluginDetailInfo from './PluginDetailInfo';
1616
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
1717
import { useAppStore } from '@/stores/appStore';
18+
import { shouldShowField } from '@/lib/pluginSettingsUtils';
1819

1920
function JsonEditorDialog({ initialValue, onSave, onCancel }) {
2021
const [jsonString, setJsonString] = useState('');
@@ -205,7 +206,7 @@ function SettingField({ settingKey, config, value, onChange, readOnly }) {
205206
return (
206207
<div className="space-y-2">
207208
<Label htmlFor={id}>{config.label}</Label>
208-
<Select value={value || config.default || ''} onValueChange={readOnly ? undefined : ((newValue) => onChange(settingKey, newValue))} disabled={readOnly}>
209+
<Select value={value ?? config.default ?? ''} onValueChange={readOnly ? undefined : ((newValue) => onChange(settingKey, newValue))} disabled={readOnly}>
209210
<SelectTrigger id={id}>
210211
<SelectValue placeholder="Выберите значение" />
211212
</SelectTrigger>
@@ -384,16 +385,6 @@ export default function PluginSettingsDialog({ bot, plugin, onOpenChange, onSave
384385
}
385386
};
386387

387-
// Определяем, какие поля показывать на основе условий
388-
const shouldShowField = (key, config) => {
389-
// Если есть поле actionsPreset, то поля enable* показываем только при custom
390-
const actionsPresetValue = settings?.actionsPreset;
391-
if (actionsPresetValue !== undefined && key.startsWith('enable')) {
392-
return actionsPresetValue === 'custom';
393-
}
394-
return true;
395-
};
396-
397388
const renderSettings = () => {
398389
if (settings === null) return <div className="text-center p-4"><Loader2 className="h-6 w-6 animate-spin mx-auto"/></div>;
399390
if (Object.keys(manifestSettings).length === 0) return <p className="text-muted-foreground p-4 text-center">У этого плагина нет настроек.</p>;
@@ -407,7 +398,7 @@ export default function PluginSettingsDialog({ bot, plugin, onOpenChange, onSave
407398
<AccordionContent className="pt-4 border-t space-y-4">
408399
{Object.entries(categoryConfig)
409400
.filter(([key]) => key !== 'label')
410-
.filter(([key, config]) => shouldShowField(key, config))
401+
.filter(([key, config]) => shouldShowField(key, settings?.actionsPreset))
411402
.map(([key, config]) => (
412403
<SettingField
413404
key={key}
@@ -428,7 +419,7 @@ export default function PluginSettingsDialog({ bot, plugin, onOpenChange, onSave
428419
return (
429420
<div className="space-y-4">
430421
{Object.entries(manifestSettings)
431-
.filter(([key, config]) => shouldShowField(key, config))
422+
.filter(([key, config]) => shouldShowField(key, settings?.actionsPreset))
432423
.map(([key, config]) => (
433424
<SettingField
434425
key={key}

frontend/src/components/PluginSettingsForm.jsx

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { Edit } from 'lucide-react';
99
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogFooter, DialogTrigger } from "@/components/ui/dialog";
1010
import Editor from '@monaco-editor/react';
1111
import { useAppStore } from '@/stores/appStore';
12+
import { shouldShowField } from '@/lib/pluginSettingsUtils';
1213

1314
function JsonEditorDialog({ initialValue, onSave, onCancel }) {
1415
const [jsonString, setJsonString] = useState('');
@@ -201,7 +202,7 @@ function SettingField({ settingKey, config, value, onChange }) {
201202
return (
202203
<div className="space-y-2">
203204
<Label htmlFor={id}>{config.label}</Label>
204-
<Select value={value || config.default || ''} onValueChange={(newValue) => onChange(settingKey, newValue)}>
205+
<Select value={value ?? config.default ?? ''} onValueChange={(newValue) => onChange(settingKey, newValue)}>
205206
<SelectTrigger id={id}>
206207
<SelectValue placeholder="Выберите значение" />
207208
</SelectTrigger>
@@ -257,20 +258,10 @@ export default function PluginSettingsForm({ plugin, onSettingsChange }) {
257258
onSettingsChange(plugin.id, newSettings);
258259
};
259260

260-
// Определяем, какие поля показывать на основе условий
261-
const shouldShowField = (key, config) => {
262-
// Если есть поле actionsPreset, то поля enable* показываем только при custom
263-
const actionsPresetValue = plugin.settings.actionsPreset;
264-
if (actionsPresetValue !== undefined && key.startsWith('enable')) {
265-
return actionsPresetValue === 'custom';
266-
}
267-
return true;
268-
};
269-
270261
return (
271262
<div className="space-y-6">
272263
{Object.entries(plugin.manifest.settings)
273-
.filter(([key, config]) => shouldShowField(key, config))
264+
.filter(([key, config]) => shouldShowField(key, plugin.settings?.actionsPreset))
274265
.map(([key, config]) => (
275266
<SettingField
276267
key={key}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/**
2+
* Определяет, должно ли поле настройки плагина отображаться
3+
* на основе условий (например, actionsPreset)
4+
*
5+
* @param {string} key - Ключ поля настройки
6+
* @param {any} actionsPresetValue - Значение поля actionsPreset (если есть)
7+
* @returns {boolean} - Должно ли поле отображаться
8+
*/
9+
export const shouldShowField = (key, actionsPresetValue) => {
10+
// Если есть поле actionsPreset, то поля enable* показываем только при custom
11+
if (actionsPresetValue !== undefined && key.startsWith('enable')) {
12+
return actionsPresetValue === 'custom';
13+
}
14+
return true;
15+
};

0 commit comments

Comments
 (0)