mirror of
https://github.com/foss42/apidash.git
synced 2025-05-31 06:08:09 +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) {
|
||||
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<HistoryDetails>
|
||||
Padding(
|
||||
padding: kPh4,
|
||||
child: HistoryURLCard(
|
||||
method: metaData!.method,
|
||||
url: metaData.url,
|
||||
historyRequestModel: selectedHistoryRequest,
|
||||
)),
|
||||
kVSpacer10,
|
||||
if (isCompact) ...[
|
||||
@ -72,16 +68,8 @@ class _HistoryDetailsState extends ConsumerState<HistoryDetails>
|
||||
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(),
|
||||
|
@ -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,
|
||||
|
@ -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()
|
||||
],
|
||||
),
|
||||
),
|
||||
|
@ -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(),
|
||||
],
|
||||
);
|
||||
}
|
@ -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<RequestResponsePage>
|
||||
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<RequestResponsePage>
|
||||
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<RequestResponsePage>
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
},
|
||||
),
|
||||
|
@ -184,9 +184,19 @@ class SettingsPage extends ConsumerWidget {
|
||||
: () => showDialog<String>(
|
||||
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: <Widget>[
|
||||
TextButton(
|
||||
onPressed: () =>
|
||||
|
@ -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: <Widget>[
|
||||
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')),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
Reference in New Issue
Block a user