App móvil Flutter para capturar contenido multimedia, etiquetarlo con hashes y enviarlo a backends configurables. Features: - Captura de fotos, audio, video y archivos - Sistema de etiquetas con bibliotecas externas (HST) - Packs de etiquetas predefinidos - Cola de reintentos (hasta 20 contenedores) - Soporte GPS - Hash SHA-256 auto-generado por contenedor - Persistencia SQLite local - Múltiples destinos configurables Stack: Flutter 3.38.5, flutter_bloc, sqflite, dio 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
56 lines
1.5 KiB
Dart
56 lines
1.5 KiB
Dart
import 'dart:typed_data';
|
|
|
|
class Pendiente {
|
|
final String hash;
|
|
final String? titulo;
|
|
final Uint8List contenido;
|
|
final int intentos;
|
|
final DateTime? ultimoIntento;
|
|
final DateTime? proximoIntento;
|
|
final int? destinoId;
|
|
|
|
Pendiente({
|
|
required this.hash,
|
|
this.titulo,
|
|
required this.contenido,
|
|
this.intentos = 0,
|
|
this.ultimoIntento,
|
|
this.proximoIntento,
|
|
this.destinoId,
|
|
});
|
|
|
|
factory Pendiente.fromMap(Map<String, dynamic> map) => Pendiente(
|
|
hash: map['hash'] as String,
|
|
titulo: map['titulo'] as String?,
|
|
contenido: map['contenido'] as Uint8List,
|
|
intentos: map['intentos'] as int? ?? 0,
|
|
ultimoIntento: map['ultimo_intento'] != null
|
|
? DateTime.parse(map['ultimo_intento'] as String)
|
|
: null,
|
|
proximoIntento: map['proximo_intento'] != null
|
|
? DateTime.parse(map['proximo_intento'] as String)
|
|
: null,
|
|
destinoId: map['destino_id'] as int?,
|
|
);
|
|
|
|
Map<String, dynamic> toMap() => {
|
|
'hash': hash,
|
|
'titulo': titulo,
|
|
'contenido': contenido,
|
|
'intentos': intentos,
|
|
'ultimo_intento': ultimoIntento?.toIso8601String(),
|
|
'proximo_intento': proximoIntento?.toIso8601String(),
|
|
'destino_id': destinoId,
|
|
};
|
|
|
|
bool get puedeReintentar => intentos < 20;
|
|
|
|
String get estado {
|
|
if (intentos >= 20) return 'agotado';
|
|
if (proximoIntento != null && proximoIntento!.isAfter(DateTime.now())) {
|
|
return 'esperando';
|
|
}
|
|
return 'listo';
|
|
}
|
|
}
|