c90Beretta преди 5 месеца
родител
ревизия
f3a9d140ee

+ 1 - 1
lib/main.dart

@@ -1,7 +1,7 @@
 //import 'package:fluent_ui/fluent_ui.dart';
 import 'package:flutter/material.dart';
 import 'package:provider/provider.dart';
-import 'package:sis_flutter/viewmodels/tarea_view_model.dart';
+import 'package:sis_flutter/viewmodels/actividad_view_model.dart';
 import 'package:sis_flutter/views/profile/profile_screen.dart';
 import '../themes/themes.dart';
 import 'views/home/home_screen.dart';

+ 8 - 14
lib/models/tarea_model.dart

@@ -24,6 +24,8 @@ class Tarea extends Basico {
   final String? iops;
   final String? soporte;
   final int? prioridad;
+  final bool? border;
+  final String? uid;
 
   Tarea({
     super.id,
@@ -43,6 +45,8 @@ class Tarea extends Basico {
     this.iops,
     this.soporte,
     this.prioridad,
+    this.border,
+    this.uid,
   });
 
   factory Tarea.fromJson(Map<String, dynamic> json) {
@@ -67,20 +71,10 @@ class Tarea extends Basico {
 
   @override
   Map<String, dynamic> toJson() => {
-        "id": id,
-        "id_actividad": idActividad,
-        "id_usuario": idUsuario,
-        "contenido": contenido,
-        "id_tarea_padre": idTareaPadre,
-        "terminado": terminado,
         "posicion": posicion,
-        "urgencia": urgencia,
-        "creado": creado,
-        "eliminado": eliminado,
-        "id_creador": idCreador,
-        "testing": testing,
-        "iops": iops,
-        "soporte": soporte,
-        "prioridad": prioridad,
+        "contenido": contenido,
+        "border": border,
+        "idActividad": idActividad,
+        "uid": idUsuario,
       };
 }

+ 93 - 93
lib/plugins/audio_plugin.dart

@@ -1,105 +1,105 @@
-// ignore_for_file: avoid_print
+// // ignore_for_file: avoid_print
 
-import 'dart:io';
-import 'dart:math';
+// import 'dart:io';
+// import 'dart:math';
 
-import 'package:assets_audio_player/assets_audio_player.dart';
-import 'package:flutter_sound/flutter_sound.dart';
-import 'package:path_provider/path_provider.dart';
-import 'package:permission_handler/permission_handler.dart';
-import '../interfaces/interfaces.dart';
-import 'package:path/path.dart' as pathP;
-import 'package:flutter/foundation.dart' show kIsWeb;
+// import 'package:assets_audio_player/assets_audio_player.dart';
+// import 'package:flutter_sound/flutter_sound.dart';
+// import 'package:path_provider/path_provider.dart';
+// import 'package:permission_handler/permission_handler.dart';
+// import '../interfaces/interfaces.dart';
+// import 'package:path/path.dart' as pathP;
+// import 'package:flutter/foundation.dart' show kIsWeb;
 
-class AudioPlugin implements AudioInterface {
-  final _soundRecorder = FlutterSoundRecorder();
-  final _soundPlayer = AssetsAudioPlayer();
-  bool _isRecorderReady = false;
-  String? pathGlobal = '';
+// class AudioPlugin implements AudioInterface {
+//   final _soundRecorder = FlutterSoundRecorder();
+//   final _soundPlayer = AssetsAudioPlayer();
+//   bool _isRecorderReady = false;
+//   String? pathGlobal = '';
 
-  @override
-  Future<void> audioPauseAndResume() async {
-    _soundPlayer.playOrPause();
-  }
+//   @override
+//   Future<void> audioPauseAndResume() async {
+//     _soundPlayer.playOrPause();
+//   }
 
-  @override
-  Future audioPlay(File audio) async {
-    _soundPlayer.open(
-      Audio.file(audio.path),
-      autoStart: true,
-      showNotification: true,
-    );
-  }
+//   @override
+//   Future audioPlay(File audio) async {
+//     _soundPlayer.open(
+//       Audio.file(audio.path),
+//       autoStart: true,
+//       showNotification: true,
+//     );
+//   }
 
-  @override
-  Future initSoundRecorder() async {
-    final microfono = await Permission.microphone.request();
-    if (microfono != PermissionStatus.granted) {
-      throw 'Sin permiso de microfono';
-    }
-    await _soundRecorder.openRecorder();
-    _isRecorderReady = true;
-    await _soundRecorder.setSubscriptionDuration(
-      const Duration(milliseconds: 500),
-    );
-  }
+//   @override
+//   Future initSoundRecorder() async {
+//     final microfono = await Permission.microphone.request();
+//     if (microfono != PermissionStatus.granted) {
+//       throw 'Sin permiso de microfono';
+//     }
+//     await _soundRecorder.openRecorder();
+//     _isRecorderReady = true;
+//     await _soundRecorder.setSubscriptionDuration(
+//       const Duration(milliseconds: 500),
+//     );
+//   }
 
-  Future<void> closeSoundRecorder() async {
-    await _soundRecorder.closeRecorder();
-  }
+//   Future<void> closeSoundRecorder() async {
+//     await _soundRecorder.closeRecorder();
+//   }
 
-  @override
-  Future startRecordAudio() async {
-    print("1.-");
-    if (!_isRecorderReady) return;
-    await Permission.microphone.request();
-    if (!kIsWeb) {
-      await Permission.storage.request();
-      await Permission.manageExternalStorage.request();
-    }
-    print("2.-");
-    final random = Random();
-    final randomInt = random.nextInt(99999);
-    pathGlobal = '$randomInt.wav';
-    print("3.-");
-    if (!kIsWeb) {
-      pathGlobal = '/$randomInt.wav';
-      String directorio = (await getApplicationDocumentsDirectory()).path;
-      Directory dir =
-          Directory(pathP.dirname(directorio + pathGlobal.toString()));
-      if (!dir.existsSync()) {
-        dir.createSync();
-      }
-      pathGlobal = directorio + pathGlobal.toString();
-      print("el global");
-      print(pathGlobal);
-    }
-    print("4.-");
+//   @override
+//   Future startRecordAudio() async {
+//     print("1.-");
+//     if (!_isRecorderReady) return;
+//     await Permission.microphone.request();
+//     if (!kIsWeb) {
+//       await Permission.storage.request();
+//       await Permission.manageExternalStorage.request();
+//     }
+//     print("2.-");
+//     final random = Random();
+//     final randomInt = random.nextInt(99999);
+//     pathGlobal = '$randomInt.wav';
+//     print("3.-");
+//     if (!kIsWeb) {
+//       pathGlobal = '/$randomInt.wav';
+//       String directorio = (await getApplicationDocumentsDirectory()).path;
+//       Directory dir =
+//           Directory(pathP.dirname(directorio + pathGlobal.toString()));
+//       if (!dir.existsSync()) {
+//         dir.createSync();
+//       }
+//       pathGlobal = directorio + pathGlobal.toString();
+//       print("el global");
+//       print(pathGlobal);
+//     }
+//     print("4.-");
 
-    await _soundRecorder.startRecorder(
-      codec: Codec.pcm16WAV,
-      numChannels: 1,
-      sampleRate: 44000,
-      toFile: pathGlobal.toString(),
-    );
-  }
+//     await _soundRecorder.startRecorder(
+//       codec: Codec.pcm16WAV,
+//       numChannels: 1,
+//       sampleRate: 44000,
+//       toFile: pathGlobal.toString(),
+//     );
+//   }
 
-  @override
-  Future<File?> stopRecordAudio() async {
-    if (!_isRecorderReady) return await Future.value(null);
-    final path = await _soundRecorder.stopRecorder();
-    return File(pathGlobal.toString());
-  }
+//   @override
+//   Future<File?> stopRecordAudio() async {
+//     if (!_isRecorderReady) return await Future.value(null);
+//     final path = await _soundRecorder.stopRecorder();
+//     return File(pathGlobal.toString());
+//   }
 
-  bool isRecording() {
-    if (_soundRecorder.isRecording) {
-      return true;
-    } else {
-      return false;
-    }
-  }
+//   bool isRecording() {
+//     if (_soundRecorder.isRecording) {
+//       return true;
+//     } else {
+//       return false;
+//     }
+//   }
 
-  Stream<RecordingDisposition>? recordOnProgress() {
-    return _soundRecorder.onProgress;
-  }
-}
+//   Stream<RecordingDisposition>? recordOnProgress() {
+//     return _soundRecorder.onProgress;
+//   }
+// }

+ 107 - 107
lib/plugins/pdf_viewer.dart

@@ -1,116 +1,116 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_pdfview/flutter_pdfview.dart';
-import 'package:permission_handler/permission_handler.dart';
-import 'package:open_file/open_file.dart';
-import 'package:path_provider/path_provider.dart';
-import 'dart:io';
+// import 'package:flutter/material.dart';
+// import 'package:flutter_pdfview/flutter_pdfview.dart';
+// import 'package:permission_handler/permission_handler.dart';
+// import 'package:open_file/open_file.dart';
+// import 'package:path_provider/path_provider.dart';
+// import 'dart:io';
 
-class PdfViewerPage extends StatefulWidget {
-  final String filePath;
-  final String fileName;
+// class PdfViewerPage extends StatefulWidget {
+//   final String filePath;
+//   final String fileName;
 
-  const PdfViewerPage(
-      {Key? key, required this.filePath, required this.fileName})
-      : super(key: key);
+//   const PdfViewerPage(
+//       {Key? key, required this.filePath, required this.fileName})
+//       : super(key: key);
 
-  @override
-  _PdfViewerPageState createState() => _PdfViewerPageState();
-}
+//   @override
+//   _PdfViewerPageState createState() => _PdfViewerPageState();
+// }
 
-class _PdfViewerPageState extends State<PdfViewerPage> {
-  late PDFViewController _pdfViewController;
-  int? pages;
-  int? currentPage;
-  bool isReady = false;
-  String errorMessage = '';
+// class _PdfViewerPageState extends State<PdfViewerPage> {
+//   late PDFViewController _pdfViewController;
+//   int? pages;
+//   int? currentPage;
+//   bool isReady = false;
+//   String errorMessage = '';
 
-  @override
-  Widget build(BuildContext context) {
-    return Scaffold(
-      appBar: AppBar(
-        title: const Text("Visualizador de PDF"),
-        actions: [
-          IconButton(
-            icon: Icon(Icons.download),
-            onPressed: _downloadPdf,
-          ),
-        ],
-      ),
-      body: Stack(
-        children: <Widget>[
-          PDFView(
-            filePath: widget.filePath,
-            enableSwipe: true,
-            swipeHorizontal: true,
-            autoSpacing: false,
-            pageFling: false,
-            onRender: (_pages) {
-              setState(() {
-                pages = _pages;
-                isReady = true;
-              });
-            },
-            onError: (error) {
-              setState(() {
-                errorMessage = error.toString();
-              });
-              print(error.toString());
-            },
-            onPageError: (page, error) {
-              setState(() {
-                errorMessage = '$page: ${error.toString()}';
-              });
-              print('$page: ${error.toString()}');
-            },
-            onViewCreated: (PDFViewController pdfViewController) {
-              _pdfViewController = pdfViewController;
-            },
-            onPageChanged: (int? page, int? total) {
-              print('page change: $page/$total');
-              setState(() {
-                currentPage = page;
-              });
-            },
-          ),
-          errorMessage.isEmpty
-              ? !isReady
-                  ? Center(
-                      child: CircularProgressIndicator(),
-                    )
-                  : Container()
-              : Center(
-                  child: Text(errorMessage),
-                )
-        ],
-      ),
-    );
-  }
+//   @override
+//   Widget build(BuildContext context) {
+//     return Scaffold(
+//       appBar: AppBar(
+//         title: const Text("Visualizador de PDF"),
+//         actions: [
+//           IconButton(
+//             icon: Icon(Icons.download),
+//             onPressed: _downloadPdf,
+//           ),
+//         ],
+//       ),
+//       body: Stack(
+//         children: <Widget>[
+//           PDFView(
+//             filePath: widget.filePath,
+//             enableSwipe: true,
+//             swipeHorizontal: true,
+//             autoSpacing: false,
+//             pageFling: false,
+//             onRender: (_pages) {
+//               setState(() {
+//                 pages = _pages;
+//                 isReady = true;
+//               });
+//             },
+//             onError: (error) {
+//               setState(() {
+//                 errorMessage = error.toString();
+//               });
+//               print(error.toString());
+//             },
+//             onPageError: (page, error) {
+//               setState(() {
+//                 errorMessage = '$page: ${error.toString()}';
+//               });
+//               print('$page: ${error.toString()}');
+//             },
+//             onViewCreated: (PDFViewController pdfViewController) {
+//               _pdfViewController = pdfViewController;
+//             },
+//             onPageChanged: (int? page, int? total) {
+//               print('page change: $page/$total');
+//               setState(() {
+//                 currentPage = page;
+//               });
+//             },
+//           ),
+//           errorMessage.isEmpty
+//               ? !isReady
+//                   ? Center(
+//                       child: CircularProgressIndicator(),
+//                     )
+//                   : Container()
+//               : Center(
+//                   child: Text(errorMessage),
+//                 )
+//         ],
+//       ),
+//     );
+//   }
 
-  Future<void> _downloadPdf() async {
-    try {
-      if (await Permission.storage.request().isGranted) {
-        final directory = await getExternalStorageDirectory();
-        if (directory != null) {
-          final filePath = '${directory.path}/${widget.fileName}';
-          final file = File(filePath);
+//   Future<void> _downloadPdf() async {
+//     try {
+//       if (await Permission.storage.request().isGranted) {
+//         final directory = await getExternalStorageDirectory();
+//         if (directory != null) {
+//           final filePath = '${directory.path}/${widget.fileName}';
+//           final file = File(filePath);
 
-          await file.writeAsBytes(await File(widget.filePath).readAsBytes());
+//           await file.writeAsBytes(await File(widget.filePath).readAsBytes());
 
-          ScaffoldMessenger.of(context).showSnackBar(
-            SnackBar(content: Text('Archivo guardado en $filePath')),
-          );
+//           ScaffoldMessenger.of(context).showSnackBar(
+//             SnackBar(content: Text('Archivo guardado en $filePath')),
+//           );
 
-          OpenFile.open(filePath);
-        }
-      } else {
-        ScaffoldMessenger.of(context).showSnackBar(
-          SnackBar(content: Text('Permisos de almacenamiento denegados')),
-        );
-      }
-    } catch (e) {
-      ScaffoldMessenger.of(context).showSnackBar(
-        SnackBar(content: Text('Error al descargar el archivo: $e')),
-      );
-    }
-  }
-}
+//           OpenFile.open(filePath);
+//         }
+//       } else {
+//         ScaffoldMessenger.of(context).showSnackBar(
+//           SnackBar(content: Text('Permisos de almacenamiento denegados')),
+//         );
+//       }
+//     } catch (e) {
+//       ScaffoldMessenger.of(context).showSnackBar(
+//         SnackBar(content: Text('Error al descargar el archivo: $e')),
+//       );
+//     }
+//   }
+// }

+ 28 - 0
lib/services/actividad_service.dart

@@ -0,0 +1,28 @@
+import 'dart:convert';
+import 'package:sis_flutter/models/actividad_model.dart';
+import 'package:sis_flutter/services/base_service.dart';
+
+class PrioridadesService extends BaseService {
+  final endpoint = "/v1/actividad/prioridades";
+
+  Future<List<Actividad>> getActividad(String idUsuario) async {
+    var r = await get(endpoint, headers: {
+      'Content-Type': 'application/json'
+    }, queryParameters: {
+      'usuario': idUsuario,
+    });
+
+    var body = jsonDecode(r.body);
+    var actividadbody = (body['detalle']).cast<Map<String, dynamic>>().toList();
+
+    final List<Actividad> actividadList = [];
+    if (r.statusCode == 200) {
+      for (var i in actividadbody) {
+        Actividad actividadJson = Actividad.fromJson(i);
+        actividadList.add(actividadJson);
+      }
+    }
+
+    return actividadList;
+  }
+}

+ 10 - 23
lib/services/tarea_service.dart

@@ -1,29 +1,16 @@
-import 'dart:convert';
-import 'package:sis_flutter/models/actividad_model.dart';
-import 'package:sis_flutter/models/tarea_model.dart';
+import 'package:sis_flutter/data/api_response.dart';
+import "package:sis_flutter/models/tarea_model.dart";
 import 'package:sis_flutter/services/base_service.dart';
 
-class PrioridadesService extends BaseService {
-  final endpoint = "/v1/actividad/prioridades";
+class TareaService extends BaseService {
+  final endpoint = "https://sis.api.edesarrollos.info/v1/tarea";
 
-  Future<List<Actividad>> getActividad(String idUsuario) async {
-    var r = await get(endpoint, headers: {
-      'Content-Type': 'application/json'
-    }, queryParameters: {
-      'usuario': idUsuario,
-    });
+  Future<ApiResponse> postTarea(Tarea tarea) async {
+    var response = await post(endpoint,
+        withAuth: false,
+        body: tarea.toJson(),
+        headers: {'Content-Type': 'application/json'});
 
-    var body = jsonDecode(r.body);
-    var actividadbody = (body['detalle']).cast<Map<String, dynamic>>().toList();
-
-    final List<Actividad> actividadList = [];
-    if (r.statusCode == 200) {
-      for (var i in actividadbody) {
-        Actividad actividadJson = Actividad.fromJson(i);
-        actividadList.add(actividadJson);
-      }
-    }
-
-    return actividadList;
+    return ApiResponse(response);
   }
 }

+ 17 - 0
lib/viewmodels/actividad_view_model.dart

@@ -0,0 +1,17 @@
+import 'package:flutter/material.dart';
+import 'package:sis_flutter/models/actividad_model.dart';
+
+// import 'package:sis_flutter/models/tarea_model.dart';
+import 'package:sis_flutter/services/actividad_service.dart';
+
+class PrioridadesViewMode extends ChangeNotifier {
+  List<Actividad> _actividadlist = [];
+  List<Actividad> get actividadList => _actividadlist;
+
+  Future<List<Actividad>> fetchActividad(idUsuario) async {
+    final detalledata = await PrioridadesService().getActividad(idUsuario);
+    _actividadlist = detalledata;
+    notifyListeners();
+    return _actividadlist;
+  }
+}

+ 12 - 20
lib/viewmodels/tarea_view_model.dart

@@ -1,28 +1,20 @@
 import 'package:flutter/material.dart';
 import 'package:sis_flutter/models/actividad_model.dart';
+import 'package:sis_flutter/models/tarea_model.dart';
 
 // import 'package:sis_flutter/models/tarea_model.dart';
+import 'package:sis_flutter/services/actividad_service.dart';
 import 'package:sis_flutter/services/tarea_service.dart';
 
-class PrioridadesViewMode extends ChangeNotifier {
-  // List<Tarea> _prioridades = [];
-  // List<Tarea> get prioridades => _prioridades;
-
-  List<Actividad> _actividadlist = [];
-  List<Actividad> get actividadList => _actividadlist;
-
-  // Future<List<Tarea>> fetchPriodidades(idUsuario) async {
-  //   final prioridadesdata =
-  //       await PrioridadesService().getPrioridades(idUsuario);
-  //   _prioridades = prioridadesdata;
-  //   notifyListeners();
-  //   return _prioridades;
-  // }
-
-  Future<List<Actividad>> fetchActividad(idUsuario) async {
-    final detalledata = await PrioridadesService().getActividad(idUsuario);
-    _actividadlist = detalledata;
-    notifyListeners();
-    return _actividadlist;
+class TareaViewModel extends ChangeNotifier {
+  void postTarea(
+      String idUsuario, String contenido, int idActividad, int posicion) {
+    final Tarea tarea = Tarea(
+        idUsuario: idUsuario,
+        posicion: posicion,
+        contenido: contenido,
+        border: false,
+        idActividad: idActividad);
+    TareaService().postTarea(tarea);
   }
 }

+ 127 - 65
lib/views/home/home_view.dart

@@ -1,12 +1,17 @@
+import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
+import 'package:flutter_linkify/flutter_linkify.dart';
 import 'package:provider/provider.dart';
 import 'package:sis_flutter/data/session/session_storage.dart';
 import 'package:sis_flutter/models/usuario_model.dart';
 import 'package:sis_flutter/services/usuario_session_service.dart';
 import 'package:sis_flutter/viewmodels/login_view_model.dart';
-import 'package:sis_flutter/viewmodels/tarea_view_model.dart';
+import 'package:sis_flutter/viewmodels/actividad_view_model.dart';
 import 'package:sis_flutter/viewmodels/viewmodels.dart';
 import 'package:sis_flutter/widgets/app_dropdown_search.dart';
+import 'package:sis_flutter/widgets/app_loader.dart';
+import 'package:url_launcher/url_launcher.dart';
+import 'package:url_launcher/url_launcher_string.dart';
 
 import '../../models/actividad_model.dart';
 import '../../themes/themes.dart';
@@ -68,78 +73,110 @@ class _HomeBodyState extends State<HomeBody> {
 
     return SafeArea(
       child: SingleChildScrollView(
-        child: Column(
-          children: [
-            Container(
-              padding: const EdgeInsets.all(10),
-              decoration: const BoxDecoration(
-                  color: Colors.white,
-                  borderRadius:
-                      BorderRadius.vertical(bottom: Radius.circular(15))),
-              child: Padding(
-                padding: const EdgeInsets.all(8.0),
-                child: Column(
-                    mainAxisAlignment: MainAxisAlignment.start,
-                    crossAxisAlignment: CrossAxisAlignment.start,
-                    children: [
-                      const Text("Bienvenido ",
-                          style: TextStyle(
-                            fontSize: 25,
-                          )),
-                      Text(_usuario!.name! ?? usuario.name!,
-                          style: const TextStyle(
-                              fontSize: 45,
-                              fontWeight: FontWeight.bold,
-                              height: -1)),
-                      const SizedBox(height: 10),
-                      Container(
-                          decoration: BoxDecoration(
-                            borderRadius: BorderRadius.circular(10),
-                          ),
-                          child: AppDropdownSearch<Usuario>(
-                            controller: _usuariosController,
-                            itemAsString: (u) => u.name!,
-                            selectedItem: _usuario,
-                            compareFn: (item1, item2) {
-                              return item1.id == item2.id;
-                            },
-                            onChanged: (selectedUsuario) {
-                              if (selectedUsuario != null) {
-                                _fetchActividad(selectedUsuario.id);
-                              }
-                            },
-                            items: _usuariosList,
-                            etiqueta: "Actividades",
-                          )),
-                    ]),
-              ),
+          child: Column(
+        children: [
+          Container(
+            padding: const EdgeInsets.all(10),
+            decoration: const BoxDecoration(
+                color: Colors.white,
+                borderRadius:
+                    BorderRadius.vertical(bottom: Radius.circular(15))),
+            child: Padding(
+              padding: const EdgeInsets.all(8.0),
+              child: Column(
+                  mainAxisAlignment: MainAxisAlignment.start,
+                  crossAxisAlignment: CrossAxisAlignment.start,
+                  children: [
+                    const Text("Bienvenido ",
+                        style: TextStyle(
+                          fontSize: 25,
+                        )),
+                    Text(_usuario?.name! ?? "Cargando...",
+                        style: const TextStyle(
+                            fontSize: 45,
+                            fontWeight: FontWeight.bold,
+                            height: -1)),
+                    const SizedBox(height: 10),
+                    Container(
+                        decoration: BoxDecoration(
+                          borderRadius: BorderRadius.circular(10),
+                        ),
+                        child: AppDropdownSearch<Usuario>(
+                          controller: _usuariosController,
+                          itemAsString: (u) => u.name!,
+                          selectedItem: _usuario,
+                          compareFn: (item1, item2) {
+                            return item1.id == item2.id;
+                          },
+                          onChanged: (selectedUsuario) {
+                            if (selectedUsuario != null) {
+                              _fetchActividad(selectedUsuario.id);
+                            }
+                          },
+                          items: _usuariosList,
+                          etiqueta: "Actividades",
+                        )),
+                  ]),
             ),
-            const SizedBox(height: 10),
-            SizedBox(
-              width: double.infinity,
-              height: height * 0.9,
-              child: ListView.builder(
-                  itemCount: actividadDetalle.length,
-                  itemBuilder: (context, index) {
-                    var actividad = actividadDetalle[index];
+          ),
+          const SizedBox(height: 10),
+          SizedBox(
+            width: double.infinity,
+            height: height * 0.9,
+            child: ListView.builder(
+                itemCount: actividadDetalle.length,
+                itemBuilder: (context, index) {
+                  var actividad = actividadDetalle[index];
 
-                    return _infoCard(actividad);
-                  }),
-            ),
-          ],
-        ),
-      ),
+                  return _infoCard(actividad);
+                }),
+          ),
+        ],
+      )),
     );
   }
 
   Card _infoCard(Actividad actividad) {
     List<Widget> tareaWidgets = [];
     for (var tarea in actividad.tareas!) {
-      final posicion = (actividad.tareas!.indexOf(tarea) + 1).toString();
+      // final posicion = (actividad.tareas!.indexOf(tarea) + 1).toString();
+      final Color color = getPrioridadColors(tarea.prioridad!);
       tareaWidgets.add(
-        ListTile(
-          title: Text(tarea.contenido!),
-          subtitle: Text("Subtarea ${tarea.iops}"),
+        Column(
+          children: [
+            const FractionallySizedBox(
+              widthFactor: 0.75, // 80% of the parent width
+              child: Divider(
+                color: Colors.grey,
+              ),
+            ),
+            ListTile(
+              leading: CircleAvatar(
+                backgroundColor: color,
+                child: Text(tarea.prioridad.toString()),
+              ),
+              title: Linkify(
+                  text: tarea.contenido!,
+                  onOpen: (link) async {
+                    if (await canLaunchUrlString(link.url)) {
+                      await launchUrlString(link.url);
+                    } else {
+                      throw CupertinoAlertDialog(
+                        title: const Text("Error"),
+                        content: const Text("No se puede abrir el link"),
+                        actions: [
+                          CupertinoDialogAction(
+                            child: const Text("OK"),
+                            onPressed: () {
+                              Navigator.of(context).pop();
+                            },
+                          )
+                        ],
+                      );
+                    }
+                  }),
+            ),
+          ],
         ),
       );
     }
@@ -149,7 +186,20 @@ class _HomeBodyState extends State<HomeBody> {
       shape: BeveledRectangleBorder(borderRadius: BorderRadius.circular(6.0)),
       child: ExpansionTile(
         backgroundColor: Colors.white24,
-        leading: const Icon(Icons.local_fire_department_rounded),
+        leading: SizedBox(
+          width: 60,
+          child: Row(
+            mainAxisAlignment: MainAxisAlignment.spaceAround,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              Text(
+                actividad.prioridad!.toString(),
+                style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold),
+              ),
+              const Icon(Icons.local_fire_department_rounded),
+            ],
+          ),
+        ),
         title: Text(
           "${actividad.nombreProyecto!} - ${actividad.nombre!} ",
           style: const TextStyle(
@@ -178,4 +228,16 @@ class _HomeBodyState extends State<HomeBody> {
       ),
     );
   }
+
+  Color getPrioridadColors(tarea) {
+    return tarea == 1
+        ? Colors.red
+        : tarea == 2
+            ? Color.fromARGB(255, 253, 211, 1)
+            : tarea == 3
+                ? Colors.green
+                : tarea == 4
+                    ? Colors.purple
+                    : Colors.grey;
+  }
 }

+ 37 - 0
lib/widgets/app_loader.dart

@@ -0,0 +1,37 @@
+import 'package:animate_do/animate_do.dart';
+import 'package:flutter/material.dart';
+
+class AppLoader extends StatelessWidget {
+  final String? text;
+  const AppLoader({super.key, this.text});
+
+  bool isEmpty(viewmodel) {
+    return viewmodel == null;
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Center(
+      child: SizedBox(
+        child: Center(
+          child: Column(
+            mainAxisAlignment: MainAxisAlignment.center,
+            children: [
+              const SizedBox(
+                height: 70,
+              ),
+              Bounce(
+                infinite: true,
+                child: Image.asset('assets/edesarrollos_icon_logo.png'),
+              ),
+              Text(
+                text ?? "Cargando",
+                style: const TextStyle(fontSize: 25),
+              ),
+            ],
+          ),
+        ),
+      ),
+    );
+  }
+}

+ 0 - 4
macos/Flutter/GeneratedPluginRegistrant.swift

@@ -5,8 +5,6 @@
 import FlutterMacOS
 import Foundation
 
-import assets_audio_player
-import assets_audio_player_web
 import mobile_scanner
 import open_file_mac
 import path_provider_foundation
@@ -14,8 +12,6 @@ import shared_preferences_foundation
 import url_launcher_macos
 
 func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
-  AssetsAudioPlayerPlugin.register(with: registry.registrar(forPlugin: "AssetsAudioPlayerPlugin"))
-  AssetsAudioPlayerWebPlugin.register(with: registry.registrar(forPlugin: "AssetsAudioPlayerWebPlugin"))
   MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin"))
   OpenFilePlugin.register(with: registry.registrar(forPlugin: "OpenFilePlugin"))
   PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))

+ 25 - 81
pubspec.lock

@@ -1,30 +1,22 @@
 # Generated by pub
 # See https://dart.dev/tools/pub/glossary#lockfile
 packages:
-  archive:
-    dependency: transitive
-    description:
-      name: archive
-      sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d
-      url: "https://pub.dev"
-    source: hosted
-    version: "3.6.1"
-  assets_audio_player:
+  animate_do:
     dependency: "direct main"
     description:
-      name: assets_audio_player
-      sha256: "9a87062cf39be0730ba8bb31ed4d148ca4e892e0ae607113f346d3c9a8da5df0"
+      name: animate_do
+      sha256: "7a3162729f0ea042f9dd84da217c5bde5472ad9cef644079929d4304a5dc4ca0"
       url: "https://pub.dev"
     source: hosted
-    version: "3.1.1"
-  assets_audio_player_web:
+    version: "3.3.4"
+  archive:
     dependency: transitive
     description:
-      name: assets_audio_player_web
-      sha256: "24cf82e72c7e7f9292d67e1b52d7945a182d9695ce8f903f60e5c6b379cbcaac"
+      name: archive
+      sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d
       url: "https://pub.dev"
     source: hosted
-    version: "3.1.1"
+    version: "3.6.1"
   async:
     dependency: transitive
     description:
@@ -190,6 +182,14 @@ packages:
     description: flutter
     source: sdk
     version: "0.0.0"
+  flutter_linkify:
+    dependency: "direct main"
+    description:
+      name: flutter_linkify
+      sha256: "74669e06a8f358fee4512b4320c0b80e51cffc496607931de68d28f099254073"
+      url: "https://pub.dev"
+    source: hosted
+    version: "6.0.0"
   flutter_lints:
     dependency: "direct dev"
     description:
@@ -214,30 +214,6 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "2.0.23"
-  flutter_sound:
-    dependency: "direct main"
-    description:
-      name: flutter_sound
-      sha256: "090a4694b11ecc744c2010621c4ffc5fe7c3079d304ea014961a72c7b72cfe6c"
-      url: "https://pub.dev"
-    source: hosted
-    version: "9.2.13"
-  flutter_sound_platform_interface:
-    dependency: transitive
-    description:
-      name: flutter_sound_platform_interface
-      sha256: "4537eaeb58a32748c42b621ad6116f7f4c6ee0a8d6ffaa501b165fe1c9df4753"
-      url: "https://pub.dev"
-    source: hosted
-    version: "9.2.13"
-  flutter_sound_web:
-    dependency: transitive
-    description:
-      name: flutter_sound_web
-      sha256: ad4ca92671a1879e1f613e900bbbdb8170b20d57d1e4e6363018fe56b055594f
-      url: "https://pub.dev"
-    source: hosted
-    version: "9.2.13"
   flutter_test:
     dependency: "direct dev"
     description: flutter
@@ -320,22 +296,22 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "3.0.1"
-  lints:
+  linkify:
     dependency: transitive
     description:
-      name: lints
-      sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
+      name: linkify
+      sha256: "4139ea77f4651ab9c315b577da2dd108d9aa0bd84b5d03d33323f1970c645832"
       url: "https://pub.dev"
     source: hosted
-    version: "2.1.1"
-  logger:
+    version: "5.0.0"
+  lints:
     dependency: transitive
     description:
-      name: logger
-      sha256: "7ad7215c15420a102ec687bb320a7312afd449bac63bfb1c60d9787c27b9767f"
+      name: lints
+      sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
       url: "https://pub.dev"
     source: hosted
-    version: "1.4.0"
+    version: "2.1.1"
   matcher:
     dependency: transitive
     description:
@@ -457,7 +433,7 @@ packages:
     source: hosted
     version: "1.9.0"
   path_provider:
-    dependency: transitive
+    dependency: "direct main"
     description:
       name: path_provider
       sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
@@ -584,22 +560,6 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "6.1.2"
-  recase:
-    dependency: transitive
-    description:
-      name: recase
-      sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213
-      url: "https://pub.dev"
-    source: hosted
-    version: "4.1.0"
-  rxdart:
-    dependency: transitive
-    description:
-      name: rxdart
-      sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb"
-      url: "https://pub.dev"
-    source: hosted
-    version: "0.27.7"
   shared_preferences:
     dependency: "direct main"
     description:
@@ -701,14 +661,6 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "1.2.0"
-  synchronized:
-    dependency: transitive
-    description:
-      name: synchronized
-      sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225"
-      url: "https://pub.dev"
-    source: hosted
-    version: "3.3.0+3"
   term_glyph:
     dependency: transitive
     description:
@@ -821,14 +773,6 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "3.1.3"
-  uuid:
-    dependency: transitive
-    description:
-      name: uuid
-      sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313"
-      url: "https://pub.dev"
-    source: hosted
-    version: "3.0.7"
   vector_math:
     dependency: transitive
     description:

+ 7 - 6
pubspec.yaml

@@ -7,16 +7,14 @@ environment:
   sdk: '>=3.2.3 <4.0.0'
 
 dependencies:
-  assets_audio_player: ^3.1.1
+  flutter:
+    sdk: flutter
+  # assets_audio_player: ^3.1.1
   camera: ^0.10.5+9
   datetime_picker_formfield: ^2.0.1
   dropdown_search: ^6.0.1
   file_picker: ^8.0.0+1
-  flutter:
-    sdk: flutter
   flutter_pdfview: ^1.3.4
-
-  flutter_sound: ^9.2.13
   http: ^1.2.0
   image: ^4.3.0
   intl: ^0.19.0
@@ -28,7 +26,10 @@ dependencies:
   shared_preferences: ^2.2.3
   timezone: ^0.9.4
   universal_html: ^2.2.4
-  url_launcher: ^6.3.0
+  url_launcher: ^6.3.1
+  path_provider: ^2.1.5
+  animate_do: ^3.3.4
+  flutter_linkify: ^6.0.0
 
 dev_dependencies:
   flutter_test: