CKT String|Colors
This commit is contained in:
@@ -1,10 +1,12 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import '../colors/app_colors.dart';
|
||||
|
||||
import '../widgets/app_gradients.dart';
|
||||
import '../colors/app_gradients.dart';
|
||||
import '../strings/credits_strings.dart';
|
||||
import '../widgets/entrance.dart';
|
||||
|
||||
const Color _pink = Color(0xFFFF55A7);
|
||||
const Color _teal = Color(0xFF2F9E94);
|
||||
const Color _pink = AppColors.pink;
|
||||
const Color _teal = AppColors.teal;
|
||||
|
||||
class _CreditPerson {
|
||||
const _CreditPerson(this.name, this.role, {this.logoPath});
|
||||
@@ -25,21 +27,27 @@ class _CreditSection {
|
||||
}
|
||||
|
||||
const List<_CreditSection> _kCreditSections = [
|
||||
_CreditSection('Criadora original', [
|
||||
_CreditPerson('Francisca Salgado Ferreira Pacheco Silva', 'Criadora original'),
|
||||
_CreditSection(CreditsStrings.originalCreatorSection, [
|
||||
_CreditPerson(
|
||||
'Francisca Salgado Ferreira Pacheco Silva',
|
||||
CreditsStrings.originalCreatorRole,
|
||||
),
|
||||
]),
|
||||
_CreditSection('Desenvolvimento informático', [
|
||||
_CreditPerson('Carlos Correia', 'Desenvolvedor'),
|
||||
_CreditPerson('Fábio Ceia', 'Desenvolvedor'),
|
||||
_CreditPerson('Ruben Grandra', 'Desenvolvedor'),
|
||||
_CreditPerson('Dinis Maria', 'Desenvolvedor'),
|
||||
_CreditSection(CreditsStrings.developmentSection, [
|
||||
_CreditPerson('Carlos Correia', CreditsStrings.developerRole),
|
||||
_CreditPerson('Fábio Ceia', CreditsStrings.developerRole),
|
||||
_CreditPerson('Ruben Grandra', CreditsStrings.developerRole),
|
||||
_CreditPerson('Dinis Maria', CreditsStrings.developerRole),
|
||||
]),
|
||||
_CreditSection('Orientadores', [
|
||||
_CreditPerson('Augusta Pureza Alves Silveira', 'Orientador(a)'),
|
||||
_CreditPerson('Cristina Lopes Cardoso Silva', 'Orientador(a)'),
|
||||
_CreditPerson('João Carlos Rodrigues L. Miranda', 'Orientador(a)'),
|
||||
_CreditSection(CreditsStrings.advisorsSection, [
|
||||
_CreditPerson('Augusta Pureza Alves Silveira', CreditsStrings.advisorRole),
|
||||
_CreditPerson('Cristina Lopes Cardoso Silva', CreditsStrings.advisorRole),
|
||||
_CreditPerson(
|
||||
'João Carlos Rodrigues L. Miranda',
|
||||
CreditsStrings.advisorRole,
|
||||
),
|
||||
]),
|
||||
_CreditSection('Instituição colaboradora', [
|
||||
_CreditSection(CreditsStrings.institutionSection, [
|
||||
_CreditPerson('Universidade Fernando Pessoa', ''),
|
||||
_CreditPerson(
|
||||
'Escola Profissional de Vila do Conde',
|
||||
@@ -66,14 +74,14 @@ class CreditsScreen extends StatelessWidget {
|
||||
elevation: 0,
|
||||
scrolledUnderElevation: 0,
|
||||
title: const Text(
|
||||
'Criadores e Colaboradores',
|
||||
CreditsStrings.pageTitle,
|
||||
style: TextStyle(fontWeight: FontWeight.w900),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
body: Container(
|
||||
color: const Color(0xFFFAFAF7),
|
||||
color: AppColors.background,
|
||||
child: SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
padding: const EdgeInsets.fromLTRB(20, 24, 20, 24),
|
||||
@@ -97,7 +105,7 @@ class CreditsScreen extends StatelessWidget {
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
const Text(
|
||||
'Quem fez a Check-Teeth Kids',
|
||||
CreditsStrings.header,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 20,
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import '../colors/app_colors.dart';
|
||||
|
||||
import '../widgets/app_gradients.dart';
|
||||
import '../colors/app_gradients.dart';
|
||||
import '../strings/curiosidade_strings.dart';
|
||||
import '../widgets/entrance.dart';
|
||||
import '../widgets/liquid_waves_background.dart';
|
||||
import '../widgets/tap_bounce.dart';
|
||||
@@ -22,7 +24,7 @@ class CuriosidadeScreen extends StatelessWidget {
|
||||
elevation: 0,
|
||||
scrolledUnderElevation: 0,
|
||||
title: const Text(
|
||||
'Curiosidades',
|
||||
CuriosidadeStrings.pageTitle,
|
||||
style: TextStyle(fontWeight: FontWeight.w900),
|
||||
),
|
||||
),
|
||||
@@ -31,7 +33,7 @@ class CuriosidadeScreen extends StatelessWidget {
|
||||
body: Stack(
|
||||
clipBehavior: Clip.none,
|
||||
children: [
|
||||
Positioned.fill(child: Container(color: const Color(0xFFFAFAF7))),
|
||||
Positioned.fill(child: Container(color: AppColors.background)),
|
||||
const LiquidWavesBackground(),
|
||||
SafeArea(
|
||||
child: Align(
|
||||
@@ -45,9 +47,8 @@ class CuriosidadeScreen extends StatelessWidget {
|
||||
child: TapBounce(
|
||||
scale: 0.97,
|
||||
child: _CuriosityTopicTile(
|
||||
title: 'Tema X',
|
||||
description:
|
||||
'Aprenda dicas rápidas e simples para cuidar dos dentes no dia a dia.',
|
||||
title: CuriosidadeStrings.topicXTitle,
|
||||
description: CuriosidadeStrings.topicXDescription,
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -57,8 +58,8 @@ class CuriosidadeScreen extends StatelessWidget {
|
||||
child: const TapBounce(
|
||||
scale: 0.97,
|
||||
child: _CuriosityTopicTile(
|
||||
title: 'Tema Y',
|
||||
description: 'Conteúdo em breve.',
|
||||
title: CuriosidadeStrings.topicYTitle,
|
||||
description: CuriosidadeStrings.contentComingSoon,
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -68,8 +69,8 @@ class CuriosidadeScreen extends StatelessWidget {
|
||||
child: const TapBounce(
|
||||
scale: 0.97,
|
||||
child: _CuriosityTopicTile(
|
||||
title: 'Tema Z',
|
||||
description: 'Conteúdo em breve.',
|
||||
title: CuriosidadeStrings.topicZTitle,
|
||||
description: CuriosidadeStrings.contentComingSoon,
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -79,8 +80,8 @@ class CuriosidadeScreen extends StatelessWidget {
|
||||
child: const TapBounce(
|
||||
scale: 0.97,
|
||||
child: _CuriosityTopicTile(
|
||||
title: 'Tema U',
|
||||
description: 'Conteúdo em breve.',
|
||||
title: CuriosidadeStrings.topicUTitle,
|
||||
description: CuriosidadeStrings.contentComingSoon,
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -114,7 +115,7 @@ class _CuriosityTopicTile extends StatelessWidget {
|
||||
showModalBottomSheet<void>(
|
||||
context: context,
|
||||
showDragHandle: true,
|
||||
backgroundColor: const Color(0xFFFFE6F1),
|
||||
backgroundColor: AppColors.pinkBackground,
|
||||
shape: const RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.vertical(top: Radius.circular(24)),
|
||||
),
|
||||
@@ -132,7 +133,7 @@ class _CuriosityTopicTile extends StatelessWidget {
|
||||
style: const TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.w900,
|
||||
color: Color(0xFFFF55A7),
|
||||
color: AppColors.pink,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 10),
|
||||
@@ -174,7 +175,7 @@ class _CuriosityTopicTile extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
onPressed: () => Navigator.of(ctx).pop(),
|
||||
child: const Text('Fechar'),
|
||||
child: const Text(CuriosidadeStrings.close),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -195,12 +196,12 @@ class _CuriosityTopicTile extends StatelessWidget {
|
||||
width: 36,
|
||||
height: 36,
|
||||
decoration: BoxDecoration(
|
||||
color: const Color(0xFFFF55A7).withValues(alpha: 0.12),
|
||||
color: AppColors.pink.withValues(alpha: 0.12),
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
child: const Icon(
|
||||
Icons.lightbulb_rounded,
|
||||
color: Color(0xFFFF55A7),
|
||||
color: AppColors.pink,
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 12),
|
||||
@@ -209,7 +210,7 @@ class _CuriosityTopicTile extends StatelessWidget {
|
||||
title,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.w900,
|
||||
color: Color(0xFF2F9E94),
|
||||
color: AppColors.teal,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import '../colors/app_colors.dart';
|
||||
import '../strings/splash_strings.dart';
|
||||
|
||||
class HelloSplashScreen extends StatefulWidget {
|
||||
const HelloSplashScreen({super.key, required this.onFinished, this.duration = const Duration(seconds: 5)});
|
||||
@@ -76,7 +78,7 @@ class _HelloSplashScreenState extends State<HelloSplashScreen> with TickerProvid
|
||||
child: Container(
|
||||
width: size.width,
|
||||
height: size.height,
|
||||
color: const Color(0xFFFAFAF7),
|
||||
color: AppColors.background,
|
||||
child: SafeArea(
|
||||
child: Center(
|
||||
child: Column(
|
||||
@@ -85,12 +87,12 @@ class _HelloSplashScreenState extends State<HelloSplashScreen> with TickerProvid
|
||||
ScaleTransition(
|
||||
scale: _pop,
|
||||
child: const Text(
|
||||
'Olá',
|
||||
SplashStrings.greeting,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 64,
|
||||
fontWeight: FontWeight.w900,
|
||||
color: Color(0xFFFF9AD0),
|
||||
color: AppColors.pinkLight,
|
||||
height: 1.0,
|
||||
),
|
||||
),
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import '../colors/app_colors.dart';
|
||||
|
||||
import '../main.dart' show supabase;
|
||||
import '../privacy_gate_prefs.dart';
|
||||
import '../strings/privacy_strings.dart';
|
||||
import '../terms_gate_prefs.dart';
|
||||
import '../widgets/entrance.dart';
|
||||
import '../widgets/liquid_waves_background.dart';
|
||||
@@ -87,7 +89,7 @@ class _PrivacyGateScreenState extends State<PrivacyGateScreen> {
|
||||
body: Stack(
|
||||
clipBehavior: Clip.none,
|
||||
children: [
|
||||
Positioned.fill(child: Container(color: const Color(0xFFFAFAF7))),
|
||||
Positioned.fill(child: Container(color: AppColors.background)),
|
||||
const LiquidWavesBackground(),
|
||||
SafeArea(
|
||||
child: Column(
|
||||
@@ -129,7 +131,7 @@ class _PrivacyGateScreenState extends State<PrivacyGateScreen> {
|
||||
child: TextButton(
|
||||
onPressed: _declining ? null : _acceptAll,
|
||||
child: const Text(
|
||||
'Aceitar tudo',
|
||||
PrivacyStrings.acceptAll,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w800,
|
||||
fontSize: 15,
|
||||
@@ -250,8 +252,8 @@ class _PrivacyConsentRow extends StatelessWidget {
|
||||
children: [
|
||||
TextSpan(
|
||||
text: item.required
|
||||
? '(Obrigatório) '
|
||||
: '(Opcional) ',
|
||||
? PrivacyStrings.requiredPrefix
|
||||
: PrivacyStrings.optionalPrefix,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w900,
|
||||
color: item.required
|
||||
@@ -302,7 +304,7 @@ class _AdvanceButton extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
onPressed: enabled ? onPressed : null,
|
||||
child: const Text('Avançar'),
|
||||
child: const Text(PrivacyStrings.advance),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import '../colors/app_colors.dart';
|
||||
|
||||
import '../main.dart' show supabase;
|
||||
import '../strings/settings_strings.dart';
|
||||
import '../widgets/app_dialogs.dart';
|
||||
import '../widgets/entrance.dart';
|
||||
import '../widgets/pill_snackbar.dart';
|
||||
@@ -8,8 +10,8 @@ import '../widgets/tap_bounce.dart';
|
||||
import 'credits_screen.dart';
|
||||
import 'terms_screen.dart';
|
||||
|
||||
const Color _teal = Color(0xFF2F9E94);
|
||||
const Color _accentPink = Color(0xFFFF55A7);
|
||||
const Color _teal = AppColors.teal;
|
||||
const Color _accentPink = AppColors.pink;
|
||||
|
||||
/// Conteúdo da aba de Configurações, para ser embutido na bottom navigation
|
||||
/// do LoggedHomeScreen (sem Scaffold/AppBar próprios).
|
||||
@@ -32,13 +34,9 @@ class _SettingsBodyState extends State<SettingsBody> {
|
||||
Future<void> _confirmDeleteAccountData() async {
|
||||
final confirmed = await showConfirmDialog(
|
||||
context,
|
||||
title: 'Apagar dados da conta',
|
||||
message:
|
||||
'Isto remove permanentemente a sua conta, perfil, crianças '
|
||||
'registadas e fotos — incluindo o login, permitindo criar uma '
|
||||
'nova conta com o mesmo e-mail depois. Esta ação não pode ser '
|
||||
'desfeita. Pretende continuar?',
|
||||
confirmLabel: 'Apagar',
|
||||
title: SettingsStrings.deleteAccountData,
|
||||
message: SettingsStrings.deleteAccountMessage,
|
||||
confirmLabel: SettingsStrings.delete,
|
||||
confirmColor: _accentPink,
|
||||
);
|
||||
|
||||
@@ -56,7 +54,8 @@ class _SettingsBodyState extends State<SettingsBody> {
|
||||
final errorMessage = (data is Map) ? data['error']?.toString() : null;
|
||||
if (response.status != 200 || errorMessage != null) {
|
||||
throw StateError(
|
||||
errorMessage ?? 'Erro ao apagar conta (status ${response.status})',
|
||||
errorMessage ??
|
||||
SettingsStrings.errorDeletingAccount(response.status),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -64,7 +63,7 @@ class _SettingsBodyState extends State<SettingsBody> {
|
||||
if (!mounted) return;
|
||||
Navigator.of(context).popUntil((route) => route.isFirst);
|
||||
} catch (e) {
|
||||
if (mounted) showPillSnackBar(context, 'Erro ao apagar: $e');
|
||||
if (mounted) showPillSnackBar(context, SettingsStrings.errorDeleting(e));
|
||||
} finally {
|
||||
if (mounted) setState(() => _deletingAccount = false);
|
||||
}
|
||||
@@ -83,18 +82,18 @@ class _SettingsBodyState extends State<SettingsBody> {
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
_SectionLabel('Conta'),
|
||||
_SectionLabel(SettingsStrings.account),
|
||||
_SettingsCard(
|
||||
children: [
|
||||
_InfoTile(
|
||||
icon: Icons.person_outline_rounded,
|
||||
title: name.isEmpty ? 'Sem nome' : name,
|
||||
title: name.isEmpty ? SettingsStrings.noName : name,
|
||||
subtitle: email,
|
||||
),
|
||||
const Divider(height: 1),
|
||||
_ActionTile(
|
||||
icon: Icons.logout_rounded,
|
||||
title: 'Sair',
|
||||
title: SettingsStrings.signOut,
|
||||
onTap: _signOut,
|
||||
),
|
||||
],
|
||||
@@ -108,12 +107,12 @@ class _SettingsBodyState extends State<SettingsBody> {
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
_SectionLabel('Sobre'),
|
||||
_SectionLabel(SettingsStrings.about),
|
||||
_SettingsCard(
|
||||
children: [
|
||||
_ActionTile(
|
||||
icon: Icons.description_outlined,
|
||||
title: 'Termos de Serviço',
|
||||
title: SettingsStrings.termsOfService,
|
||||
onTap: () => Navigator.of(context).push(
|
||||
MaterialPageRoute<void>(
|
||||
builder: (_) => const TermsScreen(),
|
||||
@@ -123,7 +122,7 @@ class _SettingsBodyState extends State<SettingsBody> {
|
||||
const Divider(height: 1),
|
||||
_ActionTile(
|
||||
icon: Icons.diversity_3_outlined,
|
||||
title: 'Criadores e colaboradores',
|
||||
title: SettingsStrings.creatorsAndContributors,
|
||||
onTap: () => Navigator.of(context).push(
|
||||
MaterialPageRoute<void>(
|
||||
builder: (_) => const CreditsScreen(),
|
||||
@@ -133,7 +132,7 @@ class _SettingsBodyState extends State<SettingsBody> {
|
||||
const Divider(height: 1),
|
||||
const _InfoTile(
|
||||
icon: Icons.info_outline_rounded,
|
||||
title: 'Versão do app',
|
||||
title: SettingsStrings.appVersion,
|
||||
subtitle: '1.0.0',
|
||||
),
|
||||
],
|
||||
@@ -147,12 +146,12 @@ class _SettingsBodyState extends State<SettingsBody> {
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
_SectionLabel('Zona de risco'),
|
||||
_SectionLabel(SettingsStrings.dangerZone),
|
||||
_SettingsCard(
|
||||
children: [
|
||||
_ActionTile(
|
||||
icon: Icons.delete_forever_rounded,
|
||||
title: 'Apagar dados da conta',
|
||||
title: SettingsStrings.deleteAccountData,
|
||||
titleColor: _accentPink,
|
||||
loading: _deletingAccount,
|
||||
onTap: _deletingAccount ? null : _confirmDeleteAccountData,
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import '../colors/app_colors.dart';
|
||||
|
||||
import '../main.dart' show supabase;
|
||||
import '../strings/terms_strings.dart';
|
||||
import '../terms_gate_prefs.dart';
|
||||
import '../widgets/entrance.dart';
|
||||
import '../widgets/liquid_waves_background.dart';
|
||||
@@ -62,7 +64,7 @@ class _TermsGateScreenState extends State<TermsGateScreen> {
|
||||
body: Stack(
|
||||
clipBehavior: Clip.none,
|
||||
children: [
|
||||
Positioned.fill(child: Container(color: const Color(0xFFFAFAF7))),
|
||||
Positioned.fill(child: Container(color: AppColors.background)),
|
||||
const LiquidWavesBackground(),
|
||||
SafeArea(
|
||||
child: Column(
|
||||
@@ -173,7 +175,7 @@ class _AcceptCheckboxRow extends StatelessWidget {
|
||||
),
|
||||
const SizedBox(width: 10),
|
||||
const Text(
|
||||
'Aceitar tudo',
|
||||
TermsStrings.acceptAll,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w800,
|
||||
fontSize: 15,
|
||||
@@ -212,7 +214,7 @@ class _AdvanceButton extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
onPressed: enabled ? onPressed : null,
|
||||
child: const Text('Avançar'),
|
||||
child: const Text(TermsStrings.advance),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import '../colors/app_colors.dart';
|
||||
|
||||
import '../widgets/app_gradients.dart';
|
||||
import '../colors/app_gradients.dart';
|
||||
import '../strings/terms_strings.dart';
|
||||
import '../widgets/terms_content.dart';
|
||||
|
||||
class TermsScreen extends StatelessWidget {
|
||||
@@ -20,14 +22,14 @@ class TermsScreen extends StatelessWidget {
|
||||
elevation: 0,
|
||||
scrolledUnderElevation: 0,
|
||||
title: const Text(
|
||||
'Termos de Serviço',
|
||||
TermsStrings.pageTitle,
|
||||
style: TextStyle(fontWeight: FontWeight.w900),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
body: Container(
|
||||
color: const Color(0xFFFAFAF7),
|
||||
color: AppColors.background,
|
||||
child: SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
padding: const EdgeInsets.fromLTRB(20, 24, 20, 24),
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
import 'dart:ui';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import '../colors/app_colors.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:video_player/video_player.dart';
|
||||
import 'package:youtube_player_flutter/youtube_player_flutter.dart';
|
||||
|
||||
import '../watched_videos_prefs.dart';
|
||||
import '../widgets/app_gradients.dart';
|
||||
import '../colors/app_gradients.dart';
|
||||
import '../strings/video_strings.dart';
|
||||
import '../widgets/entrance.dart';
|
||||
import '../widgets/liquid_waves_background.dart';
|
||||
import '../widgets/pill_snackbar.dart';
|
||||
@@ -36,83 +38,80 @@ class VideoData {
|
||||
final List<VideoData> videoList = [
|
||||
VideoData(
|
||||
id: 1,
|
||||
title: 'Episódio 1',
|
||||
description: 'Qual a Influência do nariz entupido na má oclusão',
|
||||
title: VideoStrings.episodeTitle(1),
|
||||
description: VideoStrings.episodeDescriptions[0],
|
||||
youtubeId: 'PJ58CZv4ECw',
|
||||
),
|
||||
VideoData(
|
||||
id: 2,
|
||||
title: 'Episódio 2',
|
||||
description: 'Qual a Influência das alergias sazionais na má oclusão',
|
||||
title: VideoStrings.episodeTitle(2),
|
||||
description: VideoStrings.episodeDescriptions[1],
|
||||
youtubeId: 'y4_kWmZtAtg',
|
||||
),
|
||||
VideoData(
|
||||
id: 3,
|
||||
title: 'Episódio 3',
|
||||
description: 'Qual a Influência das Otites frequentes na má oclusão',
|
||||
title: VideoStrings.episodeTitle(3),
|
||||
description: VideoStrings.episodeDescriptions[2],
|
||||
youtubeId: 'nD75Y5PuKTo',
|
||||
),
|
||||
VideoData(
|
||||
id: 4,
|
||||
title: 'Episódio 4',
|
||||
description: 'Qual a Influência das Amigdalites recorrentes na má oclusão',
|
||||
title: VideoStrings.episodeTitle(4),
|
||||
description: VideoStrings.episodeDescriptions[3],
|
||||
youtubeId: 'yvFllWYeuLw',
|
||||
),
|
||||
VideoData(
|
||||
id: 5,
|
||||
title: 'Episódio 5',
|
||||
description:
|
||||
'Qual a Influência das Bronquiolites recorrentes na má oclusão',
|
||||
title: VideoStrings.episodeTitle(5),
|
||||
description: VideoStrings.episodeDescriptions[4],
|
||||
youtubeId: 'DnhUa-T8_Ps',
|
||||
),
|
||||
VideoData(
|
||||
id: 6,
|
||||
title: 'Episódio 6',
|
||||
description: 'Qual a Influência dos problemas respitatórios na má oclusão',
|
||||
title: VideoStrings.episodeTitle(6),
|
||||
description: VideoStrings.episodeDescriptions[5],
|
||||
youtubeId: 'zKt_iwkrjvo',
|
||||
),
|
||||
VideoData(
|
||||
id: 7,
|
||||
title: 'Episódio 7',
|
||||
description:
|
||||
'Qual a Influência das interrupções respiratórias na má oclusão',
|
||||
title: VideoStrings.episodeTitle(7),
|
||||
description: VideoStrings.episodeDescriptions[6],
|
||||
youtubeId: 'NpmQ2brap5A',
|
||||
),
|
||||
VideoData(
|
||||
id: 8,
|
||||
title: 'Episódio 8',
|
||||
description: 'Qual a Influência do ressonar na má oclusão',
|
||||
title: VideoStrings.episodeTitle(8),
|
||||
description: VideoStrings.episodeDescriptions[7],
|
||||
youtubeId: 'Wj3KYw9pBi0',
|
||||
),
|
||||
VideoData(
|
||||
id: 9,
|
||||
title: 'Episódio 9',
|
||||
description:
|
||||
'Qual a Influência de acordar com saliva seca na boca ou na almofada na saúde oral',
|
||||
title: VideoStrings.episodeTitle(9),
|
||||
description: VideoStrings.episodeDescriptions[8],
|
||||
youtubeId: 'bOm9t61cT_U',
|
||||
),
|
||||
VideoData(
|
||||
id: 10,
|
||||
title: 'Episódio 10',
|
||||
description: 'Qual a Influência da respiração oral na má oclusão',
|
||||
title: VideoStrings.episodeTitle(10),
|
||||
description: VideoStrings.episodeDescriptions[9],
|
||||
youtubeId: 'fAitMizbcms',
|
||||
),
|
||||
VideoData(
|
||||
id: 11,
|
||||
title: 'Episódio 11',
|
||||
description: 'Qual a influência do uso exagerado da chupeta na má oclusão',
|
||||
title: VideoStrings.episodeTitle(11),
|
||||
description: VideoStrings.episodeDescriptions[10],
|
||||
youtubeId: '6sYoBUjks_I',
|
||||
),
|
||||
VideoData(
|
||||
id: 12,
|
||||
title: 'Episódio 12',
|
||||
description: 'Qual a influência do uso exagerado da chupeta na má oclusão',
|
||||
title: VideoStrings.episodeTitle(12),
|
||||
description: VideoStrings.episodeDescriptions[11],
|
||||
youtubeId: 'eznKrErQbHo',
|
||||
),
|
||||
VideoData(
|
||||
id: 13,
|
||||
title: 'Episódio 13',
|
||||
description: 'Qual a influência do hábito de chuchar o dedo na má oclusão',
|
||||
title: VideoStrings.episodeTitle(13),
|
||||
description: VideoStrings.episodeDescriptions[12],
|
||||
youtubeId: 'VO9CNqHRdeM',
|
||||
),
|
||||
];
|
||||
@@ -176,7 +175,7 @@ Future<void> showVideoPlayerDialog(
|
||||
}) {
|
||||
if (video.youtubeId != null) {
|
||||
if (video.youtubeId!.isEmpty) {
|
||||
showPillSnackBar(context, 'Vídeo ainda não disponível');
|
||||
showPillSnackBar(context, VideoStrings.videoNotAvailable);
|
||||
return Future.value();
|
||||
}
|
||||
return Navigator.of(context).push<void>(
|
||||
@@ -199,8 +198,8 @@ class VideoScreen extends StatefulWidget {
|
||||
/// guardar localmente quais episódios ela já assistiu até ao fim.
|
||||
final String? scopeId;
|
||||
|
||||
static const Color _teal = Color(0xFF2F9E94);
|
||||
static const Color _accentPink = Color(0xFFFF55A7);
|
||||
static const Color _teal = AppColors.teal;
|
||||
static const Color _accentPink = AppColors.pink;
|
||||
|
||||
@override
|
||||
State<VideoScreen> createState() => _VideoScreenState();
|
||||
@@ -253,7 +252,7 @@ class _VideoScreenState extends State<VideoScreen> {
|
||||
elevation: 0,
|
||||
scrolledUnderElevation: 0,
|
||||
title: const Text(
|
||||
'Vídeos Educativos',
|
||||
VideoStrings.pageTitle,
|
||||
style: TextStyle(fontWeight: FontWeight.w900),
|
||||
),
|
||||
),
|
||||
@@ -262,7 +261,7 @@ class _VideoScreenState extends State<VideoScreen> {
|
||||
body: Stack(
|
||||
clipBehavior: Clip.none,
|
||||
children: [
|
||||
Positioned.fill(child: Container(color: const Color(0xFFFAFAF7))),
|
||||
Positioned.fill(child: Container(color: AppColors.background)),
|
||||
const LiquidWavesBackground(),
|
||||
SafeArea(
|
||||
child: Padding(
|
||||
@@ -285,7 +284,7 @@ class _VideoScreenState extends State<VideoScreen> {
|
||||
child: TextField(
|
||||
controller: _searchController,
|
||||
decoration: InputDecoration(
|
||||
hintText: 'Pesquisar vídeos...',
|
||||
hintText: VideoStrings.searchHint,
|
||||
prefixIcon: const Icon(
|
||||
Icons.search,
|
||||
color: VideoScreen._teal,
|
||||
@@ -307,7 +306,7 @@ class _VideoScreenState extends State<VideoScreen> {
|
||||
child: _filteredVideos.isEmpty
|
||||
? Center(
|
||||
child: Text(
|
||||
'Nenhum vídeo encontrado',
|
||||
VideoStrings.noVideosFound,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w600,
|
||||
@@ -546,7 +545,7 @@ class _VideoButton extends StatelessWidget {
|
||||
fit: StackFit.expand,
|
||||
children: [
|
||||
ColoredBox(
|
||||
color: const Color(0xFFFFE6F1),
|
||||
color: AppColors.pinkBackground,
|
||||
child: VideoThumbnail(
|
||||
video: video,
|
||||
borderRadius: 0,
|
||||
@@ -593,7 +592,7 @@ class _VideoButton extends StatelessWidget {
|
||||
borderRadius: BorderRadius.circular(999),
|
||||
),
|
||||
child: Text(
|
||||
'EP. ${video.id}',
|
||||
VideoStrings.episodeBadge(video.id),
|
||||
style: const TextStyle(
|
||||
color: Colors.white,
|
||||
fontWeight: FontWeight.w800,
|
||||
@@ -731,7 +730,7 @@ class _YoutubePlayerPageState extends State<_YoutubePlayerPage>
|
||||
child: Scaffold(
|
||||
backgroundColor: value.isFullScreen
|
||||
? Colors.black
|
||||
: const Color(0xFFFAFAF7),
|
||||
: AppColors.background,
|
||||
appBar: value.isFullScreen
|
||||
? null
|
||||
: PreferredSize(
|
||||
@@ -808,7 +807,7 @@ class _YoutubePlayerPageState extends State<_YoutubePlayerPage>
|
||||
MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
const Text(
|
||||
'Próximos',
|
||||
VideoStrings.nextVideos,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w900,
|
||||
fontSize: 15,
|
||||
@@ -835,7 +834,7 @@ class _YoutubePlayerPageState extends State<_YoutubePlayerPage>
|
||||
vertical: 2,
|
||||
),
|
||||
child: Text(
|
||||
'Ver mais',
|
||||
VideoStrings.seeMore,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w800,
|
||||
fontSize: 13,
|
||||
@@ -1033,7 +1032,7 @@ class _VideoPlayerDialogState extends State<_VideoPlayerDialog> {
|
||||
setState(() {
|
||||
_isInitialized = false;
|
||||
});
|
||||
showPillSnackBar(context, 'Erro ao carregar vídeo: $e');
|
||||
showPillSnackBar(context, VideoStrings.errorLoadingVideo(e));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1188,7 +1187,7 @@ class _VideoControlsState extends State<_VideoControls> {
|
||||
Icons.replay_10_rounded,
|
||||
color: Colors.white,
|
||||
),
|
||||
tooltip: 'Retroceder 10s',
|
||||
tooltip: VideoStrings.rewind10s,
|
||||
onPressed: () => _seekBy(const Duration(seconds: -10)),
|
||||
),
|
||||
IconButton(
|
||||
@@ -1211,7 +1210,7 @@ class _VideoControlsState extends State<_VideoControls> {
|
||||
Icons.forward_10_rounded,
|
||||
color: Colors.white,
|
||||
),
|
||||
tooltip: 'Avançar 10s',
|
||||
tooltip: VideoStrings.forward10s,
|
||||
onPressed: () => _seekBy(const Duration(seconds: 10)),
|
||||
),
|
||||
IconButton(
|
||||
@@ -1294,7 +1293,7 @@ class _FullscreenVideoPlayerState extends State<_FullscreenVideoPlayer> {
|
||||
setState(() {
|
||||
_isInitialized = false;
|
||||
});
|
||||
showPillSnackBar(context, 'Erro ao carregar vídeo: $e');
|
||||
showPillSnackBar(context, VideoStrings.errorLoadingVideo(e));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user