diff --git a/lib/Pages/Program/bloc_program/program_bloc.dart b/lib/Pages/Program/bloc_program/program_bloc.dart index 8ed762bb8ef6040342c68c6e7f7e4102179912ab..5fe3d476526ce8ef3048edec0c45284ff366e31b 100644 --- a/lib/Pages/Program/bloc_program/program_bloc.dart +++ b/lib/Pages/Program/bloc_program/program_bloc.dart @@ -3,9 +3,11 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; +import 'package:home_industry/Pages/Program/model/program.dart'; import 'package:home_industry/Pages/Program/repositories/program_repository.dart'; import 'package:stream_transform/stream_transform.dart'; +import '../program_page.dart'; import './bloc.dart'; class ProgramBloc extends Bloc<ProgramEvent, ProgramState> { @@ -63,16 +65,16 @@ class ProgramBloc extends Bloc<ProgramEvent, ProgramState> { final programs = await programRepository.fetchProgram(page: currentState.page + 1); if (currentState is ListProgramsLoaded || currentState is InitialListProgramState) { - programs.results.sort((a,b) => b.endDateTime.compareTo(a.endDateTime)); + final sort = sortPrograms(programs.results); yield ListProgramsSortedLoaded( - programs: programs.results, + programs: sort, hasReachedMax: programs.next == null, page: currentState.page + 1); return; } else if (currentState is ListProgramsSortedLoaded) { - programs.results.sort((a,b) => b.endDateTime.compareTo(a.endDateTime)); + final sort = sortPrograms(programs.results); yield ListProgramsSortedLoaded( - programs: currentState.programs + programs.results, + programs: currentState.programs + sort, hasReachedMax: programs.next == null, page: currentState.page + 1); return; @@ -97,3 +99,24 @@ class ProgramBloc extends Bloc<ProgramEvent, ProgramState> { ); } } + +List<Program> sortPrograms(List programs) { + final programFinished = []; + final programInProgress = []; + final programNotStarted = []; + for (var i = 0; i < programs.length; i++) { + final program = programs.elementAt(i); + if (program.endDateTime != null && + program.endDateTime. + compareTo(CustomizableDateTime.current) < 1) { + programFinished.add(program); + } else if (program.startDateTime != null && + CustomizableDateTime.current. + compareTo(program.startDateTime) < 1) { + programNotStarted.add(program); + } else { + programInProgress.add(program); + } + } + return [...programNotStarted, ...programInProgress, ...programFinished]; +} diff --git a/lib/Pages/Program/program_page.dart b/lib/Pages/Program/program_page.dart index 399f1ef3be29ef72b375a895aa5b115c05f5c9e3..b55c85079eeb110193de1e9db3220b8fd742fb8e 100644 --- a/lib/Pages/Program/program_page.dart +++ b/lib/Pages/Program/program_page.dart @@ -381,12 +381,7 @@ class _ProgramDescription extends StatelessWidget { fontSize: 16, ), ), - if ( program.endDateTime != null && - program.endDateTime.compareTo(CustomizableDateTime.current) < 1) - const Text( - 'Selesai', - style: TextStyle(fontWeight: FontWeight.bold), - ) + statusText() ]), ), Expanded( @@ -398,6 +393,28 @@ class _ProgramDescription extends StatelessWidget { ], )); } + + Widget statusText() { + if (program.startDateTime != null && + CustomizableDateTime.current.compareTo(program.startDateTime) < 1) { + return const Text( + 'Belum Mulai', + style: TextStyle(fontWeight: FontWeight.bold), + ); + } + else if ( program.endDateTime != null && + program.endDateTime.compareTo(CustomizableDateTime.current) < 1) { + return const Text( + 'Selesai', + style: TextStyle(fontWeight: FontWeight.bold), + ); + } else { + return const Text( + 'Dalam Progress', + style: TextStyle(fontWeight: FontWeight.bold), + ); + } + } } class _DonasiButton extends StatelessWidget { @@ -429,7 +446,7 @@ class _DonasiButton extends StatelessWidget { class FilterButton extends StatelessWidget { final String sort; - FilterButton({Key key, @required this.sort}) + const FilterButton({Key key, @required this.sort}) : assert(sort != null), super(key: key); diff --git a/test/program_page_test.dart b/test/program_page_test.dart index dba0d01cfb990468fd632adf6a035574baa9d5c1..23720e494fe50b92b9268e592e5a0dd6a9fbc181 100644 --- a/test/program_page_test.dart +++ b/test/program_page_test.dart @@ -32,6 +32,7 @@ void main() { Program programFinished; Program programNotFinished; Program program; + Program programNotStarted; setUpAll(() async { Intl.defaultLocale = 'id'; @@ -39,7 +40,7 @@ void main() { }); setUp(() { - program = programFinished = Program( + program = Program( id: 'yha', name: 'Rumah Belajar', description: 'Belajar Komputer', @@ -78,10 +79,23 @@ void main() { totalDonationAmount: '0', speaker: 'Sherlock Holmes', posterImage: null); + programNotStarted = Program( + id: 'yha', + name: 'Rumah Belajar', + description: 'Belajar Komputer', + startDateTime: DateTime.parse('2021-07-20 20:18:04'), + endDateTime: DateTime.parse('2021-10-20 20:18:04'), + location: 'Rumah saya', + code: '123', + openDonation: true, + programMinutes: null, + totalDonationAmount: '0', + speaker: 'Sherlock Holmes', + posterImage: null); listProgram = ListProgram(count: 1, next: null, previous: null, results: [program]); listProgramWithDate = - ListProgram(count: 1, next: null, previous: null, results: [programNotFinished, programFinished]); + ListProgram(count: 1, next: null, previous: null, results: [programNotFinished, programFinished, programNotStarted]); dio = DioMock(); dependenciesRepositories = DependenciesRepositories(dio: dio); widgetTested = MaterialApp( @@ -90,6 +104,11 @@ void main() { value: dependenciesRepositories, child: Programs())); }); + test('sort program function', () { + var sortedProgram = sortPrograms(listProgramWithDate.results); + expect(sortedProgram.elementAt(0), listProgramWithDate.results.elementAt(2)); + }); + testWidgets('Load one program', (WidgetTester tester) async { when(dio.get(urlProgram, queryParameters: queryParamProgram)).thenAnswer( (_) async => Response<Map<dynamic, dynamic>>( @@ -114,8 +133,12 @@ void main() { expect(find.text('Status'), findsOneWidget); expect(find.text('Tanggal'), findsOneWidget); await tester.tap(find.text('Status')); + await tester.pump(Duration(seconds: 5)); + expect(find.byType(CustomCircularIndicator), findsOneWidget); + await tester.pump(Duration(seconds: 5)); expect(find.text('Selesai'), findsOneWidget); - + expect(find.text('Belum Mulai'), findsOneWidget); + expect(find.text('Dalam Progress'), findsOneWidget); }); testWidgets('Load programs by date', (WidgetTester tester) async {