Files
apidash/lib/screens/home_page/editor_pane/url_card.dart
Ashita Prasad 89834957a2 Add graphQL UI
2025-01-12 15:47:19 +05:30

145 lines
4.2 KiB
Dart

import 'package:apidash_core/apidash_core.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:apidash/providers/providers.dart';
import 'package:apidash/widgets/widgets.dart';
import '../../common_widgets/common_widgets.dart';
class EditorPaneRequestURLCard extends ConsumerWidget {
const EditorPaneRequestURLCard({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
ref.watch(selectedIdStateProvider);
final apiType = ref
.watch(selectedRequestModelProvider.select((value) => value?.apiType));
return Card(
color: kColorTransparent,
surfaceTintColor: kColorTransparent,
elevation: 0,
shape: RoundedRectangleBorder(
side: BorderSide(
color: Theme.of(context).colorScheme.surfaceContainerHighest,
),
borderRadius: kBorderRadius12,
),
child: Padding(
padding: EdgeInsets.symmetric(
vertical: 5,
horizontal: !context.isMediumWindow ? 20 : 6,
),
child: context.isMediumWindow
? Row(
children: [
switch (apiType) {
APIType.rest => const DropdownButtonHTTPMethod(),
APIType.graphql => kSizedBoxEmpty,
null => kSizedBoxEmpty,
},
switch (apiType) {
APIType.rest => kHSpacer5,
_ => kHSpacer8,
},
const Expanded(
child: URLTextField(),
),
],
)
: Row(
children: [
switch (apiType) {
APIType.rest => const DropdownButtonHTTPMethod(),
APIType.graphql => kSizedBoxEmpty,
null => kSizedBoxEmpty,
},
switch (apiType) {
APIType.rest => kHSpacer20,
_ => kHSpacer8,
},
const Expanded(
child: URLTextField(),
),
kHSpacer20,
const SizedBox(
height: 36,
child: SendRequestButton(),
)
],
),
),
);
}
}
class DropdownButtonHTTPMethod extends ConsumerWidget {
const DropdownButtonHTTPMethod({
super.key,
});
@override
Widget build(BuildContext context, WidgetRef ref) {
final method = ref.watch(selectedRequestModelProvider
.select((value) => value?.httpRequestModel?.method));
return DropdownButtonHttpMethod(
method: method,
onChanged: (HTTPVerb? value) {
ref
.read(collectionStateNotifierProvider.notifier)
.update(method: value);
},
);
}
}
class URLTextField extends ConsumerWidget {
const URLTextField({
super.key,
});
@override
Widget build(BuildContext context, WidgetRef ref) {
final selectedId = ref.watch(selectedIdStateProvider);
return EnvURLField(
selectedId: selectedId!,
initialValue: ref
.read(collectionStateNotifierProvider.notifier)
.getRequestModel(selectedId)
?.httpRequestModel
?.url,
onChanged: (value) {
ref.read(collectionStateNotifierProvider.notifier).update(url: value);
},
onFieldSubmitted: (value) {
ref.read(collectionStateNotifierProvider.notifier).sendRequest();
},
);
}
}
class SendRequestButton extends ConsumerWidget {
final Function()? onTap;
const SendRequestButton({
super.key,
this.onTap,
});
@override
Widget build(BuildContext context, WidgetRef ref) {
ref.watch(selectedIdStateProvider);
final isWorking = ref.watch(
selectedRequestModelProvider.select((value) => value?.isWorking));
return SendButton(
isWorking: isWorking ?? false,
onTap: () {
onTap?.call();
ref.read(collectionStateNotifierProvider.notifier).sendRequest();
},
onCancel: () {
ref.read(collectionStateNotifierProvider.notifier).cancelRequest();
},
);
}
}