ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ основному содСрТимому

πŸ“¦ Release Notes v2.0.2

Π”Π°Ρ‚Π° выпуска: 11 ΠΌΠ°Ρ€Ρ‚Π° 2026 Π³.

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ вСрсий: v2.0.1...v2.0.2


🎯 ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ измСнСния​

πŸ“Ž Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с мСдиафайлами​

1. Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Π΄ΠΈΠ° Π½Π° Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΡ€ΠΈ отправкС​

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Telegram Π½Π΅ позволяСт ΡΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΌΠ΅Π΄ΠΈΠ° (photo, video, audio) Π² ΠΎΠ΄Π½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠ΅ sendMediaGroup.

РСшСниС:

  • Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠΎΠΉ Ρ‡Π΅Ρ€Π΅Π· send_media_group
  • Photo/Video/Audio ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ вмСстС Π² ΠΎΠ΄Π½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠ΅
  • ГСнСрация ΠΊΠΎΠ΄Π° автоматичСски опрСдСляСт Ρ‚ΠΈΠΏΡ‹ ΠΈ раздСляСт ΠΈΡ…

НовыС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹:

ЀайлНазначСниС
get-media-type-by-url.tsΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΌΠ΅Π΄ΠΈΠ° ΠΏΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡŽ URL
group-media-by-type.tsΠ“Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΌΠ΅Π΄ΠΈΠ°Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠΎ Ρ‚ΠΈΠΏΠ°ΠΌ
split-media-for-sending.tsΠ Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° groupable ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹
can-send-in-one-group.tsΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° возмоТности ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ вмСстС

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:

# Π“Ρ€ΡƒΠΏΠΏΠ° ΠΌΠ΅Π΄ΠΈΠ° (photo/video/audio)
media_group = []
media_group.append(InputMediaPhoto(media="file1.jpg", caption="ВСкст"))
media_group.append(InputMediaVideo(media="file2.mp4"))
await bot.send_media_group(chat_id, media_group)

# Π“Ρ€ΡƒΠΏΠΏΠ° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² (ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ)
document_group = []
document_group.append(InputMediaDocument(media="file3.pdf"))
document_group.append(InputMediaDocument(media="file4.docx"))
await bot.send_media_group(chat_id, document_group)

2. Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ с мСдиагруппами​

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Π’ aiogram 3.x ΠΌΠ΅Ρ‚ΠΎΠ΄ send_media_group() Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ reply_markup.

РСшСниС:

  • ΠœΠ΅Π΄ΠΈΠ°Π³Ρ€ΡƒΠΏΠΏΠ° отправляСтся Π±Π΅Π· ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹
  • ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° отправляСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ сообщСниСм сразу послС ΠΌΠ΅Π΄ΠΈΠ°Π³Ρ€ΡƒΠΏΠΏΡ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:

# ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΌΠ΅Π΄ΠΈΠ°Π³Ρ€ΡƒΠΏΠΏΡ‹
sent_messages = await bot.send_media_group(chat_id, media_group)

# ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ сообщСниСм
if keyboard is not None:
await bot.send_message(chat_id, text, reply_markup=keyboard)

3. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° прямых URL Π² attachedMedia​

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: ΠœΠ΅Π΄ΠΈΠ°Ρ„Π°ΠΉΠ»Ρ‹ с прямыми URL (http/https) Π½Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΠ»ΠΈΡΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ искал ΠΈΡ… Π² Π‘Π”.

РСшСниС:

  • collectMediaVariables Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ добавляСт прямыС URL Π² mediaVariablesMap
  • generateAttachedMediaSendCode ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ прямыС URL Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π±Π΅Π· поиска Π² Π‘Π”
  • Π’ΠΈΠΏ ΠΌΠ΅Π΄ΠΈΠ° опрСдСляСтся ΠΏΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡŽ Ρ„Π°ΠΉΠ»Π° Π² URL

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹:

Π’ΠΈΠΏΠ Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ
Photojpg, jpeg, png, gif, webp, bmp
Videomp4, avi, mov, webm
Audiomp3, wav, ogg
DocumentΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅

🎨 Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса​

4. Π‘ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΌΠ΅Π΄ΠΈΠ°Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ клавиатурС​

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»:

  • ΠŸΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ >1 ΠΌΠ΅Π΄ΠΈΠ°Ρ„Π°ΠΉΠ»ΠΎΠ² β€” показываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ
  • ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ, Π½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΎΠΉ "Π‘ΠΊΡ€Ρ‹Ρ‚"
  • Π‘ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ:
    • ΠŸΠΎΠ»ΡƒΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌ Ρ„ΠΎΠ½ΠΎΠΌ (opacity-60)
    • Π‘Π΅Ρ€ΠΎΠΉ Ρ€Π°ΠΌΠΊΠΎΠΉ вмСсто Π·Π΅Π»Ρ‘Π½ΠΎΠΉ
    • Π§Ρ‘Ρ€Π½ΠΎΠΉ плашкой "Π‘ΠΊΡ€Ρ‹Ρ‚" ΠΏΠΎΠ²Π΅Ρ€Ρ… ΠΏΡ€Π΅Π²ΡŒΡŽ
    • Π‘Π΅ΠΉΠ΄ΠΆΠ΅ΠΌ "Π‘ΠΊΡ€Ρ‹Ρ‚" рядом с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ

Кнопка "Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ всС Ρ„Π°ΠΉΠ»Ρ‹":

  • ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ списком Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΏΠΎΠ»Π΅ΠΌ Π²Π²ΠΎΠ΄Π°
  • ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρƒ (keyboardType = 'none')
  • ВсС Ρ„Π°ΠΉΠ»Ρ‹ снова ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ

АвтоматичСскоС ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹:

  • ΠŸΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° автоматичСски ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ
  • useEffect отслСТиваСт количСство Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ устанавливаСт keyboardType: 'none'
  • ИзмСнСниС сохраняСтся Π² project.json ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ ΠΊΠΎΠ΄Π΅

5. АвтоматичСскоС раскрытиС сСкций ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ контСнта​

РаньшС: ВсС сСкции (ΠΊΡ€ΠΎΠΌΠ΅ "ВСкст сообщСния") Π±Ρ‹Π»ΠΈ свёрнуты ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ: Π‘Π΅ΠΊΡ†ΠΈΠΈ автоматичСски Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ, Ссли Π² Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚:

БСкцияУсловиС раскрытия
πŸ“Ž ΠœΠ΅Π΄ΠΈΠ°Ρ„Π°ΠΉΠ»Ρ‹Π•ΡΡ‚ΡŒ attachedMedia, imageUrl, videoUrl, audioUrl, documentUrl
⌨️ ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°Π•ΡΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΈΠ»ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° (inline/reply)
⚑ ΠΠ²Ρ‚ΠΎΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π’ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Π°Π²Ρ‚ΠΎΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄
πŸ“‹ УсловныС ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡΠ•ΡΡ‚ΡŒ условныС сообщСния
πŸ‘€ Π’Π²ΠΎΠ΄ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠ’ΠΊΠ»ΡŽΡ‡Ρ‘Π½ сбор Π²Π²ΠΎΠ΄Π° (тСкст, Ρ„ΠΎΡ‚ΠΎ, Π²ΠΈΠ΄Π΅ΠΎ, Π°ΡƒΠ΄ΠΈΠΎ, Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹)

6. Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ°Π½Π΅Π»ΠΈ свойств ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽβ€‹

ИзмСнСниС: Π Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ°Π½Π΅Π»ΠΈ свойств ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ с 20% Π΄ΠΎ 25% экрана.

Баланс ΠΌΠ°ΠΊΠ΅Ρ‚Π°:

  • Π‘Π°ΠΉΠ΄Π±Π°Ρ€ (ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹): 20%
  • Π₯олст: 30%
  • ПанСль свойств: 25%
  • ΠžΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅: шапка

🧩 НовыС компонСнты​

InfoBlock​

Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² с Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°ΠΌΠΈ:

<InfoBlock
variant="warning" // info | warning | recommendation
title="⚠️ Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ"
description="ОписаниС"
/>

Π€Π°ΠΉΠ»: client/components/ui/info-block.tsx


ToggleGroup​

ΠŸΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для Π³Ρ€ΡƒΠΏΠΏ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Π΅ΠΉ:

<ToggleGroup
title="Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ"
icon="fa-icon"
colorClasses={{ title: '...', icon: '...' }}
configs={configs}
selectedNode={node}
onNodeUpdate={onNodeUpdate}
description="ОписаниС"
/>

Π€Π°ΠΉΠ»: client/components/editor/properties/components/media/toggle-group.tsx


MediaFileCard​

ΠšΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ° ΠΌΠ΅Π΄ΠΈΠ°Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ скрытых Ρ„Π°ΠΉΠ»ΠΎΠ²:

<MediaFileCard
url="https://..."
fileName="Π€Π°ΠΉΠ» 1"
fileType="image"
isHidden={false}
onRemove={handleRemove}
/>

Π€Π°ΠΉΠ»: client/components/editor/properties/media/media-file-card.tsx


MediaAttachmentsPreview​

ΠŸΡ€Π΅Π²ΡŒΡŽ ΠΌΠ΅Π΄ΠΈΠ°Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π° канвасС с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ скрытия ΠΏΡ€ΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅:

<MediaAttachmentsPreview node={node} />

Π€Π°ΠΉΠ»: client/components/editor/canvas/canvas-node/media-attachments-preview.tsx


πŸ“¦ ОбновлСниС вСрсии​

  • ВСрсия прилоТСния ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π° с 2.0.1 Π΄ΠΎ 2.0.2
  • VersionBadge β€” ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ

πŸ“Š Бтатистика измСнСний​

ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡΠ€Π°ΠΉΠ»ΠΎΠ² ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎΠ‘Ρ‚Ρ€ΠΎΠΊ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎΠ‘Ρ‚Ρ€ΠΎΠΊ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ
Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΌΠ΅Π΄ΠΈΠ°8600+200+
UI ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹10400+300+
Π Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³16500+800+
ВсСго3415141342

πŸ”§ ВСхничСскиС дСтали​

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ мСдиа​

// client/lib/bot-generator/MediaHandler/utils/

get-media-type-by-url.ts // ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΏΠΎ URL
group-media-by-type.ts // Π“Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΠΎ Ρ‚ΠΈΠΏΠ°ΠΌ
split-media-for-sending.ts // Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ
can-send-in-one-group.ts // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° совмСстимости
index.ts // Экспорт всСх ΡƒΡ‚ΠΈΠ»ΠΈΡ‚

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования утилит​

import { splitMediaForSending, getMediaTypeByUrl } from './utils';

// Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Π΄ΠΈΠ°
const { groupable, documents } = splitMediaForSending(mediaUrls);

// groupable: ['file1.jpg', 'file2.mp4', 'file3.mp3']
// documents: ['file4.pdf', 'file5.docx']

// ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°
const type = getMediaTypeByUrl('https://example.com/file.jpg');
// 'photo'

Π›ΠΎΠ³ΠΈΠΊΠ° скрытия файлов​

// Π’ multi-media-selector.tsx
const hasKeyboard = keyboardType === 'inline' || keyboardType === 'reply';
const isHidden = hasKeyboard && index > 0;

// АвтоматичСскоС ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹
useEffect(() => {
if (value.length > 1 && hasKeyboard && onNodeUpdate && nodeId) {
onNodeUpdate(nodeId, { keyboardType: 'none' });
}
}, [value.length, hasKeyboard, onNodeUpdate, nodeId]);

АвтораскрытиС сСкций​

// Π’ properties-panel.tsx
useEffect(() => {
if (!selectedNode?.data) return;

// БСкция ΠΌΠ΅Π΄ΠΈΠ°Ρ„Π°ΠΉΠ»ΠΎΠ²
const hasMedia = selectedNode.data.attachedMedia?.length > 0 ||
selectedNode.data.imageUrl ||
selectedNode.data.videoUrl;
if (hasMedia && !isMediaSectionOpen) {
setIsMediaSectionOpen(true);
}

// БСкция ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹
const hasKeyboard = selectedNode.data.keyboardType !== 'none';
const hasButtons = selectedNode.data.buttons?.length > 0;
if ((hasKeyboard || hasButtons) && !isKeyboardSectionOpen) {
setIsKeyboardSectionOpen(true);
}

// ... ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅ для Π΄Ρ€ΡƒΠ³ΠΈΡ… сСкций
}, [selectedNode?.data, selectedNode?.id]);

πŸš€ Установка​

ОбновлСниС с v2.0.1:​

# ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚
git pull origin main

# УстановитС зависимости
cd client
npm install

# Π‘ΠΎΠ±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚
npm run build

# ЗапуститС
npm run start

Π§Π΅Ρ€Π΅Π· Docker:​

# ΠŸΠ΅Ρ€Π΅ΡΠΎΠ±Π΅Ρ€ΠΈΡ‚Π΅ ΠΎΠ±Ρ€Π°Π·
docker-compose build --no-cache

# ЗапуститС
docker-compose up -d

⚠️ Π’Π°ΠΆΠ½Ρ‹Π΅ замСчания​

Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с aiogram 3.x​

ИзмСнСния Π² Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ особСнности aiogram 3.x:

  • send_media_group() Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ reply_markup
  • ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° отправляСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ сообщСниСм
  • Π­Ρ‚ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π²ΠΎ всСх случаях

ΠžΠ±Ρ€Π°Ρ‚Π½Π°Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒβ€‹

  • ВсС измСнСния ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ совмСстимы
  • Π‘Ρ‚Π°Ρ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ
  • НовыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ Π½ΠΎΠ²Ρ‹ΠΌ ΡƒΠ·Π»Π°ΠΌ

ΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΡ проСктов​

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹, созданныС Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… вСрсиях, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ. НовыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ автоматичСски ΠΏΡ€ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΡƒΠ·Π»ΠΎΠ².


πŸ› Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡβ€‹

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Π Π΅ΡˆΠ΅Π½ΠΈΠ΅
send_media_group() got an unexpected keyword argument 'reply_markup'ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° отправляСтся Ρ‡Π΅Ρ€Π΅Π· send_message()
ΠœΠ΅Π΄ΠΈΠ°Ρ„Π°ΠΉΠ»Ρ‹ с прямыми URL Π½Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΠ»ΠΈΡΡŒΠŸΡ€ΡΠΌΡ‹Π΅ URL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π±Π΅Π· поиска Π² Π‘Π”
Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ ΠΎΡˆΠΈΠ±ΠΊΡƒ TelegramΠ”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠΎΠΉ
Π‘Π΅ΠΊΡ†ΠΈΠΈ ΡΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π»ΠΈΡΡŒ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΡƒΠ·Π»ΠΎΠ²Π‘Π΅ΠΊΡ†ΠΈΠΈ автоматичСски Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°

πŸ“‹ Π§Π΅ΠΊ-лист измСнСний​

  • Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Π΄ΠΈΠ° Π½Π° Π³Ρ€ΡƒΠΏΠΏΡ‹ (Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ)
  • Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ с ΠΌΠ΅Π΄ΠΈΠ°Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ
  • ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° прямых URL Π² attachedMedia
  • Π‘ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π»ΠΈΡˆΠ½ΠΈΡ… ΠΌΠ΅Π΄ΠΈΠ°Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€ΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅
  • Кнопка "Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ всС Ρ„Π°ΠΉΠ»Ρ‹"
  • АвтоматичСскоС ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΏΡ€ΠΈ >1 Ρ„Π°ΠΉΠ»ΠΎΠ²
  • АвтоматичСскоС раскрытиС сСкций
  • Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ°Π½Π΅Π»ΠΈ свойств Π΄ΠΎ 25%
  • НовыС ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹
  • Π£Ρ‚ΠΈΠ»ΠΈΡ‚Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΠ΅Π΄ΠΈΠ°Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ
  • ОбновлСна вСрсия Π΄ΠΎ 2.0.2

πŸ”— Бсылки​


ΠŸΠΎΠ»Π½Ρ‹ΠΉ список ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ: ΠšΠΎΠΌΠΌΠΈΡ‚Ρ‹ v2.0.1...v2.0.2