Merge pull request #433 from DenserMeerkat/resolve-code-tab

fix: refactored ui
This commit is contained in:
Ashita Prasad
2024-08-10 21:05:00 +05:30
committed by GitHub
7 changed files with 72 additions and 73 deletions

View File

@ -20,10 +20,7 @@ class _HistoryDetailsState extends ConsumerState<HistoryDetails>
Widget build(BuildContext context) { Widget build(BuildContext context) {
final selectedHistoryRequest = final selectedHistoryRequest =
ref.watch(selectedHistoryRequestModelProvider); ref.watch(selectedHistoryRequestModelProvider);
final metaData = selectedHistoryRequest?.metaData;
final codePaneVisible = ref.watch(historyCodePaneVisibleStateProvider); final codePaneVisible = ref.watch(historyCodePaneVisibleStateProvider);
final TabController controller = final TabController controller =
useTabController(initialLength: 3, vsync: this); useTabController(initialLength: 3, vsync: this);
@ -37,8 +34,7 @@ class _HistoryDetailsState extends ConsumerState<HistoryDetails>
Padding( Padding(
padding: kPh4, padding: kPh4,
child: HistoryURLCard( child: HistoryURLCard(
method: metaData!.method, historyRequestModel: selectedHistoryRequest,
url: metaData.url,
)), )),
kVSpacer10, kVSpacer10,
if (isCompact) ...[ if (isCompact) ...[
@ -72,16 +68,8 @@ class _HistoryDetailsState extends ConsumerState<HistoryDetails>
padding: kPh4, padding: kPh4,
child: RequestDetailsCard( child: RequestDetailsCard(
child: EqualSplitView( child: EqualSplitView(
leftWidget: Column( leftWidget:
children: [ HistoryRequestPane(isCompact: isCompact),
Expanded(
child: HistoryRequestPane(
isCompact: isCompact,
),
),
const HistoryPageBottombar(),
],
),
rightWidget: codePaneVisible rightWidget: codePaneVisible
? const CodePane(isHistoryRequest: true) ? const CodePane(isHistoryRequest: true)
: const HistoryResponsePane(), : const HistoryResponsePane(),

View File

@ -17,6 +17,7 @@ class HistoryActionButtons extends ConsumerWidget {
element.id == historyRequestModel?.metaData.requestId) ?? element.id == historyRequestModel?.metaData.requestId) ??
false; false;
final requestId = historyRequestModel?.metaData.requestId; final requestId = historyRequestModel?.metaData.requestId;
return FilledButtonGroup(buttons: [ return FilledButtonGroup(buttons: [
ButtonData( ButtonData(
icon: Icons.copy_rounded, icon: Icons.copy_rounded,

View File

@ -1,23 +1,27 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:apidash/widgets/widgets.dart'; import 'package:apidash/widgets/widgets.dart';
import 'package:apidash/models/models.dart';
import 'package:apidash/utils/utils.dart'; import 'package:apidash/utils/utils.dart';
import 'package:apidash/consts.dart'; import 'package:apidash/consts.dart';
import 'his_action_buttons.dart';
class HistoryURLCard extends StatelessWidget { class HistoryURLCard extends StatelessWidget {
const HistoryURLCard({ const HistoryURLCard({
super.key, super.key,
required this.method, required this.historyRequestModel,
required this.url,
}); });
final HTTPVerb method; final HistoryRequestModel? historyRequestModel;
final String url;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final method = historyRequestModel?.metaData.method;
final url = historyRequestModel?.metaData.url;
final fontSize = Theme.of(context).textTheme.titleMedium?.fontSize; final fontSize = Theme.of(context).textTheme.titleMedium?.fontSize;
return LayoutBuilder(builder: (context, constraints) { return LayoutBuilder(builder: (context, constraints) {
final isCompact = constraints.maxWidth <= kMinWindowSize.width; final isCompact = constraints.maxWidth <= kMinWindowSize.width;
final isExpanded = constraints.maxWidth >= kMediumWindowWidth;
return Card( return Card(
color: kColorTransparent, color: kColorTransparent,
surfaceTintColor: kColorTransparent, surfaceTintColor: kColorTransparent,
@ -37,7 +41,7 @@ class HistoryURLCard extends StatelessWidget {
children: [ children: [
isCompact ? const SizedBox.shrink() : kHSpacer10, isCompact ? const SizedBox.shrink() : kHSpacer10,
Text( Text(
method.name.toUpperCase(), method!.name.toUpperCase(),
style: kCodeStyle.copyWith( style: kCodeStyle.copyWith(
fontSize: fontSize, fontSize: fontSize,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
@ -55,7 +59,12 @@ class HistoryURLCard extends StatelessWidget {
fontSize: fontSize, fontSize: fontSize,
), ),
), ),
),
isExpanded
? HistoryActionButtons(
historyRequestModel: historyRequestModel,
) )
: const SizedBox.shrink()
], ],
), ),
), ),

View File

@ -1,3 +1,4 @@
import 'package:apidash/screens/common_widgets/common_widgets.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:apidash/widgets/widgets.dart'; import 'package:apidash/widgets/widgets.dart';
import 'package:apidash/consts.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/editor_request.dart';
import '../../home_page/editor_pane/url_card.dart'; import '../../home_page/editor_pane/url_card.dart';
class RequestResponseTabs extends StatelessWidget { class RequestTabs extends StatelessWidget {
const RequestResponseTabs({super.key, required this.controller}); const RequestTabs({super.key, required this.controller});
final TabController controller; final TabController controller;
@override @override
@ -24,16 +25,17 @@ class RequestResponseTabs extends StatelessWidget {
tabs: const [ tabs: const [
Tab(text: kLabelRequest), Tab(text: kLabelRequest),
Tab(text: kLabelResponse), Tab(text: kLabelResponse),
Tab(text: kLabelCode),
], ],
), ),
Expanded(child: RequestResponseTabviews(controller: controller)) Expanded(child: RequestTabviews(controller: controller))
], ],
); );
} }
} }
class RequestResponseTabviews extends StatelessWidget { class RequestTabviews extends StatelessWidget {
const RequestResponseTabviews({super.key, required this.controller}); const RequestTabviews({super.key, required this.controller});
final TabController controller; final TabController controller;
@override @override
@ -46,6 +48,7 @@ class RequestResponseTabviews extends StatelessWidget {
padding: kPt8, padding: kPt8,
child: ResponsePane(), child: ResponsePane(),
), ),
CodePane(),
], ],
); );
} }

View File

@ -9,8 +9,7 @@ import '../../home_page/collection_pane.dart';
import '../../home_page/editor_pane/url_card.dart'; import '../../home_page/editor_pane/url_card.dart';
import '../../home_page/editor_pane/editor_default.dart'; import '../../home_page/editor_pane/editor_default.dart';
import '../../common_widgets/common_widgets.dart'; import '../../common_widgets/common_widgets.dart';
import '../widgets/page_base.dart'; import 'request_tabs.dart';
import 'request_response_tabs.dart';
class RequestResponsePage extends StatefulHookConsumerWidget { class RequestResponsePage extends StatefulHookConsumerWidget {
const RequestResponsePage({ const RequestResponsePage({
@ -29,8 +28,8 @@ class _RequestResponsePageState extends ConsumerState<RequestResponsePage>
final id = ref.watch(selectedIdStateProvider); final id = ref.watch(selectedIdStateProvider);
final name = getRequestTitleFromUrl( final name = getRequestTitleFromUrl(
ref.watch(selectedRequestModelProvider.select((value) => value?.name))); ref.watch(selectedRequestModelProvider.select((value) => value?.name)));
final TabController requestResponseTabController = final TabController requestTabController =
useTabController(initialLength: 2, vsync: this); useTabController(initialLength: 3, vsync: this);
return DrawerSplitView( return DrawerSplitView(
scaffoldKey: kHomeScaffoldKey, scaffoldKey: kHomeScaffoldKey,
title: EditorTitle( title: EditorTitle(
@ -55,11 +54,11 @@ class _RequestResponsePageState extends ConsumerState<RequestResponsePage>
actions: const [Padding(padding: kPh8, child: EnvironmentDropdown())], actions: const [Padding(padding: kPh8, child: EnvironmentDropdown())],
mainContent: id == null mainContent: id == null
? const RequestEditorDefault() ? const RequestEditorDefault()
: RequestResponseTabs( : RequestTabs(
controller: requestResponseTabController, controller: requestTabController,
), ),
bottomNavigationBar: RequestResponsePageBottombar( bottomNavigationBar: RequestResponsePageBottombar(
requestResponseTabController: requestResponseTabController, requestTabController: requestTabController,
), ),
onDrawerChanged: (value) => onDrawerChanged: (value) =>
ref.read(leftDrawerStateProvider.notifier).state = value, ref.read(leftDrawerStateProvider.notifier).state = value,
@ -67,16 +66,15 @@ class _RequestResponsePageState extends ConsumerState<RequestResponsePage>
} }
} }
class RequestResponsePageBottombar extends ConsumerWidget { class RequestResponsePageBottombar extends StatelessWidget {
const RequestResponsePageBottombar({ const RequestResponsePageBottombar({
super.key, super.key,
required this.requestResponseTabController, required this.requestTabController,
}); });
final TabController requestResponseTabController; final TabController requestTabController;
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context) {
final selecetdId = ref.watch(selectedIdStateProvider);
return Padding( return Padding(
padding: MediaQuery.of(context).viewInsets, padding: MediaQuery.of(context).viewInsets,
child: Container( child: Container(
@ -97,36 +95,14 @@ class RequestResponsePageBottombar extends ConsumerWidget {
), ),
), ),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
IconButton.filledTonal( const Spacer(),
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),
),
SizedBox( SizedBox(
height: 36, height: 36,
child: SendRequestButton( child: SendRequestButton(
onTap: () { onTap: () {
if (requestResponseTabController.index != 1) { if (requestTabController.index != 1) {
requestResponseTabController.animateTo(1); requestTabController.animateTo(1);
} }
}, },
), ),

View File

@ -184,9 +184,19 @@ class SettingsPage extends ConsumerWidget {
: () => showDialog<String>( : () => showDialog<String>(
context: context, context: context,
builder: (BuildContext context) => AlertDialog( builder: (BuildContext context) => AlertDialog(
icon: const Icon(Icons.manage_history_rounded),
iconColor: settings.isDark
? kColorDarkDanger
: kColorLightDanger,
title: const Text('Clear Data'), title: const Text('Clear Data'),
content: const Text( 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?'), 'This action will clear all the requests data from the disk and is irreversible. Do you want to proceed?'),
),
actions: <Widget>[ actions: <Widget>[
TextButton( TextButton(
onPressed: () => onPressed: () =>

View File

@ -1,3 +1,4 @@
import 'package:apidash/consts.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
showRenameDialog( showRenameDialog(
@ -13,19 +14,30 @@ showRenameDialog(
controller.selection = controller.selection =
TextSelection(baseOffset: 0, extentOffset: controller.text.length); TextSelection(baseOffset: 0, extentOffset: controller.text.length);
return AlertDialog( return AlertDialog(
icon: const Icon(Icons.edit_rounded),
iconColor: Theme.of(context).colorScheme.primary,
title: Text(dialogTitle), title: Text(dialogTitle),
content: TextField( titleTextStyle: Theme.of(context).textTheme.titleLarge,
content: Container(
padding: kPt20,
width: 300,
child: TextField(
autofocus: true, autofocus: true,
controller: controller, controller: controller,
decoration: const InputDecoration(hintText: "Enter new name"), decoration: const InputDecoration(
hintText: "Enter new name",
border: OutlineInputBorder(
borderRadius: kBorderRadius12,
)),
),
), ),
actions: <Widget>[ actions: <Widget>[
OutlinedButton( TextButton(
onPressed: () { onPressed: () {
Navigator.pop(context); Navigator.pop(context);
}, },
child: const Text('CANCEL')), child: const Text('Cancel')),
FilledButton( TextButton(
onPressed: () { onPressed: () {
final val = controller.text.trim(); final val = controller.text.trim();
onRename(val); onRename(val);
@ -34,7 +46,7 @@ showRenameDialog(
controller.dispose(); controller.dispose();
}); });
}, },
child: const Text('OK')), child: const Text('Ok')),
], ],
); );
}); });