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
55 changes: 55 additions & 0 deletions assets/icons/logo-2.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions lib/core/consts/colors_const.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
class AppColors {
static Color primary = Color(0xFFEC5a1a); // Laranja
static Color secondary = Color(0xFF52280e); // Verde
static Color widgetBackgroundGrey = Color(0xFFECF0F4); // Cinza claro
static Color background = Color(0xFFFFFFFF); // Branco
static Color textPrimary = Color(0xFF000000); // Preto
static Color textSecondary = Color(0xFF555555); // Cinza escuro
Expand Down
12 changes: 12 additions & 0 deletions lib/core/utils/date_time_utils.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
class DateUtilsHelper {
static String saudacao() {
final hora = DateTime.now().hour;
if (hora >= 5 && hora < 12) {
return "Bom dia";
} else if (hora >= 12 && hora < 18) {
return "Boa tarde";
} else {
return "Boa noite";
}
}
}
17 changes: 17 additions & 0 deletions lib/data/models/marmita_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
class Marmita {
final String nome;
final String descricao;
final String imagem;
final double precoDia;
final double precoSemana;
final double precoMes;

Marmita({
required this.nome,
required this.descricao,
required this.imagem,
required this.precoDia,
required this.precoSemana,
required this.precoMes,
});
}
5 changes: 5 additions & 0 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:quentinha_app/core/consts/colors_const.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'core/routes/routes.dart';

void main() async {
WidgetsFlutterBinding.ensureInitialized();
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);

final prefs = await SharedPreferences.getInstance();
final bool? seenOnboarding = prefs.getBool('seenOnboarding');
Expand Down
89 changes: 89 additions & 0 deletions lib/presentation/components/app_bar_widget.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import 'package:flutter/material.dart';
import 'package:badges/badges.dart' as badges;
import 'package:quentinha_app/core/consts/size_const.dart';

import '../../core/consts/colors_const.dart';
import '../../core/log/logger.dart';

class AppBarPersonalizada extends StatelessWidget {
const AppBarPersonalizada({
super.key,
});

@override
Widget build(BuildContext context) {
return SizedBox(
height: 60,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Container(
decoration: BoxDecoration(
color: AppColors.widgetBackgroundGrey,
borderRadius: BorderRadius.circular(100),
),
child: IconButton(
icon: const Icon(Icons.sort, color: Colors.black),
onPressed: () {
AppLogger.i('Menu button pressed');
},
),
),
12.w,
Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'ENTREGAR EM',
style: TextStyle(
color: AppColors.primary,
fontSize: 12,
),
),
Row(
children: [
Text(
'Localização Atual',
style: TextStyle(
color: AppColors.textSecondary,
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
Icon(
Icons.keyboard_arrow_down,
color: AppColors.textSecondary,
),
],
),
],
),
],
),
Container(
decoration: BoxDecoration(
color: Colors.black,
borderRadius: BorderRadius.circular(100),
),
child: IconButton(
icon: badges.Badge(
badgeContent: Text('3'),
position: badges.BadgePosition.topEnd(top: -15),
child: const Icon(
Icons.shopping_bag_rounded,
color: Colors.white,
),
),
onPressed: () {
AppLogger.i('Shopping bag pressed');
},
),
),
],
),
);
}
}
100 changes: 100 additions & 0 deletions lib/presentation/components/marmita_card_widget.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
import 'package:flutter/material.dart';
import 'package:quentinha_app/core/consts/colors_const.dart';
import 'package:quentinha_app/core/consts/size_const.dart';
import '../../data/models/marmita_model.dart';

class MarmitaCardWidget extends StatelessWidget {
final Marmita marmita;
final String selectedOption;
final Function(String) onOptionSelected;

const MarmitaCardWidget({
super.key,
required this.marmita,
required this.selectedOption,
required this.onOptionSelected,
});

@override
Widget build(BuildContext context) {
double preco;
if (selectedOption == "Pro Dia") {
preco = marmita.precoDia;
} else if (selectedOption == "Pra Semana") {
preco = marmita.precoSemana;
} else {
preco = marmita.precoMes;
}

return Card(
elevation: 2,
color: Colors.white,
margin: EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Imagem ocupa toda a largura, ignorando o padding
ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(16)),
child: Image.network(
marmita.imagem,
width: double.infinity,
height: 200,
fit: BoxFit.cover,
errorBuilder: (context, error, stackTrace) => Container(
color: Colors.grey[300],
height: 200,
child: Icon(Icons.error),
),
),
),
// Conteúdo abaixo da imagem com padding
Padding(
padding: EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
marmita.nome,
style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
4.h,
Text(
marmita.descricao,
style: TextStyle(color: Colors.grey[600]),
),
8.h,
Text(
"R\$ ${preco.toStringAsFixed(2)}",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.green,
),
),
8.h,
Wrap(
spacing: 8,
children: ["Pro Dia", "Pra Semana", "Pro Mês"].map((opcao) {
return ChoiceChip(
selectedColor: AppColors.primary.withAlpha(20),
elevation: 2,
side: BorderSide(style: BorderStyle.none),
backgroundColor: AppColors.widgetBackgroundGrey,
showCheckmark: false,
label: Text(opcao),
selected: selectedOption == opcao,
onSelected: (_) {
onOptionSelected(opcao);
},
);
}).toList(),
),
],
),
),
],
),
);
}
}
67 changes: 67 additions & 0 deletions lib/presentation/components/snackbar_widget.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import 'package:flutter/material.dart';
import 'package:quentinha_app/core/consts/colors_const.dart';
import 'package:quentinha_app/core/consts/size_const.dart';

class CustomSnackBar {
/// Exibe diretamente a snackbar customizada
static void show(
BuildContext context, {
required String message,
Color backgroundColor = Colors.black87,
IconData? icon,
Duration duration = const Duration(seconds: 3),
}) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Row(
children: [
if (icon != null) ...[
Icon(icon, color: Colors.white),
8.h,
],
Expanded(child: Text(message)),
],
),
behavior: SnackBarBehavior.floating,
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
backgroundColor: backgroundColor,
duration: duration,
),
);
}

/// Exibe um loading por [delay], depois mostra a snackbar
static Future<void> showWithLoading(
BuildContext context, {
required String message,
Color backgroundColor = Colors.black87,
IconData? icon,
Duration duration = const Duration(seconds: 3),
Duration delay = const Duration(seconds: 2),
}) async {

// Exibe loading
showDialog(
context: context,
barrierDismissible: false,
builder: (_) =>
Center(child: CircularProgressIndicator(color: AppColors.primary)),
);

// Aguarda
await Future.delayed(delay);

// Fecha loading com rootNavigator
Navigator.of(context, rootNavigator: true).pop();

// Mostra snackbar
show(
context,
message: message,
backgroundColor: backgroundColor,
icon: icon,
duration: duration,
);
}
}
Loading
Loading