import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:prosappco/blocs/score_bloc/score_bloc.dart'; import 'package:score_repository/score_repository.dart'; import 'package:service_repository/service_repository.dart'; import 'package:user_repository/user_repository.dart'; class ScoreScreen extends StatefulWidget { final ServiceEntity service; const ScoreScreen({Key? key, required this.service}) : super(key: key); @override State createState() => _ScoreScreenState(); } class _ScoreScreenState extends State { double _rating = 1.0; TextEditingController commentController = TextEditingController(); late Future> _userInfoFuture; @override void initState() { super.initState(); _userInfoFuture = _getUserAndProfessionalInfo(widget.service); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Calificación'), ), body: Column( children: [ Expanded( child: SingleChildScrollView( child: Column( children: [ FutureBuilder( future: _userInfoFuture, builder: (context, AsyncSnapshot> snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return const Center(child: CircularProgressIndicator()); } else { if (snapshot.hasError) { return Center( child: Text('Error inesperado: ${snapshot.error}'), ); } else { final userInfo = snapshot.data![0] as MyUser; return Padding( padding: const EdgeInsets.symmetric(horizontal: 15), child: ListTile( leading: Container( width: 60, height: 60, decoration: BoxDecoration( color: Colors.grey.shade300, shape: BoxShape.circle, image: userInfo.picture == null ? null : DecorationImage( image: NetworkImage( userInfo.picture ?? ''), fit: BoxFit.contain, ), ), child: userInfo.picture == null ? Icon( CupertinoIcons.person, color: Colors.grey.shade400, size: 40, ) : null, ), title: Text( userInfo.name ?? '', overflow: TextOverflow.ellipsis, style: const TextStyle( fontSize: 15, fontWeight: FontWeight.w600, ), ), subtitle: const Text( 'Rating: 5.0', style: TextStyle( fontSize: 13, color: Colors.blue, ), ), ), ); } } }, ), const SizedBox(height: 10), const Text( 'Calificación', style: TextStyle(fontSize: 20, fontWeight: FontWeight.w600), ), const SizedBox(height: 10), RatingBar.builder( initialRating: _rating, minRating: 1, direction: Axis.horizontal, allowHalfRating: true, itemCount: 5, itemSize: 40, glow: false, maxRating: 5, itemPadding: const EdgeInsets.symmetric(horizontal: 5), itemBuilder: (context, _) => const Icon( Icons.star, color: Color(0xFF2BA4EC), ), onRatingUpdate: (rating) { setState(() { _rating = rating; }); }, ignoreGestures: false, ), Padding( padding: const EdgeInsets.symmetric( horizontal: 40, vertical: 40), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Comentario', style: TextStyle( fontSize: 20, fontWeight: FontWeight.w600), ), TextFormField( maxLines: null, maxLength: 400, keyboardType: TextInputType.multiline, controller: commentController, ), ], ), ), ], ), ), ), const Divider( height: 1, thickness: 0.5, ), Padding( padding: const EdgeInsets.symmetric( vertical: 10, horizontal: 15, ), child: FilledButton( onPressed: () { final CommentEntity comment = widget.service.userId == FirebaseAuth.instance.currentUser!.uid ? CommentEntity( serviceId: widget.service.id!, authorId: FirebaseAuth.instance.currentUser!.uid, isFromUser: true, score: _rating, destinationId: widget.service.professionalId, content: commentController.text, createdAt: Timestamp.now(), ) : CommentEntity( serviceId: widget.service.id!, authorId: FirebaseAuth.instance.currentUser!.uid, isFromUser: false, score: _rating, destinationId: widget.service.userId, content: commentController.text, createdAt: Timestamp.now(), ); BlocProvider.of(context) .add(SendScoreEvent(comment: comment)); }, style: FilledButton.styleFrom( backgroundColor: Theme.of(context).colorScheme.primary, padding: const EdgeInsets.symmetric(vertical: 15), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), ), child: Container( alignment: Alignment.center, width: double.infinity, child: const Text( 'Enviar calificación', style: TextStyle( color: Colors.white, fontSize: 18, ), ), ), ), ), ], ), ); } Future> _getUserAndProfessionalInfo( ServiceEntity service) async { final userRepo = FirebaseUserRepository(FirebaseAuth.instance); final MyUser? userInfo; if (FirebaseAuth.instance.currentUser!.uid == service.userId) { userInfo = await userRepo.getMyUser(service.userId); } else { userInfo = await userRepo.getMyUser(service.professionalId); } return [userInfo]; } }