Skip to content
This repository has been archived by the owner on Aug 9, 2023. It is now read-only.

Commit

Permalink
Status indicators in Pi-hole forms can be tapped to show error details
Browse files Browse the repository at this point in the history
  • Loading branch information
sterrenb committed May 19, 2020
1 parent 4cf2b5b commit 7c53759
Show file tree
Hide file tree
Showing 7 changed files with 143 additions and 57 deletions.
2 changes: 1 addition & 1 deletion lib/features/routing/presentation/pages/about_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ class AboutPage extends StatelessWidget {
'\n\n'
'FlutterHole is open source, which means anyone '
'can view the code that runs your app. '
'You can find the repository on Github.'),
'You can find the repository on GitHub.'),
],
),
),
Expand Down
2 changes: 0 additions & 2 deletions lib/features/settings/presentation/pages/add_pihole_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,6 @@ class _AddPiholePageState extends State<AddPiholePage> {
title: Row(
children: <Widget>[
Text('Host details'),
SizedBox(width: 8.0),
HostDetailsStatusIcon(),
],
),
Expand All @@ -190,7 +189,6 @@ class _AddPiholePageState extends State<AddPiholePage> {
title: Row(
children: <Widget>[
Text('Authentication'),
SizedBox(width: 8.0),
AuthenticationStatusIcon(),
],
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,6 @@ class _HostDetailsForm extends StatelessWidget {
title: Row(
children: <Widget>[
Text('Host details'),
SizedBox(width: 8.0),
HostDetailsStatusIcon(),
],
),
Expand Down Expand Up @@ -303,7 +302,6 @@ class _AuthenticationFormState extends State<AuthenticationForm> {
title: Row(
children: <Widget>[
Text('Authentication'),
SizedBox(width: 8.0),
AuthenticationStatusIcon(),
],
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import 'package:flutterhole/constants.dart';
import 'package:flutterhole/core/models/failures.dart';
import 'package:flutterhole/features/settings/blocs/pihole_settings_bloc.dart';
import 'package:flutterhole/features/settings/data/models/pihole_settings.dart';
import 'package:flutterhole/widgets/layout/failure_indicators.dart';
import 'package:flutterhole/widgets/layout/loading_indicators.dart';
import 'package:flutterhole/widgets/layout/snackbars.dart';

class AuthenticationStatusIcon extends StatelessWidget {
const AuthenticationStatusIcon({
Expand All @@ -22,23 +24,38 @@ class AuthenticationStatusIcon extends StatelessWidget {
_,
__,
dartz.Either<Failure, bool> authenticatedStatus,
___,
___,
) {
return authenticatedStatus.fold<Widget>(
(Failure failure) => Icon(
KIcons.error,
color: KColors.error,
(Failure failure) =>
FailureIconButton(
failure: failure,
title: Text('Authentication failed'),
),
(bool isAuthenticated) {
return Icon(
isAuthenticated ? KIcons.success : KIcons.error,
color: isAuthenticated ? KColors.success : KColors.error,
return isAuthenticated
? IconButton(
icon: Icon(
KIcons.success,
color: KColors.success,
),
onPressed: () {
showInfoSnackBar(
context, 'Authentication successful');
},
)
: FailureIconButton(
failure: Failure('Is your API token correct?'),
title: Text('Authentication failed'),
);
},
);
},
loading: () => LoadingIcon(),
orElse: () => Icon(KIcons.debug, color: Colors.transparent,));
orElse: () =>
IconButton(
icon: LoadingIcon(),
onPressed: null,
));
},
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,57 +6,75 @@ import 'package:flutterhole/core/models/failures.dart';
import 'package:flutterhole/features/pihole_api/data/models/pi_status.dart';
import 'package:flutterhole/features/settings/blocs/pihole_settings_bloc.dart';
import 'package:flutterhole/features/settings/data/models/pihole_settings.dart';
import 'package:flutterhole/widgets/layout/failure_indicators.dart';
import 'package:flutterhole/widgets/layout/loading_indicators.dart';
import 'package:flutterhole/widgets/layout/snackbars.dart';

class _SuccessIconButton extends StatelessWidget {
const _SuccessIconButton({
Key key,
}) : super(key: key);

@override
Widget build(BuildContext context) {
return IconButton(
icon: Icon(
KIcons.success,
color: KColors.success,
),
onPressed: () {
showInfoSnackBar(context, 'Host connection established');
},
);
}
}

class HostDetailsStatusIcon extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<PiholeSettingsBloc, PiholeSettingsState>(
builder: (BuildContext context, PiholeSettingsState state) {
return state.maybeWhen<Widget>(
validated: (
PiholeSettings settings,
dartz.Either<Failure, int> hostStatusCode,
dartz.Either<Failure, PiStatusEnum> piholeStatus,
_,
__,
) {
return hostStatusCode.fold<Widget>(
(Failure failure) => Icon(
KIcons.error,
color: KColors.error,
),
(int statusCode) {
return piholeStatus.fold<Widget>(
(Failure failure) => Icon(
KIcons.error,
color: KColors.error,
),
(PiStatusEnum piStatus) {
switch (piStatus) {
case PiStatusEnum.enabled:
case PiStatusEnum.disabled:
return Icon(
KIcons.success,
color: KColors.success,
);
case PiStatusEnum.unknown:
default:
return Icon(
KIcons.error,
color: KColors.error,
);
}
},
);
},
);
},
loading: () => LoadingIcon(),
orElse: () => Icon(
KIcons.debug,
color: Colors.transparent,
));
validated: (
PiholeSettings settings,
dartz.Either<Failure, int> hostStatusCode,
dartz.Either<Failure, PiStatusEnum> piholeStatus,
_,
__,
) {
return hostStatusCode.fold<Widget>(
(Failure failure) => FailureIconButton(
failure: failure,
title: Text('Fetching host status failed'),
),
(int statusCode) {
return piholeStatus.fold<Widget>(
(Failure failure) => FailureIconButton(
failure: failure,
title: Text('Fetching Pi-hole status failed'),
),
(PiStatusEnum piStatus) {
switch (piStatus) {
case PiStatusEnum.enabled:
case PiStatusEnum.disabled:
return _SuccessIconButton();
case PiStatusEnum.unknown:
default:
return FailureIconButton(
failure: null,
title: Text('Unknown Pi-hole status'),
);
}
},
);
},
);
},
orElse: () => IconButton(
icon: LoadingIcon(),
onPressed: null,
),
);
},
);
}
Expand Down
24 changes: 24 additions & 0 deletions lib/widgets/layout/dialogs.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutterhole/core/models/failures.dart';

Future<void> showWelcomeDialog(BuildContext context) {
return showDialog(
Expand Down Expand Up @@ -62,3 +63,26 @@ Future<bool> showConfirmationDialog(

return result ?? false;
}

Future<void> showFailureDialog(
BuildContext context,
Failure failure, {
Widget title,
}) async {
showDialog<void>(
context: context,
builder: (BuildContext dialogContext) {
return AlertDialog(
title: title,
content: SingleChildScrollView(
child: ListBody(
children: <Widget>[
Text('${failure?.message ?? 'unknown failure'}'),
Text('${failure?.error?.toString() ?? ''}'),
],
),
),
);
},
);
}
31 changes: 31 additions & 0 deletions lib/widgets/layout/failure_indicators.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutterhole/constants.dart';
import 'package:flutterhole/core/models/failures.dart';
import 'package:flutterhole/widgets/layout/dialogs.dart';

class CenteredFailureIndicator extends StatelessWidget {
const CenteredFailureIndicator(
Expand All @@ -20,3 +22,32 @@ class CenteredFailureIndicator extends StatelessWidget {
);
}
}

class FailureIconButton extends StatelessWidget {
const FailureIconButton({
Key key,
@required this.failure,
this.title,
}) : super(key: key);

final Failure failure;
final Widget title;

@override
Widget build(BuildContext context) {
return IconButton(
tooltip: 'Show failure',
icon: Icon(
KIcons.error,
color: KColors.error,
),
onPressed: () {
showFailureDialog(
context,
failure,
title: title,
);
},
);
}
}

0 comments on commit 7c53759

Please sign in to comment.