Добавить в меню действий с сообщением возможность скопировать текст сообщения #13

Closed
opened 2026-08-28 14:29:02 +07:00 by wt · 0 comments
Owner

Задача: Добавить в меню действий с сообщением возможность скопировать текст сообщения

Описание:
В настоящее время контекстное меню сообщения содержит действия: ответить, переслать, редактировать, удалить у всех, удалить у меня. Необходимо добавить новый пункт «Копировать текст», который позволит пользователю скопировать текстовое содержимое сообщения в системный буфер обмена.

Требования:

  1. Добавить пункт меню:

    • В контекстное меню (долгий тап / правая кнопка мыши на macOS) для текстовых сообщений добавить пункт «Копировать текст».
    • Пункт должен быть доступен только для сообщений, содержащих текст (обычные текстовые сообщения, а также сообщения с подписью к медиа).
    • Для сообщений, содержащих только медиа (фото, видео, аудио, геопозиция), пункт должен отсутствовать или быть неактивным.
  2. Логика копирования:

    • При выборе пункта текст сообщения копируется в UIPasteboard.general (iOS/macOS) или NSPasteboard.general (macOS).
    • Для зашифрованных OMEMO-сообщений текст должен быть скопирован после расшифровки (в исходном виде, в котором он отображается пользователю).
    • Для сообщений с вложениями (например, фото с подписью) копируется только текст подписи.
  3. UX/UI:

    • Название пункта: «Копировать текст» (локализация в будущем не требуется, но желательно вынести в строковые ресурсы).
    • Иконка: стандартная иконка копирования (системная doc.on.doc для SwiftUI).
    • Пункт должен располагаться в логическом порядке меню (например, после «Ответить» и перед «Переслать» или в конце списка).
  4. Платформы:

    • Функция должна работать на iOS, iPadOS, macOS и watchOS (для watchOS — через контекстное меню или альтернативный способ, если меню не поддерживается).
    • На watchOS, если контекстное меню недоступно, можно добавить кнопку копирования в детальном просмотре сообщения.

Технические детали:

  • Вероятнее всего, меню реализовано через SwiftUI .contextMenu в представлении ячейки сообщения (MessageView или аналогичное).
  • Необходимо найти или создать View для сообщения, добавить в .contextMenu новый Button с действием копирования.
  • Действие копирования должно использовать UIPasteboard или NSPasteboard в зависимости от платформы (можно использовать #if os(macOS)).
  • Текст сообщения доступен через модель данных (например, Message.text или вычисляемое свойство).
  • Убедиться, что копирование работает для расшифрованных OMEMO-сообщений (если расшифровка происходит асинхронно, возможно, потребуется дождаться результата).

Критерии приемки:

  • В контекстном меню текстового сообщения отображается пункт «Копировать текст».
  • При выборе пункта текст сообщения успешно копируется в буфер обмена.
  • Пункт не отображается для сообщений без текста (медиа, геопозиция, служебные сообщения).
  • Функция работает на всех целевых платформах (iOS, iPadOS, macOS, watchOS).
  • Копирование работает для OMEMO-зашифрованных сообщений.
  • Интерфейс не теряет производительность при открытии меню (меню открывается без задержек).

Дополнительные рекомендации:

  • Для единообразия с другими действиями (ответ, пересылка) рекомендуется вынести логику копирования в отдельный ViewModel или сервис.
  • Если в приложении используется кастомное меню (не SwiftUI .contextMenu), необходимо адаптировать задачу под существующую реализацию.
  • Для watchOS, если контекстное меню недоступно, можно использовать Menu или добавить кнопку в детальный просмотр.

Примерная реализация (SwiftUI):

.contextMenu {
    if message.hasText {
        Button(action: {
            #if os(macOS)
            NSPasteboard.general.clearContents()
            NSPasteboard.general.setString(message.text, forType: .string)
            #else
            UIPasteboard.general.string = message.text
            #endif
        }) {
            Label("Копировать текст", systemImage: "doc.on.doc")
        }
    }
    // остальные пункты меню...
}
### **Задача: Добавить в меню действий с сообщением возможность скопировать текст сообщения** **Описание:** В настоящее время контекстное меню сообщения содержит действия: ответить, переслать, редактировать, удалить у всех, удалить у меня. Необходимо добавить новый пункт «Копировать текст», который позволит пользователю скопировать текстовое содержимое сообщения в системный буфер обмена. **Требования:** 1. **Добавить пункт меню:** - В контекстное меню (долгий тап / правая кнопка мыши на macOS) для текстовых сообщений добавить пункт «Копировать текст». - Пункт должен быть доступен только для сообщений, содержащих текст (обычные текстовые сообщения, а также сообщения с подписью к медиа). - Для сообщений, содержащих только медиа (фото, видео, аудио, геопозиция), пункт должен отсутствовать или быть неактивным. 2. **Логика копирования:** - При выборе пункта текст сообщения копируется в `UIPasteboard.general` (iOS/macOS) или `NSPasteboard.general` (macOS). - Для зашифрованных OMEMO-сообщений текст должен быть скопирован после расшифровки (в исходном виде, в котором он отображается пользователю). - Для сообщений с вложениями (например, фото с подписью) копируется только текст подписи. 3. **UX/UI:** - Название пункта: «Копировать текст» (локализация в будущем не требуется, но желательно вынести в строковые ресурсы). - Иконка: стандартная иконка копирования (системная `doc.on.doc` для SwiftUI). - Пункт должен располагаться в логическом порядке меню (например, после «Ответить» и перед «Переслать» или в конце списка). 4. **Платформы:** - Функция должна работать на **iOS, iPadOS, macOS и watchOS** (для watchOS — через контекстное меню или альтернативный способ, если меню не поддерживается). - На watchOS, если контекстное меню недоступно, можно добавить кнопку копирования в детальном просмотре сообщения. **Технические детали:** - Вероятнее всего, меню реализовано через SwiftUI `.contextMenu` в представлении ячейки сообщения (`MessageView` или аналогичное). - Необходимо найти или создать `View` для сообщения, добавить в `.contextMenu` новый `Button` с действием копирования. - Действие копирования должно использовать `UIPasteboard` или `NSPasteboard` в зависимости от платформы (можно использовать `#if os(macOS)`). - Текст сообщения доступен через модель данных (например, `Message.text` или вычисляемое свойство). - Убедиться, что копирование работает для расшифрованных OMEMO-сообщений (если расшифровка происходит асинхронно, возможно, потребуется дождаться результата). **Критерии приемки:** - [x] В контекстном меню текстового сообщения отображается пункт «Копировать текст». - [x] При выборе пункта текст сообщения успешно копируется в буфер обмена. - [x] Пункт не отображается для сообщений без текста (медиа, геопозиция, служебные сообщения). - [x] Функция работает на всех целевых платформах (iOS, iPadOS, macOS, watchOS). - [x] Копирование работает для OMEMO-зашифрованных сообщений. - [x] Интерфейс не теряет производительность при открытии меню (меню открывается без задержек). **Дополнительные рекомендации:** - Для единообразия с другими действиями (ответ, пересылка) рекомендуется вынести логику копирования в отдельный `ViewModel` или сервис. - Если в приложении используется кастомное меню (не SwiftUI `.contextMenu`), необходимо адаптировать задачу под существующую реализацию. - Для watchOS, если контекстное меню недоступно, можно использовать `Menu` или добавить кнопку в детальный просмотр. **Примерная реализация (SwiftUI):** ```swift .contextMenu { if message.hasText { Button(action: { #if os(macOS) NSPasteboard.general.clearContents() NSPasteboard.general.setString(message.text, forType: .string) #else UIPasteboard.general.string = message.text #endif }) { Label("Копировать текст", systemImage: "doc.on.doc") } } // остальные пункты меню... } ```
wt added the Kind/Feature
Priority
High
2
labels 2026-08-28 14:29:02 +07:00
wt self-assigned this 2026-08-28 14:29:02 +07:00
wt added reference issue-13 2026-08-28 14:52:14 +07:00
wt started working 2026-08-28 15:18:15 +07:00
wt worked for 7 minutes 2026-08-28 15:25:34 +07:00
wt added the Kind/Testing label 2026-08-28 15:25:44 +07:00
wt added the
Reviewed
Confirmed
1
label 2026-08-28 20:15:47 +07:00
wt closed this issue 2026-08-28 20:15:55 +07:00
Sign in to join this conversation.