diff --git a/lib/widgets/post/compose_toolbar.dart b/lib/widgets/post/compose_toolbar.dart index 69c2f0bd..6111674b 100644 --- a/lib/widgets/post/compose_toolbar.dart +++ b/lib/widgets/post/compose_toolbar.dart @@ -72,18 +72,17 @@ class ComposeToolbar extends HookConsumerWidget { context: context, isScrollControlled: true, useRootNavigator: true, - builder: - (context) => DraftManagerSheet( - onDraftSelected: (draftId) { - final draft = ref.read(composeStorageProvider)[draftId]; - if (draft != null) { - state.titleController.text = draft.title ?? ''; - state.descriptionController.text = draft.description ?? ''; - state.contentController.text = draft.content ?? ''; - state.visibility.value = draft.visibility; - } - }, - ), + builder: (context) => DraftManagerSheet( + onDraftSelected: (draftId) { + final draft = ref.read(composeStorageProvider)[draftId]; + if (draft != null) { + state.titleController.text = draft.title ?? ''; + state.descriptionController.text = draft.description ?? ''; + state.contentController.text = draft.content ?? ''; + state.visibility.value = draft.visibility; + } + }, + ), ); } @@ -97,144 +96,154 @@ class ComposeToolbar extends HookConsumerWidget { final colorScheme = Theme.of(context).colorScheme; if (isCompact) { - return Container( - color: Theme.of(context).colorScheme.surfaceContainerLow, - padding: EdgeInsets.symmetric(horizontal: 8), + return Material( + elevation: 8, + color: Theme.of(context).colorScheme.surfaceContainerHigh, child: Center( child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 560), - child: Row( - children: [ - Expanded( - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Row( - children: [ - UploadMenu( - items: uploadMenuItems, - isCompact: isCompact, - ), - IconButton( - onPressed: linkAttachment, - icon: const Icon(Symbols.attach_file), - tooltip: 'linkAttachment'.tr(), - color: colorScheme.primary, - visualDensity: const VisualDensity( - horizontal: -4, - vertical: -2, - ), - ), - // Poll button with visual state when a poll is linked - ListenableBuilder( - listenable: state.pollId, - builder: (context, _) { - return IconButton( - onPressed: pickPoll, - icon: const Icon(Symbols.how_to_vote), - tooltip: 'poll'.tr(), + child: + Row( + children: [ + Expanded( + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: [ + UploadMenu( + items: uploadMenuItems, + isCompact: isCompact, + ), + IconButton( + onPressed: linkAttachment, + icon: const Icon(Symbols.attach_file), + tooltip: 'linkAttachment'.tr(), color: colorScheme.primary, visualDensity: const VisualDensity( horizontal: -4, vertical: -2, ), - style: ButtonStyle( - backgroundColor: WidgetStatePropertyAll( - state.pollId.value != null - ? colorScheme.primary.withOpacity(0.15) - : null, - ), - ), - ); - }, + ), + // Poll button with visual state when a poll is linked + ListenableBuilder( + listenable: state.pollId, + builder: (context, _) { + return IconButton( + onPressed: pickPoll, + icon: const Icon(Symbols.how_to_vote), + tooltip: 'poll'.tr(), + color: colorScheme.primary, + visualDensity: const VisualDensity( + horizontal: -4, + vertical: -2, + ), + style: ButtonStyle( + backgroundColor: WidgetStatePropertyAll( + state.pollId.value != null + ? colorScheme.primary.withOpacity( + 0.15, + ) + : null, + ), + ), + ); + }, + ), + // Fund button with visual state when a fund is linked + ListenableBuilder( + listenable: state.fundId, + builder: (context, _) { + return IconButton( + onPressed: pickFund, + icon: const Icon( + Symbols.account_balance_wallet, + ), + tooltip: 'fund'.tr(), + color: colorScheme.primary, + visualDensity: const VisualDensity( + horizontal: -4, + vertical: -2, + ), + style: ButtonStyle( + backgroundColor: WidgetStatePropertyAll( + state.fundId.value != null + ? colorScheme.primary.withOpacity( + 0.15, + ) + : null, + ), + ), + ); + }, + ), + // Embed button with visual state when embed is present + ListenableBuilder( + listenable: state.embedView, + builder: (context, _) { + return IconButton( + onPressed: showEmbedSheet, + icon: const Icon(Symbols.iframe), + tooltip: 'embedView'.tr(), + color: colorScheme.primary, + visualDensity: const VisualDensity( + horizontal: -4, + vertical: -2, + ), + style: ButtonStyle( + backgroundColor: WidgetStatePropertyAll( + state.embedView.value != null + ? colorScheme.primary.withOpacity( + 0.15, + ) + : null, + ), + ), + ); + }, + ), + ], ), - // Fund button with visual state when a fund is linked - ListenableBuilder( - listenable: state.fundId, - builder: (context, _) { - return IconButton( - onPressed: pickFund, - icon: const Icon(Symbols.account_balance_wallet), - tooltip: 'fund'.tr(), - color: colorScheme.primary, - visualDensity: const VisualDensity( - horizontal: -4, - vertical: -2, - ), - style: ButtonStyle( - backgroundColor: WidgetStatePropertyAll( - state.fundId.value != null - ? colorScheme.primary.withOpacity(0.15) - : null, - ), - ), - ); - }, - ), - // Embed button with visual state when embed is present - ListenableBuilder( - listenable: state.embedView, - builder: (context, _) { - return IconButton( - onPressed: showEmbedSheet, - icon: const Icon(Symbols.iframe), - tooltip: 'embedView'.tr(), - color: colorScheme.primary, - visualDensity: const VisualDensity( - horizontal: -4, - vertical: -2, - ), - style: ButtonStyle( - backgroundColor: WidgetStatePropertyAll( - state.embedView.value != null - ? colorScheme.primary.withOpacity(0.15) - : null, - ), - ), - ); - }, - ), - ], + ), ), - ), + if (originalPost == null && state.isEmpty) + IconButton( + icon: const Icon(Symbols.draft, size: 20), + color: colorScheme.primary, + onPressed: showDraftManager, + tooltip: 'drafts'.tr(), + visualDensity: const VisualDensity( + horizontal: -4, + vertical: -4, + ), + constraints: const BoxConstraints( + minWidth: 32, + minHeight: 48, + ), + ) + else if (originalPost == null) + IconButton( + icon: const Icon(Symbols.save, size: 20), + color: colorScheme.primary, + onPressed: saveDraft, + onLongPress: showDraftManager, + tooltip: 'saveDraft'.tr(), + visualDensity: const VisualDensity( + horizontal: -4, + vertical: -4, + ), + constraints: const BoxConstraints( + minWidth: 32, + minHeight: 48, + ), + ), + ], + ).padding( + horizontal: 16, + top: 4, + bottom: useSafeArea + ? MediaQuery.of(context).padding.bottom + 4 + : 4, ), - if (originalPost == null && state.isEmpty) - IconButton( - icon: const Icon(Symbols.draft, size: 20), - color: colorScheme.primary, - onPressed: showDraftManager, - tooltip: 'drafts'.tr(), - visualDensity: const VisualDensity( - horizontal: -4, - vertical: -4, - ), - constraints: const BoxConstraints( - minWidth: 32, - minHeight: 48, - ), - ) - else if (originalPost == null) - IconButton( - icon: const Icon(Symbols.save, size: 20), - color: colorScheme.primary, - onPressed: saveDraft, - onLongPress: showDraftManager, - tooltip: 'saveDraft'.tr(), - visualDensity: const VisualDensity( - horizontal: -4, - vertical: -4, - ), - constraints: const BoxConstraints( - minWidth: 32, - minHeight: 48, - ), - ), - ], - ).padding( - horizontal: 8, - top: 4, - bottom: - useSafeArea ? MediaQuery.of(context).padding.bottom + 4 : 4, - ), ), ), ); @@ -246,102 +255,108 @@ class ComposeToolbar extends HookConsumerWidget { child: Center( child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 560), - child: Row( - children: [ - Expanded( - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Row( - children: [ - UploadMenu(items: uploadMenuItems, isCompact: isCompact), - IconButton( - onPressed: linkAttachment, - icon: const Icon(Symbols.attach_file), - tooltip: 'linkAttachment'.tr(), - color: colorScheme.primary, - ), - // Poll button with visual state when a poll is linked - ListenableBuilder( - listenable: state.pollId, - builder: (context, _) { - return IconButton( - onPressed: pickPoll, - icon: const Icon(Symbols.how_to_vote), - tooltip: 'poll'.tr(), + child: + Row( + children: [ + Expanded( + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: [ + UploadMenu( + items: uploadMenuItems, + isCompact: isCompact, + ), + IconButton( + onPressed: linkAttachment, + icon: const Icon(Symbols.attach_file), + tooltip: 'linkAttachment'.tr(), color: colorScheme.primary, - style: ButtonStyle( - backgroundColor: WidgetStatePropertyAll( - state.pollId.value != null - ? colorScheme.primary.withOpacity(0.15) - : null, - ), - ), - ); - }, + ), + // Poll button with visual state when a poll is linked + ListenableBuilder( + listenable: state.pollId, + builder: (context, _) { + return IconButton( + onPressed: pickPoll, + icon: const Icon(Symbols.how_to_vote), + tooltip: 'poll'.tr(), + color: colorScheme.primary, + style: ButtonStyle( + backgroundColor: WidgetStatePropertyAll( + state.pollId.value != null + ? colorScheme.primary.withOpacity(0.15) + : null, + ), + ), + ); + }, + ), + // Fund button with visual state when a fund is linked + ListenableBuilder( + listenable: state.fundId, + builder: (context, _) { + return IconButton( + onPressed: pickFund, + icon: const Icon( + Symbols.account_balance_wallet, + ), + tooltip: 'fund'.tr(), + color: colorScheme.primary, + style: ButtonStyle( + backgroundColor: WidgetStatePropertyAll( + state.fundId.value != null + ? colorScheme.primary.withOpacity(0.15) + : null, + ), + ), + ); + }, + ), + // Embed button with visual state when embed is present + ListenableBuilder( + listenable: state.embedView, + builder: (context, _) { + return IconButton( + onPressed: showEmbedSheet, + icon: const Icon(Symbols.iframe), + tooltip: 'embedView'.tr(), + color: colorScheme.primary, + style: ButtonStyle( + backgroundColor: WidgetStatePropertyAll( + state.embedView.value != null + ? colorScheme.primary.withOpacity(0.15) + : null, + ), + ), + ); + }, + ), + ], ), - // Fund button with visual state when a fund is linked - ListenableBuilder( - listenable: state.fundId, - builder: (context, _) { - return IconButton( - onPressed: pickFund, - icon: const Icon(Symbols.account_balance_wallet), - tooltip: 'fund'.tr(), - color: colorScheme.primary, - style: ButtonStyle( - backgroundColor: WidgetStatePropertyAll( - state.fundId.value != null - ? colorScheme.primary.withOpacity(0.15) - : null, - ), - ), - ); - }, - ), - // Embed button with visual state when embed is present - ListenableBuilder( - listenable: state.embedView, - builder: (context, _) { - return IconButton( - onPressed: showEmbedSheet, - icon: const Icon(Symbols.iframe), - tooltip: 'embedView'.tr(), - color: colorScheme.primary, - style: ButtonStyle( - backgroundColor: WidgetStatePropertyAll( - state.embedView.value != null - ? colorScheme.primary.withOpacity(0.15) - : null, - ), - ), - ); - }, - ), - ], + ), ), - ), + if (originalPost == null && state.isEmpty) + IconButton( + icon: const Icon(Symbols.draft), + color: colorScheme.primary, + onPressed: showDraftManager, + tooltip: 'drafts'.tr(), + ) + else if (originalPost == null) + IconButton( + icon: const Icon(Symbols.save), + color: colorScheme.primary, + onPressed: saveDraft, + onLongPress: showDraftManager, + tooltip: 'saveDraft'.tr(), + ), + ], + ).padding( + bottom: MediaQuery.of(context).padding.bottom + 16, + horizontal: 16, + top: 8, ), - if (originalPost == null && state.isEmpty) - IconButton( - icon: const Icon(Symbols.draft), - color: colorScheme.primary, - onPressed: showDraftManager, - tooltip: 'drafts'.tr(), - ) - else if (originalPost == null) - IconButton( - icon: const Icon(Symbols.save), - color: colorScheme.primary, - onPressed: saveDraft, - onLongPress: showDraftManager, - tooltip: 'saveDraft'.tr(), - ), - ], - ).padding( - bottom: MediaQuery.of(context).padding.bottom + 16, - horizontal: 16, - top: 8, - ), ), ), );