aboutsummaryrefslogtreecommitdiff
path: root/lib/widgets
diff options
context:
space:
mode:
authorIván Ávalos <avalos@disroot.org>2023-05-20 16:43:21 -0600
committerIván Ávalos <avalos@disroot.org>2023-05-20 16:43:21 -0600
commitcd8f22959e62c0b7b191e64f4ecfec53cba9f364 (patch)
tree9e40717d4e7b5c18694ab65558acda65875f817b /lib/widgets
parent3a3af285a7460a7e2f6850b9a8dd7465492163f6 (diff)
downloadlinkchat-cd8f22959e62c0b7b191e64f4ecfec53cba9f364.tar.gz
linkchat-cd8f22959e62c0b7b191e64f4ecfec53cba9f364.tar.bz2
linkchat-cd8f22959e62c0b7b191e64f4ecfec53cba9f364.zip
Se añade autenticación y onboarding
Diffstat (limited to 'lib/widgets')
-rw-r--r--lib/widgets/avatar_picker.dart61
-rw-r--r--lib/widgets/loading_modal_widget.dart22
-rw-r--r--lib/widgets/responsive.dart34
3 files changed, 117 insertions, 0 deletions
diff --git a/lib/widgets/avatar_picker.dart b/lib/widgets/avatar_picker.dart
new file mode 100644
index 0000000..bdfec6d
--- /dev/null
+++ b/lib/widgets/avatar_picker.dart
@@ -0,0 +1,61 @@
+import 'dart:io';
+
+import 'package:flutter/material.dart';
+import 'package:image_picker/image_picker.dart';
+
+class AvatarPicker extends StatelessWidget {
+ final ImagePicker picker = ImagePicker();
+ final XFile? avatar;
+ final Function(XFile? avatar) onAvatarPicked;
+
+ AvatarPicker({
+ super.key,
+ required this.avatar,
+ required this.onAvatarPicked,
+ });
+
+ File? _getAvatarFile() {
+ return avatar == null ? null : File(avatar!.path);
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ CircleAvatar(
+ radius: 50.0,
+ backgroundImage:
+ _getAvatarFile() == null ? null : FileImage(_getAvatarFile()!),
+ child: _getAvatarFile() == null
+ ? const Icon(Icons.person, size: 50.0)
+ : null,
+ ),
+ const SizedBox(width: 18.0),
+ Column(
+ children: [
+ FilledButton.icon(
+ icon: const Icon(Icons.camera_alt),
+ label: const Text('Cámara'),
+ onPressed: () {
+ picker.pickImage(source: ImageSource.camera).then((image) {
+ onAvatarPicked(image);
+ });
+ },
+ ),
+ const SizedBox(height: 16.0),
+ FilledButton.icon(
+ icon: const Icon(Icons.collections),
+ label: const Text('Galería'),
+ onPressed: () {
+ picker.pickImage(source: ImageSource.gallery).then((image) {
+ onAvatarPicked(image);
+ });
+ },
+ )
+ ],
+ )
+ ],
+ );
+ }
+}
diff --git a/lib/widgets/loading_modal_widget.dart b/lib/widgets/loading_modal_widget.dart
new file mode 100644
index 0000000..c19a411
--- /dev/null
+++ b/lib/widgets/loading_modal_widget.dart
@@ -0,0 +1,22 @@
+import 'package:flutter/material.dart';
+
+class LoadingModal extends StatelessWidget {
+ const LoadingModal({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return const Center(
+ child: Card(
+ shape: CircleBorder(),
+ child: Padding(
+ padding: EdgeInsets.all(20.0),
+ child: SizedBox(
+ width: 200,
+ height: 200,
+ child: CircularProgressIndicator(value: null),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/widgets/responsive.dart b/lib/widgets/responsive.dart
new file mode 100644
index 0000000..f5f2739
--- /dev/null
+++ b/lib/widgets/responsive.dart
@@ -0,0 +1,34 @@
+import 'package:flutter/material.dart';
+
+class Responsive extends StatelessWidget {
+ final Widget mobile;
+ final Widget? tablet;
+ final Widget desktop;
+
+ const Responsive({
+ super.key,
+ required this.mobile,
+ this.tablet,
+ required this.desktop,
+ });
+
+ static bool isMobile(BuildContext context) =>
+ MediaQuery.of(context).size.width < 576;
+
+ static bool isTablet(BuildContext context) =>
+ MediaQuery.of(context).size.width >= 576 &&
+ MediaQuery.of(context).size.width <= 992;
+
+ static bool isDesktop(BuildContext context) =>
+ MediaQuery.of(context).size.width > 992;
+
+ @override
+ Widget build(BuildContext context) {
+ if (isDesktop(context)) {
+ return desktop;
+ } else if (tablet != null && isTablet(context)) {
+ return tablet!;
+ }
+ return mobile;
+ }
+}