Code cleanup & Refactoring

This commit is contained in:
Ankit Mahato
2024-03-23 17:51:49 +05:30
parent 19c8406d36
commit 0884a14058
10 changed files with 103 additions and 114 deletions

View File

@ -56,6 +56,7 @@ const kForegroundOpacity = 0.05;
const kOverlayBackgroundOpacity = 0.5;
const kTextStyleButton = TextStyle(fontWeight: FontWeight.bold);
const kTextStyleTab = TextStyle(fontSize: 14);
const kTextStyleButtonSmall = TextStyle(fontSize: 12);
const kFormDataButtonLabelTextStyle = TextStyle(
fontSize: 12,
@ -71,9 +72,13 @@ const kP5 = EdgeInsets.all(5);
const kP8 = EdgeInsets.all(8);
const kPs8 = EdgeInsets.only(left: 8);
const kPs2 = EdgeInsets.only(left: 2);
const kPe8 = EdgeInsets.only(right: 8.0);
const kPh20v5 = EdgeInsets.symmetric(horizontal: 20, vertical: 5);
const kPh20v10 = EdgeInsets.symmetric(horizontal: 20, vertical: 10);
const kP10 = EdgeInsets.all(10);
const kPv8 = EdgeInsets.symmetric(vertical: 8);
const kPv2 = EdgeInsets.symmetric(vertical: 2);
const kPh2 = EdgeInsets.symmetric(horizontal: 2);
const kPt24o8 = EdgeInsets.only(top: 24, left: 8.0, right: 8.0, bottom: 8.0);
const kPt5o10 =
EdgeInsets.only(left: 10.0, right: 10.0, top: 5.0, bottom: 10.0);
@ -105,8 +110,6 @@ const kPb10 = EdgeInsets.only(
const kPb15 = EdgeInsets.only(
bottom: 15,
);
const kPr8CollectionPane = EdgeInsets.only(right: 8.0);
const kpsV5 = EdgeInsets.symmetric(vertical: 2);
const kHSpacer4 = SizedBox(width: 4);
const kHSpacer5 = SizedBox(width: 5);
const kHSpacer10 = SizedBox(width: 10);
@ -118,7 +121,7 @@ const kVSpacer20 = SizedBox(height: 20);
const kVSpacer40 = SizedBox(height: 40);
const kTabAnimationDuration = Duration(milliseconds: 200);
const kTabHeight = 45.0;
const kTabHeight = 32.0;
const kHeaderHeight = 32.0;
const kSegmentHeight = 24.0;
const kTextButtonMinWidth = 44.0;
@ -537,3 +540,36 @@ const kLabelSave = "Save";
const kLabelDownload = "Download";
const kLabelSaving = "Saving";
const kLabelSaved = "Saved";
// Request Pane
const kLabelRequest = "Request";
const kLabelHideCode = "Hide Code";
const kLabelViewCode = "View Code";
const kLabelURLParams = "URL Params";
const kLabelHeaders = "Headers";
const kLabelBody = "Body";
const kNameCheckbox = "Checkbox";
const kNameURLParam = "URL Parameter";
const kNameHeader = "Header Name";
const kNameValue = "Value";
const kNameField = "Field";
const kHintAddURLParam = "Add URL Parameter";
const kHintAddValue = "Add Value";
const kHintAddName = "Add Name";
const kHintAddFieldName = "Add Field Name";
const kLabelAddParam = "Add Param";
const kLabelAddHeader = "Add Header";
const kLabelSelectFile = "Select File";
const kLabelAddFormField = "Add Form Field";
// Response Pane
const kLabelNotSent = "Not Sent";
const kLabelResponse = "Response";
const kLabelResponseBody = "Response Body";
const kTooltipClearResponse = "Clear Response";
const kHeaderRow = ["Header Name", "Header Value"];
const kLabelRequestHeaders = "Request Headers";
const kLabelResponseHeaders = "Response Headers";
const kLabelItems = "items";
const kMsgError = "Error: Response data does not exist.";
const kMsgNullBody = "Response body is missing (null).";
const kMsgNoContent = "No content";
const kMsgUnknowContentType = "Unknown Response Content-Type";

View File

@ -26,7 +26,7 @@ class CollectionPane extends ConsumerWidget {
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Padding(
padding: kPr8CollectionPane,
padding: kPe8,
child: Wrap(
alignment: WrapAlignment.spaceBetween,
children: [
@ -115,7 +115,7 @@ class _RequestListState extends ConsumerState<RequestList> {
thumbVisibility: alwaysShowCollectionPaneScrollbar ? true : null,
radius: const Radius.circular(12),
child: ReorderableListView.builder(
padding: kPr8CollectionPane,
padding: kPe8,
scrollController: controller,
buildDefaultDragHandles: false,
itemCount: requestSequence.length,

View File

@ -52,8 +52,8 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
rows: formRows,
columns: [
DaviColumn(
cellPadding: kpsV5,
name: 'Key',
cellPadding: kPv2,
name: kNameField,
grow: 4,
cellBuilder: (_, row) {
int idx = row.index;
@ -63,7 +63,7 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
child: FormDataField(
keyId: "$selectedId-$idx-form-v-$seed",
initialValue: formRows[idx].name,
hintText: " Add Key",
hintText: kHintAddFieldName,
onChanged: (value) {
formRows[idx] = formRows[idx].copyWith(name: value);
if (isLast && !isAddingRow) {
@ -93,7 +93,7 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
),
DaviColumn(
width: 40,
cellPadding: kpsV5,
cellPadding: kPv2,
cellAlignment: Alignment.center,
cellBuilder: (_, row) {
return Text(
@ -103,9 +103,9 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
},
),
DaviColumn(
name: 'Value',
name: kNameValue,
grow: 4,
cellPadding: kpsV5,
cellPadding: kPv2,
cellBuilder: (_, row) {
int idx = row.index;
bool isLast = idx + 1 == formRows.length;
@ -145,7 +145,7 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
(formRows[idx].type == FormDataType.file &&
formRows[idx].value.isNotEmpty)
? formRows[idx].value.toString()
: "Select File",
: kLabelSelectFile,
textAlign: TextAlign.center,
overflow: TextOverflow.ellipsis,
style: kFormDataButtonLabelTextStyle,
@ -159,7 +159,7 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
: CellField(
keyId: "$selectedId-$idx-form-v-$seed",
initialValue: formRows[idx].value,
hintText: " Add Value",
hintText: kHintAddValue,
onChanged: (value) {
formRows[idx] = formRows[idx].copyWith(value: value);
if (isLast && !isAddingRow) {
@ -231,7 +231,7 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
},
icon: const Icon(Icons.add),
label: const Text(
"Add Form Data",
kLabelAddFormField,
style: kTextStyleButton,
),
),

View File

@ -59,7 +59,7 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
rows: headerRows,
columns: [
DaviColumn(
name: 'Checkbox',
name: kNameCheckbox,
width: 30,
cellBuilder: (_, row) {
int idx = row.index;
@ -80,7 +80,7 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
},
),
DaviColumn(
name: 'Header Name',
name: kNameHeader,
width: 70,
grow: 1,
cellBuilder: (_, row) {
@ -89,7 +89,7 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
return HeaderField(
keyId: "$selectedId-$idx-headers-k-$seed",
initialValue: headerRows[idx].name,
hintText: "Add Header Name",
hintText: kHintAddName,
onChanged: (value) {
headerRows[idx] = headerRows[idx].copyWith(name: value);
if (isLast && !isAddingRow) {
@ -115,7 +115,7 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
},
),
DaviColumn(
name: 'Header Value',
name: kNameValue,
grow: 1,
cellBuilder: (_, row) {
int idx = row.index;
@ -123,7 +123,7 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
return CellField(
keyId: "$selectedId-$idx-headers-v-$seed",
initialValue: headerRows[idx].value,
hintText: " Add Header Value",
hintText: kHintAddValue,
onChanged: (value) {
headerRows[idx] = headerRows[idx].copyWith(value: value);
if (isLast && !isAddingRow) {
@ -202,7 +202,7 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
},
icon: const Icon(Icons.add),
label: const Text(
"Add Header",
kLabelAddHeader,
style: kTextStyleButton,
),
),

View File

@ -59,7 +59,7 @@ class EditRequestURLParamsState extends ConsumerState<EditRequestURLParams> {
rows: paramRows,
columns: [
DaviColumn(
name: 'Checkbox',
name: kNameCheckbox,
width: 30,
cellBuilder: (_, row) {
int idx = row.index;
@ -80,7 +80,7 @@ class EditRequestURLParamsState extends ConsumerState<EditRequestURLParams> {
},
),
DaviColumn(
name: 'URL Parameter',
name: kNameURLParam,
width: 70,
grow: 1,
cellBuilder: (_, row) {
@ -89,7 +89,7 @@ class EditRequestURLParamsState extends ConsumerState<EditRequestURLParams> {
return CellField(
keyId: "$selectedId-$idx-params-k-$seed",
initialValue: paramRows[idx].name,
hintText: "Add URL Parameter",
hintText: kHintAddURLParam,
onChanged: (value) {
paramRows[idx] = paramRows[idx].copyWith(name: value);
if (isLast && !isAddingRow) {
@ -115,7 +115,7 @@ class EditRequestURLParamsState extends ConsumerState<EditRequestURLParams> {
},
),
DaviColumn(
name: 'Value',
name: kNameValue,
grow: 1,
cellBuilder: (_, row) {
int idx = row.index;
@ -123,7 +123,7 @@ class EditRequestURLParamsState extends ConsumerState<EditRequestURLParams> {
return CellField(
keyId: "$selectedId-$idx-params-v-$seed",
initialValue: paramRows[idx].value,
hintText: "Add Value",
hintText: kHintAddValue,
onChanged: (value) {
paramRows[idx] = paramRows[idx].copyWith(value: value);
if (isLast && !isAddingRow) {
@ -202,7 +202,7 @@ class EditRequestURLParamsState extends ConsumerState<EditRequestURLParams> {
},
icon: const Icon(Icons.add),
label: const Text(
"Add Param",
kLabelAddParam,
style: kTextStyleButton,
),
),

View File

@ -34,7 +34,6 @@ class ResponseDetails extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
var sm = ScaffoldMessenger.of(context);
final responseStatus = ref.watch(
selectedRequestModelProvider.select((value) => value?.responseStatus));
final message = ref
@ -52,8 +51,6 @@ class ResponseDetails extends ConsumerWidget {
ref
.read(collectionStateNotifierProvider.notifier)
.clearResponse(selectedRequest?.id);
sm.hideCurrentSnackBar();
sm.showSnackBar(getSnackBar('Response cleared'));
},
),
const Expanded(

View File

@ -246,15 +246,12 @@ class ClearResponseButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Tooltip(
message: 'Clear response',
child: TextButton(
style: TextButton.styleFrom(minimumSize: const Size(40, 40)),
onPressed: onPressed,
child: const Icon(
Icons.delete,
size: 20,
),
return IconButton(
tooltip: kTooltipClearResponse,
onPressed: onPressed,
icon: const Icon(
Icons.delete,
size: 16,
),
);
}

View File

@ -48,16 +48,12 @@ class _RequestPaneState extends State<RequestPane>
return Column(
children: [
Padding(
padding: kPh20v10,
padding: kP8,
child: SizedBox(
height: kHeaderHeight,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisAlignment: MainAxisAlignment.end,
children: [
Text(
"Request",
style: Theme.of(context).textTheme.titleMedium,
),
FilledButton.tonalIcon(
onPressed: widget.onPressedCodeButton,
icon: Icon(
@ -68,7 +64,8 @@ class _RequestPaneState extends State<RequestPane>
label: SizedBox(
width: 75,
child: Text(
widget.codePaneVisible ? "Hide Code" : "View Code"),
widget.codePaneVisible ? kLabelHideCode : kLabelViewCode,
),
),
),
],
@ -79,18 +76,19 @@ class _RequestPaneState extends State<RequestPane>
key: Key(widget.selectedId!),
controller: _controller,
overlayColor: kColorTransparentState,
labelPadding: kPh2,
onTap: widget.onTapTabBar,
tabs: [
TabLabel(
text: 'URL Params',
text: kLabelURLParams,
showIndicator: widget.showIndicators[0],
),
TabLabel(
text: 'Headers',
text: kLabelHeaders,
showIndicator: widget.showIndicators[1],
),
TabLabel(
text: 'Body',
text: kLabelBody,
showIndicator: widget.showIndicators[2],
),
],

View File

@ -23,7 +23,7 @@ class NotSentWidget extends StatelessWidget {
color: color,
),
Text(
'Not Sent',
kLabelNotSent,
style:
Theme.of(context).textTheme.titleMedium?.copyWith(color: color),
),
@ -66,42 +66,19 @@ class ResponsePaneHeader extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Padding(
padding: kPh20v10,
padding: kPv8,
child: SizedBox(
height: kHeaderHeight,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text.rich(
TextSpan(
children: [
const TextSpan(
text: "Response (",
),
TextSpan(
text: "$responseStatus",
style: TextStyle(
color: getResponseStatusCodeColor(
responseStatus,
brightness: Theme.of(context).brightness,
),
fontFamily: kCodeStyle.fontFamily,
),
),
const TextSpan(
text: ")",
),
],
style: Theme.of(context).textTheme.titleMedium,
),
),
kHSpacer20,
kHSpacer10,
Expanded(
child: Text(
message ?? "",
"$responseStatus: ${message ?? '-'}",
softWrap: false,
overflow: TextOverflow.ellipsis,
style: Theme.of(context).textTheme.titleMedium!.copyWith(
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
fontFamily: kCodeStyle.fontFamily,
color: getResponseStatusCodeColor(
responseStatus,
@ -110,10 +87,10 @@ class ResponsePaneHeader extends StatelessWidget {
),
),
),
kHSpacer20,
kHSpacer10,
Text(
humanizeDuration(time),
style: Theme.of(context).textTheme.titleMedium!.copyWith(
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
fontFamily: kCodeStyle.fontFamily,
color: Theme.of(context).colorScheme.secondary,
),
@ -163,31 +140,15 @@ class _ResponseTabViewState extends State<ResponseTabView>
TabBar(
key: Key(widget.selectedId!),
controller: _controller,
labelPadding: kPh2,
overlayColor: kColorTransparentState,
onTap: (index) {},
tabs: const [
SizedBox(
height: kTabHeight,
child: Center(
child: Text(
'Body',
textAlign: TextAlign.center,
overflow: TextOverflow.fade,
softWrap: false,
style: kTextStyleButton,
),
),
TabLabel(
text: kLabelResponseBody,
),
SizedBox(
height: kTabHeight,
child: Center(
child: Text(
'Headers',
textAlign: TextAlign.center,
overflow: TextOverflow.fade,
style: kTextStyleButton,
),
),
TabLabel(
text: kLabelHeaders,
),
],
),
@ -227,8 +188,8 @@ class ResponseHeadersHeader extends StatelessWidget {
children: [
Expanded(
child: Text(
"$name (${map.length} items)",
style: Theme.of(context).textTheme.labelLarge!.copyWith(
"$name (${map.length} $kLabelItems)",
style: Theme.of(context).textTheme.labelMedium?.copyWith(
fontWeight: FontWeight.bold,
),
),
@ -243,8 +204,6 @@ class ResponseHeadersHeader extends StatelessWidget {
}
}
const kHeaderRow = ["Header Name", "Header Value"];
class ResponseHeaders extends StatelessWidget {
const ResponseHeaders({
super.key,
@ -263,7 +222,7 @@ class ResponseHeaders extends StatelessWidget {
children: [
ResponseHeadersHeader(
map: responseHeaders,
name: "Response Headers",
name: kLabelResponseHeaders,
),
if (responseHeaders.isNotEmpty) kVSpacer5,
if (responseHeaders.isNotEmpty)
@ -275,7 +234,7 @@ class ResponseHeaders extends StatelessWidget {
kVSpacer10,
ResponseHeadersHeader(
map: requestHeaders,
name: "Request Headers",
name: kLabelRequestHeaders,
),
if (requestHeaders.isNotEmpty) kVSpacer5,
if (requestHeaders.isNotEmpty)
@ -302,20 +261,18 @@ class ResponseBody extends StatelessWidget {
Widget build(BuildContext context) {
final responseModel = selectedRequestModel?.responseModel;
if (responseModel == null) {
return const ErrorMessage(
message:
'Error: Response data does not exist. $kUnexpectedRaiseIssue');
return const ErrorMessage(message: '$kMsgError $kUnexpectedRaiseIssue');
}
var body = responseModel.body;
var formattedBody = responseModel.formattedBody;
if (body == null) {
return const ErrorMessage(
message: 'Response body is missing (null). $kUnexpectedRaiseIssue');
message: '$kMsgNullBody $kUnexpectedRaiseIssue');
}
if (body.isEmpty) {
return const ErrorMessage(
message: 'No content',
message: kMsgNoContent,
showIcon: false,
showIssueButton: false,
);
@ -325,7 +282,7 @@ class ResponseBody extends StatelessWidget {
if (mediaType == null) {
return ErrorMessage(
message:
'Unknown Response Content-Type - ${responseModel.contentType}. $kUnexpectedRaiseIssue');
'$kMsgUnknowContentType - ${responseModel.contentType}. $kUnexpectedRaiseIssue');
}
var responseBodyView = getResponseBodyViewOptions(mediaType);

View File

@ -2,7 +2,11 @@ import 'package:flutter/material.dart';
import 'package:apidash/consts.dart';
class TabLabel extends StatelessWidget {
const TabLabel({super.key, required this.text, this.showIndicator = false});
const TabLabel({
super.key,
required this.text,
this.showIndicator = false,
});
final String text;
final bool showIndicator;
@ -18,14 +22,14 @@ class TabLabel extends StatelessWidget {
textAlign: TextAlign.center,
overflow: TextOverflow.fade,
softWrap: false,
style: kTextStyleButton,
style: kTextStyleTab,
),
),
if (showIndicator)
const Align(
alignment: Alignment.topCenter,
child: Padding(
padding: EdgeInsets.only(top: 6),
padding: EdgeInsets.only(top: 1),
child: Icon(
Icons.circle,
size: 6,