Skip to content
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
107 changes: 48 additions & 59 deletions lib/authentication/view/authentication_page.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/authentication/bloc/authentication_bloc.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/authentication/widgets/auth_layout.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/l10n/l10n.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/router/routes.dart';
import 'package:go_router/go_router.dart';
Expand Down Expand Up @@ -52,68 +53,56 @@ class AuthenticationPage extends StatelessWidget {
state.status == AuthenticationStatus.loading ||
state.status == AuthenticationStatus.requestCodeLoading;

return Padding(
padding: const EdgeInsets.all(AppSpacing.paddingLarge),
child: Center(
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// --- Icon ---
Padding(
padding: const EdgeInsets.only(bottom: AppSpacing.xl),
child: Icon(
Icons.newspaper,
size: AppSpacing.xxl * 2,
color: colorScheme.primary,
),
),
// --- Headline and Subheadline ---
Text(
l10n.authenticationPageHeadline,
style: textTheme.headlineMedium?.copyWith(
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
const SizedBox(height: AppSpacing.md),
Text(
l10n.authenticationPageSubheadline,
style: textTheme.bodyLarge?.copyWith(
color: colorScheme.onSurfaceVariant,
),
textAlign: TextAlign.center,
),
const SizedBox(height: AppSpacing.xxl),
return AuthLayout(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// --- Icon ---
Padding(
padding: const EdgeInsets.only(bottom: AppSpacing.xl),
child: Icon(
Icons.newspaper,
size: AppSpacing.xxl * 2,
color: colorScheme.primary,
),
),
// --- Headline and Subheadline ---
Text(
l10n.authenticationPageHeadline,
style: textTheme.headlineMedium?.copyWith(
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
const SizedBox(height: AppSpacing.md),
Text(
l10n.authenticationPageSubheadline,
style: textTheme.bodyLarge?.copyWith(
color: colorScheme.onSurfaceVariant,
),
textAlign: TextAlign.center,
),
const SizedBox(height: AppSpacing.xxl),

// --- Email Sign-In Button ---
ElevatedButton.icon(
icon: const Icon(Icons.email_outlined),
onPressed: isLoading
? null
: () {
context.goNamed(Routes.requestCodeName);
},
label: Text(l10n.authenticationEmailSignInButton),
style: ElevatedButton.styleFrom(
padding: const EdgeInsets.symmetric(
vertical: AppSpacing.md,
),
textStyle: textTheme.labelLarge,
),
// --- Email Sign-In Button ---
ElevatedButton.icon(
icon: const Icon(Icons.email_outlined),
onPressed: isLoading
? null
: () => context.goNamed(Routes.requestCodeName),
label: Text(l10n.authenticationEmailSignInButton),
style: ElevatedButton.styleFrom(
padding: const EdgeInsets.symmetric(
vertical: AppSpacing.md,
),
const SizedBox(height: AppSpacing.lg),

// --- Loading Indicator ---
if (isLoading)
const Padding(
padding: EdgeInsets.only(top: AppSpacing.xl),
child: Center(child: CircularProgressIndicator()),
),
],
textStyle: textTheme.labelLarge,
),
),
),
const SizedBox(height: AppSpacing.lg),
if (isLoading)
const Center(child: CircularProgressIndicator()),
],
),
);
},
Expand Down
110 changes: 52 additions & 58 deletions lib/authentication/view/email_code_verification_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/app/bloc/app_bloc.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/app/config/config.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/authentication/bloc/authentication_bloc.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/authentication/widgets/auth_layout.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/l10n/l10n.dart';
import 'package:pinput/pinput.dart';
import 'package:ui_kit/ui_kit.dart';
Expand Down Expand Up @@ -45,65 +46,58 @@ class EmailCodeVerificationPage extends StatelessWidget {
builder: (context, state) {
final isLoading = state.status == AuthenticationStatus.loading;

return Padding(
padding: const EdgeInsets.all(AppSpacing.paddingLarge),
child: Center(
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Icon(
Icons.mark_email_read_outlined,
size: AppSpacing.xxl * 2,
color: colorScheme.primary,
),
const SizedBox(height: AppSpacing.xl),
Text(
l10n.emailCodeSentConfirmation(email),
style: textTheme.headlineSmall?.copyWith(
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
const SizedBox(height: AppSpacing.lg),
Text(
l10n.emailCodeSentInstructions,
style: textTheme.bodyLarge?.copyWith(
color: colorScheme.onSurfaceVariant,
),
textAlign: TextAlign.center,
),
// Display demo code if in demo environment
BlocSelector<AppBloc, AppState, AppEnvironment?>(
selector: (state) => state.environment,
builder: (context, environment) {
if (environment == AppEnvironment.demo) {
return Column(
children: [
const SizedBox(height: AppSpacing.md),
Text(
l10n.demoCodeHint('123456'),
style: textTheme.bodyMedium?.copyWith(
color: colorScheme.secondary,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
],
);
}
return const SizedBox.shrink();
},
),
const SizedBox(height: AppSpacing.xl),
_EmailCodeVerificationForm(
email: email,
isLoading: isLoading,
),
],
return AuthLayout(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Icon(
Icons.mark_email_read_outlined,
size: AppSpacing.xxl * 2,
color: colorScheme.primary,
),
),
const SizedBox(height: AppSpacing.xl),
Text(
l10n.emailCodeSentConfirmation(email),
style: textTheme.headlineSmall?.copyWith(
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
const SizedBox(height: AppSpacing.lg),
Text(
l10n.emailCodeSentInstructions,
style: textTheme.bodyLarge?.copyWith(
color: colorScheme.onSurfaceVariant,
),
textAlign: TextAlign.center,
),
// Display demo code if in demo environment
BlocSelector<AppBloc, AppState, AppEnvironment?>(
selector: (state) => state.environment,
builder: (context, environment) {
if (environment == AppEnvironment.demo) {
return Padding(
padding: const EdgeInsets.only(top: AppSpacing.md),
child: Text(
l10n.demoCodeHint('123456'),
style: textTheme.bodyMedium?.copyWith(
color: colorScheme.secondary,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
);
}
return const SizedBox.shrink();
},
),
const SizedBox(height: AppSpacing.xl),
_EmailCodeVerificationForm(
email: email,
isLoading: isLoading,
),
],
),
);
},
Expand Down
117 changes: 55 additions & 62 deletions lib/authentication/view/request_code_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/app/bloc/app_bloc.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/app/config/config.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/authentication/bloc/authentication_bloc.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/authentication/widgets/auth_layout.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/l10n/l10n.dart';
import 'package:flutter_news_app_web_dashboard_full_source_code/router/routes.dart';
import 'package:go_router/go_router.dart';
Expand Down Expand Up @@ -101,69 +102,61 @@ class _RequestCodeView extends StatelessWidget {
final isLoading =
state.status == AuthenticationStatus.requestCodeLoading;

return Padding(
padding: const EdgeInsets.all(AppSpacing.paddingLarge),
child: Center(
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// --- Icon ---
Padding(
padding: const EdgeInsets.only(bottom: AppSpacing.xl),
child: Icon(
Icons.email_outlined,
size: AppSpacing.xxl * 2,
color: colorScheme.primary,
),
),
// const SizedBox(height: AppSpacing.lg),
// --- Explanation Text ---
Text(
l10n.requestCodePageHeadline,
style: textTheme.headlineSmall?.copyWith(
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
const SizedBox(height: AppSpacing.md),
Text(
l10n.requestCodePageSubheadline,
style: textTheme.bodyLarge?.copyWith(
color: colorScheme.onSurfaceVariant,
),
textAlign: TextAlign.center,
),
// Display demo email if in demo environment
BlocSelector<AppBloc, AppState, AppEnvironment?>(
selector: (state) => state.environment,
builder: (context, environment) {
if (environment == AppEnvironment.demo) {
return Padding(
padding: const EdgeInsets.only(
top: AppSpacing.lg,
),
child: Text(
l10n.demoEmailHint(
'admin@example.com | publisher@example.com',
),
style: textTheme.bodyMedium?.copyWith(
color: colorScheme.secondary,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
);
}
return const SizedBox.shrink();
},
),
const SizedBox(height: AppSpacing.xxl),
_EmailLinkForm(isLoading: isLoading),
],
return AuthLayout(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// --- Icon ---
Padding(
padding: const EdgeInsets.only(bottom: AppSpacing.xl),
child: Icon(
Icons.email_outlined,
size: AppSpacing.xxl * 2,
color: colorScheme.primary,
),
),
// --- Explanation Text ---
Text(
l10n.requestCodePageHeadline,
style: textTheme.headlineSmall?.copyWith(
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
const SizedBox(height: AppSpacing.md),
Text(
l10n.requestCodePageSubheadline,
style: textTheme.bodyLarge?.copyWith(
color: colorScheme.onSurfaceVariant,
),
textAlign: TextAlign.center,
),
// Display demo email if in demo environment
BlocSelector<AppBloc, AppState, AppEnvironment?>(
selector: (state) => state.environment,
builder: (context, environment) {
if (environment == AppEnvironment.demo) {
return Padding(
padding: const EdgeInsets.only(top: AppSpacing.lg),
child: Text(
l10n.demoEmailHint(
'admin@example.com | publisher@example.com',
),
style: textTheme.bodyMedium?.copyWith(
color: colorScheme.secondary,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
);
}
return const SizedBox.shrink();
},
),
),
const SizedBox(height: AppSpacing.xxl),
_EmailLinkForm(isLoading: isLoading),
],
),
);
},
Expand Down
Loading
Loading