Skip to content

Commit

Permalink
In Orbit πŸ‘¨β€πŸš€
Browse files Browse the repository at this point in the history
  • Loading branch information
felipecastrosales committed Apr 21, 2021
2 parents f771015 + ef7ab35 commit d8ac5a8
Show file tree
Hide file tree
Showing 17 changed files with 349 additions and 59 deletions.
4 changes: 2 additions & 2 deletions README-pt.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
<h1 align="center">DevQuiz</h1>

- βœ… Liftoff πŸ’ͺ
- βœ… Maaximum Speed πŸƒβ€β™‚οΈ
- πŸ”„ In Orbit πŸ‘¨β€πŸš€
- βœ… Maximum Speed πŸƒβ€β™‚οΈ
- βœ… In Orbit πŸ‘¨β€πŸš€
- πŸ”„ Landing πŸ”₯
- πŸ”„ Surface Exploration ⚑
- πŸ”„ Acelerando sua Carreira πŸš€
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
<h1 align="center">DevQuiz</h1>

- βœ… Liftoff πŸ’ͺ
- βœ… Maaximum Speed πŸƒβ€β™‚οΈ
- πŸ”„ In Orbit πŸ‘¨β€πŸš€
- βœ… Maximum Speed πŸƒβ€β™‚οΈ
- βœ… In Orbit πŸ‘¨β€πŸš€
- πŸ”„ Landing πŸ”₯
- πŸ”„ Surface Exploration ⚑
- πŸ”„ Accelerating your Career πŸš€
Expand Down
30 changes: 30 additions & 0 deletions assets/database/quizzes.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
[
{
"title": "Flutter in NLW",
"image": "blocks",
"questionAnswered": 1,
"level": "easy",
"questions": [
{
"title": "You are liking Flutter?",
"answers": [
{"title": "Like"},
{"title": "Don't like"},
{"title": "+/-"},
{"title": "Flutter is sensational", "isRight": true}
]
}
],
"questions": [
{
"title": "You are liking Flutter?",
"answers": [
{"title": "Like"},
{"title": "Don't like"},
{"title": "+/-"},
{"title": "Flutter is sensational", "isRight": true}
]
}
]
}
]
5 changes: 5 additions & 0 deletions assets/database/user.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"name": "Felipe Sales",
"score": 75,
"photoUrl": "https://avatars.githubusercontent.com/u/59374587"
}
6 changes: 3 additions & 3 deletions lib/core/app_widget.dart
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import 'package:flutter/material.dart';

import 'package:devquiz/challenge/challenge_page.dart';
import 'package:devquiz/home/home_page.dart';
//import 'package:devquiz/challenge/challenge_page.dart';
// import 'package:devquiz/splash/splash_page.dart';
//import 'package:devquiz/home/home_page.dart';

class AppWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'DevQuiz',
debugShowCheckedModeBanner: false,
home: ChallengePage(),
home: HomePage(),
);
}
}
32 changes: 32 additions & 0 deletions lib/home/home_controller.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import 'package:flutter/foundation.dart';

import 'home_repository.dart';
import 'home_state.dart';
import 'package:devquiz/shared/models/quiz_model.dart';
import 'package:devquiz/shared/models/user_model.dart';

class HomeController {
ValueNotifier<HomeState> stateNotifier =
ValueNotifier<HomeState>(HomeState.empty);
set state(HomeState state) => stateNotifier.value = state;
HomeState get state => stateNotifier.value;

UserModel? user;
List<QuizModel>? quizzes;

final repository = HomeRepository();

void getUser() async {
state = HomeState.loading;
await Future.delayed(Duration(seconds: 2));
user = await repository.getUser();
state = HomeState.success;
}

void getQuizzes() async {
state = HomeState.loading;
await Future.delayed(Duration(seconds: 2));
quizzes = await repository.getQuizzes();
state = HomeState.success;
}
}
103 changes: 65 additions & 38 deletions lib/home/home_page.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
import 'package:flutter/material.dart';

import 'home_controller.dart';
import 'package:devquiz/core/core.dart';
import 'package:devquiz/home/widgets/appbar/app_bar_widget.dart';
import 'package:devquiz/home/widgets/quiz_card/quiz_card_widget.dart';
import 'package:devquiz/home/widgets/level_button/level_button_widget.dart';
import 'package:devquiz/home/widgets/quiz_card/quiz_card_widget.dart';

import 'home_state.dart';

class HomePage extends StatefulWidget {
HomePage({Key? key}) : super(key: key);
Expand All @@ -12,47 +16,70 @@ class HomePage extends StatefulWidget {
}

class _HomePageState extends State<HomePage> {
final controller = HomeController();
@override
void initState() {
super.initState();
controller.getUser();
controller.getQuizzes();
controller.stateNotifier.addListener(() {
setState(() {});
});
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBarWidget(),
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: Column(
children: [
SizedBox(
height: 32,
child: ListView(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
children: [
LevelButtonWidget(label: 'Easy'),
SizedBox(width: 10),
LevelButtonWidget(label: 'Middle'),
SizedBox(width: 10),
LevelButtonWidget(label: 'Hard'),
SizedBox(width: 10),
LevelButtonWidget(label: 'Expert'),
],
if (controller.state == HomeState.success) {
return Scaffold(
appBar: AppBarWidget(user: controller.user!),
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: Column(
children: [
SizedBox(
height: 32,
child: ListView(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
children: [
LevelButtonWidget(label: 'Easy'),
SizedBox(width: 10),
LevelButtonWidget(label: 'Middle'),
SizedBox(width: 10),
LevelButtonWidget(label: 'Hard'),
SizedBox(width: 10),
LevelButtonWidget(label: 'Expert'),
],
),
),
),
SizedBox(height: 20),
Expanded(
child: GridView.count(
crossAxisSpacing: 16,
mainAxisSpacing:16,
crossAxisCount: 2,
children: [
QuizCardWidget(),
QuizCardWidget(),
QuizCardWidget(),
QuizCardWidget(),
],
SizedBox(height: 20),
Expanded(
child: GridView.count(
crossAxisSpacing: 16,
mainAxisSpacing: 16,
crossAxisCount: 2,
children: controller.quizzes!.map(
(element) => QuizCardWidget(
title: element.title,
completed: '${element.questionAnswered}/${element.questions.length}',
percent: element.questionAnswered / element.questions.length,
),
)
.toList(),
),
),
),
],
],
),
),
);
} else {
return Scaffold(
body: Center(
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(AppColors.darkGreen),
),
),
),
);
);
}
}
}
22 changes: 22 additions & 0 deletions lib/home/home_repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import 'dart:convert';
import 'package:flutter/services.dart';

import 'package:devquiz/shared/models/quiz_model.dart';
import 'package:devquiz/shared/models/user_model.dart';

class HomeRepository {
Future<UserModel> getUser() async {
final response = await rootBundle
.loadString('assets/database/user.json');
final user = UserModel.fromJson(response);
return user;
}

Future<List<QuizModel>> getQuizzes() async {
final response = await rootBundle
.loadString('assets/database/quizzes.json');
final list = jsonDecode(response) as List;
final quizzes = list.map((element) => QuizModel.fromMap(element)).toList();
return quizzes;
}
}
1 change: 1 addition & 0 deletions lib/home/home_state.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
enum HomeState{ success, loading, error, empty }
9 changes: 6 additions & 3 deletions lib/home/widgets/appbar/app_bar_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ import 'package:flutter/material.dart';

import 'package:devquiz/core/core.dart';
import 'package:devquiz/home/widgets/score_card/score_card_widget.dart';
import 'package:devquiz/shared/models/user_model.dart';

class AppBarWidget extends PreferredSize {
AppBarWidget() : super(
final UserModel user;

AppBarWidget({required this.user}) : super(
preferredSize: Size.fromHeight(250),
child: Container(
height: 250,
Expand All @@ -26,7 +29,7 @@ class AppBarWidget extends PreferredSize {
style: AppTextStyles.title,
children: [
TextSpan(
text: 'Felipe Sales', style: AppTextStyles.titleBold
text: user.name, style: AppTextStyles.titleBold
),
],
),
Expand All @@ -37,7 +40,7 @@ class AppBarWidget extends PreferredSize {
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
image: DecorationImage(
image: NetworkImage('https://avatars.githubusercontent.com/u/59374587'),
image: NetworkImage(user.photoUrl),
fit: BoxFit.cover,
),
),
Expand Down
24 changes: 17 additions & 7 deletions lib/home/widgets/quiz_card/quiz_card_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,22 @@ import 'package:devquiz/core/core.dart';
import 'package:devquiz/shared/widgets/progress_indicator/progress_indicator_widget.dart';

class QuizCardWidget extends StatelessWidget {
const QuizCardWidget({Key? key}) : super(key: key);
final String title;
final String completed;
final double percent;

const QuizCardWidget({
Key? key,
required this.title,
required this.completed,
required this.percent
}) : super(key: key);

@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
border: Border.fromBorderSide(
BorderSide(color: AppColors.border)),
border: Border.fromBorderSide(BorderSide(color: AppColors.border)),
color: AppColors.white,
borderRadius: BorderRadius.circular(10),
),
Expand All @@ -26,15 +34,17 @@ class QuizCardWidget extends StatelessWidget {
child: Image.asset(AppImages.blocks),
),
SizedBox(height: 14),
Text('State \nManagement', style: AppTextStyles.heading15),
Text(title, style: AppTextStyles.heading15),
SizedBox(height: 14),
Row(
children: [
Expanded(
flex: 1, child: Text('3/10', style: AppTextStyles.body11),
flex: 1,
child: Text(completed, style: AppTextStyles.body11),
),
Expanded(
flex: 4, child: ProgressIndicatorWidget(value: 0.3),
flex: 4,
child: ProgressIndicatorWidget(value: percent),
),
],
),
Expand All @@ -43,4 +53,4 @@ class QuizCardWidget extends StatelessWidget {
),
);
}
}
}
6 changes: 3 additions & 3 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';

import 'package:devquiz/challenge/challenge_page.dart';
import 'package:devquiz/home/home_page.dart';
//import 'package:devquiz/challenge/challenge_page.dart';
// import 'package:devquiz/splash/splash_page.dart';
//import 'package:devquiz/home/home_page.dart';

void main() {
runApp(MyApp());
Expand All @@ -14,7 +14,7 @@ class MyApp extends StatelessWidget {
return MaterialApp(
title: 'DevQuiz',
debugShowCheckedModeBanner: false,
home: ChallengePage(),
home: HomePage(),
);
}
}
28 changes: 28 additions & 0 deletions lib/shared/models/answer_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import 'dart:convert';

class AnswerModel {
final String title;
final bool isRight;

AnswerModel({required this.title, this.isRight = false});

Map<String, dynamic> toMap() {
return {
'title': title,
'isRight': isRight,
};
}

factory AnswerModel.fromMap(Map<String, dynamic> map) {
return AnswerModel(
title: map['title'],
isRight: map['isRight'] ?? false,
);
}

String toJson() => json.encode(toMap());

factory AnswerModel.fromJson(String source) =>
AnswerModel.fromMap(json.decode(source));
}

Loading

0 comments on commit d8ac5a8

Please sign in to comment.