mirror of
https://github.com/foss42/apidash.git
synced 2025-06-01 06:42:07 +08:00
wip: added basic methods
This commit is contained in:
@ -1,9 +1,10 @@
|
|||||||
import 'dart:io';
|
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:davi/davi.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:google_fonts/google_fonts.dart';
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
import 'package:davi/davi.dart';
|
|
||||||
|
|
||||||
const kDiscordUrl = "https://bit.ly/heyfoss";
|
const kDiscordUrl = "https://bit.ly/heyfoss";
|
||||||
const kGitUrl = "https://github.com/foss42/apidash";
|
const kGitUrl = "https://github.com/foss42/apidash";
|
||||||
@ -224,7 +225,9 @@ enum RequestItemMenuOption { edit, delete, duplicate }
|
|||||||
|
|
||||||
enum HTTPVerb { get, head, post, put, patch, delete }
|
enum HTTPVerb { get, head, post, put, patch, delete }
|
||||||
|
|
||||||
enum ContentType { json, text }
|
enum ContentType { json, text, formdata }
|
||||||
|
|
||||||
|
enum FormDataType { text, file }
|
||||||
|
|
||||||
const kSupportedUriSchemes = ["https", "http"];
|
const kSupportedUriSchemes = ["https", "http"];
|
||||||
const kDefaultUriScheme = "https";
|
const kDefaultUriScheme = "https";
|
||||||
@ -294,6 +297,11 @@ const kSubTypeDefaultViewOptions = 'all';
|
|||||||
const kContentTypeMap = {
|
const kContentTypeMap = {
|
||||||
ContentType.json: "$kTypeApplication/$kSubTypeJson",
|
ContentType.json: "$kTypeApplication/$kSubTypeJson",
|
||||||
ContentType.text: "$kTypeText/$kSubTypePlain",
|
ContentType.text: "$kTypeText/$kSubTypePlain",
|
||||||
|
ContentType.formdata: "multipart/form-data",
|
||||||
|
};
|
||||||
|
const kFormDataTypeMap = {
|
||||||
|
FormDataType.file: "File",
|
||||||
|
FormDataType.text: "Text",
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ResponseBodyView { preview, code, raw, none }
|
enum ResponseBodyView { preview, code, raw, none }
|
||||||
|
23
lib/models/form_data_model.dart
Normal file
23
lib/models/form_data_model.dart
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import 'package:apidash/consts.dart';
|
||||||
|
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||||
|
|
||||||
|
part 'form_data_model.freezed.dart';
|
||||||
|
part 'form_data_model.g.dart';
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
class FormDataModel with _$FormDataModel {
|
||||||
|
const factory FormDataModel({
|
||||||
|
required String name,
|
||||||
|
required dynamic value,
|
||||||
|
required FormDataType type,
|
||||||
|
}) = _FormDataModel;
|
||||||
|
|
||||||
|
factory FormDataModel.fromJson(Map<String, Object?> json) =>
|
||||||
|
_$FormDataModelFromJson(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
const kNameValueEmptyModel = FormDataModel(
|
||||||
|
name: "",
|
||||||
|
value: "",
|
||||||
|
type: FormDataType.text,
|
||||||
|
);
|
188
lib/models/form_data_model.freezed.dart
Normal file
188
lib/models/form_data_model.freezed.dart
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
// coverage:ignore-file
|
||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
|
||||||
|
|
||||||
|
part of 'form_data_model.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// FreezedGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
T _$identity<T>(T value) => value;
|
||||||
|
|
||||||
|
final _privateConstructorUsedError = UnsupportedError(
|
||||||
|
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods');
|
||||||
|
|
||||||
|
FormDataModel _$FormDataModelFromJson(Map<String, dynamic> json) {
|
||||||
|
return _FormDataModel.fromJson(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
mixin _$FormDataModel {
|
||||||
|
String get name => throw _privateConstructorUsedError;
|
||||||
|
dynamic get value => throw _privateConstructorUsedError;
|
||||||
|
FormDataType get type => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||||
|
@JsonKey(ignore: true)
|
||||||
|
$FormDataModelCopyWith<FormDataModel> get copyWith =>
|
||||||
|
throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class $FormDataModelCopyWith<$Res> {
|
||||||
|
factory $FormDataModelCopyWith(
|
||||||
|
FormDataModel value, $Res Function(FormDataModel) then) =
|
||||||
|
_$FormDataModelCopyWithImpl<$Res, FormDataModel>;
|
||||||
|
@useResult
|
||||||
|
$Res call({String name, dynamic value, FormDataType type});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class _$FormDataModelCopyWithImpl<$Res, $Val extends FormDataModel>
|
||||||
|
implements $FormDataModelCopyWith<$Res> {
|
||||||
|
_$FormDataModelCopyWithImpl(this._value, this._then);
|
||||||
|
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Val _value;
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? name = null,
|
||||||
|
Object? value = freezed,
|
||||||
|
Object? type = null,
|
||||||
|
}) {
|
||||||
|
return _then(_value.copyWith(
|
||||||
|
name: null == name
|
||||||
|
? _value.name
|
||||||
|
: name // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
|
value: freezed == value
|
||||||
|
? _value.value
|
||||||
|
: value // ignore: cast_nullable_to_non_nullable
|
||||||
|
as dynamic,
|
||||||
|
type: null == type
|
||||||
|
? _value.type
|
||||||
|
: type // ignore: cast_nullable_to_non_nullable
|
||||||
|
as FormDataType,
|
||||||
|
) as $Val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class _$$FormDataModelImplCopyWith<$Res>
|
||||||
|
implements $FormDataModelCopyWith<$Res> {
|
||||||
|
factory _$$FormDataModelImplCopyWith(
|
||||||
|
_$FormDataModelImpl value, $Res Function(_$FormDataModelImpl) then) =
|
||||||
|
__$$FormDataModelImplCopyWithImpl<$Res>;
|
||||||
|
@override
|
||||||
|
@useResult
|
||||||
|
$Res call({String name, dynamic value, FormDataType type});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class __$$FormDataModelImplCopyWithImpl<$Res>
|
||||||
|
extends _$FormDataModelCopyWithImpl<$Res, _$FormDataModelImpl>
|
||||||
|
implements _$$FormDataModelImplCopyWith<$Res> {
|
||||||
|
__$$FormDataModelImplCopyWithImpl(
|
||||||
|
_$FormDataModelImpl _value, $Res Function(_$FormDataModelImpl) _then)
|
||||||
|
: super(_value, _then);
|
||||||
|
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? name = null,
|
||||||
|
Object? value = freezed,
|
||||||
|
Object? type = null,
|
||||||
|
}) {
|
||||||
|
return _then(_$FormDataModelImpl(
|
||||||
|
name: null == name
|
||||||
|
? _value.name
|
||||||
|
: name // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
|
value: freezed == value
|
||||||
|
? _value.value
|
||||||
|
: value // ignore: cast_nullable_to_non_nullable
|
||||||
|
as dynamic,
|
||||||
|
type: null == type
|
||||||
|
? _value.type
|
||||||
|
: type // ignore: cast_nullable_to_non_nullable
|
||||||
|
as FormDataType,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
@JsonSerializable()
|
||||||
|
class _$FormDataModelImpl implements _FormDataModel {
|
||||||
|
const _$FormDataModelImpl(
|
||||||
|
{required this.name, required this.value, required this.type});
|
||||||
|
|
||||||
|
factory _$FormDataModelImpl.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$$FormDataModelImplFromJson(json);
|
||||||
|
|
||||||
|
@override
|
||||||
|
final String name;
|
||||||
|
@override
|
||||||
|
final dynamic value;
|
||||||
|
@override
|
||||||
|
final FormDataType type;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'FormDataModel(name: $name, value: $value, type: $type)';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(dynamic other) {
|
||||||
|
return identical(this, other) ||
|
||||||
|
(other.runtimeType == runtimeType &&
|
||||||
|
other is _$FormDataModelImpl &&
|
||||||
|
(identical(other.name, name) || other.name == name) &&
|
||||||
|
const DeepCollectionEquality().equals(other.value, value) &&
|
||||||
|
(identical(other.type, type) || other.type == type));
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonKey(ignore: true)
|
||||||
|
@override
|
||||||
|
int get hashCode => Object.hash(
|
||||||
|
runtimeType, name, const DeepCollectionEquality().hash(value), type);
|
||||||
|
|
||||||
|
@JsonKey(ignore: true)
|
||||||
|
@override
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
_$$FormDataModelImplCopyWith<_$FormDataModelImpl> get copyWith =>
|
||||||
|
__$$FormDataModelImplCopyWithImpl<_$FormDataModelImpl>(this, _$identity);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
return _$$FormDataModelImplToJson(
|
||||||
|
this,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class _FormDataModel implements FormDataModel {
|
||||||
|
const factory _FormDataModel(
|
||||||
|
{required final String name,
|
||||||
|
required final dynamic value,
|
||||||
|
required final FormDataType type}) = _$FormDataModelImpl;
|
||||||
|
|
||||||
|
factory _FormDataModel.fromJson(Map<String, dynamic> json) =
|
||||||
|
_$FormDataModelImpl.fromJson;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get name;
|
||||||
|
@override
|
||||||
|
dynamic get value;
|
||||||
|
@override
|
||||||
|
FormDataType get type;
|
||||||
|
@override
|
||||||
|
@JsonKey(ignore: true)
|
||||||
|
_$$FormDataModelImplCopyWith<_$FormDataModelImpl> get copyWith =>
|
||||||
|
throw _privateConstructorUsedError;
|
||||||
|
}
|
26
lib/models/form_data_model.g.dart
Normal file
26
lib/models/form_data_model.g.dart
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'form_data_model.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// JsonSerializableGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
_$FormDataModelImpl _$$FormDataModelImplFromJson(Map<String, dynamic> json) =>
|
||||||
|
_$FormDataModelImpl(
|
||||||
|
name: json['name'] as String,
|
||||||
|
value: json['value'],
|
||||||
|
type: $enumDecode(_$FormDataTypeEnumMap, json['type']),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$FormDataModelImplToJson(_$FormDataModelImpl instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'name': instance.name,
|
||||||
|
'value': instance.value,
|
||||||
|
'type': _$FormDataTypeEnumMap[instance.type]!,
|
||||||
|
};
|
||||||
|
|
||||||
|
const _$FormDataTypeEnumMap = {
|
||||||
|
FormDataType.text: 'text',
|
||||||
|
FormDataType.file: 'file',
|
||||||
|
};
|
@ -68,22 +68,22 @@ class _$NameValueModelCopyWithImpl<$Res, $Val extends NameValueModel>
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// @nodoc
|
/// @nodoc
|
||||||
abstract class _$$_NameValueModelCopyWith<$Res>
|
abstract class _$$NameValueModelImplCopyWith<$Res>
|
||||||
implements $NameValueModelCopyWith<$Res> {
|
implements $NameValueModelCopyWith<$Res> {
|
||||||
factory _$$_NameValueModelCopyWith(
|
factory _$$NameValueModelImplCopyWith(_$NameValueModelImpl value,
|
||||||
_$_NameValueModel value, $Res Function(_$_NameValueModel) then) =
|
$Res Function(_$NameValueModelImpl) then) =
|
||||||
__$$_NameValueModelCopyWithImpl<$Res>;
|
__$$NameValueModelImplCopyWithImpl<$Res>;
|
||||||
@override
|
@override
|
||||||
@useResult
|
@useResult
|
||||||
$Res call({String name, dynamic value});
|
$Res call({String name, dynamic value});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @nodoc
|
/// @nodoc
|
||||||
class __$$_NameValueModelCopyWithImpl<$Res>
|
class __$$NameValueModelImplCopyWithImpl<$Res>
|
||||||
extends _$NameValueModelCopyWithImpl<$Res, _$_NameValueModel>
|
extends _$NameValueModelCopyWithImpl<$Res, _$NameValueModelImpl>
|
||||||
implements _$$_NameValueModelCopyWith<$Res> {
|
implements _$$NameValueModelImplCopyWith<$Res> {
|
||||||
__$$_NameValueModelCopyWithImpl(
|
__$$NameValueModelImplCopyWithImpl(
|
||||||
_$_NameValueModel _value, $Res Function(_$_NameValueModel) _then)
|
_$NameValueModelImpl _value, $Res Function(_$NameValueModelImpl) _then)
|
||||||
: super(_value, _then);
|
: super(_value, _then);
|
||||||
|
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
@ -92,7 +92,7 @@ class __$$_NameValueModelCopyWithImpl<$Res>
|
|||||||
Object? name = null,
|
Object? name = null,
|
||||||
Object? value = freezed,
|
Object? value = freezed,
|
||||||
}) {
|
}) {
|
||||||
return _then(_$_NameValueModel(
|
return _then(_$NameValueModelImpl(
|
||||||
name: null == name
|
name: null == name
|
||||||
? _value.name
|
? _value.name
|
||||||
: name // ignore: cast_nullable_to_non_nullable
|
: name // ignore: cast_nullable_to_non_nullable
|
||||||
@ -107,13 +107,13 @@ class __$$_NameValueModelCopyWithImpl<$Res>
|
|||||||
|
|
||||||
/// @nodoc
|
/// @nodoc
|
||||||
@JsonSerializable()
|
@JsonSerializable()
|
||||||
class _$_NameValueModel
|
class _$NameValueModelImpl
|
||||||
with DiagnosticableTreeMixin
|
with DiagnosticableTreeMixin
|
||||||
implements _NameValueModel {
|
implements _NameValueModel {
|
||||||
const _$_NameValueModel({required this.name, required this.value});
|
const _$NameValueModelImpl({required this.name, required this.value});
|
||||||
|
|
||||||
factory _$_NameValueModel.fromJson(Map<String, dynamic> json) =>
|
factory _$NameValueModelImpl.fromJson(Map<String, dynamic> json) =>
|
||||||
_$$_NameValueModelFromJson(json);
|
_$$NameValueModelImplFromJson(json);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
final String name;
|
final String name;
|
||||||
@ -138,7 +138,7 @@ class _$_NameValueModel
|
|||||||
bool operator ==(dynamic other) {
|
bool operator ==(dynamic other) {
|
||||||
return identical(this, other) ||
|
return identical(this, other) ||
|
||||||
(other.runtimeType == runtimeType &&
|
(other.runtimeType == runtimeType &&
|
||||||
other is _$_NameValueModel &&
|
other is _$NameValueModelImpl &&
|
||||||
(identical(other.name, name) || other.name == name) &&
|
(identical(other.name, name) || other.name == name) &&
|
||||||
const DeepCollectionEquality().equals(other.value, value));
|
const DeepCollectionEquality().equals(other.value, value));
|
||||||
}
|
}
|
||||||
@ -151,12 +151,13 @@ class _$_NameValueModel
|
|||||||
@JsonKey(ignore: true)
|
@JsonKey(ignore: true)
|
||||||
@override
|
@override
|
||||||
@pragma('vm:prefer-inline')
|
@pragma('vm:prefer-inline')
|
||||||
_$$_NameValueModelCopyWith<_$_NameValueModel> get copyWith =>
|
_$$NameValueModelImplCopyWith<_$NameValueModelImpl> get copyWith =>
|
||||||
__$$_NameValueModelCopyWithImpl<_$_NameValueModel>(this, _$identity);
|
__$$NameValueModelImplCopyWithImpl<_$NameValueModelImpl>(
|
||||||
|
this, _$identity);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
return _$$_NameValueModelToJson(
|
return _$$NameValueModelImplToJson(
|
||||||
this,
|
this,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -165,10 +166,10 @@ class _$_NameValueModel
|
|||||||
abstract class _NameValueModel implements NameValueModel {
|
abstract class _NameValueModel implements NameValueModel {
|
||||||
const factory _NameValueModel(
|
const factory _NameValueModel(
|
||||||
{required final String name,
|
{required final String name,
|
||||||
required final dynamic value}) = _$_NameValueModel;
|
required final dynamic value}) = _$NameValueModelImpl;
|
||||||
|
|
||||||
factory _NameValueModel.fromJson(Map<String, dynamic> json) =
|
factory _NameValueModel.fromJson(Map<String, dynamic> json) =
|
||||||
_$_NameValueModel.fromJson;
|
_$NameValueModelImpl.fromJson;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get name;
|
String get name;
|
||||||
@ -176,6 +177,6 @@ abstract class _NameValueModel implements NameValueModel {
|
|||||||
dynamic get value;
|
dynamic get value;
|
||||||
@override
|
@override
|
||||||
@JsonKey(ignore: true)
|
@JsonKey(ignore: true)
|
||||||
_$$_NameValueModelCopyWith<_$_NameValueModel> get copyWith =>
|
_$$NameValueModelImplCopyWith<_$NameValueModelImpl> get copyWith =>
|
||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
|
@ -6,13 +6,14 @@ part of 'name_value_model.dart';
|
|||||||
// JsonSerializableGenerator
|
// JsonSerializableGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
_$_NameValueModel _$$_NameValueModelFromJson(Map<String, dynamic> json) =>
|
_$NameValueModelImpl _$$NameValueModelImplFromJson(Map<String, dynamic> json) =>
|
||||||
_$_NameValueModel(
|
_$NameValueModelImpl(
|
||||||
name: json['name'] as String,
|
name: json['name'] as String,
|
||||||
value: json['value'],
|
value: json['value'],
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$$_NameValueModelToJson(_$_NameValueModel instance) =>
|
Map<String, dynamic> _$$NameValueModelImplToJson(
|
||||||
|
_$NameValueModelImpl instance) =>
|
||||||
<String, dynamic>{
|
<String, dynamic>{
|
||||||
'name': instance.name,
|
'name': instance.name,
|
||||||
'value': instance.value,
|
'value': instance.value,
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:apidash/consts.dart';
|
import 'package:apidash/consts.dart';
|
||||||
import 'package:apidash/utils/utils.dart' show mapToRows, rowsToMap;
|
import 'package:apidash/models/form_data_model.dart';
|
||||||
|
import 'package:apidash/utils/convert_utils.dart';
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
|
|
||||||
import 'name_value_model.dart';
|
import 'name_value_model.dart';
|
||||||
import 'response_model.dart';
|
import 'response_model.dart';
|
||||||
|
|
||||||
@ -20,6 +22,7 @@ class RequestModel {
|
|||||||
this.responseStatus,
|
this.responseStatus,
|
||||||
this.message,
|
this.message,
|
||||||
this.responseModel,
|
this.responseModel,
|
||||||
|
this.formDataList,
|
||||||
});
|
});
|
||||||
|
|
||||||
final String id;
|
final String id;
|
||||||
@ -30,6 +33,7 @@ class RequestModel {
|
|||||||
final int requestTabIndex;
|
final int requestTabIndex;
|
||||||
final List<NameValueModel>? requestHeaders;
|
final List<NameValueModel>? requestHeaders;
|
||||||
final List<NameValueModel>? requestParams;
|
final List<NameValueModel>? requestParams;
|
||||||
|
final List<FormDataModel>? formDataList;
|
||||||
final ContentType requestBodyContentType;
|
final ContentType requestBodyContentType;
|
||||||
final String? requestBody;
|
final String? requestBody;
|
||||||
final int? responseStatus;
|
final int? responseStatus;
|
||||||
@ -52,6 +56,7 @@ class RequestModel {
|
|||||||
requestParams: requestParams != null ? [...requestParams!] : null,
|
requestParams: requestParams != null ? [...requestParams!] : null,
|
||||||
requestBodyContentType: requestBodyContentType,
|
requestBodyContentType: requestBodyContentType,
|
||||||
requestBody: requestBody,
|
requestBody: requestBody,
|
||||||
|
formDataList: formDataList != null ? [...formDataList!] : null,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,6 +74,7 @@ class RequestModel {
|
|||||||
int? responseStatus,
|
int? responseStatus,
|
||||||
String? message,
|
String? message,
|
||||||
ResponseModel? responseModel,
|
ResponseModel? responseModel,
|
||||||
|
List<FormDataModel>? formDataList,
|
||||||
}) {
|
}) {
|
||||||
var headers = requestHeaders ?? this.requestHeaders;
|
var headers = requestHeaders ?? this.requestHeaders;
|
||||||
var params = requestParams ?? this.requestParams;
|
var params = requestParams ?? this.requestParams;
|
||||||
@ -87,6 +93,7 @@ class RequestModel {
|
|||||||
responseStatus: responseStatus ?? this.responseStatus,
|
responseStatus: responseStatus ?? this.responseStatus,
|
||||||
message: message ?? this.message,
|
message: message ?? this.message,
|
||||||
responseModel: responseModel ?? this.responseModel,
|
responseModel: responseModel ?? this.responseModel,
|
||||||
|
formDataList: formDataList ?? this.formDataList,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,6 +123,8 @@ class RequestModel {
|
|||||||
final responseStatus = data["responseStatus"] as int?;
|
final responseStatus = data["responseStatus"] as int?;
|
||||||
final message = data["message"] as String?;
|
final message = data["message"] as String?;
|
||||||
final responseModelJson = data["responseModel"];
|
final responseModelJson = data["responseModel"];
|
||||||
|
final formDataList = data["formDataList"];
|
||||||
|
|
||||||
if (responseModelJson != null) {
|
if (responseModelJson != null) {
|
||||||
responseModel =
|
responseModel =
|
||||||
ResponseModel.fromJson(Map<String, dynamic>.from(responseModelJson));
|
ResponseModel.fromJson(Map<String, dynamic>.from(responseModelJson));
|
||||||
@ -141,6 +150,9 @@ class RequestModel {
|
|||||||
responseStatus: responseStatus,
|
responseStatus: responseStatus,
|
||||||
message: message,
|
message: message,
|
||||||
responseModel: responseModel,
|
responseModel: responseModel,
|
||||||
|
formDataList: formDataList != null
|
||||||
|
? mapToFormRows(Map<String, String>.from(formDataList))
|
||||||
|
: null,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,12 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'dart:math';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
||||||
|
import 'package:apidash/consts.dart';
|
||||||
|
import 'package:apidash/models/name_value_model.dart';
|
||||||
import 'package:apidash/providers/providers.dart';
|
import 'package:apidash/providers/providers.dart';
|
||||||
import 'package:apidash/widgets/widgets.dart';
|
import 'package:apidash/widgets/widgets.dart';
|
||||||
import 'package:apidash/consts.dart';
|
import 'package:davi/davi.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
|
|
||||||
class EditRequestBody extends ConsumerStatefulWidget {
|
class EditRequestBody extends ConsumerStatefulWidget {
|
||||||
const EditRequestBody({super.key});
|
const EditRequestBody({super.key});
|
||||||
@ -12,12 +16,99 @@ class EditRequestBody extends ConsumerStatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _EditRequestBodyState extends ConsumerState<EditRequestBody> {
|
class _EditRequestBodyState extends ConsumerState<EditRequestBody> {
|
||||||
|
late List<NameValueModel> rows;
|
||||||
|
final random = Random.secure();
|
||||||
|
late int seed;
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
seed = random.nextInt(kRandMax);
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final activeId = ref.watch(activeIdStateProvider);
|
final activeId = ref.watch(activeIdStateProvider);
|
||||||
final requestModel = ref
|
final requestModel = ref
|
||||||
.read(collectionStateNotifierProvider.notifier)
|
.read(collectionStateNotifierProvider.notifier)
|
||||||
.getRequestModel(activeId!);
|
.getRequestModel(activeId!);
|
||||||
|
ContentType? requestBodyStateWatcher = (ref
|
||||||
|
.watch(collectionStateNotifierProvider)![activeId]
|
||||||
|
?.requestBodyContentType) ??
|
||||||
|
ContentType.values.first;
|
||||||
|
DaviModel<NameValueModel> model = DaviModel<NameValueModel>(
|
||||||
|
rows: rows,
|
||||||
|
columns: [
|
||||||
|
DaviColumn(
|
||||||
|
name: 'Header Name',
|
||||||
|
grow: 1,
|
||||||
|
cellBuilder: (_, row) {
|
||||||
|
int idx = row.index;
|
||||||
|
return HeaderField(
|
||||||
|
keyId: "$activeId-$idx-headers-k-$seed",
|
||||||
|
initialValue: rows[idx].name,
|
||||||
|
hintText: "Add Header Name",
|
||||||
|
onChanged: (value) {
|
||||||
|
rows[idx] = rows[idx].copyWith(name: value);
|
||||||
|
// _onFieldChange(activeId);
|
||||||
|
},
|
||||||
|
colorScheme: Theme.of(context).colorScheme,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
sortable: false,
|
||||||
|
),
|
||||||
|
DaviColumn(
|
||||||
|
width: 30,
|
||||||
|
cellBuilder: (_, row) {
|
||||||
|
return Text(
|
||||||
|
"=",
|
||||||
|
style: kCodeStyle,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
DaviColumn(
|
||||||
|
name: 'Header Value',
|
||||||
|
grow: 1,
|
||||||
|
cellBuilder: (_, row) {
|
||||||
|
int idx = row.index;
|
||||||
|
return CellField(
|
||||||
|
keyId: "$activeId-$idx-headers-v-$seed",
|
||||||
|
initialValue: rows[idx].value,
|
||||||
|
hintText: " Add Header Value",
|
||||||
|
onChanged: (value) {
|
||||||
|
rows[idx] = rows[idx].copyWith(value: value);
|
||||||
|
// _onFieldChange(activeId);
|
||||||
|
},
|
||||||
|
colorScheme: Theme.of(context).colorScheme,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
sortable: false,
|
||||||
|
),
|
||||||
|
DaviColumn(
|
||||||
|
pinStatus: PinStatus.none,
|
||||||
|
width: 30,
|
||||||
|
cellBuilder: (_, row) {
|
||||||
|
return InkWell(
|
||||||
|
child: Theme.of(context).brightness == Brightness.dark
|
||||||
|
? kIconRemoveDark
|
||||||
|
: kIconRemoveLight,
|
||||||
|
onTap: () {
|
||||||
|
seed = random.nextInt(kRandMax);
|
||||||
|
if (rows.length == 1) {
|
||||||
|
setState(() {
|
||||||
|
rows = [
|
||||||
|
kNameValueEmptyModel,
|
||||||
|
];
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
rows.removeAt(row.index);
|
||||||
|
}
|
||||||
|
// _onFieldChange(activeId);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
return Container(
|
return Container(
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Theme.of(context).colorScheme.background,
|
color: Theme.of(context).colorScheme.background,
|
||||||
@ -38,16 +129,20 @@ class _EditRequestBodyState extends ConsumerState<EditRequestBody> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: TextFieldEditor(
|
child: requestBodyStateWatcher == ContentType.formdata
|
||||||
key: Key("$activeId-body"),
|
? Container(
|
||||||
fieldKey: "$activeId-body-editor",
|
child: const Text("Vidya"),
|
||||||
initialValue: requestModel?.requestBody,
|
)
|
||||||
onChanged: (String value) {
|
: TextFieldEditor(
|
||||||
ref
|
key: Key("$activeId-body"),
|
||||||
.read(collectionStateNotifierProvider.notifier)
|
fieldKey: "$activeId-body-editor",
|
||||||
.update(activeId, requestBody: value);
|
initialValue: requestModel?.requestBody,
|
||||||
},
|
onChanged: (String value) {
|
||||||
),
|
ref
|
||||||
|
.read(collectionStateNotifierProvider.notifier)
|
||||||
|
.update(activeId, requestBody: value);
|
||||||
|
},
|
||||||
|
),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
import 'dart:typed_data';
|
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import '../models/models.dart';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
|
import 'package:apidash/models/form_data_model.dart';
|
||||||
|
|
||||||
import '../consts.dart';
|
import '../consts.dart';
|
||||||
|
import '../models/models.dart';
|
||||||
|
|
||||||
String humanizeDuration(Duration? duration) {
|
String humanizeDuration(Duration? duration) {
|
||||||
if (duration == null) {
|
if (duration == null) {
|
||||||
@ -78,6 +81,17 @@ Map<String, String>? rowsToMap(List<NameValueModel>? kvRows,
|
|||||||
return finalMap;
|
return finalMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Map<String, String>? rowsToFormDataMap(
|
||||||
|
List<FormDataModel>? kvRows,
|
||||||
|
) {
|
||||||
|
if (kvRows == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Map<String, String> finalMap = {};
|
||||||
|
for (var row in kvRows) {}
|
||||||
|
return finalMap;
|
||||||
|
}
|
||||||
|
|
||||||
List<NameValueModel>? mapToRows(Map<String, String>? kvMap) {
|
List<NameValueModel>? mapToRows(Map<String, String>? kvMap) {
|
||||||
if (kvMap == null) {
|
if (kvMap == null) {
|
||||||
return null;
|
return null;
|
||||||
@ -89,6 +103,21 @@ List<NameValueModel>? mapToRows(Map<String, String>? kvMap) {
|
|||||||
return finalRows;
|
return finalRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<FormDataModel>? mapToFormRows(Map<String, String>? kvMap) {
|
||||||
|
if (kvMap == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<FormDataModel> finalRows = [];
|
||||||
|
for (var k in kvMap.keys) {
|
||||||
|
finalRows.add(FormDataModel(
|
||||||
|
name: k,
|
||||||
|
value: kvMap[k],
|
||||||
|
type: FormDataType.text,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
return finalRows;
|
||||||
|
}
|
||||||
|
|
||||||
Uint8List? stringToBytes(String? text) {
|
Uint8List? stringToBytes(String? text) {
|
||||||
if (text == null) {
|
if (text == null) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:apidash/utils/utils.dart';
|
|
||||||
import 'package:apidash/consts.dart';
|
import 'package:apidash/consts.dart';
|
||||||
|
import 'package:apidash/utils/utils.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class DropdownButtonHttpMethod extends StatefulWidget {
|
class DropdownButtonHttpMethod extends StatefulWidget {
|
||||||
const DropdownButtonHttpMethod({
|
const DropdownButtonHttpMethod({
|
||||||
|
Reference in New Issue
Block a user