Implementation
@override
Widget build(BuildContext context, WidgetRef ref) {
final lang = L10n.of(context);
final colorScheme = Theme.of(context).colorScheme;
final isBackupEnabled = ref.watch(
isActiveProvider(LabsFeature.encryptionBackup),
);
final helpCenterUrl = helpUrl;
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
_settingMenuSection(
context: context,
sectionTitle: lang.community,
children: [
MenuItemWidget(
innerKey: SettingsMenu.superInvitations,
iconData: Atlas.plus_envelope_thin,
enabled: ref.watch(hasSuperTokensAccess).valueOrNull == true,
iconColor: routedColor(context, ref, Routes.settingsSuperInvites),
title: lang.superInvitations,
subTitle: lang.manageYourInvitationCodes,
titleStyles: TextStyle(
color: routedColor(context, ref, Routes.settingsSuperInvites),
),
onTap: () async {
final hasAccess = await ref.read(hasSuperTokensAccess.future);
if (!hasAccess) return;
if (!context.mounted) return;
if (!isFullPage && context.isLargeScreen) {
context.pushReplacementNamed(
Routes.settingsSuperInvites.name,
);
} else {
context.pushNamed(Routes.settingsSuperInvites.name);
}
},
),
],
),
_settingMenuSection(
context: context,
sectionTitle: lang.behaviorSettingsTitle,
children: [
MenuItemWidget(
iconData: Atlas.language_translation,
title: lang.language,
iconColor: routedColor(context, ref, Routes.settingLanguage),
titleStyles: TextStyle(
color: routedColor(context, ref, Routes.settingLanguage),
),
onTap: () {
if (!isFullPage && context.isLargeScreen) {
context.pushReplacementNamed(Routes.settingLanguage.name);
} else {
context.pushNamed(Routes.settingLanguage.name);
}
},
),
MenuItemWidget(
iconData: Atlas.bell_mobile_thin,
iconColor: routedColor(context, ref, Routes.settingNotifications),
title: lang.notifications,
titleStyles: TextStyle(
color: routedColor(context, ref, Routes.settingNotifications),
),
onTap: () async {
if (!isFullPage && context.isLargeScreen) {
context.pushReplacementNamed(
Routes.settingNotifications.name,
);
} else {
context.pushNamed(Routes.settingNotifications.name);
}
},
),
MenuItemWidget(
iconData: PhosphorIconsThin.chat,
iconColor: routedColor(context, ref, Routes.settingsChat),
title: lang.chat,
titleStyles: TextStyle(
color: routedColor(context, ref, Routes.settingsChat),
),
onTap: () {
if (!isFullPage && context.isLargeScreen) {
context.pushReplacementNamed(Routes.settingsChat.name);
} else {
context.pushNamed(Routes.settingsChat.name);
}
},
),
MenuItemWidget(
iconData: PhosphorIconsThin.calendar,
iconColor: routedColor(context, ref, Routes.settingsCalendar),
title: lang.calendar,
titleStyles: TextStyle(
color: routedColor(context, ref, Routes.settingsCalendar),
),
onTap: () async {
if (!isFullPage && context.isLargeScreen) {
context.pushReplacementNamed(Routes.settingsCalendar.name);
} else {
context.pushNamed(Routes.settingsCalendar.name);
}
},
),
MenuItemWidget(
iconData: PhosphorIconsThin.faders,
iconColor: routedColor(
context,
ref,
Routes.settingsCustomizations,
),
title: lang.customizationsTitle,
titleStyles: TextStyle(
color: routedColor(context, ref, Routes.settingsCustomizations),
),
onTap: () {
if (!isFullPage && context.isLargeScreen) {
context.pushReplacementNamed(
Routes.settingsCustomizations.name,
);
} else {
context.pushNamed(Routes.settingsCustomizations.name);
}
},
),
],
),
_settingMenuSection(
context: context,
sectionTitle: lang.securityAndPrivacy,
children: [
MenuItemWidget(
iconData: Atlas.passcode,
iconColor: routedColor(context, ref, Routes.changePassword),
title: lang.changePassword,
subTitle: lang.changePasswordDescription,
titleStyles: TextStyle(
color: routedColor(context, ref, Routes.changePassword),
),
onTap: () {
if (!isFullPage && context.isLargeScreen) {
context.pushReplacementNamed(Routes.changePassword.name);
} else {
context.pushNamed(Routes.changePassword.name);
}
},
),
MenuItemWidget(
innerKey: SettingsMenu.emailAddresses,
iconData: Atlas.envelope_paper_email_thin,
iconColor: routedColor(context, ref, Routes.emailAddresses),
title: lang.emailAddresses,
subTitle: lang.connectedToYourAccount,
titleStyles: TextStyle(
color: routedColor(context, ref, Routes.emailAddresses),
),
onTap: () {
if (!isFullPage && context.isLargeScreen) {
context.pushReplacementNamed(Routes.emailAddresses.name);
} else {
context.pushNamed(Routes.emailAddresses.name);
}
},
),
MenuItemWidget(
iconData: Atlas.key_monitor_thin,
iconColor: routedColor(context, ref, Routes.settingSessions),
title: lang.sessions,
subTitle: lang.yourActiveDevices,
titleStyles: TextStyle(
color: routedColor(context, ref, Routes.settingSessions),
),
onTap: () {
if (!isFullPage && context.isLargeScreen) {
context.pushReplacementNamed(Routes.settingSessions.name);
} else {
context.pushNamed(Routes.settingSessions.name);
}
},
),
if (isBackupEnabled)
MenuItemWidget(
iconData: Atlas.key_website_thin,
iconColor: routedColor(context, ref, Routes.settingBackup),
title: lang.settingsKeyBackUpTitle,
subTitle: lang.settingsKeyBackUpDesc,
titleStyles: TextStyle(
color: routedColor(context, ref, Routes.settingBackup),
),
onTap: () {
if (!isFullPage && context.isLargeScreen) {
context.pushReplacementNamed(Routes.settingBackup.name);
} else {
context.pushNamed(Routes.settingBackup.name);
}
},
),
MenuItemWidget(
iconData: Atlas.users_thin,
iconColor: routedColor(context, ref, Routes.blockedUsers),
title: lang.blockedUsers,
subTitle: lang.usersYouBlocked,
titleStyles: TextStyle(
color: routedColor(context, ref, Routes.blockedUsers),
),
onTap: () {
if (!isFullPage && context.isLargeScreen) {
context.pushReplacementNamed(Routes.blockedUsers.name);
} else {
context.pushNamed(Routes.blockedUsers.name);
}
},
),
],
),
_settingMenuSection(
context: context,
sectionTitle: lang.acter,
children: [
MenuItemWidget(
key: SettingsMenu.labs,
iconData: Atlas.lab_appliance_thin,
iconColor: routedColor(context, ref, Routes.settingsLabs),
title: lang.labs,
subTitle: lang.experimentalActerFeatures,
titleStyles: TextStyle(
color: routedColor(context, ref, Routes.settingsLabs),
),
onTap: () {
if (!isFullPage && context.isLargeScreen) {
context.pushReplacementNamed(Routes.settingsLabs.name);
} else {
context.pushNamed(Routes.settingsLabs.name);
}
},
),
MenuItemWidget(
iconData: Atlas.info_circle_thin,
iconColor: routedColor(context, ref, Routes.info),
title: lang.info,
titleStyles: TextStyle(
color: routedColor(context, ref, Routes.info),
),
onTap: () {
if (!isFullPage && context.isLargeScreen) {
context.pushReplacementNamed(Routes.info.name);
} else {
context.pushNamed(Routes.info.name);
}
},
),
if (helpCenterUrl != null)
MenuItemWidget(
iconData: PhosphorIcons.question(),
title: lang.helpCenterTitle,
subTitle: lang.helpCenterDesc,
trailing: Icon(PhosphorIcons.arrowSquareOut()),
onTap: () => launchUrl(helpCenterUrl),
),
],
),
_settingMenuSection(
context: context,
sectionTitle: lang.dangerZone,
isDanderZone: true,
children: [
MenuItemWidget(
key: SettingsMenu.logoutAccount,
iconData: Atlas.exit_thin,
iconColor: colorScheme.error,
title: lang.logOut,
subTitle: lang.closeSessionAndDeleteData,
titleStyles: TextStyle(color: colorScheme.error),
onTap: () => logoutConfirmationDialog(context, ref),
),
MenuItemWidget(
key: SettingsMenu.deactivateAccount,
iconData: Atlas.trash_can_thin,
iconColor: colorScheme.error,
title: lang.deactivateAccount,
subTitle: lang.irreversiblyDeactivateAccount,
titleStyles: TextStyle(color: colorScheme.error),
onTap: () => deactivationConfirmationDialog(context, ref),
),
],
),
const SizedBox(height: 20),
],
);
}