Skip to content

compose: Support editing an already-sent message #1314

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

Closed
wants to merge 1 commit into from
Closed
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
Binary file modified assets/icons/ZulipIcons.ttf
Binary file not shown.
4 changes: 4 additions & 0 deletions assets/icons/edit.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
28 changes: 28 additions & 0 deletions assets/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -685,6 +685,14 @@
"@messageIsMovedLabel": {
"description": "Label for a moved message. (Use ALL CAPS for cased alphabets: Latin, Greek, Cyrillic, etc.)"
},
"messageIsEditingLabel": "SAVING EDIT...",
"@messageIsEditingLabel": {
"description": "Label shown while a message edit is being saved. (Use ALL CAPS for cased alphabets: Latin, Greek, Cyrillic, etc.)"
},
"messageIsEditErrorLabel": "EDIT ISN'T SAVED. CHECK YOUR CONNECTION.",
"@messageIsEditErrorLabel": {
"description": "Label shown when a message edit failed to save. (Use ALL CAPS for cased alphabets: Latin, Greek, Cyrillic, etc.)"
},
"pollWidgetQuestionMissing": "No question.",
"@pollWidgetQuestionMissing": {
"description": "Text to display for a poll when the question is missing"
Expand Down Expand Up @@ -716,5 +724,25 @@
"emojiPickerSearchEmoji": "Search emoji",
"@emojiPickerSearchEmoji": {
"description": "Hint text for the emoji picker search text field."
},
"actionSheetOptionEditMessage": "Edit",
"@actionSheetOptionEditMessage": {
"description": "Label for action sheet button to edit a message."
},
"errorEditingFailed": "Failed to edit message",
"@errorEditingFailed": {
"description": "Error title when editing a message fails."
},
"editMessageSaveTooltip": "Save changes",
"@editMessageSaveTooltip": {
"description": "Tooltip for the save button when editing a message"
},
"editMessageTitle": "Edit the message",
"@editMessageTitle": {
"description": "Title shown in the edit message banner"
},
"dialogSave": "Save",
"@dialogSave": {
"description": "Button label to save changes"
}
}
22 changes: 16 additions & 6 deletions lib/api/model/model.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:json_annotation/json_annotation.dart';
import 'package:flutter/foundation.dart';

import 'events.dart';
import 'initial_snapshot.dart';
Expand Down Expand Up @@ -541,8 +542,15 @@ sealed class Message {
final String contentType;

// final List<MessageEditHistory> editHistory; // TODO handle
@JsonKey(readValue: MessageEditState._readFromMessage, fromJson: Message._messageEditStateFromJson)
MessageEditState editState;
@JsonKey(readValue: MessageEditState._readFromMessage, fromJson: _messageEditStateFromJson)
final ValueNotifier<MessageEditState> _editStateNotifier;

MessageEditState get editState => _editStateNotifier.value;
set editState(MessageEditState value) {
_editStateNotifier.value = value;
}

ValueNotifier<MessageEditState> get editStateNotifier => _editStateNotifier;

final int id;
bool isMeMessage;
Expand Down Expand Up @@ -572,7 +580,7 @@ sealed class Message {
@JsonKey(name: 'match_subject')
final String? matchTopic;

static MessageEditState _messageEditStateFromJson(Object? json) {
static MessageEditState _messageEditStateFromJson(dynamic json) {
// This is a no-op so that [MessageEditState._readFromMessage]
// can return the enum value directly.
return json as MessageEditState;
Expand Down Expand Up @@ -603,7 +611,7 @@ sealed class Message {
required this.client,
required this.content,
required this.contentType,
required this.editState,
required MessageEditState editState,
required this.id,
required this.isMeMessage,
required this.lastEditTimestamp,
Expand All @@ -617,7 +625,7 @@ sealed class Message {
required this.flags,
required this.matchContent,
required this.matchTopic,
});
}) : _editStateNotifier = ValueNotifier(editState);

factory Message.fromJson(Map<String, dynamic> json) {
final type = json['type'] as String;
Expand Down Expand Up @@ -863,7 +871,9 @@ class DmMessage extends Message {
enum MessageEditState {
none,
edited,
moved;
moved,
editing,
editError;

/// Whether the given topic move reflected either a "resolve topic"
/// or "unresolve topic" operation.
Expand Down
42 changes: 42 additions & 0 deletions lib/generated/l10n/zulip_localizations.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1023,6 +1023,18 @@ abstract class ZulipLocalizations {
/// **'MOVED'**
String get messageIsMovedLabel;

/// Label shown while a message edit is being saved. (Use ALL CAPS for cased alphabets: Latin, Greek, Cyrillic, etc.)
///
/// In en, this message translates to:
/// **'SAVING EDIT...'**
String get messageIsEditingLabel;

/// Label shown when a message edit failed to save. (Use ALL CAPS for cased alphabets: Latin, Greek, Cyrillic, etc.)
///
/// In en, this message translates to:
/// **'EDIT ISN\'T SAVED. CHECK YOUR CONNECTION.'**
String get messageIsEditErrorLabel;

/// Text to display for a poll when the question is missing
///
/// In en, this message translates to:
Expand Down Expand Up @@ -1070,6 +1082,36 @@ abstract class ZulipLocalizations {
/// In en, this message translates to:
/// **'Search emoji'**
String get emojiPickerSearchEmoji;

/// Label for action sheet button to edit a message.
///
/// In en, this message translates to:
/// **'Edit'**
String get actionSheetOptionEditMessage;

/// Error title when editing a message fails.
///
/// In en, this message translates to:
/// **'Failed to edit message'**
String get errorEditingFailed;

/// Tooltip for the save button when editing a message
///
/// In en, this message translates to:
/// **'Save changes'**
String get editMessageSaveTooltip;

/// Title shown in the edit message banner
///
/// In en, this message translates to:
/// **'Edit the message'**
String get editMessageTitle;

/// Button label to save changes
///
/// In en, this message translates to:
/// **'Save'**
String get dialogSave;
}

class _ZulipLocalizationsDelegate extends LocalizationsDelegate<ZulipLocalizations> {
Expand Down
21 changes: 21 additions & 0 deletions lib/generated/l10n/zulip_localizations_ar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -541,6 +541,12 @@ class ZulipLocalizationsAr extends ZulipLocalizations {
@override
String get messageIsMovedLabel => 'MOVED';

@override
String get messageIsEditingLabel => 'SAVING EDIT...';

@override
String get messageIsEditErrorLabel => 'EDIT ISN\'T SAVED. CHECK YOUR CONNECTION.';

@override
String get pollWidgetQuestionMissing => 'No question.';

Expand All @@ -564,4 +570,19 @@ class ZulipLocalizationsAr extends ZulipLocalizations {

@override
String get emojiPickerSearchEmoji => 'Search emoji';

@override
String get actionSheetOptionEditMessage => 'Edit';

@override
String get errorEditingFailed => 'Failed to edit message';

@override
String get editMessageSaveTooltip => 'Save changes';

@override
String get editMessageTitle => 'Edit the message';

@override
String get dialogSave => 'Save';
}
21 changes: 21 additions & 0 deletions lib/generated/l10n/zulip_localizations_en.dart
Original file line number Diff line number Diff line change
Expand Up @@ -541,6 +541,12 @@ class ZulipLocalizationsEn extends ZulipLocalizations {
@override
String get messageIsMovedLabel => 'MOVED';

@override
String get messageIsEditingLabel => 'SAVING EDIT...';

@override
String get messageIsEditErrorLabel => 'EDIT ISN\'T SAVED. CHECK YOUR CONNECTION.';

@override
String get pollWidgetQuestionMissing => 'No question.';

Expand All @@ -564,4 +570,19 @@ class ZulipLocalizationsEn extends ZulipLocalizations {

@override
String get emojiPickerSearchEmoji => 'Search emoji';

@override
String get actionSheetOptionEditMessage => 'Edit';

@override
String get errorEditingFailed => 'Failed to edit message';

@override
String get editMessageSaveTooltip => 'Save changes';

@override
String get editMessageTitle => 'Edit the message';

@override
String get dialogSave => 'Save';
}
21 changes: 21 additions & 0 deletions lib/generated/l10n/zulip_localizations_ja.dart
Original file line number Diff line number Diff line change
Expand Up @@ -541,6 +541,12 @@ class ZulipLocalizationsJa extends ZulipLocalizations {
@override
String get messageIsMovedLabel => 'MOVED';

@override
String get messageIsEditingLabel => 'SAVING EDIT...';

@override
String get messageIsEditErrorLabel => 'EDIT ISN\'T SAVED. CHECK YOUR CONNECTION.';

@override
String get pollWidgetQuestionMissing => 'No question.';

Expand All @@ -564,4 +570,19 @@ class ZulipLocalizationsJa extends ZulipLocalizations {

@override
String get emojiPickerSearchEmoji => 'Search emoji';

@override
String get actionSheetOptionEditMessage => 'Edit';

@override
String get errorEditingFailed => 'Failed to edit message';

@override
String get editMessageSaveTooltip => 'Save changes';

@override
String get editMessageTitle => 'Edit the message';

@override
String get dialogSave => 'Save';
}
21 changes: 21 additions & 0 deletions lib/generated/l10n/zulip_localizations_nb.dart
Original file line number Diff line number Diff line change
Expand Up @@ -541,6 +541,12 @@ class ZulipLocalizationsNb extends ZulipLocalizations {
@override
String get messageIsMovedLabel => 'MOVED';

@override
String get messageIsEditingLabel => 'SAVING EDIT...';

@override
String get messageIsEditErrorLabel => 'EDIT ISN\'T SAVED. CHECK YOUR CONNECTION.';

@override
String get pollWidgetQuestionMissing => 'No question.';

Expand All @@ -564,4 +570,19 @@ class ZulipLocalizationsNb extends ZulipLocalizations {

@override
String get emojiPickerSearchEmoji => 'Search emoji';

@override
String get actionSheetOptionEditMessage => 'Edit';

@override
String get errorEditingFailed => 'Failed to edit message';

@override
String get editMessageSaveTooltip => 'Save changes';

@override
String get editMessageTitle => 'Edit the message';

@override
String get dialogSave => 'Save';
}
21 changes: 21 additions & 0 deletions lib/generated/l10n/zulip_localizations_pl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -541,6 +541,12 @@ class ZulipLocalizationsPl extends ZulipLocalizations {
@override
String get messageIsMovedLabel => 'PRZENIESIONO';

@override
String get messageIsEditingLabel => 'SAVING EDIT...';

@override
String get messageIsEditErrorLabel => 'EDIT ISN\'T SAVED. CHECK YOUR CONNECTION.';

@override
String get pollWidgetQuestionMissing => 'Brak pytania.';

Expand All @@ -564,4 +570,19 @@ class ZulipLocalizationsPl extends ZulipLocalizations {

@override
String get emojiPickerSearchEmoji => 'Szukaj emoji';

@override
String get actionSheetOptionEditMessage => 'Edit';

@override
String get errorEditingFailed => 'Failed to edit message';

@override
String get editMessageSaveTooltip => 'Save changes';

@override
String get editMessageTitle => 'Edit the message';

@override
String get dialogSave => 'Save';
}
21 changes: 21 additions & 0 deletions lib/generated/l10n/zulip_localizations_ru.dart
Original file line number Diff line number Diff line change
Expand Up @@ -541,6 +541,12 @@ class ZulipLocalizationsRu extends ZulipLocalizations {
@override
String get messageIsMovedLabel => 'ПЕРЕМЕЩЕНО';

@override
String get messageIsEditingLabel => 'SAVING EDIT...';

@override
String get messageIsEditErrorLabel => 'EDIT ISN\'T SAVED. CHECK YOUR CONNECTION.';

@override
String get pollWidgetQuestionMissing => 'Нет вопроса.';

Expand All @@ -564,4 +570,19 @@ class ZulipLocalizationsRu extends ZulipLocalizations {

@override
String get emojiPickerSearchEmoji => 'Поиск эмодзи';

@override
String get actionSheetOptionEditMessage => 'Edit';

@override
String get errorEditingFailed => 'Failed to edit message';

@override
String get editMessageSaveTooltip => 'Save changes';

@override
String get editMessageTitle => 'Edit the message';

@override
String get dialogSave => 'Save';
}
21 changes: 21 additions & 0 deletions lib/generated/l10n/zulip_localizations_sk.dart
Original file line number Diff line number Diff line change
Expand Up @@ -541,6 +541,12 @@ class ZulipLocalizationsSk extends ZulipLocalizations {
@override
String get messageIsMovedLabel => 'PRESUNUTÉ';

@override
String get messageIsEditingLabel => 'SAVING EDIT...';

@override
String get messageIsEditErrorLabel => 'EDIT ISN\'T SAVED. CHECK YOUR CONNECTION.';

@override
String get pollWidgetQuestionMissing => 'Bez otázky.';

Expand All @@ -564,4 +570,19 @@ class ZulipLocalizationsSk extends ZulipLocalizations {

@override
String get emojiPickerSearchEmoji => 'Hľadať emotikon';

@override
String get actionSheetOptionEditMessage => 'Edit';

@override
String get errorEditingFailed => 'Failed to edit message';

@override
String get editMessageSaveTooltip => 'Save changes';

@override
String get editMessageTitle => 'Edit the message';

@override
String get dialogSave => 'Save';
}
Loading
Loading