import { CopyOutlined, DownOutlined, InfoCircleOutlined, UpOutlined } from '@ant-design/icons'; import { App, Button, Checkbox, Input, InputNumber, Switch, Tooltip } from 'antd'; import { useEffect, useState } from 'react'; import { IS_CLOUD } from '../../../../constants'; import { type Database, databaseApi } from '../../../../entity/databases'; import { MariadbConnectionStringParser } from '../../../../entity/databases/model/mariadb/MariadbConnectionStringParser'; import { ClipboardHelper } from '../../../../shared/lib/ClipboardHelper'; import { ToastHelper } from '../../../../shared/toast'; import { ClipboardPasteModalComponent } from '../../../../shared/ui'; interface Props { database: Database; isShowCancelButton?: boolean; onCancel: () => void; isShowBackButton: boolean; onBack: () => void; saveButtonText?: string; isSaveToApi: boolean; onSaved: (database: Database) => void; isShowDbName?: boolean; } export const EditMariaDbSpecificDataComponent = ({ database, isShowCancelButton, onCancel, isShowBackButton, onBack, saveButtonText, isSaveToApi, onSaved, isShowDbName = true, }: Props) => { const { message } = App.useApp(); const [editingDatabase, setEditingDatabase] = useState(); const [isSaving, setIsSaving] = useState(false); const [isConnectionTested, setIsConnectionTested] = useState(false); const [isTestingConnection, setIsTestingConnection] = useState(false); const [isConnectionFailed, setIsConnectionFailed] = useState(false); const hasAdvancedValues = !!database.mariadb?.isExcludeEvents; const [isShowAdvanced, setShowAdvanced] = useState(hasAdvancedValues); const [isShowPasteModal, setIsShowPasteModal] = useState(false); const applyConnectionString = (text: string) => { const trimmedText = text.trim(); if (!trimmedText) { message.error('Clipboard is empty'); return; } const result = MariadbConnectionStringParser.parse(trimmedText); if ('error' in result) { message.error(result.error); return; } if (!editingDatabase?.mariadb) return; const updatedDatabase: Database = { ...editingDatabase, mariadb: { ...editingDatabase.mariadb, host: result.host, port: result.port, username: result.username, password: result.password, database: result.database, isHttps: result.isHttps, }, }; setEditingDatabase(updatedDatabase); setIsConnectionTested(false); message.success('Connection string parsed successfully'); }; const parseFromClipboard = async () => { if (!ClipboardHelper.isClipboardApiAvailable()) { setIsShowPasteModal(true); return; } try { const text = await ClipboardHelper.readFromClipboard(); applyConnectionString(text); } catch { message.error('Failed to read clipboard. Please check browser permissions.'); } }; const testConnection = async () => { if (!editingDatabase?.mariadb) return; setIsTestingConnection(true); setIsConnectionFailed(false); const trimmedDatabase = { ...editingDatabase, mariadb: { ...editingDatabase.mariadb, password: editingDatabase.mariadb.password?.trim(), }, }; try { await databaseApi.testDatabaseConnectionDirect(trimmedDatabase); setIsConnectionTested(true); ToastHelper.showToast({ title: 'Connection test passed', description: 'You can continue with the next step', }); } catch (e) { setIsConnectionFailed(true); alert((e as Error).message); } setIsTestingConnection(false); }; const saveDatabase = async () => { if (!editingDatabase?.mariadb) return; const trimmedDatabase = { ...editingDatabase, mariadb: { ...editingDatabase.mariadb, password: editingDatabase.mariadb.password?.trim(), }, }; if (isSaveToApi) { setIsSaving(true); try { await databaseApi.updateDatabase(trimmedDatabase); } catch (e) { alert((e as Error).message); } setIsSaving(false); } onSaved(trimmedDatabase); }; useEffect(() => { setIsSaving(false); setIsConnectionTested(false); setIsTestingConnection(false); setIsConnectionFailed(false); setEditingDatabase({ ...database }); }, [database]); if (!editingDatabase) return null; let isAllFieldsFilled = true; if (!editingDatabase.mariadb?.host) isAllFieldsFilled = false; if (!editingDatabase.mariadb?.port) isAllFieldsFilled = false; if (!editingDatabase.mariadb?.username) isAllFieldsFilled = false; if (!editingDatabase.id && !editingDatabase.mariadb?.password) isAllFieldsFilled = false; if (!editingDatabase.mariadb?.database) isAllFieldsFilled = false; const isLocalhostDb = editingDatabase.mariadb?.host?.includes('localhost') || editingDatabase.mariadb?.host?.includes('127.0.0.1'); return (
Parse from clipboard
Host
{ if (!editingDatabase.mariadb) return; setEditingDatabase({ ...editingDatabase, mariadb: { ...editingDatabase.mariadb, host: e.target.value.trim().replace('https://', '').replace('http://', ''), }, }); setIsConnectionTested(false); }} size="small" className="max-w-[200px] grow" placeholder="Enter MariaDB host" />
{isLocalhostDb && !IS_CLOUD && (
Please{' '} read this document {' '} to study how to backup local database
)}
Port
{ if (!editingDatabase.mariadb || e === null) return; setEditingDatabase({ ...editingDatabase, mariadb: { ...editingDatabase.mariadb, port: e }, }); setIsConnectionTested(false); }} size="small" className="max-w-[200px] grow" placeholder="Enter MariaDB port" />
Username
{ if (!editingDatabase.mariadb) return; setEditingDatabase({ ...editingDatabase, mariadb: { ...editingDatabase.mariadb, username: e.target.value.trim() }, }); setIsConnectionTested(false); }} size="small" className="max-w-[200px] grow" placeholder="Enter MariaDB username" />
Password
{ if (!editingDatabase.mariadb) return; setEditingDatabase({ ...editingDatabase, mariadb: { ...editingDatabase.mariadb, password: e.target.value }, }); setIsConnectionTested(false); }} size="small" className="max-w-[200px] grow" placeholder="Enter MariaDB password" autoComplete="off" data-1p-ignore data-lpignore="true" data-form-type="other" />
{isShowDbName && (
DB name
{ if (!editingDatabase.mariadb) return; setEditingDatabase({ ...editingDatabase, mariadb: { ...editingDatabase.mariadb, database: e.target.value.trim() }, }); setIsConnectionTested(false); }} size="small" className="max-w-[200px] grow" placeholder="Enter MariaDB database name" />
)}
Use HTTPS
{ if (!editingDatabase.mariadb) return; setEditingDatabase({ ...editingDatabase, mariadb: { ...editingDatabase.mariadb, isHttps: checked }, }); setIsConnectionTested(false); }} size="small" />
setShowAdvanced(!isShowAdvanced)} > Advanced settings {isShowAdvanced ? ( ) : ( )}
{isShowAdvanced && (
Exclude events
{ if (!editingDatabase.mariadb) return; setEditingDatabase({ ...editingDatabase, mariadb: { ...editingDatabase.mariadb, isExcludeEvents: e.target.checked, }, }); }} > Skip events
)}
{isShowCancelButton && ( )} {isShowBackButton && ( )} {!isConnectionTested && ( )} {isConnectionTested && ( )}
{isConnectionFailed && !IS_CLOUD && (
If your database uses IP whitelist, make sure Databasus server IP is added to the allowed list.
)} { setIsShowPasteModal(false); applyConnectionString(text); }} onCancel={() => setIsShowPasteModal(false)} />
); };