/* Copyright (C) 2023-2026 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import { useEffect } from 'react' import * as z from 'zod' import { useForm } from 'react-hook-form' import { zodResolver } from '@hookform/resolvers/zod' import { useTranslation } from 'react-i18next' import { Button } from '@/components/ui/button' import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form' import { Switch } from '@/components/ui/switch' import { SettingsSection } from '../components/settings-section' import { useUpdateOption } from '../hooks/use-update-option' const drawingSchema = z.object({ DrawingEnabled: z.boolean(), MjNotifyEnabled: z.boolean(), MjAccountFilterEnabled: z.boolean(), MjForwardUrlEnabled: z.boolean(), MjModeClearEnabled: z.boolean(), MjActionCheckSuccessEnabled: z.boolean(), }) type DrawingFormValues = z.infer type DrawingSettingsSectionProps = { defaultValues: DrawingFormValues } export function DrawingSettingsSection({ defaultValues, }: DrawingSettingsSectionProps) { const { t } = useTranslation() const updateOption = useUpdateOption() const form = useForm({ resolver: zodResolver(drawingSchema), defaultValues, }) useEffect(() => { form.reset(defaultValues) }, [defaultValues, form]) const onSubmit = async (values: DrawingFormValues) => { const updates = Object.entries(values).filter( ([key, value]) => value !== defaultValues[key as keyof DrawingFormValues] ) for (const [key, value] of updates) { await updateOption.mutateAsync({ key, value }) } } const switches: Array<{ name: keyof DrawingFormValues label: string description: string }> = [ { name: 'DrawingEnabled', label: t('Enable drawing features'), description: t( 'Required to expose Midjourney-style image generation to end users.' ), }, { name: 'MjNotifyEnabled', label: t('Allow upstream callbacks'), description: t( 'When enabled, Midjourney callbacks are accepted (reveals server IP).' ), }, { name: 'MjAccountFilterEnabled', label: t('Allow accountFilter parameter'), description: t( 'Keep enabled if you need to proxy requests for different upstream accounts.' ), }, { name: 'MjForwardUrlEnabled', label: t('Rewrite callback URLs to the local server'), description: t( 'Automatically replaces upstream callback URLs with the server address.' ), }, { name: 'MjModeClearEnabled', label: t('Clear mode flags in prompts'), description: t( 'Removes Midjourney flags such as --fast, --relax, and --turbo from user prompts.' ), }, { name: 'MjActionCheckSuccessEnabled', label: t('Require job success before follow-up actions'), description: t( 'Users must wait for a successful drawing before upscales or variations.' ), }, ] return (
{switches.map((item) => ( (
{item.label} {item.description}
)} /> ))}
) }