From ec70d1f59d0ae39ae3805874f3585e357de6df5b Mon Sep 17 00:00:00 2001 From: cheykrym Date: Fri, 12 Dec 2025 01:37:22 +0300 Subject: [PATCH] add context menu in msg --- yobble/Resources/Localizable.xcstrings | 18 ++++++ yobble/Views/Chat/PrivateChatView.swift | 86 +++++++++++++++++++++++++ 2 files changed, 104 insertions(+) diff --git a/yobble/Resources/Localizable.xcstrings b/yobble/Resources/Localizable.xcstrings index 4bdff9e..726d36b 100644 --- a/yobble/Resources/Localizable.xcstrings +++ b/yobble/Resources/Localizable.xcstrings @@ -491,6 +491,9 @@ } } } + }, + "Выбрать" : { + }, "Выйти из аккаунта" : { "localizations" : { @@ -728,6 +731,9 @@ } } } + }, + "Закрепить" : { + }, "Закрепить (скоро)" : { @@ -983,6 +989,9 @@ }, "Концепт" : { "comment" : "Tab bar: concept clicker" + }, + "Копировать" : { + }, "Корзина" : { "comment" : "Cart", @@ -1791,6 +1800,9 @@ }, "Основной режим находится в ранней разработке (около 10%)." : { + }, + "Ответить" : { + }, "Отключить" : { "comment" : "Кнопка подтверждения отключения 2FA" @@ -2050,6 +2062,9 @@ }, "Перейдите в раздел \"Настройки > Сменить пароль\" и следуйте инструкциям." : { "comment" : "FAQ answer: reset password" + }, + "Переслать" : { + }, "По умолчанию это полноценная соцсеть с лентой, историями и подписками. Если нужно только общение без лишнего контента, переключитесь на режим “Только чаты”. Переключить режим можно в любой момент." : { @@ -2484,6 +2499,9 @@ }, "Профиль пока не загружен. Попробуйте позже." : { "comment" : "Profile not ready error" + }, + "Прочитано" : { + }, "Прямого сброса пароля нет: сменить его можно только из настроек, уже будучи в аккаунте. Если привязана почта или другое 2FA-устройство, воспользуйтесь входом по коду - он подтвердит вашу личность и пустит в аккаунт. После входа откройте настройки → безопасность и задайте новый пароль." : { diff --git a/yobble/Views/Chat/PrivateChatView.swift b/yobble/Views/Chat/PrivateChatView.swift index 5572ebb..730f129 100644 --- a/yobble/Views/Chat/PrivateChatView.swift +++ b/yobble/Views/Chat/PrivateChatView.swift @@ -259,6 +259,92 @@ struct PrivateChatView: View { .padding(.horizontal, 8) .padding(.top, topPadding) .padding(.vertical, verticalPadding) + .contextMenu { + if isCurrentUser { + if message.isViewed == true { + Text("Прочитано") // Placeholder for read status + } + Button(action: { + // Reply action + }) { + Text("Ответить") + Image(systemName: "arrowshape.turn.up.left") + } + Button(action: { + // Copy action + }) { + Text("Копировать") + Image(systemName: "doc.on.doc") + } + Button(action: { + // Edit action + }) { + Text("Изменить") + Image(systemName: "pencil") + } + Button(action: { + // Pin action + }) { + Text("Закрепить") + Image(systemName: "pin") + } + Button(action: { + // Forward action + }) { + Text("Переслать") + Image(systemName: "arrowshape.turn.up.right") + } + Button(role: .destructive, action: { + // Delete action + }) { + Text("Удалить") + Image(systemName: "trash") + } + Button(action: { + // Select action + }) { + Text("Выбрать") + Image(systemName: "checkmark.circle") + } + } else { + Button(action: { + // Reply action + }) { + Text("Ответить") + Image(systemName: "arrowshape.turn.up.left") + } + Button(action: { + // Copy action + }) { + Text("Копировать") + Image(systemName: "doc.on.doc") + } + Button(action: { + // Pin action + }) { + Text("Закрепить") + Image(systemName: "pin") + } + Button(action: { + // Forward action + }) { + Text("Переслать") + Image(systemName: "arrowshape.turn.up.right") + } + Button(role: .destructive, action: { + // Delete action + }) { + Text("Удалить") + Image(systemName: "trash") + } + Button(action: { + // Select action + }) { + Text("Выбрать") + Image(systemName: "checkmark.circle") + } + } + } } private func messageBubble(