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

Restructure settings #481

Merged
merged 6 commits into from
May 27, 2023
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
3 changes: 3 additions & 0 deletions lib/base/strings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -279,10 +279,12 @@ abstract final class Strings {
static const frequentlyAskedQuestions = 'Frequently Asked Questions';
static const faq = 'FAQ';
static const openingHours = 'Opening hours';
static const notAvailable = 'Not available';
static const today = 'Today';

static const name = 'Name';
static const occupation = 'Occupation';
static const occupationPlaceholder = 'Occupation name fullname';
static const appearAnonymous = 'Appear anonymous on leaderboard';
static const appearAnonymousSmall = 'Appear anonymous';
static const yourProfileDescription =
Expand Down Expand Up @@ -371,4 +373,5 @@ abstract final class Strings {
"Can't connect to Analog. Are you connected to the internet?";
static const String retry = 'Retry';
static const String unknownErrorOccured = 'An unknown error occured';
static const String loading = 'Loading';
}
6 changes: 3 additions & 3 deletions lib/features/contributor/presentation/pages/credits_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ import 'package:coffeecard/base/strings.dart';
import 'package:coffeecard/base/style/colors.dart';
import 'package:coffeecard/base/style/text_styles.dart';
import 'package:coffeecard/core/external/external_url_launcher.dart';
import 'package:coffeecard/core/widgets/images/analogio_logo.dart';
import 'package:coffeecard/features/contributor/presentation/cubit/contributor_cubit.dart';
import 'package:coffeecard/features/contributor/presentation/widgets/contributor_card.dart';
import 'package:coffeecard/features/settings/presentation/widgets/settings_group.dart';
import 'package:coffeecard/features/settings/presentation/widgets/settings_list_entry.dart';
import 'package:coffeecard/service_locator.dart';
import 'package:coffeecard/utils/api_uri_constants.dart';
import 'package:coffeecard/widgets/components/images/analogio_logo.dart';
import 'package:coffeecard/widgets/components/scaffold.dart';
import 'package:coffeecard/widgets/components/section_title.dart';
import 'package:coffeecard/widgets/components/settings_group.dart';
import 'package:coffeecard/widgets/components/settings_list_entry.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:gap/gap.dart';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import 'package:coffeecard/base/strings.dart';
import 'package:coffeecard/base/style/colors.dart';
import 'package:coffeecard/base/style/text_styles.dart';
import 'package:coffeecard/core/widgets/list_entry.dart';
import 'package:coffeecard/features/settings/presentation/widgets/user_icon.dart';
import 'package:coffeecard/widgets/components/helpers/shimmer_builder.dart';
import 'package:coffeecard/widgets/components/list_entry.dart';
import 'package:coffeecard/widgets/components/user/user_icon.dart';
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import 'package:coffeecard/base/strings.dart';
import 'package:coffeecard/core/widgets/list_entry.dart';
import 'package:coffeecard/features/occupation/domain/entities/occupation.dart';
import 'package:coffeecard/widgets/components/list_entry.dart';
import 'package:coffeecard/features/settings/presentation/widgets/settings_list_entry.dart';
import 'package:coffeecard/widgets/components/section_title.dart';
import 'package:coffeecard/widgets/components/settings_list_entry.dart';
import 'package:coffeecard/widgets/components/tickets/rounded_button.dart';
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import 'package:animations/animations.dart';
import 'package:coffeecard/base/style/colors.dart';
import 'package:coffeecard/base/style/text_styles.dart';
import 'package:coffeecard/core/widgets/list_entry.dart';
import 'package:coffeecard/features/receipt/presentation/pages/view_receipt_page.dart';
import 'package:coffeecard/widgets/components/helpers/shimmer_builder.dart';
import 'package:coffeecard/widgets/components/list_entry.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import 'package:coffeecard/base/strings.dart';
import 'package:coffeecard/base/style/colors.dart';
import 'package:coffeecard/base/style/text_styles.dart';
import 'package:coffeecard/core/widgets/images/analog_logo.dart';
import 'package:coffeecard/utils/responsive.dart';
import 'package:coffeecard/utils/time_since.dart';
import 'package:coffeecard/widgets/components/card.dart';
import 'package:coffeecard/widgets/components/images/analog_logo.dart';
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
import 'package:intl/intl.dart';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import 'package:coffeecard/base/strings.dart';
import 'package:coffeecard/cubits/authentication/authentication_cubit.dart';
import 'package:coffeecard/features/settings/presentation/widgets/forms/change_email_form.dart';
import 'package:coffeecard/features/user/presentation/cubit/user_cubit.dart';
import 'package:coffeecard/widgets/components/dialog.dart';
import 'package:coffeecard/widgets/components/forms/settings/change_email_form.dart';
import 'package:coffeecard/widgets/components/scaffold.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:coffeecard/base/strings.dart';
import 'package:coffeecard/widgets/components/forms/settings/change_name_form.dart';
import 'package:coffeecard/features/settings/presentation/widgets/forms/change_name_form.dart';
import 'package:coffeecard/widgets/components/scaffold.dart';
import 'package:flutter/material.dart';

Expand Down
21 changes: 21 additions & 0 deletions lib/features/settings/presentation/pages/faq_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import 'package:coffeecard/base/strings.dart';
import 'package:coffeecard/features/settings/presentation/widgets/faq.dart';
import 'package:coffeecard/widgets/components/scaffold.dart';
import 'package:flutter/material.dart';

class FAQPage extends StatelessWidget {
static Route get route => MaterialPageRoute(builder: (_) => FAQPage());

@override
Widget build(BuildContext context) {
return AppScaffold.withTitle(
title: Strings.faq,
body: ListView(
padding: const EdgeInsets.all(16),
children: Strings.faqEntries.entries
.map((e) => FAQ(question: e.key, answer: e.value))
.toList(),
),
);
}
}
35 changes: 35 additions & 0 deletions lib/features/settings/presentation/pages/settings_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import 'package:coffeecard/base/strings.dart';
import 'package:coffeecard/features/settings/presentation/widgets/sections/about_section.dart';
import 'package:coffeecard/features/settings/presentation/widgets/sections/account_section.dart';
import 'package:coffeecard/features/settings/presentation/widgets/sections/footer.dart';
import 'package:coffeecard/features/settings/presentation/widgets/sections/profile_section.dart';
import 'package:coffeecard/widgets/components/scaffold.dart';
import 'package:flutter/material.dart';

class SettingsPage extends StatelessWidget {
const SettingsPage._({required this.scrollController});

static Route routeWith({required ScrollController scrollController}) {
return MaterialPageRoute(
builder: (_) => SettingsPage._(scrollController: scrollController),
);
}

final ScrollController scrollController;

@override
Widget build(BuildContext context) {
return AppScaffold.withTitle(
title: Strings.settingsPageTitle,
body: ListView(
controller: scrollController,
children: const [
ProfileSection(),
AccountSection(),
AboutSection(),
Footer(),
],
),
);
}
}
41 changes: 41 additions & 0 deletions lib/features/settings/presentation/pages/your_profile_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import 'package:coffeecard/base/strings.dart';
import 'package:coffeecard/features/settings/presentation/widgets/edit_profile.dart';
import 'package:coffeecard/features/user/presentation/cubit/user_cubit.dart';
import 'package:coffeecard/widgets/components/loading.dart';
import 'package:coffeecard/widgets/components/scaffold.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

class YourProfilePage extends StatelessWidget {
const YourProfilePage();

static Route get route =>
MaterialPageRoute(builder: (_) => const YourProfilePage());

@override
Widget build(BuildContext context) {
return AppScaffold.withTitle(
title: Strings.yourProfilePageTitle,
body: BlocBuilder<UserCubit, UserState>(
buildWhen: (_, current) => current is UserLoaded,
builder: (_, userLoadedState) {
if (userLoadedState is! UserLoaded) return const SizedBox.shrink();

return BlocBuilder<UserCubit, UserState>(
buildWhen: (previous, current) =>
previous is UserUpdating || current is UserUpdating,
builder: (context, state) {
return Loading(
loading: state is UserUpdating,
child: SingleChildScrollView(
padding: const EdgeInsets.only(bottom: 36),
child: EditProfile(user: userLoadedState.user),
),
);
},
);
},
),
);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:coffeecard/base/strings.dart';
import 'package:coffeecard/widgets/components/forms/settings/change_passcode_form.dart';
import 'package:coffeecard/features/settings/presentation/widgets/forms/change_passcode_form.dart';
import 'package:coffeecard/widgets/components/scaffold.dart';
import 'package:coffeecard/widgets/routers/app_flow.dart';
import 'package:flutter/material.dart';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,55 +1,19 @@
import 'package:coffeecard/base/strings.dart';
import 'package:coffeecard/base/style/text_styles.dart';
import 'package:coffeecard/features/occupation/presentation/pages/change_occupation_page.dart';
import 'package:coffeecard/features/settings/presentation/pages/change_name_page.dart';
import 'package:coffeecard/features/settings/presentation/widgets/settings_group.dart';
import 'package:coffeecard/features/settings/presentation/widgets/settings_list_entry.dart';
import 'package:coffeecard/features/settings/presentation/widgets/user_icon.dart';
import 'package:coffeecard/features/user/domain/entities/user.dart';
import 'package:coffeecard/features/user/presentation/cubit/user_cubit.dart';
import 'package:coffeecard/utils/responsive.dart';
import 'package:coffeecard/widgets/components/loading.dart';
import 'package:coffeecard/widgets/components/scaffold.dart';
import 'package:coffeecard/widgets/components/settings_group.dart';
import 'package:coffeecard/widgets/components/settings_list_entry.dart';
import 'package:coffeecard/widgets/components/user/user_icon.dart';
import 'package:coffeecard/widgets/pages/settings/change_name_page.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:gap/gap.dart';

class YourProfilePage extends StatelessWidget {
const YourProfilePage();

static Route get route =>
MaterialPageRoute(builder: (_) => const YourProfilePage());

@override
Widget build(BuildContext context) {
return AppScaffold.withTitle(
title: Strings.yourProfilePageTitle,
body: BlocBuilder<UserCubit, UserState>(
buildWhen: (_, current) => current is UserLoaded,
builder: (_, userLoadedState) {
if (userLoadedState is! UserLoaded) return const SizedBox.shrink();

return BlocBuilder<UserCubit, UserState>(
buildWhen: (previous, current) =>
previous is UserUpdating || current is UserUpdating,
builder: (context, state) {
return Loading(
loading: state is UserUpdating,
child: SingleChildScrollView(
padding: const EdgeInsets.only(bottom: 36),
child: _EditProfile(user: userLoadedState.user),
),
);
},
);
},
),
);
}
}

class _EditProfile extends StatelessWidget {
const _EditProfile({required this.user});
class EditProfile extends StatelessWidget {
const EditProfile({required this.user});

final User user;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,7 @@
import 'package:coffeecard/base/strings.dart';
import 'package:coffeecard/base/style/text_styles.dart';
import 'package:coffeecard/widgets/components/scaffold.dart';
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';

class FAQPage extends StatelessWidget {
static Route get route => MaterialPageRoute(builder: (_) => FAQPage());

@override
Widget build(BuildContext context) {
return AppScaffold.withTitle(
title: Strings.faq,
body: ListView(
padding: const EdgeInsets.all(16),
children: Strings.faqEntries.entries
.map((e) => FAQ(question: e.key, answer: e.value))
.toList(),
),
);
}
}

class FAQ extends StatefulWidget {
const FAQ({required this.question, required this.answer});

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import 'package:coffeecard/base/strings.dart';
import 'package:coffeecard/features/settings/presentation/widgets/forms/change_passcode_repeat_form.dart';
import 'package:coffeecard/utils/fast_slide_transition.dart';
import 'package:coffeecard/utils/input_validator.dart';
import 'package:coffeecard/widgets/components/forms/form.dart';
import 'package:coffeecard/widgets/components/forms/settings/change_passcode_repeat_form.dart';
import 'package:flutter/material.dart';

class ChangePasscodeForm extends StatelessWidget {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import 'package:coffeecard/base/strings.dart';
import 'package:coffeecard/core/external/external_url_launcher.dart';
import 'package:coffeecard/features/contributor/presentation/pages/credits_page.dart';
import 'package:coffeecard/features/settings/presentation/pages/faq_page.dart';
import 'package:coffeecard/features/settings/presentation/widgets/setting_value_text.dart';
import 'package:coffeecard/features/settings/presentation/widgets/settings_group.dart';
import 'package:coffeecard/features/settings/presentation/widgets/settings_list_entry.dart';
import 'package:coffeecard/service_locator.dart';
import 'package:coffeecard/utils/api_uri_constants.dart';
import 'package:flutter/material.dart';

class AboutSection extends StatelessWidget {
const AboutSection();

void faqTapCallback(BuildContext context) {
Navigator.push(context, FAQPage.route).ignore();
}

void privacyPolicyTapCallback(BuildContext context) {
sl<ExternalUrlLauncher>().launchUrlExternalApplication(
ApiUriConstants.privacyPolicyUri,
context,
);
}

void provideFeedbackTapCallback(BuildContext context) {
sl<ExternalUrlLauncher>().launchUrlExternalApplication(
ApiUriConstants.feedbackFormUri,
context,
);
}

@override
Widget build(BuildContext context) {
return SettingsGroup(
title: Strings.settingsGroupAbout,
listItems: [
SettingListEntry(
name: Strings.frequentlyAskedQuestions,
onTap: () => faqTapCallback(context),
),
const SettingListEntry(
name: Strings.openingHours,
valueWidget: SettingValueText(
value: Strings.notAvailable,
),
),
SettingListEntry(
name: Strings.privacyPolicy,
onTap: () => privacyPolicyTapCallback(context),
),
SettingListEntry(
name: Strings.provideFeedback,
onTap: () => provideFeedbackTapCallback(context),
),
SettingListEntry(
name: Strings.credits,
onTap: () => Navigator.push(context, CreditsPage.route).ignore(),
),
],
);
}
}
Loading