refactor(architecture): centralize bloc files into dedicated folder
This commit is contained in:
@@ -1,18 +0,0 @@
|
||||
import 'dart:async';
|
||||
import '../../../../product/base/bloc/base_bloc.dart';
|
||||
|
||||
class LoginBloc extends BlocBase{
|
||||
|
||||
final loginRequest = StreamController<Map<String,dynamic>>.broadcast();
|
||||
StreamSink<Map<String,dynamic>> get sinkLoginRequest => loginRequest.sink;
|
||||
Stream<Map<String,dynamic>> get streamLoginRequest => loginRequest.stream;
|
||||
|
||||
final isShowPassword = StreamController<bool>.broadcast();
|
||||
StreamSink<bool> get sinkIsShowPassword => isShowPassword.sink;
|
||||
Stream<bool> get streamIsShowPassword => isShowPassword.stream;
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
}
|
||||
|
||||
}
|
||||
@@ -16,7 +16,7 @@ import '../../../../product/constant/icon/icon_constants.dart';
|
||||
import '../../../../product/extention/context_extention.dart';
|
||||
import '../../../../product/constant/image/image_constants.dart';
|
||||
import '../../../../product/services/language_services.dart';
|
||||
import '../bloc/login_bloc.dart';
|
||||
import '../../../../bloc/login_bloc.dart';
|
||||
import '../../../../product/base/bloc/base_bloc.dart';
|
||||
import '../../../../product/shared/shared_background.dart';
|
||||
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
import 'dart:async';
|
||||
|
||||
import '../../product/base/bloc/base_bloc.dart';
|
||||
import 'bell_model.dart';
|
||||
|
||||
class BellBloc extends BlocBase {
|
||||
|
||||
final bellItems = StreamController<List<BellItems>>.broadcast();
|
||||
StreamSink<List<BellItems>> get sinkBellItems => bellItems.sink;
|
||||
Stream<List<BellItems>> get streamBellItems => bellItems.stream;
|
||||
|
||||
final isLoading = StreamController<bool>.broadcast();
|
||||
StreamSink<bool> get sinkIsLoading => isLoading.sink;
|
||||
Stream<bool> get streamIsLoading => isLoading.stream;
|
||||
|
||||
final hasMore = StreamController<bool>.broadcast();
|
||||
StreamSink<bool> get sinkHasMore => hasMore.sink;
|
||||
Stream<bool> get streamHasMore => hasMore.stream;
|
||||
|
||||
@override
|
||||
void dispose() {}
|
||||
}
|
||||
@@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
|
||||
import '../../product/extention/context_extention.dart';
|
||||
import '../../product/services/language_services.dart';
|
||||
import '../../product/constant/enums/app_theme_enums.dart';
|
||||
import 'bell_bloc.dart';
|
||||
import '../../bloc/bell_bloc.dart';
|
||||
import '../../product/base/bloc/base_bloc.dart';
|
||||
import '../../product/services/api_services.dart';
|
||||
import 'bell_model.dart';
|
||||
|
||||
@@ -1,82 +0,0 @@
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:sfm_app/feature/devices/device_model.dart';
|
||||
import 'package:sfm_app/product/base/bloc/base_bloc.dart';
|
||||
import 'package:sfm_app/product/services/api_services.dart';
|
||||
import 'package:sfm_app/product/utils/date_time_utils.dart';
|
||||
|
||||
import '../../product/utils/device_utils.dart';
|
||||
import 'device_logs_model.dart';
|
||||
|
||||
class DeviceLogsBloc extends BlocBase {
|
||||
APIServices apiServices = APIServices();
|
||||
final fromDate = StreamController<String>.broadcast();
|
||||
StreamSink<String> get sinkFromDate => fromDate.sink;
|
||||
Stream<String> get streamFromDate => fromDate.stream;
|
||||
|
||||
final hasMore = StreamController<bool>.broadcast();
|
||||
StreamSink<bool> get sinkHasMore => hasMore.sink;
|
||||
Stream<bool> get streamHasMore => hasMore.stream;
|
||||
|
||||
final allDevices = StreamController<List<Device>>.broadcast();
|
||||
StreamSink<List<Device>> get sinkAllDevices => allDevices.sink;
|
||||
Stream<List<Device>> get streamAllDevices => allDevices.stream;
|
||||
|
||||
final sensors = StreamController<List<SensorLogs>>.broadcast();
|
||||
StreamSink<List<SensorLogs>> get sinkSensors => sensors.sink;
|
||||
Stream<List<SensorLogs>> get streamSensors => sensors.stream;
|
||||
|
||||
@override
|
||||
void dispose() {}
|
||||
|
||||
void getAllDevices() async {
|
||||
String body = await apiServices.getOwnerDevices();
|
||||
if (body != "") {
|
||||
final data = jsonDecode(body);
|
||||
List<dynamic> items = data['items'];
|
||||
List<Device> originalDevices = Device.fromJsonDynamicList(items);
|
||||
List<Device> devices =
|
||||
DeviceUtils.instance.sortDeviceByState(originalDevices);
|
||||
sinkAllDevices.add(devices);
|
||||
}
|
||||
}
|
||||
|
||||
void getDeviceLogByThingID(
|
||||
int offset,
|
||||
String thingID,
|
||||
DateTime fromDate,
|
||||
List<SensorLogs> sensors,
|
||||
) async {
|
||||
log("SensorLength: ${sensors.length}");
|
||||
String fromDateString =
|
||||
DateTimeUtils.instance.formatDateTimeToString(fromDate);
|
||||
String now = DateTimeUtils.instance.formatDateTimeToString(DateTime.now());
|
||||
// List<SensorLogs> sensors = [];
|
||||
Map<String, dynamic> params = {
|
||||
'thing_id': thingID,
|
||||
'from': fromDateString,
|
||||
'to': now,
|
||||
'limit': '30',
|
||||
"offset": offset.toString(),
|
||||
"asc": "true"
|
||||
};
|
||||
final body = await apiServices.getLogsOfDevice(thingID, params);
|
||||
if (body != "") {
|
||||
final data = jsonDecode(body);
|
||||
DeviceLog devicesListLog = DeviceLog.fromJson(data);
|
||||
if (devicesListLog.sensors!.isEmpty) {
|
||||
bool hasMore = false;
|
||||
sinkHasMore.add(hasMore);
|
||||
}
|
||||
if (devicesListLog.sensors!.isNotEmpty) {
|
||||
for (var sensor in devicesListLog.sensors!) {
|
||||
sensors.add(sensor);
|
||||
}
|
||||
}
|
||||
|
||||
sinkSensors.add(sensors);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'widgets/tag_widget.dart';
|
||||
import '../devices/device_model.dart';
|
||||
import 'device_logs_bloc.dart';
|
||||
import '../../bloc/device_logs_bloc.dart';
|
||||
import '../../product/constant/icon/icon_constants.dart';
|
||||
import '../../product/extention/context_extention.dart';
|
||||
import '../../product/services/language_services.dart';
|
||||
|
||||
@@ -1,111 +0,0 @@
|
||||
// ignore_for_file: use_build_context_synchronously
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
||||
import 'package:sfm_app/product/services/api_services.dart';
|
||||
import 'package:sfm_app/product/utils/device_utils.dart';
|
||||
|
||||
import '../../../product/utils/date_time_utils.dart';
|
||||
import '../../device_log/device_logs_model.dart';
|
||||
import '../device_model.dart';
|
||||
|
||||
import '../../../product/base/bloc/base_bloc.dart';
|
||||
|
||||
class DetailDeviceBloc extends BlocBase {
|
||||
APIServices apiServices = APIServices();
|
||||
|
||||
final deviceInfo = StreamController<Device>.broadcast();
|
||||
StreamSink<Device> get sinkDeviceInfo => deviceInfo.sink;
|
||||
Stream<Device> get streamDeviceInfo => deviceInfo.stream;
|
||||
|
||||
final deviceSensor = StreamController<Map<String, dynamic>>.broadcast();
|
||||
StreamSink<Map<String, dynamic>> get sinkDeviceSensor => deviceSensor.sink;
|
||||
Stream<Map<String, dynamic>> get streamDeviceSensor => deviceSensor.stream;
|
||||
|
||||
final deviceLocation = StreamController<String>.broadcast();
|
||||
StreamSink<String> get sinkDeviceLocation => deviceLocation.sink;
|
||||
Stream<String> get streamDeviceLocation => deviceLocation.stream;
|
||||
|
||||
final sensorTemps = StreamController<List<SensorLogs>>.broadcast();
|
||||
StreamSink<List<SensorLogs>> get sinkSensorTemps => sensorTemps.sink;
|
||||
Stream<List<SensorLogs>> get streamSensorTemps => sensorTemps.stream;
|
||||
|
||||
@override
|
||||
void dispose() {}
|
||||
|
||||
void getDeviceDetail(
|
||||
BuildContext context,
|
||||
String thingID,
|
||||
Completer<GoogleMapController> controller,
|
||||
) async {
|
||||
String body = await apiServices.getDeviceInfomation(thingID);
|
||||
if (body != "") {
|
||||
final data = jsonDecode(body);
|
||||
Device device = Device.fromJson(data);
|
||||
sinkDeviceInfo.add(device);
|
||||
if (device.areaPath != null) {
|
||||
String fullLocation = await DeviceUtils.instance
|
||||
.getFullDeviceLocation(context, device.areaPath!);
|
||||
log("Location: $fullLocation");
|
||||
sinkDeviceLocation.add(fullLocation);
|
||||
}
|
||||
Map<String, dynamic> sensorMap = {};
|
||||
if (device.status!.sensors != null) {
|
||||
sensorMap = DeviceUtils.instance
|
||||
.getDeviceSensors(context, device.status!.sensors!);
|
||||
} else {
|
||||
sensorMap = DeviceUtils.instance.getDeviceSensors(context, []);
|
||||
}
|
||||
sinkDeviceSensor.add(sensorMap);
|
||||
if (device.settings!.latitude! != "" &&
|
||||
device.settings!.longitude! != "") {
|
||||
final CameraPosition cameraPosition = CameraPosition(
|
||||
target: LatLng(
|
||||
double.parse(device.settings!.latitude!),
|
||||
double.parse(device.settings!.longitude!),
|
||||
),
|
||||
zoom: 13,
|
||||
);
|
||||
final GoogleMapController mapController = await controller.future;
|
||||
mapController
|
||||
.animateCamera(CameraUpdate.newCameraPosition(cameraPosition));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void findLocation(BuildContext context, String areaPath) async {
|
||||
String fullLocation =
|
||||
await DeviceUtils.instance.getFullDeviceLocation(context, areaPath);
|
||||
sinkDeviceLocation.add(fullLocation);
|
||||
}
|
||||
|
||||
void getNearerSensorValue(String thingID) async {
|
||||
List<SensorLogs> sensorTemps = [];
|
||||
DateTime twoDaysAgo = DateTime.now().subtract(const Duration(days: 2));
|
||||
String from = DateTimeUtils.instance.formatDateTimeToString(twoDaysAgo);
|
||||
String now = DateTimeUtils.instance.formatDateTimeToString(DateTime.now());
|
||||
Map<String, dynamic> params = {
|
||||
'thing_id': thingID,
|
||||
'from': from,
|
||||
'to': now,
|
||||
'limit': '100',
|
||||
'n': '7',
|
||||
};
|
||||
final body = await apiServices.getLogsOfDevice(thingID, params);
|
||||
if (body != "") {
|
||||
final data = jsonDecode(body);
|
||||
DeviceLog devicesListLog = DeviceLog.fromJson(data);
|
||||
if (devicesListLog.sensors!.isNotEmpty) {
|
||||
for (var sensor in devicesListLog.sensors!) {
|
||||
sensorTemps.add(sensor);
|
||||
}
|
||||
sensorTemps = sensorTemps.reversed.toList();
|
||||
sinkSensorTemps.add(sensorTemps);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -14,7 +14,7 @@ import '../../../product/services/language_services.dart';
|
||||
import '../../../product/utils/device_utils.dart';
|
||||
|
||||
import '../../../product/constant/icon/icon_constants.dart';
|
||||
import 'device_detail_bloc.dart';
|
||||
import '../../../bloc/device_detail_bloc.dart';
|
||||
|
||||
class DetailDeviceScreen extends StatefulWidget {
|
||||
const DetailDeviceScreen({super.key, required this.thingID});
|
||||
|
||||
@@ -1,255 +0,0 @@
|
||||
// ignore_for_file: use_build_context_synchronously
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import '../../../product/services/api_services.dart';
|
||||
import '../../../product/services/language_services.dart';
|
||||
import '../../../product/shared/model/ward_model.dart';
|
||||
import '../../../product/utils/response_status_utils.dart';
|
||||
|
||||
import '../../../product/shared/model/district_model.dart';
|
||||
import '../../../product/shared/model/province_model.dart';
|
||||
import '../device_model.dart';
|
||||
import '../../../product/base/bloc/base_bloc.dart';
|
||||
|
||||
class DeviceUpdateBloc extends BlocBase {
|
||||
APIServices apiServices = APIServices();
|
||||
|
||||
final deviceInfo = StreamController<Device>.broadcast();
|
||||
StreamSink<Device> get sinkDeviceInfo => deviceInfo.sink;
|
||||
Stream<Device> get streamDeviceInfo => deviceInfo.stream;
|
||||
|
||||
// DeviceUpdateScreen
|
||||
final isChanged = StreamController<bool>.broadcast();
|
||||
StreamSink<bool> get sinkIsChanged => isChanged.sink;
|
||||
Stream<bool> get streamIsChanged => isChanged.stream;
|
||||
|
||||
final provinceData = StreamController<Map<String, String>>.broadcast();
|
||||
StreamSink<Map<String, String>> get sinkProvinceData => provinceData.sink;
|
||||
Stream<Map<String, String>> get streamProvinceData => provinceData.stream;
|
||||
|
||||
final listProvinces =
|
||||
StreamController<List<DropdownMenuItem<Province>>>.broadcast();
|
||||
StreamSink<List<DropdownMenuItem<Province>>> get sinkListProvinces =>
|
||||
listProvinces.sink;
|
||||
Stream<List<DropdownMenuItem<Province>>> get streamListProvinces =>
|
||||
listProvinces.stream;
|
||||
|
||||
final districtData = StreamController<Map<String, String>>.broadcast();
|
||||
StreamSink<Map<String, String>> get sinkDistrictData => districtData.sink;
|
||||
Stream<Map<String, String>> get streamDistrictData => districtData.stream;
|
||||
|
||||
final listDistricts =
|
||||
StreamController<List<DropdownMenuItem<District>>>.broadcast();
|
||||
StreamSink<List<DropdownMenuItem<District>>> get sinkListDistricts =>
|
||||
listDistricts.sink;
|
||||
Stream<List<DropdownMenuItem<District>>> get streamListDistricts =>
|
||||
listDistricts.stream;
|
||||
|
||||
final wardData = StreamController<Map<String, String>>.broadcast();
|
||||
StreamSink<Map<String, String>> get sinkWardData => wardData.sink;
|
||||
Stream<Map<String, String>> get streamWardData => wardData.stream;
|
||||
|
||||
final listWards = StreamController<List<DropdownMenuItem<Ward>>>.broadcast();
|
||||
StreamSink<List<DropdownMenuItem<Ward>>> get sinkListWards => listWards.sink;
|
||||
Stream<List<DropdownMenuItem<Ward>>> get streamListWards => listWards.stream;
|
||||
|
||||
// Show Maps in DeviceUpdateScreen
|
||||
|
||||
final markers = StreamController<Set<Marker>>.broadcast();
|
||||
StreamSink<Set<Marker>> get sinkMarkers => markers.sink;
|
||||
Stream<Set<Marker>> get streamMarkers => markers.stream;
|
||||
|
||||
final searchLocation = StreamController<TextEditingController>.broadcast();
|
||||
StreamSink<TextEditingController> get sinkSearchLocation =>
|
||||
searchLocation.sink;
|
||||
Stream<TextEditingController> get streamSearchLocation =>
|
||||
searchLocation.stream;
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
// deviceInfo.done;
|
||||
}
|
||||
|
||||
Future<void> getAllProvinces() async {
|
||||
List<DropdownMenuItem<Province>> provincesData = [];
|
||||
provincesData.clear();
|
||||
sinkListProvinces.add(provincesData);
|
||||
final body = await apiServices.getAllProvinces();
|
||||
final data = jsonDecode(body);
|
||||
List<dynamic> items = data["items"];
|
||||
|
||||
final provinces = Province.fromJsonDynamicList(items);
|
||||
for (var province in provinces) {
|
||||
provincesData.add(
|
||||
DropdownMenuItem(value: province, child: Text(province.fullName!)));
|
||||
}
|
||||
sinkListProvinces.add(provincesData);
|
||||
}
|
||||
|
||||
Future<void> getAllDistricts(String provinceID) async {
|
||||
List<DropdownMenuItem<District>> districtsData = [];
|
||||
districtsData.clear();
|
||||
sinkListDistricts.add(districtsData);
|
||||
final body = await apiServices.getAllDistricts(provinceID);
|
||||
final data = jsonDecode(body);
|
||||
List<dynamic> items = data["items"];
|
||||
final districts = District.fromJsonDynamicList(items);
|
||||
for (var district in districts) {
|
||||
districtsData.add(
|
||||
DropdownMenuItem(value: district, child: Text(district.fullName!)));
|
||||
}
|
||||
sinkListDistricts.add(districtsData);
|
||||
}
|
||||
|
||||
Future<void> getAllWards(String districtID) async {
|
||||
List<DropdownMenuItem<Ward>> wardsData = [];
|
||||
wardsData.clear();
|
||||
sinkListWards.add(wardsData);
|
||||
final body = await apiServices.getAllWards(districtID);
|
||||
final data = jsonDecode(body);
|
||||
List<dynamic> items = data["items"];
|
||||
final wards = Ward.fromJsonDynamicList(items);
|
||||
for (var ward in wards) {
|
||||
wardsData.add(DropdownMenuItem(value: ward, child: Text(ward.fullName!)));
|
||||
}
|
||||
sinkListWards.add(wardsData);
|
||||
}
|
||||
|
||||
Future<void> getDeviceInfomation(
|
||||
String thingID,
|
||||
List<DropdownMenuItem<District>> districtsData,
|
||||
List<DropdownMenuItem<Ward>> wardsData,
|
||||
TextEditingController deviceNameController,
|
||||
TextEditingController latitudeController,
|
||||
TextEditingController longitudeController) async {
|
||||
String body = await apiServices.getDeviceInfomation(thingID);
|
||||
final data = jsonDecode(body);
|
||||
Device device = Device.fromJson(data);
|
||||
sinkDeviceInfo.add(device);
|
||||
deviceNameController.text = device.name ?? "";
|
||||
latitudeController.text = device.settings!.latitude ?? "";
|
||||
longitudeController.text = device.settings!.longitude ?? "";
|
||||
if (device.areaPath != "") {
|
||||
List<String> areaPath = device.areaPath!.split('_');
|
||||
String provinceCode = areaPath[0];
|
||||
String districtCode = areaPath[1];
|
||||
String wardCode = areaPath[2];
|
||||
getAllDistricts(provinceCode);
|
||||
getAllWards(districtCode);
|
||||
final provinceResponse = await apiServices.getProvinceByID(provinceCode);
|
||||
final provincesData = jsonDecode(provinceResponse);
|
||||
Province province = Province.fromJson(provincesData['data']);
|
||||
final districtResponse = await apiServices.getDistrictByID(districtCode);
|
||||
final districtData = jsonDecode(districtResponse);
|
||||
District district = District.fromJson(districtData['data']);
|
||||
final wardResponse = await apiServices.getWardByID(wardCode);
|
||||
final wardData = jsonDecode(wardResponse);
|
||||
Ward ward = Ward.fromJson(wardData['data']);
|
||||
Map<String, String> provinceData = {
|
||||
"name": province.fullName!,
|
||||
"code": province.code!
|
||||
};
|
||||
sinkProvinceData.add(provinceData);
|
||||
Map<String, String> districData = {
|
||||
"name": district.fullName!,
|
||||
"code": district.code!,
|
||||
};
|
||||
sinkDistrictData.add(districData);
|
||||
Map<String, String> wardMap = {
|
||||
"name": ward.fullName!,
|
||||
"code": ward.code!,
|
||||
};
|
||||
sinkWardData.add(wardMap);
|
||||
}
|
||||
}
|
||||
|
||||
Future<Province> getProvinceByName(String name) async {
|
||||
final response = await apiServices.getProvincesByName(name);
|
||||
final data = jsonDecode(response);
|
||||
if (data != null &&
|
||||
data.containsKey('items') &&
|
||||
data['items'] != null &&
|
||||
data['items'].isNotEmpty) {
|
||||
List<dynamic> items = data['items'];
|
||||
List<Province> provinces = Province.fromJsonDynamicList(items);
|
||||
if (provinces.isNotEmpty) {
|
||||
return provinces[0];
|
||||
}
|
||||
}
|
||||
return Province(name: "null");
|
||||
}
|
||||
|
||||
Future<District> getDistrictByName(String name, String provinceCode) async {
|
||||
final response = await apiServices.getDistrictsByName(name);
|
||||
if (response != "") {
|
||||
final data = jsonDecode(response);
|
||||
List<dynamic> items = data['items'];
|
||||
if (items.isNotEmpty) {
|
||||
List<District> districts = District.fromJsonDynamicList(items);
|
||||
if (districts.isNotEmpty) {
|
||||
for (var district in districts) {
|
||||
if (district.provinceCode == provinceCode) {
|
||||
return district;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return District(name: "null");
|
||||
}
|
||||
|
||||
Future<Ward> getWardByName(String name, String districtCode) async {
|
||||
final response = await apiServices.getWarsdByName(name);
|
||||
final data = jsonDecode(response);
|
||||
if (data != null && data['items'] != null) {
|
||||
List<dynamic> items = data['items'];
|
||||
if (items.isNotEmpty) {
|
||||
List<Ward> wards = Ward.fromJsonDynamicList(items);
|
||||
if (wards.isNotEmpty) {
|
||||
for (var ward in wards) {
|
||||
if (ward.districtCode == districtCode) {
|
||||
return ward;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return Ward(name: "null");
|
||||
}
|
||||
|
||||
Future<void> updateDevice(
|
||||
BuildContext context,
|
||||
String thingID,
|
||||
String name,
|
||||
String latitude,
|
||||
String longitude,
|
||||
String provinceCode,
|
||||
String districtCode,
|
||||
String wardCode,
|
||||
) async {
|
||||
DateTime dateTime = DateTime.now();
|
||||
String formattedDateTime =
|
||||
DateFormat('yyyy-MM-dd HH:mm:ss').format(dateTime);
|
||||
Map<String, dynamic> body = {
|
||||
"name": name,
|
||||
"area_province": provinceCode,
|
||||
"area_district": districtCode,
|
||||
"area_ward": wardCode,
|
||||
"latitude": latitude,
|
||||
"longitude": longitude,
|
||||
"note": "User updated device infomation at $formattedDateTime",
|
||||
};
|
||||
int statusCode = await apiServices.updateOwnerDevice(thingID, body);
|
||||
showSnackBarResponseByStatusCodeNoIcon(
|
||||
context,
|
||||
statusCode,
|
||||
appLocalization(context).notification_update_device_success,
|
||||
appLocalization(context).notification_update_device_failed,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:search_choices/search_choices.dart';
|
||||
|
||||
import '../device_model.dart';
|
||||
import 'device_update_bloc.dart';
|
||||
import '../../../bloc/device_update_bloc.dart';
|
||||
import 'map_dialog.dart';
|
||||
import '../../../product/base/bloc/base_bloc.dart';
|
||||
import '../../../product/extention/context_extention.dart';
|
||||
|
||||
@@ -5,7 +5,7 @@ import 'package:http/http.dart' as http;
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
||||
import 'device_update_bloc.dart';
|
||||
import '../../../bloc/device_update_bloc.dart';
|
||||
import '../../../product/constant/app/app_constants.dart';
|
||||
import '../../../product/extention/context_extention.dart';
|
||||
import '../../../product/services/language_services.dart';
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:sfm_app/product/constant/app/app_constants.dart';
|
||||
|
||||
import 'device_model.dart';
|
||||
import '../../product/base/bloc/base_bloc.dart';
|
||||
import '../../product/services/api_services.dart';
|
||||
|
||||
import '../../product/utils/device_utils.dart';
|
||||
|
||||
class DevicesManagerBloc extends BlocBase {
|
||||
APIServices apiServices = APIServices();
|
||||
|
||||
final userRole = StreamController<String>.broadcast();
|
||||
StreamSink<String> get sinkUserRole => userRole.sink;
|
||||
Stream<String> get streamUserRole => userRole.stream;
|
||||
|
||||
final allDevices = StreamController<List<Device>>.broadcast();
|
||||
StreamSink<List<Device>> get sinkAllDevices => allDevices.sink;
|
||||
Stream<List<Device>> get streamAllDevices => allDevices.stream;
|
||||
|
||||
final deviceByState = StreamController<Map<String, List<Device>>>.broadcast();
|
||||
StreamSink<Map<String, List<Device>>> get sinkDeviceByState =>
|
||||
deviceByState.sink;
|
||||
Stream<Map<String, List<Device>>> get streamDeviceByState =>
|
||||
deviceByState.stream;
|
||||
|
||||
@override
|
||||
void dispose() {}
|
||||
|
||||
void getDevice() async {
|
||||
String body = await apiServices.getOwnerDevices();
|
||||
Map<String, List<Device>> deviceByState = {
|
||||
ApplicationConstants.OFFLINE_STATE: [],
|
||||
ApplicationConstants.NORMAL_STATE: [],
|
||||
ApplicationConstants.WARNING_STATE: [],
|
||||
ApplicationConstants.INPROGRESS_STATE: [],
|
||||
ApplicationConstants.ERROR_STATE: [],
|
||||
};
|
||||
|
||||
if (body.isNotEmpty) {
|
||||
final data = jsonDecode(body);
|
||||
List<dynamic> items = data['items'];
|
||||
List<Device> originalDevices = Device.fromJsonDynamicList(items);
|
||||
List<Device> devices =
|
||||
DeviceUtils.instance.sortDeviceByState(originalDevices);
|
||||
for (var device in devices) {
|
||||
String stateKey;
|
||||
switch (device.state) {
|
||||
case -1:
|
||||
stateKey = ApplicationConstants.OFFLINE_STATE;
|
||||
break;
|
||||
case 0:
|
||||
stateKey = ApplicationConstants.NORMAL_STATE;
|
||||
break;
|
||||
case 1:
|
||||
stateKey = ApplicationConstants.WARNING_STATE;
|
||||
break;
|
||||
case 2:
|
||||
stateKey = ApplicationConstants.INPROGRESS_STATE;
|
||||
break;
|
||||
default:
|
||||
stateKey = ApplicationConstants.ERROR_STATE;
|
||||
break;
|
||||
}
|
||||
deviceByState[stateKey]!.add(device);
|
||||
}
|
||||
sinkAllDevices.add(devices);
|
||||
sinkDeviceByState.add(deviceByState);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,7 @@ import 'package:sfm_app/product/shared/shared_pie_chart.dart';
|
||||
import 'add_new_device_widget.dart';
|
||||
import 'delete_device_widget.dart';
|
||||
import 'device_model.dart';
|
||||
import 'devices_manager_bloc.dart';
|
||||
import '../../bloc/devices_manager_bloc.dart';
|
||||
import '../../product/base/bloc/base_bloc.dart';
|
||||
import '../../product/constant/enums/app_route_enums.dart';
|
||||
import '../../product/constant/enums/role_enums.dart';
|
||||
|
||||
@@ -1,92 +0,0 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'device_alias_model.dart';
|
||||
|
||||
import '../../product/base/bloc/base_bloc.dart';
|
||||
|
||||
class HomeBloc extends BlocBase {
|
||||
|
||||
final allDevicesAlias = StreamController<List<DeviceWithAlias>>.broadcast();
|
||||
StreamSink<List<DeviceWithAlias>> get sinkAllDevicesAlias =>
|
||||
allDevicesAlias.sink;
|
||||
Stream<List<DeviceWithAlias>> get streamAllDevicesAlias =>
|
||||
allDevicesAlias.stream;
|
||||
|
||||
final onlineDevicesAlias =
|
||||
StreamController<List<DeviceWithAlias>>.broadcast();
|
||||
StreamSink<List<DeviceWithAlias>> get sinkOnlineDevicesAlias =>
|
||||
onlineDevicesAlias.sink;
|
||||
Stream<List<DeviceWithAlias>> get streamOnlineDevicesAlias =>
|
||||
onlineDevicesAlias.stream;
|
||||
|
||||
final offlineDevicesAlias =
|
||||
StreamController<List<DeviceWithAlias>>.broadcast();
|
||||
StreamSink<List<DeviceWithAlias>> get sinkOfflineDevicesAlias =>
|
||||
offlineDevicesAlias.sink;
|
||||
Stream<List<DeviceWithAlias>> get streamOfflineDevicesAlias =>
|
||||
offlineDevicesAlias.stream;
|
||||
|
||||
final warningDevicesAlias =
|
||||
StreamController<List<DeviceWithAlias>>.broadcast();
|
||||
StreamSink<List<DeviceWithAlias>> get sinkWarningDevicesAlias =>
|
||||
warningDevicesAlias.sink;
|
||||
Stream<List<DeviceWithAlias>> get streamWarningDevicesAlias =>
|
||||
warningDevicesAlias.stream;
|
||||
|
||||
final notUseDevicesAlias =
|
||||
StreamController<List<DeviceWithAlias>>.broadcast();
|
||||
StreamSink<List<DeviceWithAlias>> get sinkNotUseDevicesAlias =>
|
||||
notUseDevicesAlias.sink;
|
||||
Stream<List<DeviceWithAlias>> get streamNotUseDevicesAlias =>
|
||||
notUseDevicesAlias.stream;
|
||||
|
||||
final allDevicesAliasJoined =
|
||||
StreamController<List<DeviceWithAlias>>.broadcast();
|
||||
StreamSink<List<DeviceWithAlias>> get sinkAllDevicesAliasJoined =>
|
||||
allDevicesAliasJoined.sink;
|
||||
Stream<List<DeviceWithAlias>> get streamAllDevicesAliasJoined =>
|
||||
allDevicesAliasJoined.stream;
|
||||
|
||||
final onlineDevicesAliasJoined =
|
||||
StreamController<List<DeviceWithAlias>>.broadcast();
|
||||
StreamSink<List<DeviceWithAlias>> get sinkOnlineDevicesAliasJoined =>
|
||||
onlineDevicesAliasJoined.sink;
|
||||
Stream<List<DeviceWithAlias>> get streamOnlineDevicesAliasJoined =>
|
||||
onlineDevicesAliasJoined.stream;
|
||||
|
||||
final offlineDevicesAliasJoined =
|
||||
StreamController<List<DeviceWithAlias>>.broadcast();
|
||||
StreamSink<List<DeviceWithAlias>> get sinkOfflineDevicesAliasJoined =>
|
||||
offlineDevicesAliasJoined.sink;
|
||||
Stream<List<DeviceWithAlias>> get streamOfflineDevicesAliasJoined =>
|
||||
offlineDevicesAliasJoined.stream;
|
||||
|
||||
final warningDevicesAliasJoined =
|
||||
StreamController<List<DeviceWithAlias>>.broadcast();
|
||||
StreamSink<List<DeviceWithAlias>> get sinkWarningDevicesAliasJoined =>
|
||||
warningDevicesAliasJoined.sink;
|
||||
Stream<List<DeviceWithAlias>> get streamWarningDevicesAliasJoined =>
|
||||
warningDevicesAliasJoined.stream;
|
||||
|
||||
final notUseDevicesAliasJoined =
|
||||
StreamController<List<DeviceWithAlias>>.broadcast();
|
||||
StreamSink<List<DeviceWithAlias>> get sinkNotUseDevicesAliasJoined =>
|
||||
notUseDevicesAliasJoined.sink;
|
||||
Stream<List<DeviceWithAlias>> get streamNotUseDevicesAliasJoined =>
|
||||
notUseDevicesAliasJoined.stream;
|
||||
|
||||
final countNotitication = StreamController<int>.broadcast();
|
||||
StreamSink<int> get sinkCountNotitication => countNotitication.sink;
|
||||
Stream<int> get streamCountNotitication => countNotitication.stream;
|
||||
|
||||
final ownerDevicesStatus =
|
||||
StreamController<Map<String, List<DeviceWithAlias>>>.broadcast();
|
||||
StreamSink<Map<String, List<DeviceWithAlias>>>
|
||||
get sinkOwnerDevicesStatus => ownerDevicesStatus.sink;
|
||||
Stream<Map<String, List<DeviceWithAlias>>> get streamOwnerDevicesStatus =>
|
||||
ownerDevicesStatus.stream;
|
||||
|
||||
|
||||
@override
|
||||
void dispose() {}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ import '../settings/device_notification_settings/device_notification_settings_mo
|
||||
import '../../product/extention/context_extention.dart';
|
||||
import '../../product/services/api_services.dart';
|
||||
import '../../product/services/language_services.dart';
|
||||
import 'home_bloc.dart';
|
||||
import '../../bloc/home_bloc.dart';
|
||||
import '../../product/base/bloc/base_bloc.dart';
|
||||
|
||||
class HomeScreen extends StatefulWidget {
|
||||
|
||||
@@ -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';
|
||||
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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 ?? ''));
|
||||
}
|
||||
}
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sfm_app/product/base/bloc/base_bloc.dart';
|
||||
import '../bell/bell_model.dart';
|
||||
|
||||
class MainBloc extends BlocBase {
|
||||
final bellBloc = StreamController<Bell>.broadcast();
|
||||
StreamSink<Bell> get sinkBellBloc => bellBloc.sink;
|
||||
Stream<Bell> get streamBellBloc => bellBloc.stream;
|
||||
|
||||
|
||||
final language = StreamController<Locale?>.broadcast();
|
||||
StreamSink<Locale?> get sinkLanguage => language.sink;
|
||||
Stream<Locale?> get streamLanguage => language.stream;
|
||||
|
||||
final theme = StreamController<ThemeData?>.broadcast();
|
||||
StreamSink<ThemeData?> get sinkTheme => theme.sink;
|
||||
Stream<ThemeData?> get streamTheme => theme.stream;
|
||||
|
||||
final themeMode = StreamController<bool>.broadcast();
|
||||
StreamSink<bool> get sinkThemeMode => themeMode.sink;
|
||||
Stream<bool> get streamThemeMode => themeMode.stream;
|
||||
|
||||
final isVNIcon = StreamController<bool>.broadcast();
|
||||
StreamSink<bool> get sinkIsVNIcon => isVNIcon.sink;
|
||||
Stream<bool> get streamIsVNIcon => isVNIcon.stream;
|
||||
|
||||
@override
|
||||
void dispose() {}
|
||||
}
|
||||
@@ -8,20 +8,20 @@ import 'package:go_router/go_router.dart';
|
||||
// import 'package:persistent_bottom_nav_bar_v2/persistent-tab-view.dart';
|
||||
import 'package:badges/badges.dart' as badges;
|
||||
import 'package:persistent_bottom_nav_bar/persistent_bottom_nav_bar.dart';
|
||||
import '../home/home_bloc.dart';
|
||||
import '../../bloc/home_bloc.dart';
|
||||
import '../../product/constant/app/app_constants.dart';
|
||||
import '../../product/constant/enums/app_route_enums.dart';
|
||||
import '../../product/permission/location_permission.dart';
|
||||
import '../../product/services/theme_services.dart';
|
||||
import '../devices/devices_manager_bloc.dart';
|
||||
import '../../bloc/devices_manager_bloc.dart';
|
||||
import '../devices/devices_manager_screen.dart';
|
||||
import '../home/home_screen.dart';
|
||||
import '../inter_family/inter_family_bloc.dart';
|
||||
import '../../bloc/inter_family_bloc.dart';
|
||||
import '../inter_family/inter_family_screen.dart';
|
||||
import '../device_log/device_logs_bloc.dart';
|
||||
import '../../bloc/device_logs_bloc.dart';
|
||||
import '../device_log/device_logs_screen.dart';
|
||||
import 'main_bloc.dart';
|
||||
import '../map/map_bloc.dart';
|
||||
import '../../bloc/main_bloc.dart';
|
||||
import '../../bloc/map_bloc.dart';
|
||||
import '../map/map_screen.dart';
|
||||
import '../../product/base/bloc/base_bloc.dart';
|
||||
import '../../product/constant/enums/app_theme_enums.dart';
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
// ignore_for_file: use_build_context_synchronously
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
||||
import '../../product/services/map_services.dart';
|
||||
import '../../product/shared/shared_snack_bar.dart';
|
||||
import '../devices/device_model.dart';
|
||||
import '../../product/base/bloc/base_bloc.dart';
|
||||
import '../../product/services/api_services.dart';
|
||||
|
||||
class MapBloc extends BlocBase {
|
||||
APIServices apiServices = APIServices();
|
||||
MapServices mapServices = MapServices();
|
||||
@override
|
||||
void dispose() {}
|
||||
|
||||
final mapTheme = StreamController<String>.broadcast();
|
||||
StreamSink<String> get sinkMapTheme => mapTheme.sink;
|
||||
Stream<String> get streamMapTheme => mapTheme.stream;
|
||||
|
||||
final mapType = StreamController<MapType>.broadcast();
|
||||
StreamSink<MapType> get sinkMapType => mapType.sink;
|
||||
Stream<MapType> get streamMapType => mapType.stream;
|
||||
|
||||
final mapController = StreamController<GoogleMapController>.broadcast();
|
||||
StreamSink<GoogleMapController> get sinkmapController => mapController.sink;
|
||||
Stream<GoogleMapController> get streammapController => mapController.stream;
|
||||
|
||||
final allDevices = StreamController<List<Device>>.broadcast();
|
||||
StreamSink<List<Device>> get sinkAllDevices => allDevices.sink;
|
||||
Stream<List<Device>> get streamAllDevices => allDevices.stream;
|
||||
|
||||
final allMarker = StreamController<Set<Marker>>.broadcast();
|
||||
StreamSink<Set<Marker>> get sinkAllMarker => allMarker.sink;
|
||||
Stream<Set<Marker>> get streamAllMarker => allMarker.stream;
|
||||
|
||||
final polylines = StreamController<List<LatLng>>.broadcast();
|
||||
StreamSink<List<LatLng>> get sinkPolylines => polylines.sink;
|
||||
Stream<List<LatLng>> get streamPolylines => polylines.stream;
|
||||
|
||||
Future<void> updateCameraPosition(
|
||||
Completer<GoogleMapController> controller,
|
||||
double latitude,
|
||||
double longitude,
|
||||
double zoom,
|
||||
) async {
|
||||
final CameraPosition cameraPosition =
|
||||
CameraPosition(target: LatLng(latitude, longitude), zoom: zoom);
|
||||
final GoogleMapController mapController = await controller.future;
|
||||
mapController.animateCamera(CameraUpdate.newCameraPosition(cameraPosition));
|
||||
}
|
||||
|
||||
Future<void> findTheWay(
|
||||
BuildContext context,
|
||||
Completer<GoogleMapController> controller,
|
||||
LatLng origin,
|
||||
LatLng destination,
|
||||
) async {
|
||||
List<LatLng> polylines = [];
|
||||
final polylineCoordinates =
|
||||
await mapServices.findTheWay(origin, destination);
|
||||
if (polylineCoordinates.isNotEmpty) {
|
||||
polylines = polylineCoordinates;
|
||||
sinkPolylines.add(polylines);
|
||||
await updateCameraPosition(
|
||||
controller,
|
||||
destination.latitude,
|
||||
destination.longitude,
|
||||
13.0,
|
||||
);
|
||||
} else {
|
||||
showNoIconTopSnackBar(
|
||||
context, "Không tìm thấy đường", Colors.orange, Colors.white);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -7,7 +7,7 @@ import 'package:geolocator/geolocator.dart';
|
||||
import 'package:google_maps_cluster_manager_2/google_maps_cluster_manager_2.dart';
|
||||
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
||||
import 'package:sfm_app/feature/devices/device_model.dart';
|
||||
import 'package:sfm_app/feature/map/map_bloc.dart';
|
||||
import 'package:sfm_app/bloc/map_bloc.dart';
|
||||
import 'package:sfm_app/feature/map/widget/on_tap_marker_widget.dart';
|
||||
import 'package:sfm_app/product/base/bloc/base_bloc.dart';
|
||||
import 'package:sfm_app/product/constant/icon/icon_constants.dart';
|
||||
|
||||
@@ -7,7 +7,7 @@ import 'show_direction_widget.dart';
|
||||
import 'show_nearest_place.dart';
|
||||
import '../../../product/constant/icon/icon_constants.dart';
|
||||
import '../../../product/extention/context_extention.dart';
|
||||
import '../map_bloc.dart';
|
||||
import '../../../bloc/map_bloc.dart';
|
||||
import '../../../product/services/api_services.dart';
|
||||
import '../../../product/services/language_services.dart';
|
||||
import '../../../product/utils/device_utils.dart';
|
||||
|
||||
@@ -7,7 +7,7 @@ import 'package:sfm_app/product/constant/icon/icon_constants.dart';
|
||||
import 'package:sfm_app/product/extention/context_extention.dart';
|
||||
import 'package:sfm_app/product/services/language_services.dart';
|
||||
|
||||
import '../map_bloc.dart';
|
||||
import '../../../bloc/map_bloc.dart';
|
||||
|
||||
showDirections(
|
||||
BuildContext context,
|
||||
|
||||
@@ -4,7 +4,7 @@ import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
||||
import '../map_bloc.dart';
|
||||
import '../../../bloc/map_bloc.dart';
|
||||
import 'show_direction_widget.dart';
|
||||
import '../../../product/constant/icon/icon_constants.dart';
|
||||
import '../../../product/extention/context_extention.dart';
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'device_notification_settings_model.dart';
|
||||
import '../../../product/base/bloc/base_bloc.dart';
|
||||
|
||||
class DeviceNotificationSettingsBloc extends BlocBase {
|
||||
final listNotifications =
|
||||
StreamController<List<DeviceNotificationSettings>>.broadcast();
|
||||
StreamSink<List<DeviceNotificationSettings>> get sinkListNotifications =>
|
||||
listNotifications.sink;
|
||||
Stream<List<DeviceNotificationSettings>> get streamListNotifications =>
|
||||
listNotifications.stream;
|
||||
|
||||
final deviceThingID = StreamController<String>.broadcast();
|
||||
StreamSink<String> get sinkDeviceThingID => deviceThingID.sink;
|
||||
Stream<String> get streamDeviceThingID => deviceThingID.stream;
|
||||
|
||||
final deviceNotificationSettingMap =
|
||||
StreamController<Map<String, int>>.broadcast();
|
||||
StreamSink<Map<String, int>> get sinkDeviceNotificationSettingMap =>
|
||||
deviceNotificationSettingMap.sink;
|
||||
Stream<Map<String, int>> get streamDeviceNotificationSettingMap =>
|
||||
deviceNotificationSettingMap.stream;
|
||||
|
||||
final isDataChange = StreamController<bool>.broadcast();
|
||||
StreamSink<bool> get sinkIsDataChange => isDataChange.sink;
|
||||
Stream<bool> get streamIsDataChange => isDataChange.stream;
|
||||
|
||||
final iconChange = StreamController<IconData>.broadcast();
|
||||
StreamSink<IconData> get sinkIconChange => iconChange.sink;
|
||||
Stream<IconData> get streamIconChange => iconChange.stream;
|
||||
|
||||
final messageChange = StreamController<String>.broadcast();
|
||||
StreamSink<String> get sinkMessageChange => messageChange.sink;
|
||||
Stream<String> get streaMmessageChange => messageChange.stream;
|
||||
|
||||
|
||||
@override
|
||||
void dispose() {}
|
||||
}
|
||||
@@ -4,7 +4,7 @@ import 'dart:convert';
|
||||
import 'package:dropdown_button2/dropdown_button2.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import '../../../product/shared/shared_snack_bar.dart';
|
||||
import 'device_notification_settings_bloc.dart';
|
||||
import '../../../bloc/device_notification_settings_bloc.dart';
|
||||
import 'device_notification_settings_model.dart';
|
||||
import '../../../product/base/bloc/base_bloc.dart';
|
||||
import '../../../product/extention/context_extention.dart';
|
||||
|
||||
@@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
|
||||
import '../../../product/shared/shared_snack_bar.dart';
|
||||
import '../../../product/constant/icon/icon_constants.dart';
|
||||
import '../../../product/services/api_services.dart';
|
||||
import '../settings_bloc.dart';
|
||||
import '../../../bloc/settings_bloc.dart';
|
||||
import '../../../product/shared/shared_input_decoration.dart';
|
||||
import '../../../product/extention/context_extention.dart';
|
||||
import '../../../product/services/language_services.dart';
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'profile/profile_model.dart';
|
||||
import '../../product/base/bloc/base_bloc.dart';
|
||||
|
||||
class SettingsBloc extends BlocBase {
|
||||
// Settings Screen
|
||||
final userProfile = StreamController<User>.broadcast();
|
||||
StreamSink<User> get sinkUserProfile => userProfile.sink;
|
||||
Stream<User> get streamUserProfile => userProfile.stream;
|
||||
|
||||
|
||||
// Profile Screen
|
||||
final isChangeProfileInfomation = StreamController<bool>.broadcast();
|
||||
StreamSink<bool> get sinkIsChangeProfileInfomation =>
|
||||
isChangeProfileInfomation.sink;
|
||||
Stream<bool> get streamIsChangeProfileInfomation =>
|
||||
isChangeProfileInfomation.stream;
|
||||
|
||||
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,7 @@ import '../../product/constant/icon/icon_constants.dart';
|
||||
import '../../product/extention/context_extention.dart';
|
||||
import '../../product/services/api_services.dart';
|
||||
import 'profile/profile_model.dart';
|
||||
import 'settings_bloc.dart';
|
||||
import '../../bloc/settings_bloc.dart';
|
||||
import '../../product/base/bloc/base_bloc.dart';
|
||||
import '../../product/services/language_services.dart';
|
||||
|
||||
|
||||
Reference in New Issue
Block a user