'use client' import { useMutation } from '@apollo/client' import { ArrowLeft, ShoppingCart, Check, X } from 'lucide-react' import { useState } from 'react' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Checkbox } from '@/components/ui/checkbox' import { GlassInput } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { ADD_MARKETPLACE_API_KEY } from '@/graphql/mutations' import { AuthLayout } from './auth-layout' interface ApiValidationData { sellerId?: string sellerName?: string tradeMark?: string isValid?: boolean } interface MarketplaceApiStepProps { onNext: (apiData: { wbApiKey?: string wbApiValidation?: ApiValidationData ozonApiKey?: string ozonApiValidation?: ApiValidationData }) => void onBack: () => void } interface ApiKeyValidation { [key: string]: { isValid: boolean | null isValidating: boolean error?: string } } export function MarketplaceApiStep({ onNext, onBack }: MarketplaceApiStepProps) { const [selectedMarketplaces, setSelectedMarketplaces] = useState([]) const [wbApiKey, setWbApiKey] = useState('') const [ozonApiKey, setOzonApiKey] = useState('') const [validationStates, setValidationStates] = useState({}) const [isSubmitting, setIsSubmitting] = useState(false) const [wbValidationData, setWbValidationData] = useState(null) const [ozonValidationData, setOzonValidationData] = useState(null) const [addMarketplaceApiKey] = useMutation(ADD_MARKETPLACE_API_KEY) const handleMarketplaceToggle = (marketplace: string) => { if (selectedMarketplaces.includes(marketplace)) { setSelectedMarketplaces((prev) => prev.filter((m) => m !== marketplace)) if (marketplace === 'wildberries') setWbApiKey('') if (marketplace === 'ozon') setOzonApiKey('') // Сбрасываем состояние валидации setValidationStates((prev) => ({ ...prev, [marketplace]: { isValid: null, isValidating: false }, })) } else { setSelectedMarketplaces((prev) => [...prev, marketplace]) } } const validateApiKey = async (marketplace: string, apiKey: string) => { if (!apiKey || !isValidApiKey(apiKey)) return setValidationStates((prev) => ({ ...prev, [marketplace]: { isValid: null, isValidating: true }, })) try { const { data } = await addMarketplaceApiKey({ variables: { input: { marketplace: marketplace.toUpperCase(), apiKey, validateOnly: true, }, }, }) setValidationStates((prev) => ({ ...prev, [marketplace]: { isValid: data.addMarketplaceApiKey.success, isValidating: false, error: data.addMarketplaceApiKey.success ? undefined : data.addMarketplaceApiKey.message, }, })) // Сохраняем данные валидации if (data.addMarketplaceApiKey.success && data.addMarketplaceApiKey.apiKey?.validationData) { const validationData = data.addMarketplaceApiKey.apiKey.validationData if (marketplace === 'wildberries') { setWbValidationData({ sellerId: validationData.sellerId, sellerName: validationData.sellerName, tradeMark: validationData.tradeMark, isValid: true, }) } else if (marketplace === 'ozon') { setOzonValidationData({ sellerId: validationData.sellerId, sellerName: validationData.sellerName, tradeMark: validationData.tradeMark, isValid: true, }) } } } catch { setValidationStates((prev) => ({ ...prev, [marketplace]: { isValid: false, isValidating: false, error: 'Ошибка валидации API ключа', }, })) } } const handleApiKeyChange = (marketplace: string, value: string) => { if (marketplace === 'wildberries') { setWbApiKey(value) } else if (marketplace === 'ozon') { setOzonApiKey(value) } // Сбрасываем состояние валидации при изменении setValidationStates((prev) => ({ ...prev, [marketplace]: { isValid: null, isValidating: false }, })) } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (selectedMarketplaces.length === 0) return setIsSubmitting(true) // Валидируем все выбранные маркетплейсы const validationPromises = [] if (selectedMarketplaces.includes('wildberries') && isValidApiKey(wbApiKey)) { validationPromises.push(validateApiKey('wildberries', wbApiKey)) } if (selectedMarketplaces.includes('ozon') && isValidApiKey(ozonApiKey)) { validationPromises.push(validateApiKey('ozon', ozonApiKey)) } // Ждем завершения всех валидаций await Promise.all(validationPromises) // Небольшая задержка чтобы состояние обновилось await new Promise((resolve) => setTimeout(resolve, 100)) // Проверяем результаты валидации let hasValidationErrors = false for (const marketplace of selectedMarketplaces) { const validation = validationStates[marketplace] if (!validation || validation.isValid !== true) { hasValidationErrors = true break } } if (!hasValidationErrors) { const apiData: { wbApiKey?: string wbApiValidation?: ApiValidationData ozonApiKey?: string ozonApiValidation?: ApiValidationData } = {} if (selectedMarketplaces.includes('wildberries') && isValidApiKey(wbApiKey)) { apiData.wbApiKey = wbApiKey if (wbValidationData) { apiData.wbApiValidation = wbValidationData } } if (selectedMarketplaces.includes('ozon') && isValidApiKey(ozonApiKey)) { apiData.ozonApiKey = ozonApiKey if (ozonValidationData) { apiData.ozonApiValidation = ozonValidationData } } onNext(apiData) } setIsSubmitting(false) } const isValidApiKey = (key: string) => { return key.length >= 10 && /^[a-zA-Z0-9-_.]+$/.test(key) } const isFormValid = () => { if (selectedMarketplaces.length === 0) return false for (const marketplace of selectedMarketplaces) { const apiKey = marketplace === 'wildberries' ? wbApiKey : ozonApiKey if (!isValidApiKey(apiKey)) { return false } } return true } const getValidationBadge = (marketplace: string) => { const validation = validationStates[marketplace] if (!validation || validation.isValid === null) return null if (validation.isValidating) { return ( Проверка... ) } if (validation.isValid) { return ( Валидный ) } return ( Невалидный ) } const marketplaces = [ { id: 'wildberries', name: 'Wildberries', badge: 'Популярный', badgeColor: 'purple', apiKey: wbApiKey, setApiKey: (value: string) => handleApiKeyChange('wildberries', value), placeholder: 'API ключ Wildberries', }, { id: 'ozon', name: 'Ozon', badge: 'Быстро растёт', badgeColor: 'blue', apiKey: ozonApiKey, setApiKey: (value: string) => handleApiKeyChange('ozon', value), placeholder: 'API ключ Ozon', }, ] return (

Кабинет селлера

Управление продажами на маркетплейсах

{marketplaces.map((marketplace) => (
handleMarketplaceToggle(marketplace.id)} className="border-white/30 data-[state=checked]:bg-purple-500" />
{marketplace.badge} {selectedMarketplaces.includes(marketplace.id) && getValidationBadge(marketplace.id)}
{selectedMarketplaces.includes(marketplace.id) && (
marketplace.setApiKey(e.target.value)} className="h-10 text-sm" />

{marketplace.id === 'wildberries' ? 'Личный кабинет → Настройки → Доступ к API' : 'Кабинет продавца → API → Генерация ключа'}

{validationStates[marketplace.id]?.error && (

{validationStates[marketplace.id].error}

)}
)}
))}
) }