Skip to content

Commit

Permalink
get
Browse files Browse the repository at this point in the history
  • Loading branch information
manandharsudhir committed Jul 25, 2023
1 parent b20b8ab commit 81adcd5
Show file tree
Hide file tree
Showing 11 changed files with 172 additions and 47 deletions.
30 changes: 30 additions & 0 deletions lib/core/base_client.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import 'package:dio/dio.dart';

class BaseClient {
BaseClient._();
static BaseClient get instance => BaseClient._();
Dio dio = Dio(BaseOptions(
baseUrl: "https://api.nstack.in/",
connectTimeout: Duration(seconds: 30),
receiveTimeout: Duration(seconds: 30),
));

Future getData(
String path, {
Map<String, dynamic>? queryParameters,
Options? options,
}) async {
try {
final response = await dio.get(
path,
queryParameters: queryParameters,
options: options,
);
return response.data;
} on DioException catch (e) {
throw Exception(e.message);
} catch (e) {
rethrow;
}
}
}
24 changes: 18 additions & 6 deletions lib/features/homepage/model/todo_model.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,24 @@
import 'dart:convert';

class TodoModel {
String id;
String title;
String description;
bool isCompleted;
String id;

TodoModel(
{required this.isCompleted,
required this.id,
required this.description,
required this.title});
TodoModel({
required this.id,
required this.title,
required this.description,
required this.isCompleted,
});

factory TodoModel.fromJson(Map<String, dynamic> json) {
return TodoModel(
id: json["_id"],
title: json["title"],
description: json["description"],
isCompleted: json["is_completed"],
);
}
}
20 changes: 19 additions & 1 deletion lib/features/homepage/provider/todo_state.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,23 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:todoapp/features/homepage/model/todo_model.dart';
import 'package:todoapp/features/homepage/repo/todo_repo.dart';

class TodoProvider extends ChangeNotifier {
final Ref ref;
TodoProvider({required this.ref});
List<TodoModel> todoModel = [];

getTodo() async {
try {
final response = await ref.read(todoRepo).getTodo();
todoModel = response;
notifyListeners();
} catch (e) {
todoModel = [];
}
}

addTodo(TodoModel model) {
todoModel.add(model);
notifyListeners();
Expand All @@ -19,6 +32,11 @@ class TodoProvider extends ChangeNotifier {
title: todoModel[index].title);
notifyListeners();
}

deleteTodo(String id) {
todoModel.removeWhere((element) => element.id == id);
notifyListeners();
}
}

final todoProvider = ChangeNotifierProvider((ref) => TodoProvider());
final todoProvider = ChangeNotifierProvider((ref) => TodoProvider(ref: ref));
20 changes: 20 additions & 0 deletions lib/features/homepage/repo/todo_repo.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import 'package:dio/dio.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:todoapp/core/base_client.dart';
import 'package:todoapp/features/homepage/model/todo_model.dart';

class TodoRepo {
Future<List<TodoModel>> getTodo() async {
try {
final response = await BaseClient.instance.getData("v1/todos");
final List<TodoModel> data = (response["items"] as List)
.map((e) => TodoModel.fromJson(e))
.toList();
return data;
} catch (e) {
rethrow;
}
}
}

final todoRepo = Provider((ref) => TodoRepo());
30 changes: 22 additions & 8 deletions lib/features/homepage/view/screen/homepage.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:todoapp/features/addTodoPage/view/screen/add_todo_page.dart';
import 'package:todoapp/features/homepage/provider/todo_state.dart';
import 'package:todoapp/features/homepage/view/widgets/completed_todo.dart';
import 'package:todoapp/features/homepage/view/widgets/todo.dart';
import 'package:todoapp/features/homepage/view/widgets/todo_item_widget.dart';
Expand All @@ -17,10 +18,19 @@ class Homepage extends ConsumerStatefulWidget {
class _HomepageState extends ConsumerState<Homepage>
with SingleTickerProviderStateMixin {
late final tabController;
bool isLoading = false;

@override
void initState() {
tabController = TabController(length: 3, vsync: this);
setState(() {
isLoading = true;
});
ref.read(todoProvider).getTodo().then((_) {
setState(() {
isLoading = false;
});
});
super.initState();
}

Expand Down Expand Up @@ -55,13 +65,17 @@ class _HomepageState extends ConsumerState<Homepage>
},
child: Icon(Icons.add),
),
body: TabBarView(
children: [
AllTodoWidget(),
TodoWidget(),
CompletedTodoWidget(),
],
controller: tabController,
));
body: isLoading
? Center(
child: CircularProgressIndicator(),
)
: TabBarView(
children: [
AllTodoWidget(),
TodoWidget(),
CompletedTodoWidget(),
],
controller: tabController,
));
}
}
12 changes: 5 additions & 7 deletions lib/features/homepage/view/widgets/all_todo_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,11 @@ class AllTodoWidget extends ConsumerWidget {
itemCount: todo.todoModel.length,
itemBuilder: (context, index) {
return TodoItemWidget(
title: todo.todoModel[index].title,
description: todo.todoModel[index].description,
taskCompleted: todo.todoModel[index].isCompleted,
onChanged: (_) {
ref.read(todoProvider).completeTodo(todo.todoModel[index].id);
},
deleteFunction: (_) {});
title: todo.todoModel[index].title,
description: todo.todoModel[index].description,
taskCompleted: todo.todoModel[index].isCompleted,
id: todo.todoModel[index].id,
);
},
);
}
Expand Down
10 changes: 5 additions & 5 deletions lib/features/homepage/view/widgets/completed_todo.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@ class CompletedTodoWidget extends ConsumerWidget {
itemCount: todo.length,
itemBuilder: (context, index) {
return TodoItemWidget(
title: todo[index].title,
description: todo[index].description,
taskCompleted: todo[index].isCompleted,
onChanged: (_) {},
deleteFunction: (_) {});
title: todo[index].title,
description: todo[index].description,
taskCompleted: todo[index].isCompleted,
id: todo[index].id,
);
},
);
}
Expand Down
10 changes: 5 additions & 5 deletions lib/features/homepage/view/widgets/todo.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@ class TodoWidget extends ConsumerWidget {
itemCount: todo.length,
itemBuilder: (context, index) {
return TodoItemWidget(
title: todo[index].title,
description: todo[index].description,
taskCompleted: todo[index].isCompleted,
onChanged: (_) {},
deleteFunction: (_) {});
title: todo[index].title,
description: todo[index].description,
taskCompleted: todo[index].isCompleted,
id: todo[index].id,
);
},
);
}
Expand Down
45 changes: 30 additions & 15 deletions lib/features/homepage/view/widgets/todo_item_widget.dart
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:todoapp/features/homepage/provider/todo_state.dart';

class TodoItemWidget extends StatelessWidget {
class TodoItemWidget extends ConsumerWidget {
final String title;
final String description;
final bool taskCompleted;
Function(bool?)? onChanged;
Function(BuildContext)? deleteFunction;
final String id;

TodoItemWidget({
const TodoItemWidget({
super.key,
required this.title,
required this.description,
required this.taskCompleted,
required this.onChanged,
required this.deleteFunction,
required this.id,
});

@override
Widget build(BuildContext context) {
Widget build(BuildContext context, WidgetRef ref) {
return Container(
padding: EdgeInsets.all(24),
padding: const EdgeInsets.all(24),
decoration: BoxDecoration(
color: Theme.of(context).primaryColor,
borderRadius: BorderRadius.circular(12),
Expand Down Expand Up @@ -55,24 +55,39 @@ class TodoItemWidget extends StatelessWidget {
Visibility(
visible: !taskCompleted,
child: CircleAvatar(
backgroundColor: Colors.green,
child: IconButton(
onPressed: () {
onChanged!(true);
ref.read(todoProvider).completeTodo(id);
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
content: Text(
"Todo Completed Successfully",
),
backgroundColor: Colors.green,
));
},
icon: Icon(Icons.done),
icon: const Icon(Icons.done),
),
backgroundColor: Colors.green,
),
),
SizedBox(
const SizedBox(
width: 8,
),
CircleAvatar(
backgroundColor: Colors.red,
child: IconButton(
onPressed: () {},
icon: Icon(Icons.delete),
onPressed: () {
ref.read(todoProvider).deleteTodo(id);

ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
content: Text(
"Todo Deleted Successfully",
),
backgroundColor: Colors.red,
));
},
icon: const Icon(Icons.delete),
),
backgroundColor: Colors.red,
),
],
),
Expand Down
16 changes: 16 additions & 0 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.5"
dio:
dependency: "direct main"
description:
name: dio
sha256: "3866d67f93523161b643187af65f5ac08bc991a5bcdaf41a2d587fe4ccb49993"
url: "https://pub.dev"
source: hosted
version: "5.3.0"
fake_async:
dependency: transitive
description:
Expand Down Expand Up @@ -91,6 +99,14 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
http_parser:
dependency: transitive
description:
name: http_parser
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
url: "https://pub.dev"
source: hosted
version: "4.0.2"
js:
dependency: transitive
description:
Expand Down
2 changes: 2 additions & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ dependencies:
cupertino_icons: ^1.0.2
flutter_riverpod: ^2.3.6
uuid: ^3.0.7
dio: ^5.3.0

dev_dependencies:
flutter_test:
sdk: flutter
Expand Down

0 comments on commit 81adcd5

Please sign in to comment.