+ token verification
Some checks failed
ci/woodpecker/push/bff Pipeline was successful
ci/woodpecker/push/db Pipeline was successful
ci/woodpecker/push/billing_fees Pipeline was successful
ci/woodpecker/push/chain_gateway Pipeline was successful
ci/woodpecker/push/fx_ingestor Pipeline was successful
ci/woodpecker/push/fx_oracle Pipeline failed
ci/woodpecker/push/frontend Pipeline was successful
ci/woodpecker/push/nats Pipeline was successful
ci/woodpecker/push/ledger Pipeline was successful
ci/woodpecker/push/notification Pipeline was successful
ci/woodpecker/push/payments_orchestrator Pipeline was successful
ci/woodpecker/push/bump_version unknown status

This commit is contained in:
Stephan D
2025-11-24 20:53:42 +01:00
parent b4f6f63871
commit d65e442cb6
10 changed files with 217 additions and 23 deletions

View File

@@ -0,0 +1,20 @@
import 'package:flutter/material.dart';
import 'package:pweb/pages/errors/error.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
class StatusPageFailure extends StatelessWidget {
final String errorMessage;
final Object error;
const StatusPageFailure({ super.key, required this.errorMessage, required this.error });
@override
Widget build(BuildContext context) => exceptionToErrorPage(
context: context,
title: AppLocalizations.of(context)!.verificationFailed,
errorMessage: errorMessage,
exception: error,
);
}

View File

@@ -0,0 +1,78 @@
import 'package:flutter/material.dart';
import 'package:pshared/widgets/locale.dart';
import 'package:pweb/pages/status/failure.dart';
import 'package:pweb/pages/status/success.dart';
import 'package:pweb/pages/with_footer.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
class StatusPage<T> extends StatefulWidget {
final Future<T> Function() operation;
final String errorMessage;
final IconData? successIcon;
final String successMessage;
final String successDescription;
final Widget? successAction;
const StatusPage({
super.key,
required this.operation,
required this.errorMessage,
this.successIcon,
required this.successMessage,
required this.successDescription,
this.successAction,
});
@override
State<StatusPage<T>> createState() => _StatusPageState<T>();
}
class _StatusPageState<T> extends State<StatusPage<T>> {
late Future<T> _operation;
@override
void initState() {
super.initState();
_operation = widget.operation();
}
@override
Widget build(BuildContext context) => PageWithFooter(
appBar: AppBar(
title: Text(AppLocalizations.of(context)!.verifyAccount),
centerTitle: true,
actions: [
const LocaleChangerDropdown(
availableLocales: AppLocalizations.supportedLocales,
),
],
),
child: FutureBuilder<T>(
future: _operation,
builder: (context, snapshot) {
if (snapshot.hasError) {
return StatusPageFailure(
errorMessage: widget.errorMessage,
error: snapshot.error!,
);
}
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
}
return StatusPageSuccess(
successMessage: widget.successMessage,
successDescription: widget.successDescription,
icon: widget.successIcon,
action: widget.successAction,
);
},
),
);
}

View File

@@ -0,0 +1,45 @@
import 'package:flutter/material.dart';
class StatusPageSuccess extends StatelessWidget {
final IconData? icon;
final String successMessage;
final String successDescription;
final Widget? action;
const StatusPageSuccess({
super.key,
required this.successMessage,
required this.successDescription,
this.action,
this.icon,
});
@override
Widget build(BuildContext context) => Center(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Icon(icon ?? Icons.check_circle_outline, size: 72, color: Theme.of(context).colorScheme.primary),
const SizedBox(height: 16.0),
Text(
successMessage,
style: Theme.of(context).textTheme.titleMedium,
textAlign: TextAlign.center,
),
const SizedBox(height: 8.0),
Text(
successDescription,
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.bodyMedium,
),
const SizedBox(height: 20.0),
if (action != null)
action!,
],
),
),
);
}