import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useSortable } from '@dnd-kit/sortable'; import { PiCaretDown } from 'react-icons/pi'; import { CSS } from '@dnd-kit/utilities'; import { cn } from '../../lib/utils'; import { GripIcon, TrashIcon } from '../icons/LandingIcons'; import type { AdminLandingPaymentMethod, EditableMethodField } from '../../api/landings'; import type { PaymentMethodSubOptionInfo } from '../../types'; export type MethodWithId = AdminLandingPaymentMethod & { _id: string }; const ChevronDownIcon = ({ open }: { open: boolean }) => ( ); interface SortableSelectedMethodProps { method: MethodWithId; availableSubOptions: PaymentMethodSubOptionInfo[] | null; onUpdate: (methodId: string, field: EditableMethodField, value: string | number | null) => void; onSubOptionsChange: (methodId: string, subOptions: Record) => void; onRemove: (methodId: string) => void; } export function SortableSelectedMethodCard({ method, availableSubOptions, onUpdate, onSubOptionsChange, onRemove, }: SortableSelectedMethodProps) { const { t } = useTranslation(); const [expanded, setExpanded] = useState(false); const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: method._id, }); const style: React.CSSProperties = { transform: CSS.Transform.toString(transform), transition, zIndex: isDragging ? 50 : undefined, position: isDragging ? 'relative' : undefined, }; return (
{expanded && (
onUpdate(method.method_id, 'display_name', e.target.value)} className="w-full rounded-lg border border-dark-700 bg-dark-800 px-3 py-1.5 text-sm text-dark-100 outline-none focus:border-accent-500" />
onUpdate(method.method_id, 'description', e.target.value || null)} placeholder={t('admin.landings.methodDescPlaceholder', 'Optional description')} className="w-full rounded-lg border border-dark-700 bg-dark-800 px-3 py-1.5 text-sm text-dark-100 outline-none focus:border-accent-500" />
onUpdate(method.method_id, 'icon_url', e.target.value || null)} placeholder="https://..." className="w-full rounded-lg border border-dark-700 bg-dark-800 px-3 py-1.5 text-sm text-dark-100 outline-none focus:border-accent-500" />
onUpdate( method.method_id, 'min_amount_kopeks', e.target.value ? Math.max(0, Math.floor(Number(e.target.value))) : null, ) } placeholder="—" className="w-full rounded-lg border border-dark-700 bg-dark-800 px-3 py-1.5 text-sm text-dark-100 outline-none focus:border-accent-500" />
onUpdate( method.method_id, 'max_amount_kopeks', e.target.value ? Math.max(0, Math.floor(Number(e.target.value))) : null, ) } placeholder="—" className="w-full rounded-lg border border-dark-700 bg-dark-800 px-3 py-1.5 text-sm text-dark-100 outline-none focus:border-accent-500" />
onUpdate(method.method_id, 'currency', e.target.value || null)} placeholder="RUB" className="w-full rounded-lg border border-dark-700 bg-dark-800 px-3 py-1.5 text-sm text-dark-100 outline-none focus:border-accent-500" />
onUpdate(method.method_id, 'return_url', e.target.value || null)} placeholder={t( 'admin.landings.methodReturnUrlPlaceholder', 'Default: cabinet success page. Use {token} for purchase token', )} className="w-full rounded-lg border border-dark-700 bg-dark-800 px-3 py-1.5 text-sm text-dark-100 outline-none focus:border-accent-500" />
{availableSubOptions && availableSubOptions.length > 0 && (
{availableSubOptions.map((opt) => { // Missing keys treated as enabled (opt-out model) const enabled = method.sub_options?.[opt.id] !== false; return ( ); })}
)}
)}
); }