refactor(architecture): centralize bloc files into dedicated folder

This commit is contained in:
anhtunz
2025-01-05 18:56:39 +07:00
parent fb12c44505
commit c2c685da86
37 changed files with 87 additions and 87 deletions

View File

@@ -2,7 +2,7 @@
import 'package:dropdown_button2/dropdown_button2.dart';
import 'package:flutter/material.dart';
import 'group_detail_bloc.dart';
import '../../../bloc/group_detail_bloc.dart';
import '../../../product/constant/icon/icon_constants.dart';
import '../../../product/services/language_services.dart';

View File

@@ -1,118 +0,0 @@
// ignore_for_file: use_build_context_synchronously
import 'dart:async';
import 'dart:convert';
import 'package:flutter/widgets.dart';
import '../../devices/device_model.dart';
import '../../../product/base/bloc/base_bloc.dart';
import '../../../product/services/api_services.dart';
import '../../../product/services/language_services.dart';
import '../../../product/utils/response_status_utils.dart';
import 'group_detail_model.dart';
class DetailGroupBloc extends BlocBase {
APIServices apiServices = APIServices();
final detailGroup = StreamController<GroupDetail>.broadcast();
StreamSink<GroupDetail> get sinkDetailGroup => detailGroup.sink;
Stream<GroupDetail> get streamDetailGroup => detailGroup.stream;
final warningDevice = StreamController<List<DeviceOfGroup>>.broadcast();
StreamSink<List<DeviceOfGroup>> get sinkWarningDevice => warningDevice.sink;
Stream<List<DeviceOfGroup>> get streamWarningDevice => warningDevice.stream;
final message = StreamController<String>.broadcast();
StreamSink<String> get sinkMessage => message.sink;
Stream<String> get streamMessage => message.stream;
@override
void dispose() {}
Future<void> getGroupDetail(String groupID) async {
final body = await apiServices.getGroupDetail(groupID);
final data = jsonDecode(body);
List<DeviceOfGroup> warningDevices = [];
if (data != null) {
GroupDetail group = GroupDetail.fromJson(data);
sinkDetailGroup.add(group);
if (group.devices != null) {
for (var device in group.devices!) {
if (device.state == 1) {
warningDevices.add(device);
}
}
sinkWarningDevice.add(warningDevices);
}
}
}
Future<void> approveUserToGroup(BuildContext context, String groupID,
String userID, String userName) async {
Map<String, dynamic> body = {"group_id": groupID, "user_id": userID};
int statusCode = await apiServices.approveGroup(body);
showSnackBarResponseByStatusCode(context, statusCode,
"Đã duyệt $userName vào nhóm!", "Duyệt $userName thất bại!");
}
Future<void> deleteOrUnapproveUser(BuildContext context, String groupID,
String userID, String userName) async {
int statusCode = await apiServices.deleteUserInGroup(groupID, userID);
showSnackBarResponseByStatusCode(context, statusCode,
"Đã xóa người dùng $userName", "Xóa người dùng $userName thất bại");
}
Future<void> deleteDevice(BuildContext context, String groupID,
String thingID, String deviceName) async {
int statusCode = await apiServices.deleteDeviceInGroup(groupID, thingID);
showSnackBarResponseByStatusCode(context, statusCode,
"Đã xóa thiết bị $deviceName", "Xóa thiết bị $deviceName thất bại");
}
Future<void> leaveGroup(
BuildContext context, String groupID, String userID) async {
int statusCode = await apiServices.deleteUserInGroup(groupID, userID);
showSnackBarResponseByStatusCode(
context,
statusCode,
appLocalization(context).notification_leave_group_success,
appLocalization(context).notification_leave_group_failed);
}
Future<void> updateDeviceNameInGroup(
BuildContext context, String thingID, String newAlias) async {
Map<String, dynamic> body = {"thing_id": thingID, "alias": newAlias};
int statusCode = await apiServices.updateDeviceAlias(body);
showSnackBarResponseByStatusCode(
context,
statusCode,
appLocalization(context).notification_update_device_success,
appLocalization(context).notification_update_device_failed,
);
}
Future<List<Device>> getOwnerDevices() async {
List<Device> allDevices = [];
String body = await apiServices.getOwnerDevices();
if (body != "") {
final data = jsonDecode(body);
List<dynamic> items = data['items'];
allDevices = Device.fromJsonDynamicList(items);
}
return allDevices;
}
Future<void> addDeviceToGroup(
BuildContext context, String groupID, String thingID) async {
Map<String, dynamic> body = {
"thing_id": thingID,
};
int statusCode = await apiServices.addDeviceToGroup(groupID, body);
showSnackBarResponseByStatusCode(
context,
statusCode,
appLocalization(context).notification_add_device_success,
appLocalization(context).notification_add_device_failed,
);
}
}

View File

@@ -1,7 +1,7 @@
// ignore_for_file: use_build_context_synchronously
import 'package:flutter/material.dart';
import 'group_detail_bloc.dart';
import '../../../bloc/group_detail_bloc.dart';
import 'group_detail_model.dart';
import '../../../product/base/bloc/base_bloc.dart';
import '../../../product/constant/app/app_constants.dart';

View File

@@ -5,7 +5,7 @@ import 'package:go_router/go_router.dart';
import '../../../product/constant/enums/app_route_enums.dart';
import 'groups_model.dart';
import '../inter_family_bloc.dart';
import '../../../bloc/inter_family_bloc.dart';
import '../inter_family_widget.dart';
import '../../../product/base/bloc/base_bloc.dart';
import '../../../product/constant/app/app_constants.dart';

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:qr_flutter/qr_flutter.dart';
import '../inter_family_bloc.dart';
import '../../../bloc/inter_family_bloc.dart';
import '../../../product/constant/icon/icon_constants.dart';
import '../../../product/extention/context_extention.dart';
import '../../../product/services/language_services.dart';

View File

@@ -1,119 +0,0 @@
// ignore_for_file: use_build_context_synchronously
import 'dart:async';
import 'dart:convert';
import 'dart:developer';
import 'package:flutter/material.dart';
import '../../product/constant/app/app_constants.dart';
import '../../product/services/api_services.dart';
import '../../product/base/bloc/base_bloc.dart';
import '../../product/services/language_services.dart';
import '../../product/utils/response_status_utils.dart';
import 'groups/groups_model.dart';
class InterFamilyBloc extends BlocBase {
APIServices apiServices = APIServices();
final isLoading = StreamController<bool>.broadcast();
StreamSink<bool> get sinkIsLoading => isLoading.sink;
Stream<bool> get streamIsLoading => isLoading.stream;
final titleScreen = StreamController<String>.broadcast();
StreamSink<String> get sinkTitleScreen => titleScreen.sink;
Stream<String> get streamTitleScreen => titleScreen.stream;
final selectedScreen = StreamController<int>.broadcast();
StreamSink<int> get sinkSelectedScreen => selectedScreen.sink;
Stream<int> get streamSelectedScreen => selectedScreen.stream;
final currentGroups = StreamController<List<Group>>.broadcast();
StreamSink<List<Group>> get sinkCurrentGroups => currentGroups.sink;
Stream<List<Group>> get streamCurrentGroups => currentGroups.stream;
@override
void dispose() {}
void getAllGroup(String role) async {
List<Group> groups = [];
sinkCurrentGroups.add(groups);
final body = await apiServices.getAllGroups();
if (body.isNotEmpty) {
final data = jsonDecode(body);
List<dynamic> items = data["items"];
groups = Group.fromJsonDynamicList(items);
groups = sortGroupByName(groups);
List<Group> currentGroups = groups.where(
(group) {
bool isPublic = group.visibility == "PUBLIC";
if (role == ApplicationConstants.OWNER_GROUP) {
return group.isOwner == true && isPublic;
}
if (role == ApplicationConstants.PARTICIPANT_GROUP) {
return group.isOwner == null && isPublic;
}
return false;
},
).toList();
sinkCurrentGroups.add(currentGroups);
} else {
log("Get groups from API failed");
}
log("Inter Family Role: $role");
}
Future<void> createGroup(
BuildContext context, String name, String description) async {
APIServices apiServices = APIServices();
Map<String, dynamic> body = {"name": name, "description": description};
int? statusCode = await apiServices.createGroup(body);
showSnackBarResponseByStatusCode(
context,
statusCode,
appLocalization(context).notification_add_group_success,
appLocalization(context).notification_add_group_failed);
}
Future<void> changeGroupInfomation(BuildContext context, String groupID,
String name, String description) async {
Map<String, dynamic> body = {"name": name, "description": description};
int statusCode = await apiServices.updateGroup(body, groupID);
showSnackBarResponseByStatusCode(
context,
statusCode,
appLocalization(context).notification_update_group_success,
appLocalization(context).notification_update_group_failed);
}
Future<void> joinGroup(BuildContext context, String groupID) async {
Map<String, dynamic> body = {
"group_id": groupID,
};
int statusCode = await apiServices.joinGroup(groupID, body);
showSnackBarResponseByStatusCode(
context,
statusCode,
appLocalization(context).notification_join_request_group_success,
appLocalization(context).notification_join_request_group_failed);
}
Future<void> deleteGroup(BuildContext context, String groupID) async {
int statusCode = await apiServices.deleteGroup(groupID);
showSnackBarResponseByStatusCode(
context,
statusCode,
appLocalization(context).notification_delete_group_success,
appLocalization(context).notification_delete_group_failed);
}
List<Group> sortGroupByName(List<Group> groups) {
return groups..sort((a, b) => (a.name ?? '').compareTo(b.name ?? ''));
}
}

View File

@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'groups/groups_screen.dart';
import 'inter_family_bloc.dart';
import '../../bloc/inter_family_bloc.dart';
import 'inter_family_widget.dart';
import '../../product/base/bloc/base_bloc.dart';
import '../../product/constant/app/app_constants.dart';

View File

@@ -1,7 +1,7 @@
// ignore_for_file: use_build_context_synchronously
import 'package:flutter/material.dart';
import 'inter_family_bloc.dart';
import '../../bloc/inter_family_bloc.dart';
import '../../product/constant/icon/icon_constants.dart';
import '../../product/services/language_services.dart';
import '../../product/utils/qr_utils.dart';