new UX for emote settings

This commit is contained in:
OfficialDakari 2025-12-02 11:54:34 +05:00
parent ce0d1c63d1
commit 4dd242bc7d
59 changed files with 2003 additions and 417 deletions

View File

@ -3378,5 +3378,14 @@
"enterNewChat": "Enter new chat", "enterNewChat": "Enter new chat",
"approve": "Approve", "approve": "Approve",
"youHaveKnocked": "You have knocked", "youHaveKnocked": "You have knocked",
"pleaseWaitUntilInvited": "Please wait now, until someone from the room invites you." "pleaseWaitUntilInvited": "Please wait until someone invites you.",
"backToMainChat": "Back to main chat",
"saveChanges": "Save changes",
"createSticker": "Create sticker or emoji",
"newStickerPack": "New sticker pack",
"stickerPackNameAlreadyExists": "A sticker pack with that name already exists",
"stickerPackName": "Sticker pack name",
"attribution": "Attribution",
"useAsSticker": "Sticker",
"useAsEmoji": "Emoji"
} }

View File

@ -263,7 +263,9 @@ abstract class AppRoutes {
pageBuilder: (context, state) => defaultPageBuilder( pageBuilder: (context, state) => defaultPageBuilder(
context, context,
state, state,
const EmotesSettings(), EmotesSettings(
roomId: state.pathParameters['roomid'],
),
), ),
), ),
], ],
@ -369,7 +371,8 @@ abstract class AppRoutes {
roomId: state.pathParameters['roomid']!, roomId: state.pathParameters['roomid']!,
shareItems: shareItems, shareItems: shareItems,
eventId: state.uri.queryParameters['event'], eventId: state.uri.queryParameters['event'],
showThreadRoots: state.uri.queryParameters['threads'] == 'true', showThreadRoots:
state.uri.queryParameters['threads'] == 'true',
), ),
); );
}, },
@ -491,7 +494,9 @@ abstract class AppRoutes {
pageBuilder: (context, state) => defaultPageBuilder( pageBuilder: (context, state) => defaultPageBuilder(
context, context,
state, state,
const EmotesSettings(), EmotesSettings(
roomId: state.pathParameters['roomid'],
),
), ),
redirect: loggedOutRedirect, redirect: loggedOutRedirect,
), ),
@ -500,7 +505,9 @@ abstract class AppRoutes {
pageBuilder: (context, state) => defaultPageBuilder( pageBuilder: (context, state) => defaultPageBuilder(
context, context,
state, state,
const EmotesSettings(), EmotesSettings(
roomId: state.pathParameters['roomid'],
),
), ),
redirect: loggedOutRedirect, redirect: loggedOutRedirect,
), ),

View File

@ -5172,8 +5172,62 @@ abstract class L10n {
/// No description provided for @pleaseWaitUntilInvited. /// No description provided for @pleaseWaitUntilInvited.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Please wait now, until someone from the room invites you.'** /// **'Please wait until someone invites you.'**
String get pleaseWaitUntilInvited; String get pleaseWaitUntilInvited;
/// No description provided for @backToMainChat.
///
/// In en, this message translates to:
/// **'Back to main chat'**
String get backToMainChat;
/// No description provided for @saveChanges.
///
/// In en, this message translates to:
/// **'Save changes'**
String get saveChanges;
/// No description provided for @createSticker.
///
/// In en, this message translates to:
/// **'Create sticker or emoji'**
String get createSticker;
/// No description provided for @newStickerPack.
///
/// In en, this message translates to:
/// **'New sticker pack'**
String get newStickerPack;
/// No description provided for @stickerPackNameAlreadyExists.
///
/// In en, this message translates to:
/// **'A sticker pack with that name already exists'**
String get stickerPackNameAlreadyExists;
/// No description provided for @stickerPackName.
///
/// In en, this message translates to:
/// **'Sticker pack name'**
String get stickerPackName;
/// No description provided for @attribution.
///
/// In en, this message translates to:
/// **'Attribution'**
String get attribution;
/// No description provided for @useAsSticker.
///
/// In en, this message translates to:
/// **'Sticker'**
String get useAsSticker;
/// No description provided for @useAsEmoji.
///
/// In en, this message translates to:
/// **'Emoji'**
String get useAsEmoji;
} }
class _L10nDelegate extends LocalizationsDelegate<L10n> { class _L10nDelegate extends LocalizationsDelegate<L10n> {

View File

@ -2877,6 +2877,33 @@ class L10nAr extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2895,6 +2895,33 @@ class L10nBe extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2895,6 +2895,33 @@ class L10nBn extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2895,6 +2895,33 @@ class L10nBo extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2923,6 +2923,33 @@ class L10nCa extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2899,6 +2899,33 @@ class L10nCs extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2919,6 +2919,33 @@ class L10nDe extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2896,6 +2896,33 @@ class L10nEl extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2895,6 +2895,33 @@ class L10nEn extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2902,6 +2902,33 @@ class L10nEo extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2924,6 +2924,33 @@ class L10nEs extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2918,6 +2918,33 @@ class L10nEt extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2907,6 +2907,33 @@ class L10nEu extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2898,6 +2898,33 @@ class L10nFa extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2904,6 +2904,33 @@ class L10nFi extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2901,6 +2901,33 @@ class L10nFil extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2942,6 +2942,33 @@ class L10nFr extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2928,6 +2928,33 @@ class L10nGa extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2908,6 +2908,33 @@ class L10nGl extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2890,6 +2890,33 @@ class L10nHe extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2895,6 +2895,33 @@ class L10nHi extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2904,6 +2904,33 @@ class L10nHr extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2906,6 +2906,33 @@ class L10nHu extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2895,6 +2895,33 @@ class L10nIa extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2910,6 +2910,33 @@ class L10nId extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2894,6 +2894,33 @@ class L10nIe extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2926,6 +2926,33 @@ class L10nIt extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2864,6 +2864,33 @@ class L10nJa extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2897,6 +2897,33 @@ class L10nKa extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2833,6 +2833,33 @@ class L10nKo extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2901,6 +2901,33 @@ class L10nLt extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2913,6 +2913,33 @@ class L10nLv extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2898,6 +2898,33 @@ class L10nNb extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2902,6 +2902,33 @@ class L10nNl extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2912,6 +2912,33 @@ class L10nPl extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2895,8 +2895,35 @@ class L10nPt extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }
/// The translations for Portuguese, as used in Brazil (`pt_BR`). /// The translations for Portuguese, as used in Brazil (`pt_BR`).

View File

@ -2912,6 +2912,33 @@ class L10nRo extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2902,4 +2902,32 @@ class L10nRu extends L10n {
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited =>
'Пожалуйста, подождите когда администраторы примут Ваш запрос.'; 'Пожалуйста, подождите когда администраторы примут Ваш запрос.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2896,6 +2896,33 @@ class L10nSk extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2899,6 +2899,33 @@ class L10nSl extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2891,6 +2891,33 @@ class L10nSr extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2905,6 +2905,33 @@ class L10nSv extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2927,6 +2927,33 @@ class L10nTa extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2895,6 +2895,33 @@ class L10nTe extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2897,6 +2897,33 @@ class L10nTh extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2904,6 +2904,33 @@ class L10nTr extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2909,6 +2909,33 @@ class L10nUk extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2894,6 +2894,33 @@ class L10nVi extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }

View File

@ -2792,8 +2792,35 @@ class L10nZh extends L10n {
String get youHaveKnocked => 'You have knocked'; String get youHaveKnocked => 'You have knocked';
@override @override
String get pleaseWaitUntilInvited => String get pleaseWaitUntilInvited => 'Please wait until someone invites you.';
'Please wait now, until someone from the room invites you.';
@override
String get backToMainChat => 'Back to main chat';
@override
String get saveChanges => 'Save changes';
@override
String get createSticker => 'Create sticker or emoji';
@override
String get newStickerPack => 'New sticker pack';
@override
String get stickerPackNameAlreadyExists =>
'A sticker pack with that name already exists';
@override
String get stickerPackName => 'Sticker pack name';
@override
String get attribution => 'Attribution';
@override
String get useAsSticker => 'Sticker';
@override
String get useAsEmoji => 'Emoji';
} }
/// The translations for Chinese, using the Han script (`zh_Hant`). /// The translations for Chinese, using the Han script (`zh_Hant`).

View File

@ -127,7 +127,7 @@ class MessageContent extends StatelessWidget {
case MessageTypes.Sticker: case MessageTypes.Sticker:
if (event.redacted) continue textmessage; if (event.redacted) continue textmessage;
final maxSize = event.messageType == MessageTypes.Sticker final maxSize = event.messageType == MessageTypes.Sticker
? 128 ? 128.0
: event.messageType == MessageTypes.Image : event.messageType == MessageTypes.Image
? 512.0 ? 512.0
: 256.0; : 256.0;

View File

@ -67,7 +67,9 @@ class StickerPickerDialogState extends State<StickerPickerDialog> {
GridView.builder( GridView.builder(
itemCount: imageKeys.length, itemCount: imageKeys.length,
gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 128, maxCrossAxisExtent: 84,
mainAxisSpacing: 8.0,
crossAxisSpacing: 8.0,
), ),
shrinkWrap: true, shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),

View File

@ -3,16 +3,15 @@ import 'dart:async';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:collection/collection.dart';
import 'package:extera_next/generated/l10n/l10n.dart';
import 'package:go_router/go_router.dart';
import 'package:http/http.dart' hide Client; import 'package:http/http.dart' hide Client;
import 'package:matrix/matrix.dart'; import 'package:matrix/matrix.dart';
import 'package:extera_next/generated/l10n/l10n.dart';
import 'package:extera_next/utils/client_manager.dart'; import 'package:extera_next/utils/client_manager.dart';
import 'package:extera_next/utils/file_selector.dart'; import 'package:extera_next/utils/file_selector.dart';
import 'package:extera_next/utils/matrix_sdk_extensions/matrix_file_extension.dart'; import 'package:extera_next/utils/matrix_sdk_extensions/matrix_file_extension.dart';
import 'package:extera_next/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:extera_next/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart';
import 'package:extera_next/widgets/adaptive_dialogs/show_text_input_dialog.dart';
import 'package:extera_next/widgets/future_loading_dialog.dart'; import 'package:extera_next/widgets/future_loading_dialog.dart';
import '../../widgets/matrix.dart'; import '../../widgets/matrix.dart';
import 'import_archive_dialog.dart'; import 'import_archive_dialog.dart';
@ -22,24 +21,53 @@ import 'package:archive/archive.dart'
if (dart.library.io) 'package:archive/archive_io.dart'; if (dart.library.io) 'package:archive/archive_io.dart';
class EmotesSettings extends StatefulWidget { class EmotesSettings extends StatefulWidget {
const EmotesSettings({super.key}); final String? roomId;
const EmotesSettings({required this.roomId, super.key});
@override @override
EmotesSettingsController createState() => EmotesSettingsController(); EmotesSettingsController createState() => EmotesSettingsController();
} }
class EmotesSettingsController extends State<EmotesSettings> { class EmotesSettingsController extends State<EmotesSettings> {
String? get roomId => GoRouterState.of(context).pathParameters['roomid']; late final Room? room;
Room? get room => String? stateKey;
roomId != null ? Matrix.of(context).client.getRoomById(roomId!) : null;
String? get stateKey => GoRouterState.of(context).pathParameters['state_key']; List<String>? get packKeys {
final room = this.room;
if (room == null) return null;
final keys = room.states['im.ponies.room_emotes']?.keys.toList() ?? [];
keys.sort();
return keys;
}
@override
void initState() {
super.initState();
room = widget.roomId != null
? Matrix.of(context).client.getRoomById(widget.roomId!)
: null;
setStateKey(packKeys?.firstOrNull, reset: false);
}
void setStateKey(String? key, {reset = true}) {
stateKey = key;
final event = key == null
? null
: room?.getState(
'im.ponies.room_emotes',
key,
);
final eventPack = event?.content.tryGetMap<String, Object?>('pack');
packDisplayNameController.text =
eventPack?.tryGet<String>('display_name') ?? '';
packAttributionController.text =
eventPack?.tryGet<String>('attribution') ?? '';
if (reset) resetAction();
}
bool showSave = false; bool showSave = false;
TextEditingController newImageCodeController = TextEditingController();
ValueNotifier<ImagePackImageContent?> newImageController =
ValueNotifier<ImagePackImageContent?>(null);
ImagePackContent _getPack() { ImagePackContent _getPack() {
final client = Matrix.of(context).client; final client = Matrix.of(context).client;
@ -69,25 +97,25 @@ class EmotesSettingsController extends State<EmotesSettings> {
return; return;
} }
final client = Matrix.of(context).client; final client = Matrix.of(context).client;
if (room != null) { final result = await showFutureLoadingDialog(
await showFutureLoadingDialog(
context: context, context: context,
future: () => client.setRoomStateWithKey( future: () => room != null
? client.setRoomStateWithKey(
room!.id, room!.id,
'im.ponies.room_emotes', 'im.ponies.room_emotes',
stateKey ?? '', stateKey ?? '',
pack!.toJson(), pack!.toJson(),
), )
); : client.setAccountData(
} else {
await showFutureLoadingDialog(
context: context,
future: () => client.setAccountData(
client.userID!, client.userID!,
'im.ponies.user_emotes', 'im.ponies.user_emotes',
pack!.toJson(), pack!.toJson(),
), ),
); );
if (!result.isError) {
setState(() {
showSave = false;
});
} }
} }
@ -123,17 +151,56 @@ class EmotesSettingsController extends State<EmotesSettings> {
setState(() {}); setState(() {});
} }
final TextEditingController packDisplayNameController =
TextEditingController();
final TextEditingController packAttributionController =
TextEditingController();
void removeImageAction(String oldImageCode) => setState(() { void removeImageAction(String oldImageCode) => setState(() {
pack!.images.remove(oldImageCode); pack!.images.remove(oldImageCode);
showSave = true; showSave = true;
}); });
void toggleUsage(String imageCode, ImagePackUsage usage) {
setState(() {
final usages =
pack!.images[imageCode]!.usage ??= List.from(ImagePackUsage.values);
if (!usages.remove(usage)) usages.add(usage);
showSave = true;
});
}
void submitDisplaynameAction() {
if (readonly) return;
packDisplayNameController.text = packDisplayNameController.text.trim();
final input = packDisplayNameController.text;
setState(() {
pack!.pack.displayName = input;
showSave = true;
});
}
void submitAttributionAction() {
if (readonly) return;
packAttributionController.text = packAttributionController.text.trim();
final input = packAttributionController.text;
setState(() {
pack!.pack.attribution = input;
showSave = true;
});
}
void submitImageAction( void submitImageAction(
String oldImageCode, String oldImageCode,
String imageCode,
ImagePackImageContent image, ImagePackImageContent image,
TextEditingController controller, TextEditingController controller,
) { ) {
controller.text = controller.text.trim().replaceAll(' ', '-');
final imageCode = controller.text;
if (imageCode == oldImageCode) return;
if (pack!.images.keys.any((k) => k == imageCode && k != oldImageCode)) { if (pack!.images.keys.any((k) => k == imageCode && k != oldImageCode)) {
controller.text = oldImageCode; controller.text = oldImageCode;
showOkAlertDialog( showOkAlertDialog(
@ -169,8 +236,60 @@ class EmotesSettingsController extends State<EmotesSettings> {
?.tryGetMap<String, Object?>(stateKey ?? '') != ?.tryGetMap<String, Object?>(stateKey ?? '') !=
null; null;
bool get readonly => bool get readonly => room == null
room == null ? false : !(room!.canSendEvent('im.ponies.room_emotes')); ? false
: room?.canChangeStateEvent('im.ponies.room_emotes') == false;
void resetAction() {
setState(() {
_pack = _getPack();
showSave = false;
});
}
void createImagePack() async {
final room = this.room;
if (room == null) throw Exception('Cannot create image pack without room');
final input = await showTextInputDialog(
context: context,
title: L10n.of(context).newStickerPack,
hintText: L10n.of(context).name,
okLabel: L10n.of(context).create,
);
final name = input?.trim();
if (name == null || name.isEmpty) return;
if (!mounted) return;
final keyName = name.toLowerCase().replaceAll(' ', '_');
if (packKeys?.contains(name) ?? false) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(L10n.of(context).stickerPackNameAlreadyExists),
),
);
return;
}
await showFutureLoadingDialog(
context: context,
future: () => room.client.setRoomStateWithKey(
room.id,
'im.ponies.room_emotes',
keyName,
{
'images': {},
'pack': {'display_name': name},
},
),
);
if (!mounted) return;
setState(() {});
await room.client.oneShotSync();
if (!mounted) return;
setState(() {});
}
void saveAction() async { void saveAction() async {
await save(context); await save(context);
@ -179,74 +298,34 @@ class EmotesSettingsController extends State<EmotesSettings> {
}); });
} }
void addImageAction() async { void createStickers() async {
if (newImageCodeController.text.isEmpty || final pickedFiles = await selectFiles(
newImageController.value == null) {
await showOkAlertDialog(
useRootNavigator: false,
context: context,
title: L10n.of(context).emoteWarnNeedToPick,
okLabel: L10n.of(context).ok,
);
return;
}
final imageCode = newImageCodeController.text;
if (pack!.images.containsKey(imageCode)) {
await showOkAlertDialog(
useRootNavigator: false,
context: context,
title: L10n.of(context).emoteExists,
okLabel: L10n.of(context).ok,
);
return;
}
if (!RegExp(r'^[-\w]+$').hasMatch(imageCode)) {
await showOkAlertDialog(
useRootNavigator: false,
context: context,
title: L10n.of(context).emoteInvalid,
okLabel: L10n.of(context).ok,
);
return;
}
pack!.images[imageCode] = newImageController.value!;
await save(context);
setState(() {
newImageCodeController.text = '';
newImageController.value = null;
showSave = false;
});
}
void imagePickerAction(
ValueNotifier<ImagePackImageContent?> controller,
) async {
final result = await selectFiles(
context, context,
type: FileSelectorType.images, type: FileSelectorType.images,
allowMultiple: true,
); );
final pickedFile = result.firstOrNull; if (pickedFiles.isEmpty) return;
if (pickedFile == null) return; if (!mounted) return;
await showFutureLoadingDialog(
context: context,
futureWithProgress: (setProgress) async {
for (final (i, pickedFile) in pickedFiles.indexed) {
setProgress(i / pickedFiles.length);
var file = MatrixImageFile( var file = MatrixImageFile(
bytes: await pickedFile.readAsBytes(), bytes: await pickedFile.readAsBytes(),
name: pickedFile.name, name: pickedFile.name,
); );
try { file = await file.generateThumbnail(
file = (await file.generateThumbnail(
nativeImplementations: ClientManager.nativeImplementations, nativeImplementations: ClientManager.nativeImplementations,
))!; ) ??
} catch (e, s) { file;
Logs().w('Unable to create thumbnail', e, s); final uri = await Matrix.of(context).client.uploadContent(
}
final uploadResp = await showFutureLoadingDialog(
context: context,
future: () => Matrix.of(context).client.uploadContent(
file.bytes, file.bytes,
filename: file.name, filename: file.name,
contentType: file.mimeType, contentType: file.mimeType,
),
); );
if (uploadResp.error == null) {
setState(() { setState(() {
final info = <String, dynamic>{ final info = <String, dynamic>{
...file.info, ...file.info,
@ -262,12 +341,20 @@ class EmotesSettingsController extends State<EmotesSettings> {
info['w'] = (ratio * 256.0).round(); info['w'] = (ratio * 256.0).round();
} }
} }
controller.value = ImagePackImageContent.fromJson(<String, dynamic>{ final imageCode = pickedFile.name.split('.').first;
'url': uploadResp.result.toString(), pack!.images[imageCode] =
ImagePackImageContent.fromJson(<String, dynamic>{
'url': uri.toString(),
'info': info, 'info': info,
}); });
}); });
} }
},
);
setState(() {
showSave = true;
});
} }
@override @override

View File

@ -1,12 +1,13 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:extera_next/generated/l10n/l10n.dart';
import 'package:matrix/matrix.dart'; import 'package:matrix/matrix.dart';
import 'package:extera_next/generated/l10n/l10n.dart';
import 'package:extera_next/utils/platform_infos.dart'; import 'package:extera_next/utils/platform_infos.dart';
import 'package:extera_next/widgets/layouts/max_width_body.dart'; import 'package:extera_next/widgets/layouts/max_width_body.dart';
import 'package:extera_next/widgets/mxc_image.dart'; import 'package:extera_next/widgets/mxc_image.dart';
import 'package:extera_next/widgets/mxc_image_viewer.dart';
import '../../widgets/matrix.dart'; import '../../widgets/matrix.dart';
import 'settings_emotes.dart'; import 'settings_emotes.dart';
@ -19,16 +20,47 @@ class EmotesSettingsView extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (controller.widget.roomId != null && controller.room == null) {
return Scaffold(
appBar: AppBar(
title: Text(L10n.of(context).oopsSomethingWentWrong),
),
body: Center(
child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat),
),
);
}
final theme = Theme.of(context); final theme = Theme.of(context);
final client = Matrix.of(context).client; final client = Matrix.of(context).client;
final imageKeys = controller.pack!.images.keys.toList(); final imageKeys = controller.pack!.images.keys.toList();
final packKeys = controller.packKeys;
if (packKeys != null && packKeys.isEmpty) {
packKeys.add('');
}
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
leading: const Center(child: BackButton()), automaticallyImplyLeading: !controller.showSave,
title: Text(L10n.of(context).customEmojisAndStickers), title: controller.showSave
? TextButton(
onPressed: controller.resetAction,
child: Text(L10n.of(context).cancel),
)
: Text(L10n.of(context).customEmojisAndStickers),
actions: [ actions: [
if (controller.showSave)
ElevatedButton(
onPressed: () => controller.save(context),
style: ElevatedButton.styleFrom(
backgroundColor: theme.colorScheme.primary,
foregroundColor: theme.colorScheme.onPrimary,
),
child: Text(L10n.of(context).saveChanges),
)
else
PopupMenuButton<PopupMenuEmojiActions>( PopupMenuButton<PopupMenuEmojiActions>(
useRootNavigator: true,
onSelected: (value) { onSelected: (value) {
switch (value) { switch (value) {
case PopupMenuEmojiActions.export: case PopupMenuEmojiActions.export:
@ -45,6 +77,7 @@ class EmotesSettingsView extends StatelessWidget {
value: PopupMenuEmojiActions.import, value: PopupMenuEmojiActions.import,
child: Text(L10n.of(context).importFromZipFile), child: Text(L10n.of(context).importFromZipFile),
), ),
if (imageKeys.isNotEmpty)
PopupMenuItem( PopupMenuItem(
value: PopupMenuEmojiActions.export, value: PopupMenuEmojiActions.export,
child: Text(L10n.of(context).exportEmotePack), child: Text(L10n.of(context).exportEmotePack),
@ -52,74 +85,121 @@ class EmotesSettingsView extends StatelessWidget {
], ],
), ),
], ],
bottom: packKeys == null
? null
: PreferredSize(
preferredSize: const Size.fromHeight(48),
child: Padding(
padding: const EdgeInsets.all(4.0),
child: SizedBox(
height: 40,
child: ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: packKeys.length + 1,
itemBuilder: (context, i) {
if (i == 0) {
if (controller.readonly) {
return const SizedBox.shrink();
}
return Padding(
padding: const EdgeInsets.symmetric(
horizontal: 4.0,
),
child: FilterChip(
label: const Icon(
Icons.add_outlined,
size: 20,
),
onSelected: controller.showSave
? null
: (_) => controller.createImagePack(),
),
);
}
i--;
final key = packKeys[i];
final event = controller.room
?.getState('im.ponies.room_emotes', packKeys[i]);
final eventPack =
event?.content.tryGetMap<String, Object?>('pack');
final packName =
eventPack?.tryGet<String>('display_name') ??
eventPack?.tryGet<String>('name') ??
(key.isNotEmpty ? key : 'Default');
return Padding(
padding: const EdgeInsets.symmetric(
horizontal: 4.0,
),
child: FilterChip(
label: Text(packName),
selected: controller.stateKey == key ||
(controller.stateKey == null && key.isEmpty),
onSelected: controller.showSave
? null
: (_) => controller.setStateKey(key),
),
);
},
),
),
),
),
), ),
floatingActionButton: controller.showSave
? FloatingActionButton(
onPressed: controller.saveAction,
child: const Icon(Icons.save_outlined, color: Colors.white),
)
: null,
body: MaxWidthBody( body: MaxWidthBody(
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[ children: <Widget>[
if (!controller.readonly) if (controller.room != null) ...[
Container( const SizedBox(height: 16),
padding: const EdgeInsets.symmetric( Padding(
vertical: 8.0, padding: const EdgeInsets.symmetric(horizontal: 16.0),
),
child: ListTile(
leading: Container(
width: 180.0,
height: 38,
padding: const EdgeInsets.symmetric(horizontal: 8),
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(10)),
color: theme.secondaryHeaderColor,
),
child: TextField( child: TextField(
controller: controller.newImageCodeController, maxLength: 256,
autocorrect: false, controller: controller.packDisplayNameController,
minLines: 1, readOnly: controller.readonly,
maxLines: 1, onSubmitted: (_) => controller.submitDisplaynameAction(),
decoration: InputDecoration( decoration: InputDecoration(
hintText: L10n.of(context).emoteShortcode, counter: const SizedBox.shrink(),
prefixText: ': ', hintText: controller.stateKey,
suffixText: ':', labelText: L10n.of(context).stickerPackName,
prefixStyle: TextStyle(
color: theme.colorScheme.secondary,
fontWeight: FontWeight.bold,
),
suffixStyle: TextStyle(
color: theme.colorScheme.secondary,
fontWeight: FontWeight.bold,
),
border: InputBorder.none,
), ),
), ),
), ),
title: _ImagePicker( const SizedBox(height: 8),
controller: controller.newImageController, Padding(
onPressed: controller.imagePickerAction, padding: const EdgeInsets.symmetric(horizontal: 16.0),
), child: TextField(
trailing: InkWell( maxLength: 256,
onTap: controller.addImageAction, controller: controller.packAttributionController,
child: const Icon( readOnly: controller.readonly,
Icons.add_outlined, onSubmitted: (_) => controller.submitAttributionAction(),
color: Colors.green, decoration: InputDecoration(
size: 32.0, counter: const SizedBox.shrink(),
labelText: L10n.of(context).attribution,
), ),
), ),
), ),
],
if (!controller.readonly) ...[
Padding(
padding: const EdgeInsets.all(16.0),
child: ElevatedButton.icon(
onPressed: controller.createStickers,
icon: const Icon(Icons.upload_outlined),
label: Text(L10n.of(context).createSticker),
), ),
if (controller.room != null) ),
const Divider(),
],
if (controller.room != null && imageKeys.isNotEmpty)
SwitchListTile.adaptive( SwitchListTile.adaptive(
title: Text(L10n.of(context).enableEmotesGlobally), title: Text(L10n.of(context).enableEmotesGlobally),
value: controller.isGloballyActive(client), value: controller.isGloballyActive(client),
onChanged: controller.setIsGloballyActive, onChanged: controller.setIsGloballyActive,
), ),
if (!controller.readonly || controller.room != null)
const Divider(),
imageKeys.isEmpty imageKeys.isEmpty
? Center( ? Center(
child: Padding( child: Padding(
@ -135,11 +215,8 @@ class EmotesSettingsView extends StatelessWidget {
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
separatorBuilder: (BuildContext context, int i) => separatorBuilder: (BuildContext context, int i) =>
const SizedBox.shrink(), const SizedBox.shrink(),
itemCount: imageKeys.length + 1, itemCount: imageKeys.length,
itemBuilder: (BuildContext context, int i) { itemBuilder: (BuildContext context, int i) {
if (i >= imageKeys.length) {
return Container(height: 70);
}
final imageCode = imageKeys[i]; final imageCode = imageKeys[i];
final image = controller.pack!.images[imageCode]!; final image = controller.pack!.images[imageCode]!;
final textEditingController = TextEditingController(); final textEditingController = TextEditingController();
@ -147,15 +224,9 @@ class EmotesSettingsView extends StatelessWidget {
final useShortCuts = final useShortCuts =
(PlatformInfos.isWeb || PlatformInfos.isDesktop); (PlatformInfos.isWeb || PlatformInfos.isDesktop);
return ListTile( return ListTile(
leading: Container( title: Row(
width: 180.0, children: [
height: 38, Expanded(
padding: const EdgeInsets.symmetric(horizontal: 8),
decoration: BoxDecoration(
borderRadius:
const BorderRadius.all(Radius.circular(10)),
color: theme.secondaryHeaderColor,
),
child: Shortcuts( child: Shortcuts(
shortcuts: !useShortCuts shortcuts: !useShortCuts
? {} ? {}
@ -171,7 +242,6 @@ class EmotesSettingsView extends StatelessWidget {
onInvoke: (i) { onInvoke: (i) {
controller.submitImageAction( controller.submitImageAction(
imageCode, imageCode,
textEditingController.text,
image, image,
textEditingController, textEditingController,
); );
@ -185,24 +255,22 @@ class EmotesSettingsView extends StatelessWidget {
autocorrect: false, autocorrect: false,
minLines: 1, minLines: 1,
maxLines: 1, maxLines: 1,
maxLength: 128,
decoration: InputDecoration( decoration: InputDecoration(
hintText: L10n.of(context).emoteShortcode, hintText: L10n.of(context).emoteShortcode,
prefixText: ': ', prefixText: ': ',
suffixText: ':', suffixText: ':',
prefixStyle: TextStyle( counter: const SizedBox.shrink(),
color: theme.colorScheme.secondary, filled: false,
fontWeight: FontWeight.bold, enabledBorder: const OutlineInputBorder(
borderSide: BorderSide(
color: Colors.transparent,
), ),
suffixStyle: TextStyle(
color: theme.colorScheme.secondary,
fontWeight: FontWeight.bold,
), ),
border: InputBorder.none,
), ),
onSubmitted: (s) => onSubmitted: (s) =>
controller.submitImageAction( controller.submitImageAction(
imageCode, imageCode,
s,
image, image,
textEditingController, textEditingController,
), ),
@ -210,17 +278,56 @@ class EmotesSettingsView extends StatelessWidget {
), ),
), ),
), ),
title: _EmoteImage(image.url), if (!controller.readonly)
PopupMenuButton<ImagePackUsage>(
onSelected: (usage) => controller.toggleUsage(
imageCode,
usage,
),
itemBuilder: (context) => [
PopupMenuItem(
value: ImagePackUsage.sticker,
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
if (image.usage?.contains(
ImagePackUsage.sticker,
) ??
true)
const Icon(Icons.check_outlined),
const SizedBox(width: 12),
Text(L10n.of(context).useAsSticker),
],
),
),
PopupMenuItem(
value: ImagePackUsage.emoticon,
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
if (image.usage?.contains(
ImagePackUsage.emoticon,
) ??
true)
const Icon(Icons.check_outlined),
const SizedBox(width: 12),
Text(L10n.of(context).useAsEmoji),
],
),
),
],
icon: const Icon(Icons.edit_outlined),
),
],
),
leading: _EmoteImage(image.url),
trailing: controller.readonly trailing: controller.readonly
? null ? null
: InkWell( : IconButton(
onTap: () => tooltip: L10n.of(context).delete,
onPressed: () =>
controller.removeImageAction(imageCode), controller.removeImageAction(imageCode),
child: const Icon( icon: const Icon(Icons.delete_outlined),
Icons.delete_outlined,
color: Colors.red,
size: 32.0,
),
), ),
); );
}, },
@ -239,43 +346,26 @@ class _EmoteImage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
const size = 38.0; const size = 44.0;
return SizedBox.square( final key = 'sticker_preview_$mxc';
dimension: size, return InkWell(
borderRadius: BorderRadius.circular(4),
onTap: () => showDialog(
context: context,
builder: (_) => MxcImageViewer(mxc),
),
child: MxcImage( child: MxcImage(
key: ValueKey(key),
cacheKey: key,
uri: mxc, uri: mxc,
fit: BoxFit.contain, fit: BoxFit.contain,
width: size, width: size,
height: size, height: size,
isThumbnail: false, isThumbnail: true,
animated: true,
), ),
); );
} }
} }
class _ImagePicker extends StatefulWidget {
final ValueNotifier<ImagePackImageContent?> controller;
final void Function(ValueNotifier<ImagePackImageContent?>) onPressed;
const _ImagePicker({required this.controller, required this.onPressed});
@override
_ImagePickerState createState() => _ImagePickerState();
}
class _ImagePickerState extends State<_ImagePicker> {
@override
Widget build(BuildContext context) {
if (widget.controller.value == null) {
return ElevatedButton(
onPressed: () => widget.onPressed(widget.controller),
child: Text(L10n.of(context).pickImage),
);
} else {
return _EmoteImage(widget.controller.value!.url);
}
}
}
class SubmitLineIntent extends Intent {} class SubmitLineIntent extends Intent {}

View File

@ -3,8 +3,8 @@ import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:async/async.dart'; import 'package:async/async.dart';
import 'package:extera_next/generated/l10n/l10n.dart';
import 'package:extera_next/generated/l10n/l10n.dart';
import 'package:extera_next/utils/localized_exception_extension.dart'; import 'package:extera_next/utils/localized_exception_extension.dart';
import 'package:extera_next/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; import 'package:extera_next/widgets/adaptive_dialogs/adaptive_dialog_action.dart';
@ -14,7 +14,8 @@ import 'package:extera_next/widgets/adaptive_dialogs/adaptive_dialog_action.dart
/// null. /// null.
Future<Result<T>> showFutureLoadingDialog<T>({ Future<Result<T>> showFutureLoadingDialog<T>({
required BuildContext context, required BuildContext context,
required Future<T> Function() future, Future<T> Function()? future,
Future<T> Function(void Function(double?) setProgress)? futureWithProgress,
String? title, String? title,
String? backLabel, String? backLabel,
bool barrierDismissible = false, bool barrierDismissible = false,
@ -22,7 +23,10 @@ Future<Result<T>> showFutureLoadingDialog<T>({
ExceptionContext? exceptionContext, ExceptionContext? exceptionContext,
bool ignoreError = false, bool ignoreError = false,
}) async { }) async {
final futureExec = future(); assert(future != null || futureWithProgress != null);
final onProgressStream = StreamController<double?>();
final futureExec =
futureWithProgress?.call(onProgressStream.add) ?? future!();
final resultFuture = ResultFuture(futureExec); final resultFuture = ResultFuture(futureExec);
if (delay) { if (delay) {
@ -46,6 +50,7 @@ Future<Result<T>> showFutureLoadingDialog<T>({
title: title, title: title,
backLabel: backLabel, backLabel: backLabel,
exceptionContext: exceptionContext, exceptionContext: exceptionContext,
onProgressStream: onProgressStream.stream,
), ),
); );
return result ?? return result ??
@ -60,6 +65,7 @@ class LoadingDialog<T> extends StatefulWidget {
final String? backLabel; final String? backLabel;
final Future<T> future; final Future<T> future;
final ExceptionContext? exceptionContext; final ExceptionContext? exceptionContext;
final Stream<double?> onProgressStream;
const LoadingDialog({ const LoadingDialog({
super.key, super.key,
@ -67,6 +73,7 @@ class LoadingDialog<T> extends StatefulWidget {
this.title, this.title,
this.backLabel, this.backLabel,
this.exceptionContext, this.exceptionContext,
required this.onProgressStream,
}); });
@override @override
@ -110,7 +117,13 @@ class LoadingDialogState<T> extends State<LoadingDialog> {
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
if (exception == null) ...[ if (exception == null) ...[
const CircularProgressIndicator.adaptive(), StreamBuilder(
stream: widget.onProgressStream,
builder: (context, snapshot) =>
CircularProgressIndicator.adaptive(
value: snapshot.data,
),
),
const SizedBox(width: 20), const SizedBox(width: 20),
], ],
Expanded( Expanded(

View File

@ -98,9 +98,9 @@ include(flutter/generated_plugins.cmake)
# By default, "installing" just makes a relocatable bundle in the build # By default, "installing" just makes a relocatable bundle in the build
# directory. # directory.
set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle")
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) #if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
endif() #endif()
# Start with a clean build bundle directory every time. # Start with a clean build bundle directory every time.
install(CODE " install(CODE "

View File

@ -1227,10 +1227,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.16.0" version: "1.17.0"
mgrs_dart: mgrs_dart:
dependency: transitive dependency: transitive
description: description:
@ -2016,26 +2016,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: test name: test
sha256: "65e29d831719be0591f7b3b1a32a3cda258ec98c58c7b25f7b84241bc31215bb" sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.26.2" version: "1.26.3"
test_api: test_api:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.7.6" version: "0.7.7"
test_core: test_core:
dependency: transitive dependency: transitive
description: description:
name: test_core name: test_core
sha256: "80bf5a02b60af04b09e14f6fe68b921aad119493e26e490deaca5993fef1b05a" sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.6.11" version: "0.6.12"
timezone: timezone:
dependency: transitive dependency: transitive
description: description: