diff --git a/lib/widgets/buttons.dart b/lib/widgets/buttons.dart index 76ed71f2..3e4f02bb 100644 --- a/lib/widgets/buttons.dart +++ b/lib/widgets/buttons.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:apidash/utils/utils.dart'; import 'package:apidash/consts.dart'; +import "snackbars.dart"; class CopyButton extends StatefulWidget { const CopyButton({super.key, required this.toCopy}); @@ -13,9 +15,12 @@ class CopyButton extends StatefulWidget { class _CopyButtonState extends State { @override Widget build(BuildContext context) { + var sm = ScaffoldMessenger.of(context); return TextButton( onPressed: () async { await Clipboard.setData(ClipboardData(text: widget.toCopy)); + sm.hideCurrentSnackBar(); + sm.showSnackBar(getSnackBar("Copied")); }, child: Row( children: const [ @@ -78,3 +83,60 @@ class _SendRequestButtonState extends State { ); } } + +class SaveInDownloadsButton extends StatefulWidget { + const SaveInDownloadsButton({ + super.key, + this.content, + this.mimeType, + this.name, + }); + + final Uint8List? content; + final String? mimeType; + final String? name; + + @override + State createState() => _SaveInDownloadsButtonState(); +} + +class _SaveInDownloadsButtonState extends State { + @override + Widget build(BuildContext context) { + var sm = ScaffoldMessenger.of(context); + return TextButton( + onPressed: (widget.content != null) + ? () async { + var message = ""; + var ext = getFileExtension(widget.mimeType); + var path = await getFileDownloadpath( + widget.name, + ext, + ); + if (path != null) { + try { + await saveFile(path, widget.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( + children: const [ + Icon( + Icons.download, + size: 20, + ), + Text(kLabelDownload) + ], + ), + ); + } +} diff --git a/lib/widgets/codegen_previewer.dart b/lib/widgets/codegen_previewer.dart index fa19d253..8edd624c 100644 --- a/lib/widgets/codegen_previewer.dart +++ b/lib/widgets/codegen_previewer.dart @@ -1,8 +1,9 @@ import 'package:flutter/material.dart'; import 'package:highlighter/highlighter.dart' show highlight; import 'package:apidash/consts.dart'; +import 'package:apidash/utils/utils.dart'; import 'code_previewer.dart' show convert; -import 'buttons.dart' show CopyButton; +import 'buttons.dart'; class CodeGenPreviewer extends StatefulWidget { const CodeGenPreviewer({ @@ -144,6 +145,10 @@ class _ViewCodePaneState extends State { ), ), CopyButton(toCopy: widget.code), + SaveInDownloadsButton( + content: stringToBytes(widget.code), + mimeType: "application/vnd.dart", + ) ], ), ),