Co-authored-by: Inex Code <inex.code@selfprivacy.org>
pull/90/head
NaiJi ✨ 2022-05-25 15:21:56 +03:00
parent 14acfdec6b
commit 5dcaa060a1
32 changed files with 93 additions and 61 deletions

View File

@ -9,6 +9,10 @@
# packages, and plugins designed to encourage good coding practices. # packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml include: package:flutter_lints/flutter.yaml
analyzer:
exclude:
- lib/generated_plugin_registrant.dart
linter: linter:
# The lint rules applied to this project can be customized in the # The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml` # section below to disable rules from the `package:flutter_lints/flutter.yaml`

View File

@ -6,10 +6,10 @@ abstract class LengthStringValidation extends ValidationModel<String> {
: super(predicate, errorMessage); : super(predicate, errorMessage);
@override @override
String? check(String value) { String? check(String val) {
var length = value.length; var length = val.length;
var errorMessage = errorMassage.replaceAll('[]', length.toString()); var errorMessage = errorMassage.replaceAll('[]', length.toString());
return test(value) ? errorMessage : null; return test(val) ? errorMessage : null;
} }
} }

View File

@ -7,7 +7,7 @@ import 'package:selfprivacy/config/hive_config.dart';
import 'package:selfprivacy/theming/factory/app_theme_factory.dart'; import 'package:selfprivacy/theming/factory/app_theme_factory.dart';
import 'package:selfprivacy/ui/pages/setup/initializing.dart'; import 'package:selfprivacy/ui/pages/setup/initializing.dart';
import 'package:selfprivacy/ui/pages/onboarding/onboarding.dart'; import 'package:selfprivacy/ui/pages/onboarding/onboarding.dart';
import 'package:selfprivacy/ui/pages/rootRoute.dart'; import 'package:selfprivacy/ui/pages/root_route.dart';
import 'package:wakelock/wakelock.dart'; import 'package:wakelock/wakelock.dart';
import 'package:timezone/data/latest.dart' as tz; import 'package:timezone/data/latest.dart' as tz;
@ -55,9 +55,10 @@ void main() async {
class MyApp extends StatelessWidget { class MyApp extends StatelessWidget {
const MyApp({ const MyApp({
Key? key,
required this.lightThemeData, required this.lightThemeData,
required this.darkThemeData, required this.darkThemeData,
}); }) : super(key: key);
final ThemeData lightThemeData; final ThemeData lightThemeData;
final ThemeData darkThemeData; final ThemeData darkThemeData;
@ -84,7 +85,7 @@ class MyApp extends StatelessWidget {
themeMode: themeMode:
appSettings.isDarkModeOn ? ThemeMode.dark : ThemeMode.light, appSettings.isDarkModeOn ? ThemeMode.dark : ThemeMode.light,
home: appSettings.isOnboardingShowing home: appSettings.isOnboardingShowing
? OnboardingPage(nextPage: InitializingPage()) ? const OnboardingPage(nextPage: InitializingPage())
: const RootPage(), : const RootPage(),
builder: (BuildContext context, Widget? widget) { builder: (BuildContext context, Widget? widget) {
Widget error = const Text('...rendering error...'); Widget error = const Text('...rendering error...');

View File

@ -1,5 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:selfprivacy/ui/components/brand_button/FilledButton.dart'; import 'package:selfprivacy/ui/components/brand_button/filled_button.dart';
import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; import 'package:selfprivacy/ui/components/brand_text/brand_text.dart';
enum BrandButtonTypes { rised, text, iconText } enum BrandButtonTypes { rised, text, iconText }

View File

@ -15,7 +15,7 @@ class BrandMarkdown extends StatefulWidget {
final String fileName; final String fileName;
@override @override
_BrandMarkdownState createState() => _BrandMarkdownState(); State<BrandMarkdown> createState() => _BrandMarkdownState();
} }
class _BrandMarkdownState extends State<BrandMarkdown> { class _BrandMarkdownState extends State<BrandMarkdown> {

View File

@ -7,7 +7,7 @@ class BrandTabBar extends StatefulWidget {
final TabController? controller; final TabController? controller;
@override @override
_BrandTabBarState createState() => _BrandTabBarState(); State<BrandTabBar> createState() => _BrandTabBarState();
} }
class _BrandTabBarState extends State<BrandTabBar> { class _BrandTabBarState extends State<BrandTabBar> {

View File

@ -16,7 +16,7 @@ class BrandTimer extends StatefulWidget {
final Duration duration; final Duration duration;
@override @override
_BrandTimerState createState() => _BrandTimerState(); State<BrandTimer> createState() => _BrandTimerState();
} }
class _BrandTimerState extends State<BrandTimer> { class _BrandTimerState extends State<BrandTimer> {

View File

@ -3,7 +3,11 @@ import 'package:selfprivacy/config/brand_colors.dart';
import 'package:selfprivacy/logic/models/state_types.dart'; import 'package:selfprivacy/logic/models/state_types.dart';
class IconStatusMask extends StatelessWidget { class IconStatusMask extends StatelessWidget {
const IconStatusMask({required this.child, required this.status}); const IconStatusMask({
Key? key,
required this.child,
required this.status,
}) : super(key: key);
final Icon child; final Icon child;
final StateType status; final StateType status;

View File

@ -27,7 +27,7 @@ class NotReadyCard extends StatelessWidget {
child: GestureDetector( child: GestureDetector(
onTap: () => Navigator.of(context).push( onTap: () => Navigator.of(context).push(
materialRoute( materialRoute(
InitializingPage(), const InitializingPage(),
), ),
), ),
child: Text( child: Text(

View File

@ -11,7 +11,7 @@ class BrandFab extends StatefulWidget {
const BrandFab({Key? key}) : super(key: key); const BrandFab({Key? key}) : super(key: key);
@override @override
_BrandFabState createState() => _BrandFabState(); State<BrandFab> createState() => _BrandFabState();
} }
class _BrandFabState extends State<BrandFab> class _BrandFabState extends State<BrandFab>

View File

@ -17,7 +17,7 @@ class ProgressBar extends StatefulWidget {
final List<String> steps; final List<String> steps;
@override @override
_ProgressBarState createState() => _ProgressBarState(); State<ProgressBar> createState() => _ProgressBarState();
} }
class _ProgressBarState extends State<ProgressBar> { class _ProgressBarState extends State<ProgressBar> {

View File

@ -21,7 +21,7 @@ class BackupDetails extends StatefulWidget {
const BackupDetails({Key? key}) : super(key: key); const BackupDetails({Key? key}) : super(key: key);
@override @override
_BackupDetailsState createState() => _BackupDetailsState(); State<BackupDetails> createState() => _BackupDetailsState();
} }
class _BackupDetailsState extends State<BackupDetails> class _BackupDetailsState extends State<BackupDetails>

View File

@ -8,8 +8,10 @@ import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.da
import 'package:selfprivacy/ui/components/brand_icons/brand_icons.dart'; import 'package:selfprivacy/ui/components/brand_icons/brand_icons.dart';
class DnsDetailsPage extends StatefulWidget { class DnsDetailsPage extends StatefulWidget {
const DnsDetailsPage({Key? key}) : super(key: key);
@override @override
_DnsDetailsPageState createState() => _DnsDetailsPageState(); State<DnsDetailsPage> createState() => _DnsDetailsPageState();
} }
class _DnsDetailsPageState extends State<DnsDetailsPage> { class _DnsDetailsPageState extends State<DnsDetailsPage> {

View File

@ -16,7 +16,7 @@ class AppSettingsPage extends StatefulWidget {
const AppSettingsPage({Key? key}) : super(key: key); const AppSettingsPage({Key? key}) : super(key: key);
@override @override
_AppSettingsPageState createState() => _AppSettingsPageState(); State<AppSettingsPage> createState() => _AppSettingsPageState();
} }
class _AppSettingsPageState extends State<AppSettingsPage> { class _AppSettingsPageState extends State<AppSettingsPage> {
@ -50,6 +50,7 @@ class _AppSettingsPageState extends State<AppSettingsPage> {
child: _TextColumn( child: _TextColumn(
title: 'more.settings.1'.tr(), title: 'more.settings.1'.tr(),
value: 'more.settings.2'.tr(), value: 'more.settings.2'.tr(),
hasWarning: false,
), ),
), ),
const SizedBox(width: 5), const SizedBox(width: 5),
@ -76,6 +77,7 @@ class _AppSettingsPageState extends State<AppSettingsPage> {
child: _TextColumn( child: _TextColumn(
title: 'more.settings.3'.tr(), title: 'more.settings.3'.tr(),
value: 'more.settings.4'.tr(), value: 'more.settings.4'.tr(),
hasWarning: false,
), ),
), ),
const SizedBox(width: 5), const SizedBox(width: 5),
@ -144,6 +146,7 @@ class _AppSettingsPageState extends State<AppSettingsPage> {
child: _TextColumn( child: _TextColumn(
title: 'more.settings.5'.tr(), title: 'more.settings.5'.tr(),
value: 'more.settings.6'.tr(), value: 'more.settings.6'.tr(),
hasWarning: false,
), ),
), ),
const SizedBox(width: 5), const SizedBox(width: 5),
@ -177,6 +180,7 @@ class _AppSettingsPageState extends State<AppSettingsPage> {
await context await context
.read<ServerInstallationCubit>() .read<ServerInstallationCubit>()
.serverDelete(); .serverDelete();
if (!mounted) return;
Navigator.of(context).pop(); Navigator.of(context).pop();
}), }),
ActionButton( ActionButton(

View File

@ -11,7 +11,7 @@ class Console extends StatefulWidget {
const Console({Key? key}) : super(key: key); const Console({Key? key}) : super(key: key);
@override @override
_ConsoleState createState() => _ConsoleState(); State<Console> createState() => _ConsoleState();
} }
class _ConsoleState extends State<Console> { class _ConsoleState extends State<Console> {

View File

@ -10,7 +10,7 @@ import 'package:selfprivacy/ui/components/brand_icons/brand_icons.dart';
import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; import 'package:selfprivacy/ui/components/brand_text/brand_text.dart';
import 'package:selfprivacy/ui/pages/setup/initializing.dart'; import 'package:selfprivacy/ui/pages/setup/initializing.dart';
import 'package:selfprivacy/ui/pages/onboarding/onboarding.dart'; import 'package:selfprivacy/ui/pages/onboarding/onboarding.dart';
import 'package:selfprivacy/ui/pages/rootRoute.dart'; import 'package:selfprivacy/ui/pages/root_route.dart';
import 'package:selfprivacy/ui/pages/ssh_keys/ssh_keys.dart'; import 'package:selfprivacy/ui/pages/ssh_keys/ssh_keys.dart';
import 'package:selfprivacy/utils/route_transitions/basic.dart'; import 'package:selfprivacy/utils/route_transitions/basic.dart';
@ -43,7 +43,7 @@ class MorePage extends StatelessWidget {
_NavItem( _NavItem(
title: 'more.configuration_wizard'.tr(), title: 'more.configuration_wizard'.tr(),
iconData: BrandIcons.triangle, iconData: BrandIcons.triangle,
goTo: InitializingPage(), goTo: const InitializingPage(),
), ),
_NavItem( _NavItem(
title: 'more.settings.title'.tr(), title: 'more.settings.title'.tr(),

View File

@ -10,7 +10,7 @@ class OnboardingPage extends StatefulWidget {
final Widget nextPage; final Widget nextPage;
@override @override
_OnboardingPageState createState() => _OnboardingPageState(); State<OnboardingPage> createState() => _OnboardingPageState();
} }
class _OnboardingPageState extends State<OnboardingPage> { class _OnboardingPageState extends State<OnboardingPage> {

View File

@ -24,7 +24,7 @@ class ProvidersPage extends StatefulWidget {
const ProvidersPage({Key? key}) : super(key: key); const ProvidersPage({Key? key}) : super(key: key);
@override @override
_ProvidersPageState createState() => _ProvidersPageState(); State<ProvidersPage> createState() => _ProvidersPageState();
} }
class _ProvidersPageState extends State<ProvidersPage> { class _ProvidersPageState extends State<ProvidersPage> {
@ -124,7 +124,7 @@ class _Card extends StatelessWidget {
stableText = 'providers.domain.status'.tr(); stableText = 'providers.domain.status'.tr();
onTap = () => Navigator.of(context).push(materialRoute( onTap = () => Navigator.of(context).push(materialRoute(
DnsDetailsPage(), const DnsDetailsPage(),
)); ));
break; break;
case ProviderType.backup: case ProviderType.backup:

View File

@ -13,7 +13,7 @@ class RootPage extends StatefulWidget {
const RootPage({Key? key}) : super(key: key); const RootPage({Key? key}) : super(key: key);
@override @override
_RootPageState createState() => _RootPageState(); State<RootPage> createState() => _RootPageState();
} }
class _RootPageState extends State<RootPage> class _RootPageState extends State<RootPage>

View File

@ -90,7 +90,11 @@ class _Chart extends StatelessWidget {
return SizedBox( return SizedBox(
height: 200, height: 200,
child: CpuChart(data, state.period, state.start), child: CpuChart(
data: data,
period: state.period,
start: state.start,
),
); );
} }
@ -101,9 +105,9 @@ class _Chart extends StatelessWidget {
return SizedBox( return SizedBox(
height: 200, height: 200,
child: NetworkChart( child: NetworkChart(
[ppsIn, ppsOut], listData: [ppsIn, ppsOut],
state.period, period: state.period,
state.start, start: state.start,
), ),
); );
} }
@ -115,9 +119,9 @@ class _Chart extends StatelessWidget {
return SizedBox( return SizedBox(
height: 200, height: 200,
child: NetworkChart( child: NetworkChart(
[ppsIn, ppsOut], listData: [ppsIn, ppsOut],
state.period, period: state.period,
state.start, start: state.start,
), ),
); );
} }

View File

@ -7,7 +7,12 @@ import 'package:selfprivacy/logic/models/hetzner_metrics.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
class CpuChart extends StatelessWidget { class CpuChart extends StatelessWidget {
const CpuChart(this.data, this.period, this.start); const CpuChart({
Key? key,
required this.data,
required this.period,
required this.start,
}) : super(key: key);
final List<TimeSeriesData> data; final List<TimeSeriesData> data;
final Period period; final Period period;
@ -103,8 +108,8 @@ class CpuChart extends StatelessWidget {
} else if (value == 0) { } else if (value == 0) {
return true; return true;
} }
var _value = value - minValue; var localValue = value - minValue;
var v = _value / 20; var v = localValue / 20;
return v - v.floor() == 0; return v - v.floor() == 0;
} }

View File

@ -9,11 +9,12 @@ import 'package:selfprivacy/logic/models/hetzner_metrics.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
class NetworkChart extends StatelessWidget { class NetworkChart extends StatelessWidget {
const NetworkChart( const NetworkChart({
this.listData, Key? key,
this.period, required this.listData,
this.start, required this.period,
); required this.start,
}) : super(key: key);
final List<List<TimeSeriesData>> listData; final List<List<TimeSeriesData>> listData;
final Period period; final Period period;
@ -132,9 +133,9 @@ class NetworkChart extends StatelessWidget {
} else if (value == 0) { } else if (value == 0) {
return true; return true;
} }
var _value = value - minValue; var diff = value - minValue;
var v = _value / 20; var finalValue = diff / 20;
return v - v.floor() == 0; return finalValue - finalValue.floor() == 0;
} }
String bottomTitle(int value) { String bottomTitle(int value) {

View File

@ -37,7 +37,7 @@ class ServerDetailsScreen extends StatefulWidget {
const ServerDetailsScreen({Key? key}) : super(key: key); const ServerDetailsScreen({Key? key}) : super(key: key);
@override @override
_ServerDetailsScreenState createState() => _ServerDetailsScreenState(); State<ServerDetailsScreen> createState() => _ServerDetailsScreenState();
} }
class _ServerDetailsScreenState extends State<ServerDetailsScreen> class _ServerDetailsScreenState extends State<ServerDetailsScreen>

View File

@ -42,6 +42,7 @@ class _ServerSettings extends StatelessWidget {
child: const _TextColumn( child: const _TextColumn(
title: 'Allow Auto-upgrade', title: 'Allow Auto-upgrade',
value: 'Wether to allow automatic packages upgrades', value: 'Wether to allow automatic packages upgrades',
hasWarning: false,
), ),
), ),
SwitcherBlock( SwitcherBlock(
@ -50,15 +51,17 @@ class _ServerSettings extends StatelessWidget {
child: const _TextColumn( child: const _TextColumn(
title: 'Reboot after upgrade', title: 'Reboot after upgrade',
value: 'Reboot without prompt after applying updates', value: 'Reboot without prompt after applying updates',
hasWarning: false,
), ),
), ),
_Button( _Button(
onTap: () { onTap: () {
Navigator.of(context).push(materialRoute(SelectTimezone())); Navigator.of(context).push(materialRoute(const SelectTimezone()));
}, },
child: _TextColumn( child: _TextColumn(
title: 'Server Timezone', title: 'Server Timezone',
value: serverDetailsState.serverTimezone.timezone.name, value: serverDetailsState.serverTimezone.timezone.name,
hasWarning: false,
), ),
), ),
], ],

View File

@ -8,7 +8,7 @@ class SelectTimezone extends StatefulWidget {
const SelectTimezone({Key? key}) : super(key: key); const SelectTimezone({Key? key}) : super(key: key);
@override @override
_SelectTimezoneState createState() => _SelectTimezoneState(); State<SelectTimezone> createState() => _SelectTimezoneState();
} }
class _SelectTimezoneState extends State<SelectTimezone> { class _SelectTimezoneState extends State<SelectTimezone> {

View File

@ -35,13 +35,13 @@ class ServicesPage extends StatefulWidget {
const ServicesPage({Key? key}) : super(key: key); const ServicesPage({Key? key}) : super(key: key);
@override @override
_ServicesPageState createState() => _ServicesPageState(); State<ServicesPage> createState() => _ServicesPageState();
} }
void _launchURL(url) async { void _launchURL(url) async {
var _possible = await canLaunchUrlString(url); var canLaunch = await canLaunchUrlString(url);
if (_possible) { if (canLaunch) {
try { try {
await launchUrlString( await launchUrlString(
url, url,

View File

@ -21,6 +21,8 @@ import 'package:selfprivacy/ui/pages/setup/recovering/recovery_routing.dart';
import 'package:selfprivacy/utils/route_transitions/basic.dart'; import 'package:selfprivacy/utils/route_transitions/basic.dart';
class InitializingPage extends StatelessWidget { class InitializingPage extends StatelessWidget {
const InitializingPage({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var cubit = context.watch<ServerInstallationCubit>(); var cubit = context.watch<ServerInstallationCubit>();

View File

@ -10,7 +10,9 @@ import 'package:selfprivacy/logic/cubit/forms/factories/field_cubit_factory.dart
class RecoverByOldTokenInstruction extends StatelessWidget { class RecoverByOldTokenInstruction extends StatelessWidget {
@override @override
const RecoverByOldTokenInstruction({required this.instructionFilename}); const RecoverByOldTokenInstruction(
{Key? key, required this.instructionFilename})
: super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

View File

@ -11,7 +11,7 @@ class RecoveryConfirmServer extends StatefulWidget {
const RecoveryConfirmServer({Key? key}) : super(key: key); const RecoveryConfirmServer({Key? key}) : super(key: key);
@override @override
_RecoveryConfirmServerState createState() => _RecoveryConfirmServerState(); State<RecoveryConfirmServer> createState() => _RecoveryConfirmServerState();
} }
class _RecoveryConfirmServerState extends State<RecoveryConfirmServer> { class _RecoveryConfirmServerState extends State<RecoveryConfirmServer> {
@ -57,11 +57,11 @@ class _RecoveryConfirmServerState extends State<RecoveryConfirmServer> {
children: [ children: [
if (servers.length == 1 || if (servers.length == 1 ||
(!_isExtended && _isServerFound(servers))) (!_isExtended && _isServerFound(servers)))
_ConfirmServer(context, _firstValidServer(servers), confirmServer(context, _firstValidServer(servers),
servers.length > 1), servers.length > 1),
if (servers.length > 1 && if (servers.length > 1 &&
(_isExtended || !_isServerFound(servers))) (_isExtended || !_isServerFound(servers)))
_ChooseServer(context, servers), chooseServer(context, servers),
], ],
), ),
if (servers?.isEmpty ?? true) if (servers?.isEmpty ?? true)
@ -84,14 +84,14 @@ class _RecoveryConfirmServerState extends State<RecoveryConfirmServer> {
); );
} }
Widget _ConfirmServer( Widget confirmServer(
BuildContext context, BuildContext context,
ServerBasicInfoWithValidators server, ServerBasicInfoWithValidators server,
bool showMoreServersButton, bool showMoreServersButton,
) { ) {
return Column( return Column(
children: [ children: [
_ServerCard( serverCard(
context: context, context: context,
server: server, server: server,
), ),
@ -110,14 +110,14 @@ class _RecoveryConfirmServerState extends State<RecoveryConfirmServer> {
); );
} }
Widget _ChooseServer( Widget chooseServer(
BuildContext context, List<ServerBasicInfoWithValidators> servers) { BuildContext context, List<ServerBasicInfoWithValidators> servers) {
return Column( return Column(
children: [ children: [
for (final server in servers) for (final server in servers)
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0), padding: const EdgeInsets.symmetric(vertical: 8.0),
child: _ServerCard( child: serverCard(
context: context, context: context,
server: server, server: server,
onTap: () => _showConfirmationDialog(context, server), onTap: () => _showConfirmationDialog(context, server),
@ -127,7 +127,7 @@ class _RecoveryConfirmServerState extends State<RecoveryConfirmServer> {
); );
} }
Widget _ServerCard( Widget serverCard(
{required BuildContext context, {required BuildContext context,
required ServerBasicInfoWithValidators server, required ServerBasicInfoWithValidators server,
VoidCallback? onTap}) { VoidCallback? onTap}) {

View File

@ -47,7 +47,7 @@ class RecoveryMethodSelect extends StatelessWidget {
BrandButton.text( BrandButton.text(
title: 'recovering.method_select_nothing'.tr(), title: 'recovering.method_select_nothing'.tr(),
onPressed: () => Navigator.of(context) onPressed: () => Navigator.of(context)
.push(materialRoute(RecoveryFallbackMethodSelect())), .push(materialRoute(const RecoveryFallbackMethodSelect())),
) )
], ],
); );

View File

@ -36,10 +36,10 @@ class RecoveryRouting extends StatelessWidget {
currentPage = const RecoverByRecoveryKey(); currentPage = const RecoverByRecoveryKey();
break; break;
case RecoveryStep.newDeviceKey: case RecoveryStep.newDeviceKey:
currentPage = RecoverByNewDeviceKeyInstruction(); currentPage = const RecoverByNewDeviceKeyInstruction();
break; break;
case RecoveryStep.oldToken: case RecoveryStep.oldToken:
currentPage = RecoverByOldToken(); currentPage = const RecoverByOldToken();
break; break;
case RecoveryStep.hetznerToken: case RecoveryStep.hetznerToken:
currentPage = const RecoveryHetznerConnected(); currentPage = const RecoveryHetznerConnected();

View File

@ -24,7 +24,7 @@ class SshKeysPage extends StatefulWidget {
const SshKeysPage({Key? key, required this.user}) : super(key: key); const SshKeysPage({Key? key, required this.user}) : super(key: key);
@override @override
_SshKeysPageState createState() => _SshKeysPageState(); State<SshKeysPage> createState() => _SshKeysPageState();
} }
class _SshKeysPageState extends State<SshKeysPage> { class _SshKeysPageState extends State<SshKeysPage> {