diff --git a/lib/blocs/truth_or_dare/truth_or_dare_bloc.dart b/lib/blocs/truth_or_dare/truth_or_dare_bloc.dart index ad4023b..173c62f 100644 --- a/lib/blocs/truth_or_dare/truth_or_dare_bloc.dart +++ b/lib/blocs/truth_or_dare/truth_or_dare_bloc.dart @@ -26,21 +26,24 @@ class TruthOrDareBloc extends Bloc { } } - Stream _getDareToState(TruthOrDareEvent event) async*{ + Stream _getDareToState(GetDare event) async*{ yield TodLoading(); try{ - DareModel dareModel=await truthRepository.getRandomDare(); - yield DareLoaded(dareModel: dareModel); + int selectedLevel=event.selectedLevel; + DareModel dareModel=await truthRepository.getRandomDare(selectedLevel: selectedLevel); + yield DareLoaded(dareModel: dareModel,selectedLevel: selectedLevel); }catch(e){ yield TodError(errMessage: e.toString()??"An error occured",isTruth: false); } } - Stream _getTruthToState(TruthOrDareEvent event) async*{ + Stream _getTruthToState(GetTruth event) async*{ yield TodLoading(); try{ - TruthModel truthModel=await truthRepository.getRandomTruth(); - yield TruthLoaded(truthModel: truthModel); + int selectedLevel=event.selectedLevel; + TruthModel truthModel=await truthRepository.getRandomTruth(selectedLevel: selectedLevel); + print(truthModel); + yield TruthLoaded(truthModel: truthModel,selectedLevel: selectedLevel); }catch(e){ yield TodError(errMessage: e.toString()??"An error occured",isTruth: true); } diff --git a/lib/blocs/truth_or_dare/truth_or_dare_event.dart b/lib/blocs/truth_or_dare/truth_or_dare_event.dart index c20caff..be42fc5 100644 --- a/lib/blocs/truth_or_dare/truth_or_dare_event.dart +++ b/lib/blocs/truth_or_dare/truth_or_dare_event.dart @@ -6,10 +6,18 @@ abstract class TruthOrDareEvent extends Equatable { List get props => []; } class GetTruth extends TruthOrDareEvent{ + final int selectedLevel; + GetTruth({this.selectedLevel=-1}); + @override + List get props => [selectedLevel]; } class GetDare extends TruthOrDareEvent{ + final int selectedLevel; + GetDare({this.selectedLevel=-1}); + @override + List get props => [selectedLevel]; } class SubmitTruthOrDare extends TruthOrDareEvent{ diff --git a/lib/blocs/truth_or_dare/truth_or_dare_state.dart b/lib/blocs/truth_or_dare/truth_or_dare_state.dart index 32ef6a9..3f37a4c 100644 --- a/lib/blocs/truth_or_dare/truth_or_dare_state.dart +++ b/lib/blocs/truth_or_dare/truth_or_dare_state.dart @@ -11,14 +11,15 @@ class TodLoading extends TruthOrDareState{} class TruthLoaded extends TruthOrDareState{ final TruthModel truthModel; - TruthLoaded({this.truthModel}); + final int selectedLevel; + TruthLoaded({this.truthModel,this.selectedLevel=-1}); @override List get props => [truthModel]; } class DareLoaded extends TruthOrDareState{ final DareModel dareModel; - - DareLoaded({this.dareModel, }); + final int selectedLevel; + DareLoaded({this.dareModel,this.selectedLevel=-1 }); @override List get props => [dareModel]; } diff --git a/lib/constants/Lists.dart b/lib/constants/Lists.dart new file mode 100644 index 0000000..2fbc70b --- /dev/null +++ b/lib/constants/Lists.dart @@ -0,0 +1 @@ +const List level=['easy','medium','hard']; \ No newline at end of file diff --git a/lib/repositories/truth_repository.dart b/lib/repositories/truth_repository.dart index e70a213..0531d53 100644 --- a/lib/repositories/truth_repository.dart +++ b/lib/repositories/truth_repository.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:dio/dio.dart'; import 'package:truthordare/config/url.dart'; +import 'package:truthordare/constants/Lists.dart'; import 'package:truthordare/model/DareModel.dart'; import 'package:truthordare/model/TruthModel.dart'; import 'package:truthordare/model/UserDareModel.dart'; @@ -10,10 +11,14 @@ import 'package:truthordare/screen/truth_or_dare/user_truth.dart'; import 'package:truthordare/utilities/http.dart'; class TruthOrDareRepository{ - Future getRandomTruth() async{ + Future getRandomTruth({int selectedLevel=-1}) async{ try{ + String levelSelected=""; + if(selectedLevel> -1){ + levelSelected=level[selectedLevel]; + } Response response = await dio.get( - '$baseUrl/truth/random', + '$baseUrl/truth/random?level=$levelSelected', ); final dynamic data = response.data; final TruthModel record = truthModelFromJson(jsonEncode(data)); @@ -22,10 +27,14 @@ class TruthOrDareRepository{ throw Exception(e); } } - Future getRandomDare() async{ + Future getRandomDare({int selectedLevel=-1}) async{ try{ + String levelSelected=""; + if(selectedLevel> -1){ + levelSelected=level[selectedLevel]; + } Response response = await dio.get( - '$baseUrl/dare/random', + '$baseUrl/dare/random?level=$levelSelected', ); final dynamic data = response.data; final DareModel record = dareModelFromJson(jsonEncode(data)); diff --git a/lib/screen/truth_or_dare/home.dart b/lib/screen/truth_or_dare/home.dart index 38ea09d..ed95ff6 100644 --- a/lib/screen/truth_or_dare/home.dart +++ b/lib/screen/truth_or_dare/home.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:truthordare/blocs/truth_or_dare/truth_or_dare_bloc.dart'; +import 'package:truthordare/constants/Lists.dart'; import 'package:truthordare/service_locator.dart'; import 'package:truthordare/constants/Colors.dart'; import 'package:truthordare/constants/Dictionary.dart'; @@ -11,7 +12,7 @@ class Home extends StatelessWidget { @override Widget build(BuildContext context) { return BlocProvider( - create: (context) => sl()..add(GetDare()), + create: (context) => sl()..add(GetTruth()), child: Scaffold( appBar: AppBar( elevation: 0, @@ -36,7 +37,10 @@ class Home extends StatelessWidget { ), Container( margin: const EdgeInsets.only(left: 15.0), - child: Text(state.errMessage.split(Dictionary.exeption).last,style: TextStyle(color: Colors.white),), + child: Text( + state.errMessage.split(Dictionary.exeption).last, + style: TextStyle(color: Colors.white), + ), ) ], ), @@ -44,19 +48,20 @@ class Home extends StatelessWidget { label: "Try again", textColor: Colors.white, onPressed: () { - if(state.isTruth){ - BlocProvider.of(context).add(GetTruth()); - }else{ - BlocProvider.of(context).add(GetDare()); + if (state.isTruth) { + BlocProvider.of(context) + .add(GetTruth()); + } else { + BlocProvider.of(context) + .add(GetDare()); } - }))); } }, builder: (context, state) => SingleChildScrollView( child: Container( child: Column( - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( height: MediaQuery.of(context).size.height * 0.25, @@ -67,7 +72,7 @@ class Home extends StatelessWidget { overflow: Overflow.visible, children: [ Container( - height: 100, + height: 90, width: MediaQuery.of(context).size.width, ), Positioned( @@ -77,71 +82,130 @@ class Home extends StatelessWidget { width: MediaQuery.of(context).size.width, child: Card( shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10) - ), + borderRadius: BorderRadius.circular(10)), elevation: 2, child: Container( padding: EdgeInsets.all(10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - state is TodLoading - ? buildShimmer(context) - : Text( - state is DareLoaded - ? "${capitalize(state.dareModel.results.level)} Dare" - : state is TruthLoaded - ? "${capitalize(state.truthModel.results.level)} Truth" - : "", + child: (state is TruthLoaded && + state.truthModel.results == null) || + (state is DareLoaded && + state.dareModel.results == null) + ? Column( + children: [ + Icon(Icons.dangerous,size: 50,color: ColorBase.kPrimaryColor,), + Text( + "Tidak ada Truth or Dare untuk level yang dipilih", style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold), + textAlign: TextAlign.center, ), - SizedBox( - height: 10, - ), - Container( - decoration: BoxDecoration( - color: ColorBase.blue, - borderRadius: BorderRadius.circular(10)), - width: MediaQuery.of(context).size.width, - padding: EdgeInsets.all(20), - child: Column(children: [ - state is TodLoading - ? buildShimmer(context) - : Text( - state is DareLoaded - ? state.dareModel.results.dare - : state is TruthLoaded - ? state.truthModel.results - .truth - : "", - style: TextStyle( - fontSize: 24, - color: Colors.white), - ), - - ]), - ), - SizedBox(height: 10,), - Text("Dikirim oleh ${state is DareLoaded - ? state.dareModel.results.user.username - : state is TruthLoaded - ? state.truthModel.results - .user.username - : ""}",style: TextStyle(fontSize: 14,color: Colors.grey),textAlign: TextAlign.end,) - ], - ), + ], + ) + : Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + state is TodLoading + ? buildShimmer(context) + : Text( + state is DareLoaded + ? "${capitalize(state.dareModel.results.level)} Dare" + : state is TruthLoaded + ? "${capitalize(state.truthModel.results.level)} Truth" + : "", + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold), + ), + SizedBox( + height: 10, + ), + Container( + decoration: BoxDecoration( + color: ColorBase.blue, + borderRadius: + BorderRadius.circular(10)), + width: + MediaQuery.of(context).size.width, + padding: EdgeInsets.all(20), + child: Column(children: [ + state is TodLoading + ? buildShimmer(context) + : Text( + state is DareLoaded + ? state.dareModel.results + .dare + : state is TruthLoaded + ? state.truthModel + .results.truth + : "", + style: TextStyle( + fontSize: 24, + color: Colors.white), + ), + ]), + ), + SizedBox( + height: 10, + ), + Text( + "Dikirim oleh ${state is DareLoaded ? state.dareModel.results.user.username : state is TruthLoaded ? state.truthModel.results.user.username : ""}", + style: TextStyle( + fontSize: 14, color: Colors.grey), + textAlign: TextAlign.end, + ) + ], + ), ), ), ), ) ], ), - SizedBox( - height: 20, - ), - buildButtonBar(context) + state is TruthLoaded || state is DareLoaded + ? Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Wrap( + direction: Axis.horizontal, + spacing: 10, + children: level.map((e) { + return ChoiceChip( + label: Text(capitalize(e)), + selected: state is TruthLoaded + ? state.selectedLevel == level.indexOf(e) + : state is DareLoaded + ? state.selectedLevel == level.indexOf(e) + : false, + onSelected: (value) { + if (state is TruthLoaded) { + if (state.selectedLevel == level.indexOf(e)) { + BlocProvider.of(context) + .add(GetTruth(selectedLevel: -1)); + } else { + BlocProvider.of(context) + .add(GetTruth( + selectedLevel: level.indexOf(e))); + } + } else if (state is DareLoaded) { + if (state.selectedLevel == level.indexOf(e)) { + BlocProvider.of(context) + .add(GetDare(selectedLevel: -1)); + } else { + BlocProvider.of(context) + .add(GetDare( + selectedLevel: level.indexOf(e))); + } + } + }, + ); + }).toList(), + ), + ) + : SizedBox( + height: 10, + ), + buildButtonBar(context,state) ], ), ), @@ -159,7 +223,7 @@ class Home extends StatelessWidget { highlightColor: Colors.grey[100]); } - Widget buildButtonBar(context) { + Widget buildButtonBar(context,state) { return Container( padding: EdgeInsets.all(10), child: Column( @@ -172,13 +236,24 @@ class Home extends StatelessWidget { onPressed: () { BlocProvider.of(context).add(GetTruth()); }, - child: Text( - "Truth", - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 18, - color: Colors.white), - textAlign: TextAlign.center, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + state is TruthLoaded?Row( + children: [ + Icon(Icons.check_circle,color: Colors.white,), + SizedBox(width: 10,), + ], + ):SizedBox(), + Text( + "Truth", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + color: Colors.white), + textAlign: TextAlign.center, + ), + ], ), ), ), @@ -193,13 +268,24 @@ class Home extends StatelessWidget { onPressed: () { BlocProvider.of(context).add(GetDare()); }, - child: Text( - "Dare", - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 18, - color: ColorBase.kPrimaryColor), - textAlign: TextAlign.center, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + state is DareLoaded?Row( + children: [ + Icon(Icons.check_circle,color: ColorBase.kPrimaryColor,), + SizedBox(width: 10,), + ], + ):SizedBox(), + Text( + "Dare", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + color: ColorBase.kPrimaryColor), + textAlign: TextAlign.center, + ), + ], ), ), ),