Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Made vendor login generic #721

Merged
merged 2 commits into from
Jan 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/dart.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ on:

env:
flutter_channel: 'stable' # or: 'dev' or 'beta'
flutter_version: '3.13.6'
flutter_version: '3.16.5'

jobs:
build:
Expand Down
4 changes: 4 additions & 0 deletions lib/domain/connections_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,8 @@ abstract interface class ConnectionsService {
Future activateScene(String id);

Future addScene(SceneCbjEntity scene);

Future<void> loginVendor(VendorLoginEntity value);

Future<List<VendorEntityInformation>> getVendors();
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,12 @@ class _AppConnectionService implements ConnectionsService {

@override
Future addScene(SceneCbjEntity scene) => IcSynchronizer().addScene(scene);

@override
Future loginVendor(VendorLoginEntity value) async =>
IcSynchronizer().loginVendor(value);

@override
Future<List<VendorEntityInformation>> getVendors() async =>
IcSynchronizer().getVendors();
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,10 @@ class _DemoConnectionService implements ConnectionsService {

@override
Future activateScene(String id) async {}

@override
Future<void> loginVendor(VendorLoginEntity value) async {}

@override
Future<List<VendorEntityInformation>> getVendors() async => [];
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,10 @@ class _NoneConnectionService implements ConnectionsService {

@override
Future activateScene(String id) async {}

@override
Future<void> loginVendor(VendorLoginEntity value) async {}

@override
Future<List<VendorEntityInformation>> getVendors() async => [];
}
4 changes: 4 additions & 0 deletions lib/presentation/atoms/switch_atom.dart
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,9 @@ class _SwitchAtomState extends State<SwitchAtom> {
case SwitchVariant.switchVariant:
activeIcon = MdiIcons.lightSwitch;
inactiveIcon = MdiIcons.lightSwitch;
case SwitchVariant.ac:
activeIcon = MdiIcons.airConditioner;
inactiveIcon = MdiIcons.airConditioner;
}

return SizedBox(
Expand Down Expand Up @@ -115,5 +118,6 @@ enum SwitchVariant {
boiler,
smartPlug,
switchVariant,
ac,
;
}
40 changes: 6 additions & 34 deletions lib/presentation/core/entities_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,40 +10,12 @@ class EntitiesUtils {
return FontAwesomeIcons.alignJustify;
case EntityTypes.boiler:
return FontAwesomeIcons.temperatureThreeQuarters;
case EntityTypes.browserApp:
// TODO: Handle this case.
break;
case EntityTypes.button:
return Icons.smart_button;
case EntityTypes.computerApp:
return Icons.computer;
case EntityTypes.emptyEntity:
// TODO: Handle this case.
break;
case EntityTypes.hub:
// TODO: Handle this case.
break;
case EntityTypes.light:
case EntityTypes.dimmableLight:
case EntityTypes.rgbLights:
case EntityTypes.rgbcctLights:
case EntityTypes.rgbwLights:
case EntityTypes.cctLight:
return FontAwesomeIcons.lightbulb;
case EntityTypes.phoneApp:
return Icons.phone;
case EntityTypes.pingEntity:
// TODO: Handle this case.
break;
case EntityTypes.playerEntity:
// TODO: Handle this case.
break;
case EntityTypes.printer:
case EntityTypes.scanner:
case EntityTypes.printerWithScanner:
return Icons.print;
case EntityTypes.routerEntity:
return Icons.router;
case EntityTypes.securityCamera:
return Icons.camera;
case EntityTypes.smartComputer:
Expand All @@ -52,14 +24,14 @@ class EntitiesUtils {
return MdiIcons.powerSocketAu;
case EntityTypes.smartTV:
return Icons.tv;
case EntityTypes.smartTypeNotSupported:
// TODO: Handle this case.
break;
case EntityTypes.switch_:
return MdiIcons.lightSwitch;
case EntityTypes.voiceAssistant:
return MdiIcons.voicemail;
case EntityTypes.ac:
return MdiIcons.airConditioner;
case EntityTypes.emptyEntity:
case EntityTypes.pingEntity:
case EntityTypes.smartTypeNotSupported:
return Icons.question_mark;
}
return Icons.question_mark;
}
}
4 changes: 1 addition & 3 deletions lib/presentation/core/routes/app_router.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,14 @@ class AppRouter extends $AppRouter {
AutoRoute(page: AddActionRoute.page),
AutoRoute(page: ChooseAutomationTypeToAddRoute.page),
AutoRoute(page: ChooseDeviceVendorToAddRoute.page),
AutoRoute(page: AddLifxVendorRoute.page),
AutoRoute(page: AddEspHomeVendorRoute.page),
AutoRoute(page: AddEwelinkVendorRoute.page),
AutoRoute(page: ConnectToHomeWifiRoute.page),
AutoRoute(page: OpenAccessPointRoute.page),
AutoRoute(page: ScanForNewCBJCompsRoute.page),
AutoRoute(page: ConfigureNewCbjCompRoute.page),
AutoRoute(page: ComputerConnectionCheckRoute.page),
AutoRoute(page: EntitiesInNetworkRoute.page),
AutoRoute(page: EntitiesInAreaRoute.page),
AutoRoute(page: LoginVendorRoute.page),

// Pages from packages
AutoRoute(page: SmartCameraContainerRoute.page),
Expand Down
11 changes: 7 additions & 4 deletions lib/presentation/molecules/device_by_type_molecule.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:cbj_integrations_controller/integrations_controller.dart';
import 'package:cybearjinni/presentation/atoms/atoms.dart';
import 'package:cybearjinni/presentation/molecules/molecules.dart';
import 'package:flutter/material.dart';

Expand Down Expand Up @@ -36,9 +35,13 @@ class DeviceByTypeMolecule extends StatelessWidget {
return DimmableLightMolecule(entity as GenericDimmableLightDE);
case EntityTypes.securityCamera:
return SecurityCameraMolecule(entity as GenericSecurityCameraDE);

default:
return TextAtom('Entity type is unsupported ${type?.name ?? 'null'}');
case EntityTypes.ac:
return AcMolecule(entity as GenericAcDE);
case EntityTypes.smartTypeNotSupported:
case EntityTypes.emptyEntity:
case EntityTypes.pingEntity:
case null:
return const SizedBox();
}
}
}
87 changes: 87 additions & 0 deletions lib/presentation/molecules/devices/ac_molecule.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import 'dart:collection';

import 'package:another_flushbar/flushbar_helper.dart';
import 'package:cbj_integrations_controller/integrations_controller.dart';
import 'package:cybearjinni/domain/connections_service.dart';
import 'package:cybearjinni/presentation/atoms/atoms.dart';
import 'package:cybearjinni/presentation/molecules/molecules.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';

class AcMolecule extends StatefulWidget {
const AcMolecule(this.entity);

final GenericAcDE entity;

@override
State<AcMolecule> createState() => _AcMoleculeState();
}

class _AcMoleculeState extends State<AcMolecule> {
Future<void> _turnOnAllAcs() async {
FlushbarHelper.createLoading(
message: 'Turning_On_ac'.tr(),
linearProgressIndicator: const LinearProgressIndicator(),
).show(context);

setEntityState(EntityActions.on);
// IDeviceRepository.instance.moveUpStateDevices(devicesId: blindsIdToTurnUp);
}

void setEntityState(EntityActions action) {
final VendorsAndServices? vendor =
widget.entity.cbjDeviceVendor.vendorsAndServices;
if (vendor == null) {
return;
}
final HashMap<VendorsAndServices, HashSet<String>> uniqueIdByVendor =
HashMap();
uniqueIdByVendor.addEntries(
[
MapEntry(
vendor,
HashSet<String>()
..addAll([widget.entity.deviceCbjUniqueId.getOrCrash()]),
),
],
);

ConnectionsService.instance.setEntityState(
ActionObject(
uniqueIdByVendor: uniqueIdByVendor,
property: EntityProperties.acSwitchState,
actionType: action,
),
);
}

Future<void> _turnOffAllAcs() async {
FlushbarHelper.createLoading(
message: 'Turning_Off_ac'.tr(),
linearProgressIndicator: const LinearProgressIndicator(),
).show(context);

setEntityState(EntityActions.off);
}

void _onChange(bool value) {
if (value) {
_turnOnAllAcs();
} else {
_turnOffAllAcs();
}
}

@override
Widget build(BuildContext context) {
return DeviceNameRow(
widget.entity.cbjEntityName.getOrCrash()!,
SwitchAtom(
variant: SwitchVariant.ac,
onToggle: _onChange,
action: widget.entity.acSwitchState.action!,
state: widget.entity.entityStateGRPC.state,
),
);
}
}
3 changes: 2 additions & 1 deletion lib/presentation/molecules/molecules.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
export 'bottom_navigation_bar_molecule.dart';
export 'device_by_type_molecule.dart';
export 'device_name_row.dart';
export 'devices/ac_molecule.dart';
export 'devices/blind_molecule.dart';
export 'devices/blinds_card_molecule.dart';
export 'devices/boiler_molecule.dart';
Expand All @@ -17,5 +18,5 @@ export 'devices/switch_molecule.dart';
export 'list_tile_molecule.dart';
export 'list_view_molecule.dart';
export 'loading_page_molecule.dart';
export 'top_bar_molecule.dart';
export 'scenes_grid.dart';
export 'top_bar_molecule.dart';
4 changes: 0 additions & 4 deletions lib/presentation/organisms/devices_list_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,11 @@ class DevicesListView extends StatelessWidget {

HashSet<EntityTypes> getReleatedTypes(EntityTypes type) {
if (type == EntityTypes.light ||
type == EntityTypes.rgbLights ||
type == EntityTypes.rgbwLights ||
type == EntityTypes.cctLight ||
type == EntityTypes.dimmableLight) {
return HashSet.from({
EntityTypes.light,
EntityTypes.rgbLights,
EntityTypes.rgbwLights,
EntityTypes.cctLight,
EntityTypes.dimmableLight,
});
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,47 +1,31 @@
import 'package:auto_route/auto_route.dart';
import 'package:cbj_integrations_controller/integrations_controller.dart';
import 'package:cbj_integrations_controller/integrations_controller.dart';
import 'package:cybearjinni/presentation/atoms/atoms.dart';
import 'package:cybearjinni/presentation/core/routes/app_router.gr.dart';
import 'package:cybearjinni/presentation/core/snack_bar_service.dart';
import 'package:flutter/material.dart';
import 'package:hexcolor/hexcolor.dart';

class VendorWidget extends StatelessWidget {
const VendorWidget(this.vendor);
const VendorWidget(this.vendorInformation);

final VendorData vendor;
final VendorEntityInformation vendorInformation;

@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
final String vendorName = vendor.name
.getOrCrash()
.toLowerCase()
.replaceAll(' ', '')
.replaceAll('_', '');

if (vendorName == VendorsAndServices.lifx.name.toLowerCase()) {
context.router.push(AddLifxVendorRoute(vendor: vendor));
} else if (vendorName ==
VendorsAndServices.espHome.name.toLowerCase()) {
context.router.push(AddEspHomeVendorRoute(vendor: vendor));
} else if (vendorName ==
VendorsAndServices.sonoffEweLink.name.toLowerCase()) {
context.router.push(AddEwelinkVendorRoute(vendor: vendor));
} else if (vendorName ==
VendorsAndServices.philipsHue.name.toLowerCase()) {
if (vendorInformation.loginType == VendorLoginTypes.notNeeded) {
SnackBarService().show(
context,
'Please press the button on top of the Philips Hue Hub for and wait 20s',
);
} else {
SnackBarService().show(
context,
'${vendor.name.getOrCrash()} devices will be add automatically'
'${vendorInformation.displayName} devices will be add automatically'
' for you',
);
return;
}

context.router
.push(LoginVendorRoute(vendorInformation: vendorInformation));
},
child: Container(
height: 100,
Expand All @@ -54,10 +38,7 @@ class VendorWidget extends StatelessWidget {
height: 180,
decoration: BoxDecoration(
image: DecorationImage(
image: NetworkImage(
vendor.image ??
'http://www.clker.com/cliparts/f/Z/G/4/h/Q/no-image-available-th.png',
),
image: NetworkImage(vendorInformation.imageUrl),
fit: BoxFit.fitHeight,
),
),
Expand All @@ -66,7 +47,7 @@ class VendorWidget extends StatelessWidget {
width: 10,
),
TextAtom(
vendor.name.getOrCrash(),
vendorInformation.displayName,
style: const TextStyle(
color: Colors.black,
fontSize: 22,
Expand Down
Loading