8000 Redesign `ChatMessage` delete popup (#1268) by ekrem-qb · Pull Request #1291 · team113/messenger · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Redesign ChatMessage delete popup (#1268) #1291

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 17 commits into from
Jun 26, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ All user visible changes to this project will be documented in this file. This p
### Changed

- UI:
- Chat page:
- Redesigned message delete popups. ([#1291], [#1268])
- Media panel:
- Default order of call buttons in dock. ([#1294], [#1263])

Expand All @@ -26,8 +28,10 @@ All user visible changes to this project will be documented in this file. This p
- Inability to proceed to recover access with username not being empty. ([#1285])

[#1263]: /../../issue/1263
[#1268]: /../../issue/1268
[#1280]: /../../pull/1280
[#1285]: /../../pull/1285
[#1291]: /../../pull/1291
[#1294]: /../../pull/1294


Expand Down
15 changes: 14 additions & 1 deletion assets/icons/delete19_white.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
11 changes: 5 additions & 6 deletions assets/l10n/en-US.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -545,6 +545,7 @@ label_ago_date = {$years ->
label_all = All
label_all_chats_and_groups = All chats and groups
label_all_session_except_current_terminated = All sessions except this one will be terminated
label_also_delete_for_everyone = Also delete for everyone
label_always_muted = Always muted
label_any_button_or_combination = Any button or combination
label_app_background = Application background
Expand Down Expand Up @@ -656,10 +657,8 @@ label_delete_account = Delete account
label_delete_chat = Delete chat
label_delete_chats = Delete chats
label_delete_email = Delete E-mail
label_delete_for_everyone = Delete for everyone
label_delete_for_me = Delete for me
label_delete_message = Delete the message?
label_delete_messages = Delete the messages?
label_delete_message = Delete the message
label_delete_messages = Delete the messages
label_delivered = Delivered
label_desktop_apps = Desktop apps
label_device_by_default = By default - {$device}
Expand Down Expand Up @@ -774,8 +773,6 @@ label_media_section_hint = Microphone, speaker, camera
label_media_settings = Media settings
label_message = Message
label_message_editing = Message editing
label_message_will_deleted_for_you = The message will be deleted only for you.
label_messages_will_deleted_for_you = The messages will be deleted only for you.
label_microphone_changed = Microphone has been changed to {$microphone}
label_mobile_apps = Mobile apps
label_money = Money
Expand Down Expand Up @@ -972,7 +969,9 @@ label_terminate_sessions = Terminate session(s)
label_terms_and_privacy_policy = Terms & Privacy policy
label_text_status = Text status
label_text_status_description = 25 symbols max
label_these_messages_will_be_deleted_only_for_you = These messages will be deleted only for you
label_this_device = This device
label_this_message_will_be_deleted_only_for_you = This message will be deleted only for you
label_to_restore_chat_use_search = To restore the chat, please, use the search.
label_to_restore_chats_use_search = To restore the chats, please, use the search.
label_typing = Typing
Expand Down
11 changes: 5 additions & 6 deletions assets/l10n/ru-RU.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,7 @@ label_ago_date = {$years ->
label_all = Все
label_all_chats_and_groups = Все чаты и группы
label_all_session_except_current_terminated = Все сессии, кроме текущей, будут завершены
label_also_delete_for_everyone = Также удалить для всех
label_always_muted = Заглушённые чаты
label_any_button_or_combination = Любая кнопка или комбинация
label_app_background = Фон приложения
Expand Down Expand Up @@ -678,10 +679,8 @@ label_delete_account = Удалить аккаунт
label_delete_chat = Удалить чат
label_delete_chats = Удалить чаты
label_delete_email = Удалить E-mail
label_delete_for_everyone = Удалить для всех
label_delete_for_me = Удалить для меня
label_delete_message = Удалить сообщение?
label_delete_messages = Удалить сообщения?
label_delete_message = Удалить сообщение
label_delete_messages = Удалить сообщения
label_delivered = Доставлено
label_desktop_apps = Десктопные приложения
label_device_by_default = По умолчанию - {$device}
Expand Down Expand Up @@ -796,8 +795,6 @@ label_media_section_hint = Микрофон, спикер, камера
label_media_settings = Настройки медиа
label_message = Сообщение
label_message_editing = Редактирование сообщения
label_message_will_deleted_for_you = Сообщение будет удалено только для Вас.
label_messages_will_deleted_for_you = Сообщения будут удалены только для Вас.
label_microphone_changed = Микрофон был изменён на {$microphone}
label_mobile_apps = Мобильные приложения
label_money = Деньги
Expand Down Expand Up @@ -997,7 +994,9 @@ label_terminate_sessions = Завершить сессию(-ии)
label_terms_and_privacy_policy = Условия и политика конфиденциальности
label_text_status = Текстовый статус
label_text_status_description = Максимум 25 символов
label_these_messages_will_be_deleted_only_for_you = Эти сообщения будут удалены только у Вас
label_this_device = Это устройство
label_this_message_will_be_deleted_only_for_you = Это сообщение будет удалено только у Вас
label_to_restore_chat_use_search = Чтобы восстановить чат, пожалуйста, воспользуйтесь поиском.
label_to_restore_chats_use_search = Чтобы восстановить чаты, пожалуйста, воспользуйтесь поиском.
label_typing = Печатает
Expand Down
115 changes: 63 additions & 52 deletions lib/ui/page/home/page/chat/view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,11 @@ import '/ui/page/call/widget/conditional_backdrop.dart';
import '/ui/page/call/widget/fit_view.dart';
import '/ui/page/home/widget/app_bar.dart';
import '/ui/page/home/widget/avatar.dart';
import '/ui/page/home/widget/confirm_dialog.dart';
import '/ui/page/home/widget/highlighted_container.dart';
import '/ui/page/home/widget/unblock_button.dart';
import '/ui/widget/animated_button.dart';
import '/ui/widget/animated_switcher.dart';
import '/ui/widget/checkbox_button.dart';
import '/ui/widget/context_menu/menu.dart';
import '/ui/widget/context_menu/region.dart';
import '/ui/widget/future_or_builder.dart';
Expand Down Expand Up @@ -1413,67 +1413,78 @@ class ChatView extends StatelessWidget {
enabled: canDelete,
onPressed: canDelete
? () async {
final bool deletable =
c.chat?.chat.value.isMonolog == true ||
c.selected.every((e) {
if (e is ChatMessageElement) {
return e.item.value.author.id == c.me &&
c.chat?.chat.value.isRead(
e.item.value,
c.me,
) ==
false;
} else if (e is ChatForwardElement) {
return e.authorId == c.me &&
c.chat?.chat.value.isRead(
e.forwards.first.value,
c.me,
) ==
false;
} else if (e is ChatInfoElement) {
return false;
} else if (e is ChatCallElement) {
return false;
}
final bool isMonolog =
c.chat?.chat.value.isMonolog ?? false;

final bool deletable = c.selected.every((e) {
if (e is ChatMessageElement) {
return e.item.value.author.id == c.me &&
c.chat?.chat.value.isRead(
e.item.value,
c.me,
) ==
false;
} else if (e is ChatForwardElement) {
return e.authorId == c.me &&
c.chat?.chat.value.isRead(
e.forwards.first.value,
c.me,
) ==
false;
} else if (e is ChatInfoElement) {
return false;
} else if (e is ChatCallElement) {
return false;
}

return false;
});
return false;
});

final result = await ConfirmDialog.show(
context,
title: c.selected.length > 1
bool deleteForAll = false;

final bool? pressed = await MessagePopup.alert(
c.selected.length > 1
? 'label_delete_messages'.l10n
: 'label_delete_message'.l10n,
description: deletable
? null
: c.selected.length > 1
? 'label_messages_will_deleted_for_you'.l10n
: 'label_message_will_deleted_for_you'.l10n,
initial: 1,
variants: [
ConfirmDialogVariant(
key: const Key('HideForMe'),
label: 'label_delete_for_me'.l10n,
onProceed: () async {
return await Future.wait(
c.selected.asItems.map(c.hideChatItem),
);
},
),
if (deletable)
ConfirmDialogVariant(
key: const Key('DeleteForAll'),
label: 'label_delete_for_everyone'.l10n,
onProceed: () async {
return await Future.wait(
c.selected.asItems.map(c.deleteMessage),
description: [
if (!deletable && !isMonolog)
TextSpan(
text: c.selected.length > 1
? 'label_these_messages_will_be_deleted_only_for_you'
.l10n
: 'label_this_message_will_be_deleted_only_for_you'
.l10n,
),
],
additional: [
if (deletable && !isMonolog)
StatefulBuilder(
builder: (context, setState) {
return RowCheckboxButton(
key: const Key('DeleteForAll'),
label: 'label_also_delete_for_everyone'
.l10n,
value: deleteForAll,
onPressed: (e) =>
setState(() => deleteForAll = e),
);
},
),
],
button: MessagePopup.deleteButton,
);

if (result != null) {
if (pressed ?? false) {
if (deletable && (isMonolog || deleteForAll)) {
await Future.wait(
c.selected.asItems.map(c.deleteMessage),
);
} else {
await Future.wait(
c.selected.asItems.map(c.hideChatItem),
);
}

c.selecting.value = false;
}
}
Expand Down
53 changes: 35 additions & 18 deletions lib/ui/page/home/page/chat/widget/chat_forward.dart
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,14 @@ import '/ui/page/call/widget/fit_view.dart';
import '/ui/page/home/page/chat/controller.dart';
import '/ui/page/home/page/chat/forward/view.dart';
import '/ui/page/home/widget/avatar.dart';
import '/ui/page/home/widget/confirm_dialog.dart';
import '/ui/page/home/widget/gallery_popup.dart';
import '/ui/widget/checkbox_button.dart';
import '/ui/widget/context_menu/menu.dart';
import '/ui/widget/context_menu/region.dart';
import '/ui/widget/future_or_builder.dart';
import '/ui/widget/svg/svg.dart';
import '/ui/widget/widget_button.dart';
import '/util/message_popup.dart';
import '/util/platform_utils.dart';
import 'animated_offset.dart';
import 'chat_item.dart';
Expand Down Expand Up @@ -1066,27 +1067,43 @@ class _ChatForwardWidgetState extends State<ChatForwardWidget> {
widget.me,
);

await ConfirmDialog.show(
context,
title: 'label_delete_message'.l10n,
description: deletable || isMonolog
? null
: 'label_message_will_deleted_for_you'.l10n,
variants: [
if (!deletable || !isMonolog)
ConfirmDialogVariant(
key: const Key('HideForMe'),
onProceed: widget.onHide,
label: 'label_delete_for_me'.l10n,
bool deleteForAll = false;

final bool? pressed = await MessagePopup.alert(
'label_delete_message'.l10n,
description: [
if (!deletable && !isMonolog)
TextSpan(
text:
'label_this_message_will_be_deleted_only_for_you'
.l10n,
),
if (deletable)
ConfirmDialogVariant(
key: const Key('DeleteForAll'),
onProceed: widget.onDelete,
label: 'label_delete_for_everyone'.l10n,
],
additional: [
if (deletable && !isMonolog)
StatefulBuilder(
builder: (context, setState) {
return RowCheckboxButton(
key: const Key('DeleteForAll'),
label: 'label_also_delete_for_everyone'
.l10n,
value: deleteForAll,
onPressed: (e) =>
setState(() => deleteForAll = e),
);
},
),
],
button: MessagePopup.deleteButton,
);

if (pressed ?? false) {
if (deletable && (isMonolog || deleteForAll)) {
widget.onDelete?.call();
} else if (!isMonolog) {
widget.onHide?.call();
}
}
},
),
ContextMenuButton(
Expand Down
Loading
Loading
0