showDetailsTime static method

dynamic showDetailsTime(
  1. BuildContext context,
  2. Future<void> deleteTime(),
  3. TimeTraining timeTraining
)

Método para mostrar los detalles de un tiempo seleccionado.

Este método permite visualizar y gestionar un tiempo registrado, mostrando su información y permitiendo aplicar penalizaciones, eliminar el tiempo o copiar el scramble asociado.

Parametros: context: El contexto de la aplicación para poder mostrar el diálogo. deleteTime: Función que se ejecutará si el usuario confirma la eliminación del tiempo. timeTraining: Objeto que contiene los detalles del tiempo.

Implementation

static showDetailsTime(BuildContext context,
    Future<void> Function() deleteTime, TimeTraining timeTraining) async {
  // ATRIBUTO PARA SABER SI ESTA PRESIONADO EL SCRAMBLE O LOS COMMENTS
  var isTextPressed = true;

  final currentTime = Provider.of<CurrentTime>(context, listen: false);
  currentTime.setResetTimeTraining();
  currentTime.setTimeTraining(timeTraining); // SE ACTUALIZA EL ESTADO GLOBAL

  // REESTABLECER VALORES DE PENALIZACION
  currentTime.isPlusTwoChoose = false;
  currentTime.isDnfChoose = false;

  int idTime = await timeTrainingDaoSb.getIdByTime(
      currentTime.timeTraining!.scramble,
      currentTime.timeTraining!.idSession);

  if (idTime == -1) {
    AlertUtil.showSnackBarError(context, "time_saved_error");
    return;
  } // VALIDAR QUE EL IDTIME NO DE ERROR

  // SE GUARA EL TIEMPO ORIGINAL DEPENDIENDO DE SI TENIA UN +2 O NO DE PENALIZACION
  final timeInSecondsOld = currentTime.timeTraining!.penalty == "+2"
      ? timeTraining.timeInSeconds - 2
      : timeTraining.timeInSeconds;

  // SE MUESTRA EL DIALOG
  return showDialog(
      context: context,
      builder: (context) {
        return StatefulBuilder(
          builder: (context, setState) {
            setState(() {
              // SEGUN LA PENALIZACION DEL TIEMPO, SE PONE UN ICONO
              if (currentTime.timeTraining!.penalty == "+2") {
                iconPenalty = Icons.timer;
                currentTime.isDnfChoose = false;
                currentTime.isPlusTwoChoose = true;
              } else if (currentTime.timeTraining!.penalty == "DNF") {
                iconPenalty = Icons.close;
                currentTime.isDnfChoose = true;
                currentTime.isPlusTwoChoose = false;
              } else if (currentTime.timeTraining!.penalty == "none") {
                iconPenalty = Icons.block;
              } // INICIALIZAR EL ICONO
            });
            return AlertDialog(
              // SE REDUCE EL PADDING DEL TITULO Y DEL CONTENIDO
              titlePadding:
                  const EdgeInsets.symmetric(horizontal: 15, vertical: 10),
              contentPadding:
                  const EdgeInsets.symmetric(horizontal: 15, vertical: 10),

              backgroundColor: AppColors.lightVioletColor,
              // TITULO DE LA ALERTA
              title: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  DropdownButtonHideUnderline(
                    child: DropdownButton2(
                      // BOTON PARA EL DROPDOWN
                      customButton: IconClass.iconMaker(
                          context, iconPenalty, "add_penalty"),
                      // ITEMS DEL DROPDOWN
                      items: [
                        ...MenuItems.items.map(
                          (item) => DropdownMenuItem<MenuItem>(
                            value: item,
                            // CONSTRUYE CADA ITEM DEL MENU
                            child: MenuItems.buildItem(item),
                          ),
                        ),
                      ],

                      // CUANDO SE SELECCIONA UNA OPCION, SE ACTUALIZA EL ICONO Y LA PENALIZACION
                      onChanged: (value) async {
                        setState(() {
                          iconPenalty = value!.icon;

                          // ASIGNAR LA PENALIZACION SEGUN EL ICONO SELECCIONADO
                          if (iconPenalty == Icons.close) {
                            // PENALIZACION DNF (NO FINALIZADO)
                            currentTime.setPenalty("DNF", !currentTime.isDnfChoose);
                            currentTime.isDnfChoose = !currentTime.isDnfChoose;
                            currentTime.isPlusTwoChoose = false;
                          } else if (iconPenalty == Icons.timer) {
                            // PENALIZACION +2 SEGUNDOS
                            currentTime.setPenalty("+2", !currentTime.isPlusTwoChoose);
                            currentTime.isDnfChoose = false;
                            currentTime.isPlusTwoChoose = !currentTime.isPlusTwoChoose;
                          } else if (iconPenalty == Icons.block) {
                            // SIN PENALIZACION, RESTA LOS 2 SEGUNDOS SI ESTABA EN +2
                            if (currentTime.timeTraining!.penalty == "+2") {
                              currentTime.timeTraining!.timeInSeconds = timeInSecondsOld;
                            }
                            currentTime.setPenalty("none", true);
                          }
                        });

                        // ACTUALIZAR EL ESTADO GLOBAL
                        currentTime.updateCurrentTime(context);

                        // GUARDAR CAMBIOS EN LA BASE DE DATOS
                        if (await timeTrainingDaoSb.updateTime(
                            idTime, currentTime.timeTraining) == false) {
                          // MOSTRAR ERROR SI FALLA LA ACTUALIZACION
                          AlertUtil.showSnackBarError(
                              context, "time_saved_error");
                          return;
                        }
                      },

                      dropdownStyleData: DropdownStyleData(
                        width: 160, // ANCHO DEL MENU DESPLEGABLE
                        padding: const EdgeInsets.symmetric(vertical: 6),
                        decoration: BoxDecoration(
                          // BORDES REDONDEADOS
                          borderRadius: BorderRadius.circular(4),
                          color: AppColors.imagenBg, // COLOR DE FONDO
                        ),
                        offset: const Offset(0, 8), // DESPLAZAMIENTO DEL MENU
                      ),
                      menuItemStyleData: MenuItemStyleData(
                        customHeights: [
                          // ALTURA DE CADA ITEM
                          ...List<double>.filled(MenuItems.items.length, 48),
                        ],
                        // ESPACIADO INTERNO
                        padding: const EdgeInsets.only(left: 16, right: 16),
                      ),
                    ),
                  ),
                  Text(
                    // SI LA PENALIZACION ES 'DNF' SE MUESTRA EN VEZ DEL TIEMPO
                    currentTime.timeTraining!.penalty == "DNF"
                        ? currentTime.timeTraining!.penalty.toString()
                        : currentTime.timeTraining!.timeInSeconds.toString(),
                    style: AppStyles.darkPurpleAndBold(30),
                  ),

                  IconClass.iconButton(context, () async {
                    await deleteTime();
                  }, "delete_time", Icons.delete)
                ],
              ),
              content: Column(
                mainAxisSize: MainAxisSize.min, // QUE OCUPE EL MINIMO
                children: [
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      IconClass.iconButton(
                          context, () {}, "date", Icons.calendar_month),
                      Text(
                        DateFormat('dd/MM/yyyy').format(DateTime.now()),
                        style: AppStyles.darkPurple(16),
                      )
                    ],
                  ),

                  // LINEA DIVISORIA ENTRE LA FECHA Y EL CONTENIDO EN SI
                  const Divider(
                    height: 10,
                    thickness: 1.3,
                    indent: 10,
                    endIndent: 10,
                    color: AppColors.darkPurpleColor,
                  ),

                  const SizedBox(height: 5),

                  Row(
                    children: [
                      Card(
                        // SEGUN SI ESTA PRESIONADO O NO, SE TORNA DE UN COLOR U OTRO
                        color: isTextPressed
                            ? AppColors.downLinearColor
                            : AppColors.purpleButton,
                        shape: RoundedRectangleBorder(
                          borderRadius: BorderRadius.circular(5),
                        ), // RADIO DEL CARD
                        child: TextButton(
                          onPressed: () {
                            setState(() {
                              // SI EL SCRAMBLE ES SELECCIONADO, SE PONE A TRUE
                              isTextPressed = true;
                            });
                          },
                          child: Text(
                            "Scramble",
                            style: AppStyles.darkPurpleAndBold(13),
                          ),
                        ),
                      ),
                      Card(
                        // SI EL SCRAMBLE ESTA PRESIONADO SE CAMBIA DE COLOR EL CARD
                        color: isTextPressed
                            ? AppColors.purpleButton
                            : AppColors.downLinearColor,
                        shape: RoundedRectangleBorder(
                          borderRadius: BorderRadius.circular(5),
                        ), // RADIO DEL CARD
                        child: TextButton(
                          onPressed: () {
                            setState(() {
                              // CUANDO PRESIONE LOS COMENTAIOS, SE PONE A FALSE
                              isTextPressed = false;
                            });
                          },
                          child: Text(
                            Internationalization.internationalization.getLocalizations(context, "comments"),
                            style: AppStyles.darkPurpleAndBold(13),
                          ),
                        ),
                      ),
                    ],
                  ),

                  Row(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: [
                      Expanded(
                        child: Text(
                          // SI EL SCRAMBLE ESTA PRESIONADO SE MUESTRA EL SCRAMBLE
                          // Y SI NO LOS COMENTARIOS
                          isTextPressed
                              ? timeTraining.scramble
                              : (timeTraining.comments ?? Internationalization.internationalization.getLocalizations(context, "no_comments")),
                          style: const TextStyle(fontSize: 14),
                          // HACE UN SALTO DE LINEA SI ES LARGO
                          softWrap: true,
                          // SI TIENE MUCHO OVERFLOW, TRUNCA EL SCRAMBLE Y PONE PUNTOS SUSPENSIVOS
                          overflow: TextOverflow.fade,
                        ),
                      ),
                      IconClass.iconButton(context, () async {
                        await Clipboard.setData(
                            ClipboardData(text: timeTraining.scramble));
                        // MUESTRA MENSAJE DE QUE SE COPIO CORRECTAMENTE
                        showSnackBarInformation(
                            context, "copied_successfully");
                      }, "copy_scramble", Icons.copy)
                    ],
                  )
                ],
              ),
            );
          },
        );
      });
}