|
1 | 1 | "use client"; |
2 | 2 |
|
3 | | -import { useState, useMemo } from "react"; |
| 3 | +import { useState, useMemo, useEffect } from "react"; |
4 | 4 | import { useRouter } from "next/navigation"; |
5 | 5 | import Image from "next/image"; |
6 | 6 | import { GenerationRecord } from "../lib/jsondb/types"; |
7 | 7 | import { ValidatedArtist } from "../lib/public/schemas/artist"; |
| 8 | +import { smartMapToPart } from "../lib/utils/track-mapping"; |
8 | 9 |
|
9 | 10 | interface PresetCreateFormProps { |
10 | 11 | generation: GenerationRecord; |
@@ -50,6 +51,53 @@ export function PresetCreateForm({ |
50 | 51 | }, |
51 | 52 | }); |
52 | 53 |
|
| 54 | + // Автозаполнение формы из songsterrData |
| 55 | + useEffect(() => { |
| 56 | + if (!generation.songsterrData) return; |
| 57 | + |
| 58 | + const { artist, title, trackType, trackName, url } = |
| 59 | + generation.songsterrData; |
| 60 | + |
| 61 | + // 1. Поиск существующего артиста (fuzzy match) |
| 62 | + const foundArtist = artists.find( |
| 63 | + (a) => |
| 64 | + a.title.toLowerCase() === artist.toLowerCase() || |
| 65 | + a.title.toLowerCase().includes(artist.toLowerCase()) || |
| 66 | + artist.toLowerCase().includes(a.title.toLowerCase()), |
| 67 | + ); |
| 68 | + |
| 69 | + if (foundArtist) { |
| 70 | + // Артист найден - выбираем его |
| 71 | + setIsNewArtist(false); |
| 72 | + setFormData((prev) => ({ |
| 73 | + ...prev, |
| 74 | + artistId: foundArtist.id, |
| 75 | + song: title, |
| 76 | + part: smartMapToPart(trackType, trackName), |
| 77 | + tabsUrl: url, |
| 78 | + })); |
| 79 | + console.log( |
| 80 | + `✅ Артист найден: ${foundArtist.title} (ID: ${String(foundArtist.id)})`, |
| 81 | + ); |
| 82 | + } else { |
| 83 | + // Артист не найден - создаем нового |
| 84 | + setIsNewArtist(true); |
| 85 | + setFormData((prev) => ({ |
| 86 | + ...prev, |
| 87 | + newArtistTitle: artist, |
| 88 | + newArtistDescription: `Описание для ${artist}`, |
| 89 | + song: title, |
| 90 | + part: smartMapToPart(trackType, trackName), |
| 91 | + tabsUrl: url, |
| 92 | + })); |
| 93 | + console.log(`📝 Создание нового артиста: ${artist}`); |
| 94 | + } |
| 95 | + |
| 96 | + console.log( |
| 97 | + `🎵 Автозаполнение: ${artist} - ${title} (${smartMapToPart(trackType, trackName)})`, |
| 98 | + ); |
| 99 | + }, [generation.songsterrData, artists]); |
| 100 | + |
53 | 101 | // Получаем последнюю версию chain из генерации (не используется в UI, но может понадобиться) |
54 | 102 | const latestChain = useMemo(() => { |
55 | 103 | if (generation.versions.length === 0) return null; |
@@ -163,6 +211,33 @@ export function PresetCreateForm({ |
163 | 211 | }} |
164 | 212 | className="space-y-6" |
165 | 213 | > |
| 214 | + {/* Автозаполнение из Songsterr */} |
| 215 | + {generation.songsterrData && ( |
| 216 | + <div className="bg-green-50 border border-green-200 rounded-lg p-4 mb-6"> |
| 217 | + <h3 className="text-lg font-semibold text-green-900 mb-2"> |
| 218 | + ✅ Форма автозаполнена из Songsterr |
| 219 | + </h3> |
| 220 | + <div className="text-sm text-green-700 space-y-1"> |
| 221 | + <p> |
| 222 | + <span className="font-medium">Артист:</span>{" "} |
| 223 | + {generation.songsterrData.artist} |
| 224 | + </p> |
| 225 | + <p> |
| 226 | + <span className="font-medium">Песня:</span>{" "} |
| 227 | + {generation.songsterrData.title} |
| 228 | + </p> |
| 229 | + <p> |
| 230 | + <span className="font-medium">Тип трека:</span>{" "} |
| 231 | + {generation.songsterrData.trackType} |
| 232 | + </p> |
| 233 | + <p className="text-xs text-green-600 mt-2"> |
| 234 | + 💡 Проверьте автозаполненные поля ниже и внесите правки при |
| 235 | + необходимости |
| 236 | + </p> |
| 237 | + </div> |
| 238 | + </div> |
| 239 | + )} |
| 240 | + |
166 | 241 | {/* Информация о генерации */} |
167 | 242 | <div className="bg-gray-50 rounded-lg p-4"> |
168 | 243 | <h3 className="text-lg font-semibold text-gray-900 mb-3"> |
|
0 commit comments