Files
apidash/lib/widgets/buttons.dart
2024-03-17 22:20:24 +05:30

262 lines
5.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:apidash/utils/utils.dart';
import 'package:apidash/consts.dart';
import "snackbars.dart";
class CopyButton extends StatelessWidget {
const CopyButton({
super.key,
required this.toCopy,
this.showLabel = true,
});
final String toCopy;
final bool showLabel;
@override
Widget build(BuildContext context) {
var sm = ScaffoldMessenger.of(context);
return Tooltip(
message: showLabel ? '' : kLabelCopy,
child: SizedBox(
width: showLabel ? null : kTextButtonMinWidth,
child: TextButton(
onPressed: () async {
await Clipboard.setData(ClipboardData(text: toCopy));
sm.hideCurrentSnackBar();
sm.showSnackBar(getSnackBar("Copied"));
},
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
const Icon(
Icons.content_copy,
size: 20,
),
if (showLabel) const Text(kLabelCopy)
],
),
),
),
);
}
}
class SendRequestButton extends StatelessWidget {
const SendRequestButton({
super.key,
required this.isWorking,
required this.onTap,
});
final bool isWorking;
final void Function() onTap;
@override
Widget build(BuildContext context) {
return FilledButton(
onPressed: isWorking ? null : onTap,
child: Row(
mainAxisSize: MainAxisSize.min,
children: isWorking
? const [
Text(
kLabelSending,
style: kTextStyleButton,
),
]
: const [
Text(
kLabelSend,
style: kTextStyleButton,
),
kHSpacer10,
Icon(
size: 16,
Icons.send,
),
],
),
);
}
}
class SaveInDownloadsButton extends StatelessWidget {
const SaveInDownloadsButton({
super.key,
this.content,
this.mimeType,
this.ext,
this.name,
this.showLabel = true,
});
final Uint8List? content;
final String? mimeType;
final String? ext;
final String? name;
final bool showLabel;
@override
Widget build(BuildContext context) {
var sm = ScaffoldMessenger.of(context);
return Tooltip(
message: showLabel ? '' : kLabelDownload,
child: SizedBox(
width: showLabel ? null : kTextButtonMinWidth,
child: TextButton(
onPressed: (content != null)
? () async {
var message = "";
var path = await getFileDownloadpath(
name,
ext ?? getFileExtension(mimeType),
);
if (path != null) {
try {
await saveFile(path, content!);
var sp = getShortPath(path);
message = 'Saved to $sp';
} catch (e) {
message = "An error occurred while saving file.";
}
} else {
message = "Unable to determine the download path.";
}
sm.hideCurrentSnackBar();
sm.showSnackBar(getSnackBar(message, small: false));
}
: null,
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
const Icon(
Icons.download,
size: 20,
),
if (showLabel) const Text(kLabelDownload)
],
),
),
),
);
}
}
class RepoButton extends StatelessWidget {
const RepoButton({
super.key,
this.text,
this.icon,
});
final String? text;
final IconData? icon;
@override
Widget build(BuildContext context) {
var label = text ?? "GitHub";
if (icon == null) {
return FilledButton(
onPressed: () {
launchUrl(Uri.parse(kGitUrl));
},
child: Text(
label,
style: kTextStyleButton,
),
);
}
return FilledButton.icon(
onPressed: () {
launchUrl(Uri.parse(kGitUrl));
},
icon: Icon(
icon,
size: 20.0,
),
label: Text(
label,
style: kTextStyleButton,
),
);
}
}
class DiscordButton extends StatelessWidget {
const DiscordButton({
super.key,
this.text,
});
final String? text;
@override
Widget build(BuildContext context) {
var label = text ?? 'Discord Server';
return FilledButton.icon(
onPressed: () {
launchUrl(Uri.parse(kDiscordUrl));
},
icon: const Icon(
Icons.discord,
size: 20.0,
),
label: Text(
label,
style: kTextStyleButton,
),
);
}
}
class SaveButton extends StatelessWidget {
const SaveButton({
super.key,
this.onPressed,
});
final VoidCallback? onPressed;
@override
Widget build(BuildContext context) {
return TextButton.icon(
onPressed: onPressed,
icon: const Icon(
Icons.save,
size: 20,
),
label: const Text(
kLabelSave,
style: kTextStyleButton,
),
);
}
}
class ClearResponseButton extends StatelessWidget {
const ClearResponseButton({
super.key,
this.onPressed,
});
final VoidCallback? onPressed;
@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,
),
),
);
}
}