mirror of
https://github.com/foss42/apidash.git
synced 2025-06-06 11:28:07 +08:00
Merge pull request #433 from DenserMeerkat/resolve-code-tab
fix: refactored ui
This commit is contained in:
@ -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(),
|
||||||
|
@ -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,
|
||||||
|
@ -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()
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -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(),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
@ -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);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
@ -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: () =>
|
||||||
|
@ -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')),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user