diff --git a/lib/screens/history/history_details.dart b/lib/screens/history/history_details.dart index ebdf81c1..6e12b422 100644 --- a/lib/screens/history/history_details.dart +++ b/lib/screens/history/history_details.dart @@ -20,10 +20,7 @@ class _HistoryDetailsState extends ConsumerState Widget build(BuildContext context) { final selectedHistoryRequest = ref.watch(selectedHistoryRequestModelProvider); - final metaData = selectedHistoryRequest?.metaData; - final codePaneVisible = ref.watch(historyCodePaneVisibleStateProvider); - final TabController controller = useTabController(initialLength: 3, vsync: this); @@ -37,8 +34,7 @@ class _HistoryDetailsState extends ConsumerState Padding( padding: kPh4, child: HistoryURLCard( - method: metaData!.method, - url: metaData.url, + historyRequestModel: selectedHistoryRequest, )), kVSpacer10, if (isCompact) ...[ @@ -72,16 +68,8 @@ class _HistoryDetailsState extends ConsumerState padding: kPh4, child: RequestDetailsCard( child: EqualSplitView( - leftWidget: Column( - children: [ - Expanded( - child: HistoryRequestPane( - isCompact: isCompact, - ), - ), - const HistoryPageBottombar(), - ], - ), + leftWidget: + HistoryRequestPane(isCompact: isCompact), rightWidget: codePaneVisible ? const CodePane(isHistoryRequest: true) : const HistoryResponsePane(), diff --git a/lib/screens/history/history_widgets/his_action_buttons.dart b/lib/screens/history/history_widgets/his_action_buttons.dart index 436c9557..d4e79959 100644 --- a/lib/screens/history/history_widgets/his_action_buttons.dart +++ b/lib/screens/history/history_widgets/his_action_buttons.dart @@ -17,6 +17,7 @@ class HistoryActionButtons extends ConsumerWidget { element.id == historyRequestModel?.metaData.requestId) ?? false; final requestId = historyRequestModel?.metaData.requestId; + return FilledButtonGroup(buttons: [ ButtonData( icon: Icons.copy_rounded, diff --git a/lib/screens/history/history_widgets/his_url_card.dart b/lib/screens/history/history_widgets/his_url_card.dart index cb8ec0da..f7fd89b3 100644 --- a/lib/screens/history/history_widgets/his_url_card.dart +++ b/lib/screens/history/history_widgets/his_url_card.dart @@ -1,23 +1,27 @@ import 'package:flutter/material.dart'; import 'package:apidash/widgets/widgets.dart'; +import 'package:apidash/models/models.dart'; import 'package:apidash/utils/utils.dart'; import 'package:apidash/consts.dart'; +import 'his_action_buttons.dart'; class HistoryURLCard extends StatelessWidget { const HistoryURLCard({ super.key, - required this.method, - required this.url, + required this.historyRequestModel, }); - final HTTPVerb method; - final String url; + final HistoryRequestModel? historyRequestModel; @override Widget build(BuildContext context) { + final method = historyRequestModel?.metaData.method; + final url = historyRequestModel?.metaData.url; final fontSize = Theme.of(context).textTheme.titleMedium?.fontSize; + return LayoutBuilder(builder: (context, constraints) { final isCompact = constraints.maxWidth <= kMinWindowSize.width; + final isExpanded = constraints.maxWidth >= kMediumWindowWidth; return Card( color: kColorTransparent, surfaceTintColor: kColorTransparent, @@ -37,7 +41,7 @@ class HistoryURLCard extends StatelessWidget { children: [ isCompact ? const SizedBox.shrink() : kHSpacer10, Text( - method.name.toUpperCase(), + method!.name.toUpperCase(), style: kCodeStyle.copyWith( fontSize: fontSize, fontWeight: FontWeight.bold, @@ -55,7 +59,12 @@ class HistoryURLCard extends StatelessWidget { fontSize: fontSize, ), ), - ) + ), + isExpanded + ? HistoryActionButtons( + historyRequestModel: historyRequestModel, + ) + : const SizedBox.shrink() ], ), ), diff --git a/lib/screens/mobile/requests_page/request_response_tabs.dart b/lib/screens/mobile/requests_page/request_tabs.dart similarity index 72% rename from lib/screens/mobile/requests_page/request_response_tabs.dart rename to lib/screens/mobile/requests_page/request_tabs.dart index 34a0ed90..7d542095 100644 --- a/lib/screens/mobile/requests_page/request_response_tabs.dart +++ b/lib/screens/mobile/requests_page/request_tabs.dart @@ -1,3 +1,4 @@ +import 'package:apidash/screens/common_widgets/common_widgets.dart'; import 'package:flutter/material.dart'; import 'package:apidash/widgets/widgets.dart'; import 'package:apidash/consts.dart'; @@ -5,8 +6,8 @@ import '../../home_page/editor_pane/details_card/response_pane.dart'; import '../../home_page/editor_pane/editor_request.dart'; import '../../home_page/editor_pane/url_card.dart'; -class RequestResponseTabs extends StatelessWidget { - const RequestResponseTabs({super.key, required this.controller}); +class RequestTabs extends StatelessWidget { + const RequestTabs({super.key, required this.controller}); final TabController controller; @override @@ -24,16 +25,17 @@ class RequestResponseTabs extends StatelessWidget { tabs: const [ Tab(text: kLabelRequest), Tab(text: kLabelResponse), + Tab(text: kLabelCode), ], ), - Expanded(child: RequestResponseTabviews(controller: controller)) + Expanded(child: RequestTabviews(controller: controller)) ], ); } } -class RequestResponseTabviews extends StatelessWidget { - const RequestResponseTabviews({super.key, required this.controller}); +class RequestTabviews extends StatelessWidget { + const RequestTabviews({super.key, required this.controller}); final TabController controller; @override @@ -46,6 +48,7 @@ class RequestResponseTabviews extends StatelessWidget { padding: kPt8, child: ResponsePane(), ), + CodePane(), ], ); } diff --git a/lib/screens/mobile/requests_page/requests_page.dart b/lib/screens/mobile/requests_page/requests_page.dart index fcd291b1..f9c986d9 100644 --- a/lib/screens/mobile/requests_page/requests_page.dart +++ b/lib/screens/mobile/requests_page/requests_page.dart @@ -9,8 +9,7 @@ import '../../home_page/collection_pane.dart'; import '../../home_page/editor_pane/url_card.dart'; import '../../home_page/editor_pane/editor_default.dart'; import '../../common_widgets/common_widgets.dart'; -import '../widgets/page_base.dart'; -import 'request_response_tabs.dart'; +import 'request_tabs.dart'; class RequestResponsePage extends StatefulHookConsumerWidget { const RequestResponsePage({ @@ -29,8 +28,8 @@ class _RequestResponsePageState extends ConsumerState final id = ref.watch(selectedIdStateProvider); final name = getRequestTitleFromUrl( ref.watch(selectedRequestModelProvider.select((value) => value?.name))); - final TabController requestResponseTabController = - useTabController(initialLength: 2, vsync: this); + final TabController requestTabController = + useTabController(initialLength: 3, vsync: this); return DrawerSplitView( scaffoldKey: kHomeScaffoldKey, title: EditorTitle( @@ -55,11 +54,11 @@ class _RequestResponsePageState extends ConsumerState actions: const [Padding(padding: kPh8, child: EnvironmentDropdown())], mainContent: id == null ? const RequestEditorDefault() - : RequestResponseTabs( - controller: requestResponseTabController, + : RequestTabs( + controller: requestTabController, ), bottomNavigationBar: RequestResponsePageBottombar( - requestResponseTabController: requestResponseTabController, + requestTabController: requestTabController, ), onDrawerChanged: (value) => ref.read(leftDrawerStateProvider.notifier).state = value, @@ -67,16 +66,15 @@ class _RequestResponsePageState extends ConsumerState } } -class RequestResponsePageBottombar extends ConsumerWidget { +class RequestResponsePageBottombar extends StatelessWidget { const RequestResponsePageBottombar({ super.key, - required this.requestResponseTabController, + required this.requestTabController, }); - final TabController requestResponseTabController; + final TabController requestTabController; @override - Widget build(BuildContext context, WidgetRef ref) { - final selecetdId = ref.watch(selectedIdStateProvider); + Widget build(BuildContext context) { return Padding( padding: MediaQuery.of(context).viewInsets, child: Container( @@ -97,36 +95,14 @@ class RequestResponsePageBottombar extends ConsumerWidget { ), ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - IconButton.filledTonal( - style: IconButton.styleFrom( - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(12)), - ), - ), - onPressed: selecetdId == null - ? null - : () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => const PageBase( - title: 'View Code', - scaffoldBody: CodePane(), - addBottomPadding: false, - ), - fullscreenDialog: true, - ), - ); - }, - icon: const Icon(Icons.code_rounded), - ), + const Spacer(), SizedBox( height: 36, child: SendRequestButton( onTap: () { - if (requestResponseTabController.index != 1) { - requestResponseTabController.animateTo(1); + if (requestTabController.index != 1) { + requestTabController.animateTo(1); } }, ), diff --git a/lib/screens/settings_page.dart b/lib/screens/settings_page.dart index 2ce155f2..8e9c8486 100644 --- a/lib/screens/settings_page.dart +++ b/lib/screens/settings_page.dart @@ -184,9 +184,19 @@ class SettingsPage extends ConsumerWidget { : () => showDialog( context: context, builder: (BuildContext context) => AlertDialog( + icon: const Icon(Icons.manage_history_rounded), + iconColor: settings.isDark + ? kColorDarkDanger + : kColorLightDanger, title: const Text('Clear Data'), - content: const Text( - 'This action will clear all the requests data from the disk and is irreversible. Do you want to proceed?'), + titleTextStyle: + Theme.of(context).textTheme.titleLarge, + content: ConstrainedBox( + constraints: + const BoxConstraints(maxWidth: 300), + child: const Text( + 'This action will clear all the requests data from the disk and is irreversible. Do you want to proceed?'), + ), actions: [ TextButton( onPressed: () => diff --git a/lib/widgets/dialog_rename.dart b/lib/widgets/dialog_rename.dart index 900ba758..4b78e987 100644 --- a/lib/widgets/dialog_rename.dart +++ b/lib/widgets/dialog_rename.dart @@ -1,3 +1,4 @@ +import 'package:apidash/consts.dart'; import 'package:flutter/material.dart'; showRenameDialog( @@ -13,19 +14,30 @@ showRenameDialog( controller.selection = TextSelection(baseOffset: 0, extentOffset: controller.text.length); return AlertDialog( + icon: const Icon(Icons.edit_rounded), + iconColor: Theme.of(context).colorScheme.primary, title: Text(dialogTitle), - content: TextField( - autofocus: true, - controller: controller, - decoration: const InputDecoration(hintText: "Enter new name"), + titleTextStyle: Theme.of(context).textTheme.titleLarge, + content: Container( + padding: kPt20, + width: 300, + child: TextField( + autofocus: true, + controller: controller, + decoration: const InputDecoration( + hintText: "Enter new name", + border: OutlineInputBorder( + borderRadius: kBorderRadius12, + )), + ), ), actions: [ - OutlinedButton( + TextButton( onPressed: () { Navigator.pop(context); }, - child: const Text('CANCEL')), - FilledButton( + child: const Text('Cancel')), + TextButton( onPressed: () { final val = controller.text.trim(); onRename(val); @@ -34,7 +46,7 @@ showRenameDialog( controller.dispose(); }); }, - child: const Text('OK')), + child: const Text('Ok')), ], ); });