diff --git a/.firebase/hosting.YnVpbGQvd2Vi.cache b/.firebase/hosting.YnVpbGQvd2Vi.cache new file mode 100644 index 0000000..385e5e0 --- /dev/null +++ b/.firebase/hosting.YnVpbGQvd2Vi.cache @@ -0,0 +1,30 @@ +version.json,1728152850417,c1bac6fe7ab58112f718045c20deb1a41dcf19a02e1020238244536dc09630db +manifest.json,1728148290215,67da68067b8ef9736b01012f3e02ac0ffe18e854a173106067660c100bd028a7 +main.dart.js,1728152746244,39e365cbeff6588ba11f731b39b97fa331896bdb2343f6f0db180e65ff3eeb4d +index.html,1728152850342,6da82dc58c7cb08e9d162a5b55899c1988b5da7219b120a1bcabac9715c87f1a +flutter_service_worker.js,1728152851620,745d91485ff3a7bb91fb49b25f4c34e27836fd9bca9216ef8cbde5ac1f7e1916 +flutter_bootstrap.js,1728152850321,7eafde75445215b267b9f2a5441df057de193861ded038fa85768363a5fb813c +flutter.js,1726052018000,bdfafe4aa16419c55e07170cdaf2d56664b5fdc0fa1648424c760308f944d79e +favicon.png,1711641864000,c023e85c356b33452a71456926b38343b06e82352785091f9bc4debc68956529 +icons/Icon-maskable-512.png,1727438901368,acb883dcd1c47b0c08d93b9f838459a0a14957b1f044f759310893e89557a5e1 +icons/Icon-maskable-192.png,1727438901374,1c3ba0c948915ce01efa0bcb9c9b22dffc63f30df9ff6c3288531c5209a86908 +icons/Icon-512.png,1711641864000,db4e589fa57af5d94440c1679ae7b9248d82ddd3002614cf473439d0728d868f +icons/Icon-192.png,1711641864000,84c73fff6a50c2573b3a7d2e09b2d55c628db625c8ca61c632a0add7028d2926 +canvaskit/skwasm.worker.js,1726052388000,c4b4bf79e49758d9b00d8a2b2af62a979d81b39de63d002f6c3594ba5bf5ec1d +canvaskit/skwasm.wasm,1726052388000,05686833202a9678427941106855591f5b780b26e27818f2a0d6c1af9960edb0 +canvaskit/skwasm.js.symbols,1726052388000,ad83528321bd031071beb3550339d01a52ac2ad1acbcd619772b6fded14be998 +canvaskit/skwasm.js,1726052388000,76d591512f312d38b06612a78e1f9e3202c0b0c846e283de2f3d63b5702e485d +canvaskit/canvaskit.wasm,1726052300000,af636e6f5af32b8b9e62b046816b3eca81b1b9999a67d80ae099c70b4b1e4dd9 +canvaskit/canvaskit.js.symbols,1726052298000,5f87146e29704d54f88cdf0e189addbf3290e06398d50c7153f88818f6568c61 +canvaskit/canvaskit.js,1726052300000,38aedc9a9048bdfbebd0ae4763a5af2ff4742e604be7b696a4853e8f1e970ca9 +canvaskit/chromium/canvaskit.wasm,1726052322000,24d416b2e80cfd7dfc34f3ee638188bab54b0d715457855b8b9303e2e895d541 +canvaskit/chromium/canvaskit.js.symbols,1726052320000,ef0ef5073c624f5b469e8d9e6ed3d396cc53278ccc8811254da69a1cb9cc9695 +canvaskit/chromium/canvaskit.js,1726052322000,c1dfde8615b48e2da75dae236a80b2fec444ece6337809d0e69b0ee0acbf9efc +assets/NOTICES,1728152850497,e2fb89d9e3c06e6fff8787ff981b24b14a470683a2c9e17a5f20a1603ee0b0d4 +assets/FontManifest.json,1728152850496,0059f68c5df6acbe6f7c2fafc04f5538ef1c9dcb981103d7d174f3ea480baea1 +assets/AssetManifest.json,1728152850496,36e074b6e48903e8e343f7d8a0b9e61d9569825ff8f1d91f4623d28b9d015c67 +assets/AssetManifest.bin.json,1728152850496,c38971830625185f3782eb1f7932d9589bc2ffa0bf1d9c397fff6f7137524ea2 +assets/AssetManifest.bin,1728152850496,b3ea7e0cb98ab8b876acb6c1b86b443771b7ab60115cd83a3c02ee086a7a9462 +assets/shaders/ink_sparkle.frag,1728152850600,c1bf2e040de157dc910cb5f6d0106a2ffe939bbe1ee6beac13fe9ccc25f0db67 +assets/fonts/MaterialIcons-Regular.otf,1728152851312,14e106167a63e32f4c0eebe8d25104abe6de0883ede3cca6dead0fd44ad6570c +assets/assets/events.json,1728152406496,9fa3ae9353ab652383912b4540c4cdef51cc224edc5474acef39615af9a45450 diff --git a/assets/agenda.json b/assets/agenda.json new file mode 100644 index 0000000..151ed65 --- /dev/null +++ b/assets/agenda.json @@ -0,0 +1,63 @@ +{ + "events": [ + { + "speaker": "Filipe Barroso", + "title": "O que é Flutter?", + "description": "Nesta apresentação vai ser feita uma introdução ao Flutter e como ele funciona. O que o distingue de outras tecnologias.", + "time": "2024-10-12T10:00:00Z", + "type_id":"1" + }, + { + "title": "Pausa", + "description": "Pausa para um cafézinho", + "time": "2024-10-12T10:45:00Z", + "type_id":"0" + }, + { + "speaker": "Filipe Barroso", + "title": "Flutter para Iniciantes", + "description": "Nesta apresentação vai ser uma introdução ao Flutter para iniciantes. Com a apresentação dos Widgets mais comuns", + "time": "2024-10-12T11:00:00Z", + "type_id":"1" + } , + { + "speaker": "Mentores Flutter Portugal", + "title": "Oficina de Instalação de Flutter", + "description": "Será-te dado instruções como instalar o Flutter na tua máquina, com o apoio de um mentor.", + "time": "2024-10-12T12:00:00Z", + "type_id":"1" + }, + { + "title": "Almoço", + "description": "Pausa para almoço", + "time": "2024-10-12T13:00:00Z", + "type_id":"0" + }, + { + "speaker": "Mentores Flutter Portugal", + "title": "Oficina Individualizada & Contribuições Código Aberto a Fogos.pt", + "description": "Nesta oficina terás a oportunidade de ter uma primeira experiência prática com Flutter, tanto poderás contribuir para um simples código base ou contribuir para o Fogos.pt", + "time": "2024-10-12T14:00:00Z", + "type_id":"1" + }, + { + "title": "Pausa", + "description": "Pausa para um cafézinho", + "time": "2024-10-12T10:45:00Z", + "type_id":"0" + }, +{ + "speaker": "Mentores Flutter Portugal", + "title": "(Cont.) Oficina Individualizada & Contribuições Código Aberto a Fogos.pt", + "description": "Nesta oficina terás a oportunidade de ter uma primeira experiência prática com Flutter, tanto poderás contribuir para um simples código base ou contribuir para o Fogos.pt", + "time": "2024-10-12T14:00:00Z", + "type_id":"1" + }, + { + "title": "Fim", + "description": "Fim da Oficina", + "time": "2024-10-12T17:45:00Z", + "type_id":"0" + } + ] + } \ No newline at end of file diff --git a/assets/events.json b/assets/events.json deleted file mode 100644 index 4f302e0..0000000 --- a/assets/events.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "events": [ - { - "speaker": "Filipe Barroso", - "title": "O que é Flutter?", - "description": "Nesta apresentação vai ser uma introdução ao Flutter e como ele funciona", - "time": "2024-10-12T10:00:00Z" - }, - { - "speaker": "???", - "title": "TBA", - "description": "Por anunciar", - "time": "2024-10-12T11:00:00Z" - } , - { - "speaker": "", - "title": "Almoço", - "description": "Pausa para o almoço", - "time": "2024-10-12T12:00:00Z" - }, - { - "speaker": "Flutter Portugal", - "title": "Oficina de Flutter", - "description": "Será-te dado instruções como desenvolver uma aplicação com Flutter, com o apoio de um mentor.", - "time": "2024-10-12T13:00:00Z" - }, - { - "speaker": "Flutter Portugal", - "title": "Contribuições Fogos V2", - "description": "Já estás mais confiante com o Flutter? Então que tal contribuir para o Fogos V2?", - "time": "2024-10-12T13:00:00Z" - } - ] - } \ No newline at end of file diff --git a/firebase.json b/firebase.json index b9c1ce9..6603732 100644 --- a/firebase.json +++ b/firebase.json @@ -1,6 +1,6 @@ { "hosting": { - "public": "web", + "public": "build/web", "ignore": [ "firebase.json", "**/.*", diff --git a/lib/app.dart b/lib/app.dart index f797097..31447bd 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -8,7 +8,7 @@ class MainApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, - theme: ThemeData.dark(), + theme: ThemeData.light(), home: const AgendaPage(), ); } diff --git a/lib/features/agenda/application/agenda_controller_cubit.dart b/lib/features/agenda/application/agenda_controller_cubit.dart index 50fd945..45fe93f 100644 --- a/lib/features/agenda/application/agenda_controller_cubit.dart +++ b/lib/features/agenda/application/agenda_controller_cubit.dart @@ -3,15 +3,15 @@ import 'package:flutter_portugal_scheduler/features/agenda/application/agenda_co import 'package:flutter_portugal_scheduler/features/agenda/data/events_repository.dart'; class AgendaControllerCubit extends Cubit { - final EventsRepository _eventsRepository; + final AgendaRepository _eventsRepository; AgendaControllerCubit({ - required EventsRepository eventsRepository, + required AgendaRepository eventsRepository, }) : _eventsRepository = eventsRepository, - super(AgendaControllerState(events: null)); + super(AgendaControllerState(agenda: null)); Future loadEvents() async { - final events = await _eventsRepository.loadEvents(); - emit(state.copyWith(events: events)); + final events = await _eventsRepository.loadAgenda(); + emit(state.copyWith(agenda: events)); } } diff --git a/lib/features/agenda/application/agenda_controller_state.dart b/lib/features/agenda/application/agenda_controller_state.dart index c63ca21..1ff2f43 100644 --- a/lib/features/agenda/application/agenda_controller_state.dart +++ b/lib/features/agenda/application/agenda_controller_state.dart @@ -1,11 +1,11 @@ import 'package:dart_mappable/dart_mappable.dart'; -import 'package:flutter_portugal_scheduler/features/agenda/domain/data.dart'; +import 'package:flutter_portugal_scheduler/features/agenda/domain/agenda_base_value.dart'; part 'agenda_controller_state.mapper.dart'; @MappableClass() final class AgendaControllerState with AgendaControllerStateMappable { - final Events? events; + final List? agenda; - AgendaControllerState({required this.events}); + AgendaControllerState({required this.agenda}); } diff --git a/lib/features/agenda/application/agenda_controller_state.mapper.dart b/lib/features/agenda/application/agenda_controller_state.mapper.dart index b67884c..0a17982 100644 --- a/lib/features/agenda/application/agenda_controller_state.mapper.dart +++ b/lib/features/agenda/application/agenda_controller_state.mapper.dart @@ -14,7 +14,6 @@ class AgendaControllerStateMapper static AgendaControllerStateMapper ensureInitialized() { if (_instance == null) { MapperContainer.globals.use(_instance = AgendaControllerStateMapper._()); - EventsMapper.ensureInitialized(); } return _instance!; } @@ -22,17 +21,17 @@ class AgendaControllerStateMapper @override final String id = 'AgendaControllerState'; - static Events? _$events(AgendaControllerState v) => v.events; - static const Field _f$events = - Field('events', _$events); + static List? _$agenda(AgendaControllerState v) => v.agenda; + static const Field> _f$agenda = + Field('agenda', _$agenda); @override final MappableFields fields = const { - #events: _f$events, + #agenda: _f$agenda, }; static AgendaControllerState _instantiate(DecodingData data) { - return AgendaControllerState(events: data.dec(_f$events)); + return AgendaControllerState(agenda: data.dec(_f$agenda)); } @override @@ -92,8 +91,9 @@ abstract class AgendaControllerStateCopyWith< $R, $In extends AgendaControllerState, $Out> implements ClassCopyWith<$R, $In, $Out> { - EventsCopyWith<$R, Events, Events>? get events; - $R call({Events? events}); + ListCopyWith<$R, AgendaBaseValue, + ObjectCopyWith<$R, AgendaBaseValue, AgendaBaseValue>>? get agenda; + $R call({List? agenda}); AgendaControllerStateCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>( Then<$Out2, $R2> t); } @@ -107,14 +107,18 @@ class _AgendaControllerStateCopyWithImpl<$R, $Out> late final ClassMapperBase $mapper = AgendaControllerStateMapper.ensureInitialized(); @override - EventsCopyWith<$R, Events, Events>? get events => - $value.events?.copyWith.$chain((v) => call(events: v)); + ListCopyWith<$R, AgendaBaseValue, + ObjectCopyWith<$R, AgendaBaseValue, AgendaBaseValue>>? + get agenda => $value.agenda != null + ? ListCopyWith($value.agenda!, + (v, t) => ObjectCopyWith(v, $identity, t), (v) => call(agenda: v)) + : null; @override - $R call({Object? events = $none}) => - $apply(FieldCopyWithData({if (events != $none) #events: events})); + $R call({Object? agenda = $none}) => + $apply(FieldCopyWithData({if (agenda != $none) #agenda: agenda})); @override AgendaControllerState $make(CopyWithData data) => - AgendaControllerState(events: data.get(#events, or: $value.events)); + AgendaControllerState(agenda: data.get(#agenda, or: $value.agenda)); @override AgendaControllerStateCopyWith<$R2, AgendaControllerState, $Out2> diff --git a/lib/features/agenda/data/events_repository.dart b/lib/features/agenda/data/events_repository.dart index 8bfd193..1b82259 100644 --- a/lib/features/agenda/data/events_repository.dart +++ b/lib/features/agenda/data/events_repository.dart @@ -1,17 +1,36 @@ import 'package:flutter/services.dart'; -import 'package:flutter_portugal_scheduler/features/agenda/domain/data.dart'; +import 'package:flutter_portugal_scheduler/features/agenda/domain/agenda_base_value.dart'; +import 'package:flutter_portugal_scheduler/features/agenda/domain/events.dart'; +import 'package:intl/intl.dart'; -class EventsRepository { - Future loadEvents() async { +class AgendaRepository { + Future> loadAgenda() async { final json = await _loadJson(); final events = EventsMapper.fromJson(json); - return events; + + return events.events.map((event) { + final dateFormat = DateFormat('HH:mm'); + return switch (event.typeId) { + 0 => AgendaBreakValue( + title: event.title, + description: event.description, + time: dateFormat.format(event.time), + ), + 1 => AgendaTalkValue( + title: event.title, + description: event.description, + time: dateFormat.format(event.time), + speaker: event.speaker, + ), + _ => throw Exception('Invalid event type'), + }; + }).toList(); } } // New method to load JSON from a file Future _loadJson() async { final String response = - await rootBundle.loadString('assets/events.json'); // Load JSON file + await rootBundle.loadString('assets/agenda.json'); // Load JSON file return response; // Decode JSON } diff --git a/lib/features/agenda/domain/agenda_base_value.dart b/lib/features/agenda/domain/agenda_base_value.dart new file mode 100644 index 0000000..2f03c45 --- /dev/null +++ b/lib/features/agenda/domain/agenda_base_value.dart @@ -0,0 +1,34 @@ +/// Base class for all events in the agenda +sealed class AgendaBaseValue { + final String title; + final String description; + final String time; + + AgendaBaseValue({ + required this.title, + required this.description, + required this.time, + }); +} + +/// A break in the agenda +class AgendaBreakValue extends AgendaBaseValue { + AgendaBreakValue({ + required super.title, + required super.description, + required super.time, + }); +} + +/// A talk in the agenda +class AgendaTalkValue extends AgendaBaseValue { + final String speaker; + + AgendaTalkValue({ + String? speaker, + required super.title, + required super.description, + required super.time, + }) : assert(speaker != null, 'Speaker is required'), + speaker = speaker ?? 'Unknown'; +} diff --git a/lib/features/agenda/domain/data.dart b/lib/features/agenda/domain/events.dart similarity index 82% rename from lib/features/agenda/domain/data.dart rename to lib/features/agenda/domain/events.dart index 17b89b9..c03b23a 100644 --- a/lib/features/agenda/domain/data.dart +++ b/lib/features/agenda/domain/events.dart @@ -2,7 +2,7 @@ import 'package:dart_mappable/dart_mappable.dart'; // Will be generated by dart_mappable -part 'data.mapper.dart'; +part 'events.mapper.dart'; /// Any class that is mapped from JSON must extend `JsonMappable` /// @@ -17,15 +17,18 @@ class Events with EventsMappable { @MappableClass() class Event with EventMappable { - final String speaker; + final String? speaker; final String description; final String title; final DateTime time; + @MappableField(key: 'type_id') + final int typeId; Event({ required this.speaker, required this.description, required this.title, required this.time, + required this.typeId, }); } diff --git a/lib/features/agenda/domain/data.mapper.dart b/lib/features/agenda/domain/events.mapper.dart similarity index 89% rename from lib/features/agenda/domain/data.mapper.dart rename to lib/features/agenda/domain/events.mapper.dart index a0f8ad0..91afc43 100644 --- a/lib/features/agenda/domain/data.mapper.dart +++ b/lib/features/agenda/domain/events.mapper.dart @@ -4,7 +4,7 @@ // ignore_for_file: unused_element, unnecessary_cast, override_on_non_overriding_member // ignore_for_file: strict_raw_type, inference_failure_on_untyped_parameter -part of 'data.dart'; +part of 'events.dart'; class EventsMapper extends ClassMapperBase { EventsMapper._(); @@ -120,7 +120,7 @@ class EventMapper extends ClassMapperBase { @override final String id = 'Event'; - static String _$speaker(Event v) => v.speaker; + static String? _$speaker(Event v) => v.speaker; static const Field _f$speaker = Field('speaker', _$speaker); static String _$description(Event v) => v.description; static const Field _f$description = @@ -129,6 +129,9 @@ class EventMapper extends ClassMapperBase { static const Field _f$title = Field('title', _$title); static DateTime _$time(Event v) => v.time; static const Field _f$time = Field('time', _$time); + static int _$typeId(Event v) => v.typeId; + static const Field _f$typeId = + Field('typeId', _$typeId, key: 'type_id'); @override final MappableFields fields = const { @@ -136,6 +139,7 @@ class EventMapper extends ClassMapperBase { #description: _f$description, #title: _f$title, #time: _f$time, + #typeId: _f$typeId, }; static Event _instantiate(DecodingData data) { @@ -143,7 +147,8 @@ class EventMapper extends ClassMapperBase { speaker: data.dec(_f$speaker), description: data.dec(_f$description), title: data.dec(_f$title), - time: data.dec(_f$time)); + time: data.dec(_f$time), + typeId: data.dec(_f$typeId)); } @override @@ -193,7 +198,11 @@ extension EventValueCopy<$R, $Out> on ObjectCopyWith<$R, Event, $Out> { abstract class EventCopyWith<$R, $In extends Event, $Out> implements ClassCopyWith<$R, $In, $Out> { $R call( - {String? speaker, String? description, String? title, DateTime? time}); + {String? speaker, + String? description, + String? title, + DateTime? time, + int? typeId}); EventCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t); } @@ -205,22 +214,25 @@ class _EventCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, Event, $Out> late final ClassMapperBase $mapper = EventMapper.ensureInitialized(); @override $R call( - {String? speaker, + {Object? speaker = $none, String? description, String? title, - DateTime? time}) => + DateTime? time, + int? typeId}) => $apply(FieldCopyWithData({ - if (speaker != null) #speaker: speaker, + if (speaker != $none) #speaker: speaker, if (description != null) #description: description, if (title != null) #title: title, - if (time != null) #time: time + if (time != null) #time: time, + if (typeId != null) #typeId: typeId })); @override Event $make(CopyWithData data) => Event( speaker: data.get(#speaker, or: $value.speaker), description: data.get(#description, or: $value.description), title: data.get(#title, or: $value.title), - time: data.get(#time, or: $value.time)); + time: data.get(#time, or: $value.time), + typeId: data.get(#typeId, or: $value.typeId)); @override EventCopyWith<$R2, Event, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t) => diff --git a/lib/features/agenda/presentation/agenda_list_view.dart b/lib/features/agenda/presentation/agenda_list_view.dart index 84f64a3..892fc6d 100644 --- a/lib/features/agenda/presentation/agenda_list_view.dart +++ b/lib/features/agenda/presentation/agenda_list_view.dart @@ -3,7 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_portugal_scheduler/features/agenda/application/agenda_controller_cubit.dart'; import 'package:flutter_portugal_scheduler/features/agenda/application/agenda_controller_state.dart'; import 'package:flutter_portugal_scheduler/features/agenda/data/events_repository.dart'; -import 'package:intl/intl.dart'; +import 'package:flutter_portugal_scheduler/features/agenda/domain/agenda_base_value.dart'; class AgendaListView extends StatelessWidget { const AgendaListView({super.key}); @@ -11,39 +11,61 @@ class AgendaListView extends StatelessWidget { @override Widget build(BuildContext context) { return BlocBuilder( - bloc: AgendaControllerCubit(eventsRepository: EventsRepository()) + bloc: AgendaControllerCubit(eventsRepository: AgendaRepository()) ..loadEvents(), builder: (context, state) { - if (state.events == null) { + if (state.agenda == null) { return const Center( child: Text('No events'), ); } - return ListView.builder( - itemCount: state.events?.events.length ?? 0, - itemBuilder: (context, index) { - String formattedTime = - DateFormat('HH:mm').format(state.events!.events[index].time); + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: ListView.builder( + itemCount: state.agenda?.length ?? 0, + itemBuilder: (context, index) { + final agendaItem = state.agenda![index]; - return ListTile( - leading: Text( - formattedTime, - style: Theme.of(context).textTheme.displayMedium, - ), - subtitle: Text( - state.events!.events[index].description, - style: Theme.of(context).textTheme.labelLarge, - ), - title: Text( - state.events!.events[index].title, - style: Theme.of(context).textTheme.titleLarge, - ), - trailing: Text( - state.events!.events[index].speaker, - style: Theme.of(context).textTheme.labelLarge, - ), - ); - }, + return switch (agendaItem) { + // TALK + AgendaTalkValue(speaker: _) => ListTile( + tileColor: Theme.of(context).colorScheme.primaryContainer, + leading: Text( + agendaItem.time, + style: Theme.of(context).textTheme.displayMedium, + ), + subtitle: Text( + agendaItem.description, + style: Theme.of(context).textTheme.labelLarge, + ), + title: Text( + agendaItem.title, + style: Theme.of(context).textTheme.titleLarge, + ), + trailing: Text( + agendaItem.speaker, + style: Theme.of(context).textTheme.labelLarge, + ), + ), + + // BREAK + AgendaBreakValue() => ListTile( + leading: Text( + agendaItem.time, + style: Theme.of(context).textTheme.displayMedium, + ), + subtitle: Text( + agendaItem.description, + style: Theme.of(context).textTheme.labelLarge, + ), + title: Text( + agendaItem.title, + style: Theme.of(context).textTheme.titleLarge, + ), + ), + }; + }, + ), ); }, ); diff --git a/lib/features/agenda/presentation/agenda_page.dart b/lib/features/agenda/presentation/agenda_page.dart index b8bab55..6699227 100644 --- a/lib/features/agenda/presentation/agenda_page.dart +++ b/lib/features/agenda/presentation/agenda_page.dart @@ -8,7 +8,10 @@ class AgendaPage extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text('Flutter Portugal Agenda'), + title: Text( + 'Flutter Portugal Agenda', + style: Theme.of(context).textTheme.displayLarge, + ), ), body: const AgendaListView(), ); diff --git a/pubspec.yaml b/pubspec.yaml index d3f9be1..b533aff 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,4 +23,4 @@ dev_dependencies: flutter: uses-material-design: true assets: - - assets/events.json + - assets/agenda.json