Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions lib/core/services/firebase/remote_config_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@ final remoteConfigDefaults = {
"apuntes": false,
"perfil": true,
},
"acceso_rapido": {
"horario": {"enabled": true},
"calculadora": {"enabled": true},
"novedades": {"enabled": true},
"malla_historica": {"enabled": true},
},
"profile": {
"notificaciones": true,
"bug_report": true,
Expand Down
3 changes: 3 additions & 0 deletions lib/screens/asignaturas/widgets/acceso_rapido.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class AccesoRapido extends StatelessWidget {
colorDark: AppTheme.darkBlueCard,
label: "Horario",
icon: AppIcons.timetable,
flagKey: "horario",
onTap: () => visitarHorario(context),
),
CardAccesoRapido(
Expand All @@ -25,6 +26,7 @@ class AccesoRapido extends StatelessWidget {
label: "Notas",
icon: AppIcons.calculator,
fill: 0,
flagKey: "calculadora",
onTap: () => visitarCalculadoraNotas(context),
),
if (showEstudianteActions)
Expand All @@ -34,6 +36,7 @@ class AccesoRapido extends StatelessWidget {
label: "Malla Histórica",
icon: AppIcons.historicTimetable,
fill: 0,
flagKey: "malla_historica",
onTap: () => visitarMallaHistorica(context),
),
];
Expand Down
3 changes: 3 additions & 0 deletions lib/screens/home/widgets/acceso_rapido.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ Widget build(BuildContext context) {
colorDark: AppTheme.darkBlueCard,
label: "Horario",
icon: AppIcons.timetable,
flagKey: "horario",
onTap: () => visitarHorario(context),
),
CardAccesoRapido(
Expand All @@ -29,6 +30,7 @@ Widget build(BuildContext context) {
label: "Notas",
icon: AppIcons.calculator,
fill: 0,
flagKey: "calculadora",
onTap: () => visitarNotas(context),
),
CardAccesoRapido(
Expand All @@ -37,6 +39,7 @@ Widget build(BuildContext context) {
label: "Novedades",
icon: AppIcons.updates,
fill: 0,
flagKey: "novedades",
onTap: () => visitarNovedades(context),
),
];
Expand Down
75 changes: 50 additions & 25 deletions lib/styles/cards/card_acceso_rapido.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import "package:adaptive_theme/adaptive_theme.dart";
import "package:flutter/material.dart";
import "package:miutem/core/utils/utilities.dart";
import "package:miutem/widgets/feature_flag.dart";

class CardAccesoRapido extends StatelessWidget {
final Color color, colorDark;
Expand All @@ -9,35 +10,59 @@ class CardAccesoRapido extends StatelessWidget {
final Function() onTap;
final double fill;

const CardAccesoRapido({super.key, required this.color, required this.label, required this.icon, required this.onTap, required this.colorDark, this.fill = 1.0});
/// Clave del feature flag dentro de `acceso_rapido` en Remote Config (ej: "horario").
/// Si la característica está desactivada, la tarjeta se ve opaca y al tocarla
/// muestra el motivo definido en `acceso_rapido.<flagKey>.reason`.
final String? flagKey;

const CardAccesoRapido({super.key, required this.color, required this.label, required this.icon, required this.onTap, required this.colorDark, this.fill = 1.0, this.flagKey});

bool get _isEnabled => flagKey == null || FeatureFlag.evaluateSync("acceso_rapido.$flagKey.enabled");

void _mostrarMotivo(BuildContext context) => showDialog(
context: context,
builder: (ctx) => AlertDialog(
icon: const Icon(Icons.info_outline_rounded),
title: Text(FeatureFlag.getString("acceso_rapido.$flagKey.reason.title", defaultValue: "$label no está disponible")),
content: Text(FeatureFlag.getString("acceso_rapido.$flagKey.reason.message", defaultValue: "Desactivamos temporalmente esta característica. Inténtalo más tarde.")),
actions: [
TextButton(onPressed: () => Navigator.of(ctx).pop(), child: const Text("Entendido")),
],
),
);

@override
Widget build(BuildContext context) => GestureDetector(
onTap: onTap,
child: ValueListenableBuilder<AdaptiveThemeMode>(
valueListenable: AdaptiveTheme.of(context).modeChangeNotifier,
builder: (ctx, mode, child) => DecoratedBox(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(14),
color: themedColor(context, light: color, dark: colorDark),
),
child: SizedBox(
height: 120,
child: Padding(
padding: const EdgeInsets.fromLTRB(12,20,12,20),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Icon(icon, fill: fill, size: 32, weight: 600, color: Theme.of(context).textTheme.bodyMedium?.color),
const Spacer(),
Text(label, style: Theme.of(context).textTheme.labelMedium),
],
Widget build(BuildContext context) {
final enabled = _isEnabled;
return GestureDetector(
onTap: enabled ? onTap : () => _mostrarMotivo(context),
child: Opacity(
opacity: enabled ? 1 : 0.4,
child: ValueListenableBuilder<AdaptiveThemeMode>(
valueListenable: AdaptiveTheme.of(context).modeChangeNotifier,
builder: (ctx, mode, child) => DecoratedBox(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(14),
color: themedColor(context, light: color, dark: colorDark),
),
child: SizedBox(
height: 120,
child: Padding(
padding: const EdgeInsets.fromLTRB(12,20,12,20),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Icon(icon, fill: fill, size: 32, weight: 600, color: Theme.of(context).textTheme.bodyMedium?.color),
const Spacer(),
Text(label, style: Theme.of(context).textTheme.labelMedium),
],
),
),
),
),
),
),
),
);

);
}
}
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: miutem
description: "Plataforma académica para estudiantes de la Universidad Tecnológica Metropolitana (UTEM)"
publish_to: none

version: 4.0.0+152
version: 4.0.0+153

environment:
sdk: ^3.11.1
Expand Down
Loading