6.6.0: Извлечение ссылки из текста в желании
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m5s
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m5s
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "play-life-web",
|
||||
"version": "6.5.0",
|
||||
"version": "6.6.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -4,6 +4,13 @@ import { useAuth } from './auth/AuthContext'
|
||||
import Toast from './Toast'
|
||||
import './WishlistForm.css'
|
||||
|
||||
// Извлекает первый URL из текста
|
||||
function extractUrl(text) {
|
||||
if (!text) return ''
|
||||
const match = text.match(/https?:\/\/[^\s<>"'`,;!)\]]+/i)
|
||||
return match ? match[0] : text
|
||||
}
|
||||
|
||||
const API_URL = '/api/wishlist'
|
||||
const TASKS_API_URL = '/api/tasks'
|
||||
const PROJECTS_API_URL = '/projects'
|
||||
@@ -359,15 +366,18 @@ function WishlistForm({ onNavigate, wishlistId, editConditionIndex, newTaskId: n
|
||||
setToastMessage({ text: 'Введите ссылку', type: 'error' })
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
const extracted = extractUrl(link)
|
||||
setLink(extracted)
|
||||
|
||||
// Проверяем валидность URL
|
||||
try {
|
||||
new URL(link)
|
||||
new URL(extracted)
|
||||
} catch {
|
||||
setToastMessage({ text: 'Некорректная ссылка', type: 'error' })
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
setFetchingMetadata(true)
|
||||
try {
|
||||
const response = await authFetch(`${API_URL}/metadata`, {
|
||||
@@ -375,7 +385,7 @@ function WishlistForm({ onNavigate, wishlistId, editConditionIndex, newTaskId: n
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({ url: link.trim() }),
|
||||
body: JSON.stringify({ url: extracted.trim() }),
|
||||
})
|
||||
|
||||
if (response.ok) {
|
||||
@@ -477,7 +487,9 @@ function WishlistForm({ onNavigate, wishlistId, editConditionIndex, newTaskId: n
|
||||
|
||||
// Загрузка картинки по ссылке с последующим кропом
|
||||
const loadImageFromUrl = async () => {
|
||||
const url = imageUrlInput?.trim()
|
||||
const extracted = extractUrl(imageUrlInput)
|
||||
setImageUrlInput(extracted)
|
||||
const url = extracted?.trim()
|
||||
if (!url) {
|
||||
setToastMessage({ text: 'Введите ссылку на картинку', type: 'error' })
|
||||
return
|
||||
@@ -800,9 +812,10 @@ function WishlistForm({ onNavigate, wishlistId, editConditionIndex, newTaskId: n
|
||||
<div className="link-input-wrapper">
|
||||
<input
|
||||
id="link"
|
||||
type="url"
|
||||
type="text"
|
||||
value={link}
|
||||
onChange={(e) => setLink(e.target.value)}
|
||||
onBlur={() => setLink(extractUrl(link))}
|
||||
placeholder="https://..."
|
||||
className="form-input"
|
||||
disabled={fetchingMetadata}
|
||||
@@ -907,9 +920,10 @@ function WishlistForm({ onNavigate, wishlistId, editConditionIndex, newTaskId: n
|
||||
<div className="image-url-row">
|
||||
<span className="image-url-label">Ссылка:</span>
|
||||
<input
|
||||
type="url"
|
||||
type="text"
|
||||
value={imageUrlInput}
|
||||
onChange={(e) => setImageUrlInput(e.target.value)}
|
||||
onBlur={() => setImageUrlInput(extractUrl(imageUrlInput))}
|
||||
placeholder="https://..."
|
||||
className="form-input image-url-input"
|
||||
disabled={loadingImageFromUrl}
|
||||
|
||||
Reference in New Issue
Block a user