diff --git a/lib/widgets/buttons.dart b/lib/widgets/buttons.dart new file mode 100644 index 00000000..42fd45a9 --- /dev/null +++ b/lib/widgets/buttons.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class CopyButton extends StatefulWidget { + const CopyButton({super.key, required this.toCopy}); + + final String toCopy; + @override + State createState() => _CopyButtonState(); +} + +class _CopyButtonState extends State { + @override + Widget build(BuildContext context) { + return TextButton( + onPressed: () async { + await Clipboard.setData(ClipboardData(text: widget.toCopy)); + }, + child: Row( + children: const [ + Icon( + Icons.content_copy, + size: 20, + ), + Text("Copy") + ], + ), + ); + } +} diff --git a/lib/widgets/error_message.dart b/lib/widgets/error_message.dart new file mode 100644 index 00000000..ca1966db --- /dev/null +++ b/lib/widgets/error_message.dart @@ -0,0 +1,36 @@ +import 'package:apidash/consts.dart'; +import 'package:flutter/material.dart'; + +class ErrorMessage extends StatelessWidget { + const ErrorMessage({super.key, required this.message}); + + final String? message; + + @override + Widget build(BuildContext context) { + final color = Theme.of(context).colorScheme.secondary; + return Padding( + padding: kPh20v10, + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.warning_rounded, + size: 40, + color: color, + ), + SelectableText( + message ?? 'And error occurred. $kRaiseIssue', + textAlign: TextAlign.center, + style: Theme.of(context) + .textTheme + .titleMedium + ?.copyWith(color: color), + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/previewer.dart b/lib/widgets/previewer.dart new file mode 100644 index 00000000..dc5be558 --- /dev/null +++ b/lib/widgets/previewer.dart @@ -0,0 +1,43 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:apidash/consts.dart'; + +class Previewer extends StatefulWidget { + const Previewer( + {super.key, + required this.bytes, + required this.type, + required this.subtype}); + + final Uint8List bytes; + final String type; + final String subtype; + @override + State createState() => _PreviewerState(); +} + +class _PreviewerState extends State { + @override + Widget build(BuildContext context) { + if (widget.type == kTypeApplication && widget.subtype == kSubTypePdf) { + return const SelectableText("PDF viewing $kMimeTypeRaiseIssue"); + } + if (widget.type == kTypeImage) { + return Image.memory( + widget.bytes, + errorBuilder: (context, _, stackTrace) { + return SelectableText( + "${widget.type}/${widget.subtype} mimetype preview $kMimeTypeRaiseIssue"); + }, + ); + } + if (widget.type == kTypeAudio) { + return const SelectableText("Audio playing $kMimeTypeRaiseIssue"); + } + if (widget.type == kTypeVideo) { + return const SelectableText("Video playing $kMimeTypeRaiseIssue"); + } + return SelectableText( + "${widget.type}/${widget.subtype} mimetype preview $kMimeTypeRaiseIssue"); + } +} diff --git a/lib/widgets/tables.dart b/lib/widgets/tables.dart new file mode 100644 index 00000000..088cf54e --- /dev/null +++ b/lib/widgets/tables.dart @@ -0,0 +1,89 @@ +import 'package:flutter/material.dart'; +import 'package:apidash/utils/utils.dart'; +import 'package:apidash/consts.dart'; + +class MapTable extends StatefulWidget { + const MapTable( + {super.key, + required this.map, + required this.colNames, + this.firstColumnHeaderCase = false}); + + final Map map; + final List colNames; + final bool firstColumnHeaderCase; + + @override + State createState() => _MapTableState(); +} + +class _MapTableState extends State { + @override + Widget build(BuildContext context) { + return Table( + border: TableBorder( + horizontalInside: BorderSide( + color: Theme.of(context).colorScheme.surfaceVariant, + ), + ), + columnWidths: const { + 0: FlexColumnWidth(), + 1: FlexColumnWidth(), + }, + defaultVerticalAlignment: TableCellVerticalAlignment.middle, + children: [ + TableRow( + children: widget.colNames + .map( + (e) => TableCell( + verticalAlignment: TableCellVerticalAlignment.top, + child: Padding( + padding: kP1, + child: SelectableText( + e, + style: kCodeStyle.copyWith( + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, + ), + ), + ), + ), + ) + .toList(), + ), + ...widget.map.entries + .map( + (entry) => TableRow( + children: [ + TableCell( + verticalAlignment: TableCellVerticalAlignment.top, + child: Padding( + padding: kP1, + child: SelectableText( + widget.firstColumnHeaderCase + ? formatHeaderCase(entry.key) + : entry.key, + style: kCodeStyle.copyWith( + color: Theme.of(context).colorScheme.tertiary, + ), + ), + ), + ), + TableCell( + verticalAlignment: TableCellVerticalAlignment.top, + child: Padding( + padding: kP1, + child: SelectableText( + entry.value, + style: kCodeStyle, + ), + ), + ), + ], + ), + ) + .toList(), + ], + ); + } +} diff --git a/lib/widgets/widgets.dart b/lib/widgets/widgets.dart new file mode 100644 index 00000000..f9f9d88a --- /dev/null +++ b/lib/widgets/widgets.dart @@ -0,0 +1,6 @@ +export 'editor.dart'; +export 'code_highlighter.dart'; +export 'buttons.dart'; +export 'tables.dart'; +export 'previewer.dart'; +export 'error_message.dart';