Skip to content

Commit

Permalink
feat(PinCode_Widget): introduce PinCode Trait Widget (#54)
Browse files Browse the repository at this point in the history
* feat(pin_code_icon): introduce pin_code_icon

* feat(pin_code_provider): introduce PinCodeProvider

* feat(pin_code): introduce pin code slim widget

* feat(pin_code_widget): new pin code widget

* feat(pin_code_widget): include pin_code_slim_widget in factory

* refactor(pin_code_slim_widget): update icons

* feat(pin_code_widget): carve out pin code widget details

* feat(pin_code_slim_widget): show bottom sheet on click

* fix(pin_code_widget): fix icon size and color

* feat(pin_code_slim_widget): add basic list and detail view navigation

* feat(pin_code_slim_widget): Detail View implementation to create new pin code

* fix(pin_code_detail_view): add async modifier to onPressed callback

* test(detail_screen_test.dart): add pinCodeProvider mocks to existing tests

* refactor(pin_code_slim_widget): add sub-navigation between sheets

* feat(pin_code_widget): save new pin code

* feat(pin_code): update styles according to figma design

* refactor(pin_code_provider): rename from sendAddPinCode to sendCreatePinCode method name

* test(pin_code_provider): more tests for pin_code_provider

* refactor(pin_code_provider): rename action to sendCreatePinCode

* build(pubspec.yaml): update yonomi_platform_sdk dependency to 5.2.0

* chore(config.yml): pin flutter version to 3.3.2

* test(battery_widget, pin_code_widget): wrap tested Widgets in Scaffold widget to fix errors
  • Loading branch information
ses110 committed Sep 27, 2022
1 parent 010f30d commit 9eaf083
Show file tree
Hide file tree
Showing 24 changed files with 1,258 additions and 14 deletions.
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ anchors:
executors:
default-executor:
docker:
- image: cirrusci/flutter:latest
- image: cirrusci/flutter:3.3.2
shell: "/bin/bash -eo pipefail"
node-executor:
docker:
Expand Down
3 changes: 3 additions & 0 deletions lib/assets/traits/device_item_icon.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:yonomi_device_widgets/assets/traits/battery_level_icon.dart';
import 'package:yonomi_device_widgets/assets/traits/color_temperature_icon.dart';
import 'package:yonomi_device_widgets/assets/traits/lock_item_icon.dart';
import 'package:yonomi_device_widgets/assets/traits/pin_code_icon.dart';
import 'package:yonomi_device_widgets/assets/traits/power_item_icon.dart';
import 'package:yonomi_device_widgets/assets/traits/thermostat_icon.dart';
import 'package:yonomi_device_widgets/assets/traits/unknown_item_icon.dart';
Expand Down Expand Up @@ -31,6 +32,8 @@ class DeviceItemIcon {
return ColorTemperatureIcon(
findIconStateValue<sdk.ColorTemperature, int>(
determiningTrait.states));
case sdk.PinCodeTrait:
return PinCodeIcon();
default:
return UnknownItemIcon();
}
Expand Down
13 changes: 13 additions & 0 deletions lib/assets/traits/pin_code_icon.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import 'package:bootstrap_icons/bootstrap_icons.dart';
import 'package:flutter/material.dart';
import 'package:yonomi_device_widgets/ui/widget_style_constants.dart';

class PinCodeIcon extends Icon {
static const DEFAULT_ICON = BootstrapIcons.grid_3x3_gap_fill;

PinCodeIcon(
{size = WidgetStyleConstants.defaultDeviceIconSize,
color = WidgetStyleConstants.deviceIconColor,
Key? key})
: super(DEFAULT_ICON, key: key, size: size, color: color);
}
57 changes: 57 additions & 0 deletions lib/providers/pin_code_provider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import 'package:yonomi_device_widgets/providers/device_provider.dart';
import 'package:yonomi_platform_sdk/yonomi-sdk.dart';

typedef SendCreatePinCodeMethod = Future<void> Function(
Request request, String id, String pinCode, String pinCodeName);

class PinCodeProvider extends DeviceProvider {
static const _DEFAULT_DISPLAY_NAME = 'PIN_CODE';

late String _deviceId;
late Request _request;

PinCodeProvider(Request request, String deviceId,
{GetDeviceDetailsMethod getDetails = DevicesRepository.getDeviceDetails})
: super(request, deviceId, getDetails: getDetails) {
this._deviceId = deviceId;
this._request = request;
}

/// Run the "makeCreatePinCodeActionRequest" mutation on this device
///
/// @param pinCode the pin code
/// @param pinCodeName the name for the pin code
/// @throws ServerException for any errors returned by the platform
Future<void> sendCreatePinCode(String pinCode, String pinCodeName,
{GetDeviceDetailsMethod getDetails = DevicesRepository.getDeviceDetails,
SendCreatePinCodeMethod sendCreatePinCodeMethod =
PinCodeRepository.sendCreatePinCodeAction}) async {
return performAction<List<PinCodeCredential>>(
[...?getPinCodeCredentials, PinCodeCredential(pinCodeName, pinCode)],
() => getPinCodeCredentials,
() => sendCreatePinCodeMethod(
_request, this._deviceId, pinCode, pinCodeName),
getDetails: getDetails);
}

PinCodeTrait? getPinCodeTrait() {
return trait<PinCodeTrait>() as PinCodeTrait?;
}

String get displayName => deviceDetail?.displayName ?? _DEFAULT_DISPLAY_NAME;

/// Get pinCodeCredentials State
List<PinCodeCredential>? get getPinCodeCredentials =>
getPinCodeTrait()?.pinCodes;

/// Get the Max Number Of Credentials allowed for this device
int? get maxNumberOfCredentials => getPinCodeTrait()?.maxNumberOfCredentials;

/// Get min and max Credential length allowed for this device
PinCodeLengthRange? get pinCodeLengthRange =>
getPinCodeTrait()?.pinCodeLengthRange;

/// Get min and max pin code Name length allowed for this device
PinCodeNameLengthRange? get nameLengthRange =>
getPinCodeTrait()?.nameLengthRange;
}
5 changes: 5 additions & 0 deletions lib/traits/detail_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:yonomi_device_widgets/providers/brightness_provider.dart';
import 'package:yonomi_device_widgets/providers/color_provider.dart';
import 'package:yonomi_device_widgets/providers/color_temperature_provider.dart';
import 'package:yonomi_device_widgets/providers/lock_provider.dart';
import 'package:yonomi_device_widgets/providers/pin_code_provider.dart';
import 'package:yonomi_device_widgets/providers/power_trait_provider.dart';
import 'package:yonomi_device_widgets/providers/thermostat_provider.dart';
import 'package:yonomi_device_widgets/providers/trait_detail_provider.dart';
Expand All @@ -22,6 +23,7 @@ class DetailScreen extends StatelessWidget {
Widget build(BuildContext context) {
return MultiProvider(
providers: [
// coverage:ignore-start
ChangeNotifierProvider<TraitDetailProvider>(
create: (context) => TraitDetailProvider(request, deviceId)),
ChangeNotifierProvider<LockProvider>(
Expand All @@ -38,6 +40,9 @@ class DetailScreen extends StatelessWidget {
create: (context) => ColorProvider(request, deviceId)),
ChangeNotifierProvider<ColorTemperatureProvider>(
create: (context) => ColorTemperatureProvider(request, deviceId)),
ChangeNotifierProvider<PinCodeProvider>(
create: (context) => PinCodeProvider(request, deviceId)),
// coverage:ignore-end
],
child: DetailScreenWidget(request, deviceId),
);
Expand Down
16 changes: 16 additions & 0 deletions lib/traits/device_widget_factory.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,22 @@ import 'package:yonomi_device_widgets/providers/brightness_provider.dart';
import 'package:yonomi_device_widgets/providers/color_provider.dart';
import 'package:yonomi_device_widgets/providers/color_temperature_provider.dart';
import 'package:yonomi_device_widgets/providers/lock_provider.dart';
import 'package:yonomi_device_widgets/providers/pin_code_provider.dart';
import 'package:yonomi_device_widgets/providers/power_trait_provider.dart';
import 'package:yonomi_device_widgets/providers/thermostat_provider.dart';
import 'package:yonomi_device_widgets/traits/battery_widget.dart';
import 'package:yonomi_device_widgets/traits/brightness_widget.dart';
import 'package:yonomi_device_widgets/traits/color_temperature_widget.dart';
import 'package:yonomi_device_widgets/traits/color_widget.dart';
import 'package:yonomi_device_widgets/traits/lock_widget.dart';
import 'package:yonomi_device_widgets/traits/pin_code_widget.dart';
import 'package:yonomi_device_widgets/traits/power_widget.dart';
import 'package:yonomi_device_widgets/traits/slim/battery_slim_widget.dart';
import 'package:yonomi_device_widgets/traits/slim/brightness_slim_widget.dart';
import 'package:yonomi_device_widgets/traits/slim/color_slim_widget.dart';
import 'package:yonomi_device_widgets/traits/slim/color_temperature_slim_widget.dart';
import 'package:yonomi_device_widgets/traits/slim/lock_slim_widget.dart';
import 'package:yonomi_device_widgets/traits/slim/pin_code_slim_widget.dart';
import 'package:yonomi_device_widgets/traits/slim/power_slim_widget.dart';
import 'package:yonomi_device_widgets/traits/slim/thermostat_slim_widget.dart';
import 'package:yonomi_device_widgets/traits/slim/unknown_slim_widget.dart';
Expand Down Expand Up @@ -75,6 +78,12 @@ class DeviceWidgetFactory {
textColor: textColor);
},
);
case PinCodeTrait:
return Consumer<PinCodeProvider>(
builder: (_, PinCodeProvider, __) {
return PinCodeWidget(PinCodeProvider, textColor: textColor);
},
);
default:
return UnknownWidget(name: trait.name, iconColor: iconColor);
}
Expand Down Expand Up @@ -135,6 +144,13 @@ class DeviceWidgetFactory {
backgroundColor: backgroundColor,
);
});
case PinCodeTrait:
return Consumer<PinCodeProvider>(builder: (_, pinCodeProvider, __) {
return PinCodeSlimWidget(
pinCodeProvider,
backgroundColor: backgroundColor,
);
});
default:
return UnknownSlimWidget(trait.name, backgroundColor: backgroundColor);
}
Expand Down
65 changes: 65 additions & 0 deletions lib/traits/pin_code_widget.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:yonomi_device_widgets/assets/traits/pin_code_icon.dart';
import 'package:yonomi_device_widgets/mixins/toast_notifications.dart';
import 'package:yonomi_device_widgets/providers/pin_code_provider.dart';
import 'package:yonomi_device_widgets/ui/widget_style_constants.dart';

class PinCodeWidget extends StatelessWidget with ToastNotifications {
final PinCodeProvider _pinCodeProvider;
late final Color _iconColor;
late final Color _textColor;
late final double _iconSize;

PinCodeWidget(this._pinCodeProvider,
{Color iconColor = WidgetStyleConstants.deviceIconColor,
Color textColor = WidgetStyleConstants.darkTextColor,
double iconSize = 60.0,
Key? key})
: super(key: key) {
this._iconColor = iconColor;
this._textColor = textColor;
this._iconSize = iconSize;
}

@override
Widget build(BuildContext context) {
if (_pinCodeProvider.isLoading) {
return Center(
child:
SizedBox(child: CircularProgressIndicator(), height: 30, width: 30),
);
} else if (_pinCodeProvider.isInErrorState) {
showToast(context, _pinCodeProvider.getErrorMessage);
return Icon(Icons.error);
} else {
return Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Row(children: <Widget>[
Text(
'PIN_CODE',
style: Theme.of(context)
.textTheme
.headline6
?.copyWith(color: _textColor),
)
]),
Padding(
padding:
const EdgeInsets.symmetric(vertical: 10.0, horizontal: 8.0),
child: Container(
child: Center(
child: SizedBox(
width: _iconSize,
height: _iconSize,
child: PinCodeIcon(size: _iconSize, color: _iconColor),
),
),
),
),
],
);
}
}
}
3 changes: 1 addition & 2 deletions lib/traits/slim/brightness_slim_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,7 @@ class _BrightnessSlimWidgetState extends State<BrightnessSlimWidget> {
final brightness = _brightnessValue();
return ListTile(
tileColor: _backgroundColor,
leading: (_brightnessProvider.isPerformingAction ||
_brightnessProvider.isLoading)
leading: (_brightnessProvider.isLoading)
? SizedBox(
child: CircularProgressIndicator(), height: 20, width: 20)
: Icon(BootstrapIcons.sun, color: _iconColor),
Expand Down
Loading

0 comments on commit 9eaf083

Please sign in to comment.