mirror of
https://git.selfprivacy.org/kherel/selfprivacy.org.app.git
synced 2025-01-09 01:21:14 +00:00
Merge pull request 'jobs' (#28) from jobs into master
Reviewed-on: https://git.selfprivacy.org/kherel/selfprivacy.org.app/pulls/28
This commit is contained in:
commit
b130960113
|
@ -19,12 +19,14 @@
|
||||||
"connect": "Connect",
|
"connect": "Connect",
|
||||||
"domain": "Domain",
|
"domain": "Domain",
|
||||||
"saving": "Saving..",
|
"saving": "Saving..",
|
||||||
"nickname": "nickname",
|
"nickname": "Nickname",
|
||||||
"loading": "Loading...",
|
"loading": "Loading...",
|
||||||
"later": "I will setup it later",
|
"later": "I will setup it later",
|
||||||
"reset": "Reset",
|
"reset": "Reset",
|
||||||
"details": "Details",
|
"details": "Details",
|
||||||
"no_data": "No data"
|
"no_data": "No data",
|
||||||
|
"wait": "Wait",
|
||||||
|
"remove": "Remove"
|
||||||
},
|
},
|
||||||
"more": {
|
"more": {
|
||||||
"_comment": "'More' tab",
|
"_comment": "'More' tab",
|
||||||
|
@ -34,7 +36,7 @@
|
||||||
"onboarding": "Onboarding",
|
"onboarding": "Onboarding",
|
||||||
"console": "Console",
|
"console": "Console",
|
||||||
"about_app_page": {
|
"about_app_page": {
|
||||||
"text": "Тут любая служебная информация, v.{}"
|
"text": "Application version v.{}"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"title": "Application settings",
|
"title": "Application settings",
|
||||||
|
@ -188,7 +190,9 @@
|
||||||
"20": "\n",
|
"20": "\n",
|
||||||
"21": "One more restart to apply your security certificates.",
|
"21": "One more restart to apply your security certificates.",
|
||||||
"22": "Create master account",
|
"22": "Create master account",
|
||||||
"23": "Enter a nickname and strong password"
|
"23": "Enter a nickname and strong password",
|
||||||
|
"finish": "Everything is initialized",
|
||||||
|
"checks": "Checks have been completed \n{} ouf of {}"
|
||||||
},
|
},
|
||||||
"modals": {
|
"modals": {
|
||||||
"_comment": "messages in modals",
|
"_comment": "messages in modals",
|
||||||
|
@ -198,7 +202,8 @@
|
||||||
"4": "Purge all authentication keys?",
|
"4": "Purge all authentication keys?",
|
||||||
"5": "Yes, purge all my tokens",
|
"5": "Yes, purge all my tokens",
|
||||||
"6": "Delete the server and volume?",
|
"6": "Delete the server and volume?",
|
||||||
"7": "Yes"
|
"7": "Yes",
|
||||||
|
"8": "Remove task"
|
||||||
},
|
},
|
||||||
"timer": {
|
"timer": {
|
||||||
"sec": "{} sec"
|
"sec": "{} sec"
|
||||||
|
@ -208,5 +213,13 @@
|
||||||
"title": "Jobs list",
|
"title": "Jobs list",
|
||||||
"start": "Start",
|
"start": "Start",
|
||||||
"empty": "No jobs"
|
"empty": "No jobs"
|
||||||
|
},
|
||||||
|
"validations": {
|
||||||
|
"required": "Required",
|
||||||
|
"invalid_format": "Invalid format",
|
||||||
|
"root_name": "User name cannot be 'root'",
|
||||||
|
"key_format": "Invalid key format",
|
||||||
|
"length": "Length is [] shoud be {}",
|
||||||
|
"user_alredy_exist": "Already exists"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -24,7 +24,9 @@
|
||||||
"later": "Настрою потом",
|
"later": "Настрою потом",
|
||||||
"reset": "Reset",
|
"reset": "Reset",
|
||||||
"details": "Детальная информация",
|
"details": "Детальная информация",
|
||||||
"no_data": "Нет данных"
|
"no_data": "Нет данных",
|
||||||
|
"wait": "Ожидайте",
|
||||||
|
"remove": "Удалить"
|
||||||
},
|
},
|
||||||
"more": {
|
"more": {
|
||||||
"_comment": "вкладка еще",
|
"_comment": "вкладка еще",
|
||||||
|
@ -188,7 +190,9 @@
|
||||||
"20": "\n2 Заходим в созданный нами проект. Если такового - нет, значит создаём.\n3 Наводим мышкой на боковую панель. Она должна раскрыться, показав нам пункты меню. Нас интересует последний — Security (с иконкой ключика).\n4 Далее, в верхней части интерфейса видим примерно такой список: SSH Keys, API Tokens, Certificates, Members. Нам нужен API Tokens. Переходим по нему.\n5 В правой части интерфейса, нас будет ожидать кнопка Generate API token. Если же вы используете мобильную версию сайта, в нижнем правом углу вы увидите красный плюсик. Нажимаем на эту кнопку.\n6 В поле Description, даём нашему токену название (это может быть любое название, которые вам нравиться. Сути оно не меняет.",
|
"20": "\n2 Заходим в созданный нами проект. Если такового - нет, значит создаём.\n3 Наводим мышкой на боковую панель. Она должна раскрыться, показав нам пункты меню. Нас интересует последний — Security (с иконкой ключика).\n4 Далее, в верхней части интерфейса видим примерно такой список: SSH Keys, API Tokens, Certificates, Members. Нам нужен API Tokens. Переходим по нему.\n5 В правой части интерфейса, нас будет ожидать кнопка Generate API token. Если же вы используете мобильную версию сайта, в нижнем правом углу вы увидите красный плюсик. Нажимаем на эту кнопку.\n6 В поле Description, даём нашему токену название (это может быть любое название, которые вам нравиться. Сути оно не меняет.",
|
||||||
"21": "Сейчас будет дополнительная перезагрузка для активации сертификатов безопастности",
|
"21": "Сейчас будет дополнительная перезагрузка для активации сертификатов безопастности",
|
||||||
"22": "Создайте главную учетную запись",
|
"22": "Создайте главную учетную запись",
|
||||||
"23": "Введите никнейм и сложный пароль"
|
"23": "Введите никнейм и сложный пароль",
|
||||||
|
"finish": "Все инициализировано",
|
||||||
|
"checks": "Проверок выполнено: \n{} / {}"
|
||||||
},
|
},
|
||||||
"modals": {
|
"modals": {
|
||||||
"_comment": "messages in modals",
|
"_comment": "messages in modals",
|
||||||
|
@ -209,5 +213,13 @@
|
||||||
"title": "Задачи",
|
"title": "Задачи",
|
||||||
"start": "Начать выполенение",
|
"start": "Начать выполенение",
|
||||||
"empty": "Пусто"
|
"empty": "Пусто"
|
||||||
|
},
|
||||||
|
"validations": {
|
||||||
|
"required": "обязательное поле",
|
||||||
|
"invalid_format": "Неверный формат",
|
||||||
|
"root_name": "Имя пользователя не может быть'root'",
|
||||||
|
"key_format": "Неверный формат",
|
||||||
|
"length": "Длина строки [] должна быть {}",
|
||||||
|
"user_alredy_exist": "Имя уже используется"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -6,6 +6,8 @@ PODS:
|
||||||
- Flutter
|
- Flutter
|
||||||
- path_provider (0.0.1):
|
- path_provider (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
|
- share_plus (0.0.1):
|
||||||
|
- Flutter
|
||||||
- shared_preferences (0.0.1):
|
- shared_preferences (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- url_launcher (0.0.1):
|
- url_launcher (0.0.1):
|
||||||
|
@ -18,6 +20,7 @@ DEPENDENCIES:
|
||||||
- flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
|
- flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
|
||||||
- package_info (from `.symlinks/plugins/package_info/ios`)
|
- package_info (from `.symlinks/plugins/package_info/ios`)
|
||||||
- path_provider (from `.symlinks/plugins/path_provider/ios`)
|
- path_provider (from `.symlinks/plugins/path_provider/ios`)
|
||||||
|
- share_plus (from `.symlinks/plugins/share_plus/ios`)
|
||||||
- shared_preferences (from `.symlinks/plugins/shared_preferences/ios`)
|
- shared_preferences (from `.symlinks/plugins/shared_preferences/ios`)
|
||||||
- url_launcher (from `.symlinks/plugins/url_launcher/ios`)
|
- url_launcher (from `.symlinks/plugins/url_launcher/ios`)
|
||||||
- wakelock (from `.symlinks/plugins/wakelock/ios`)
|
- wakelock (from `.symlinks/plugins/wakelock/ios`)
|
||||||
|
@ -31,6 +34,8 @@ EXTERNAL SOURCES:
|
||||||
:path: ".symlinks/plugins/package_info/ios"
|
:path: ".symlinks/plugins/package_info/ios"
|
||||||
path_provider:
|
path_provider:
|
||||||
:path: ".symlinks/plugins/path_provider/ios"
|
:path: ".symlinks/plugins/path_provider/ios"
|
||||||
|
share_plus:
|
||||||
|
:path: ".symlinks/plugins/share_plus/ios"
|
||||||
shared_preferences:
|
shared_preferences:
|
||||||
:path: ".symlinks/plugins/shared_preferences/ios"
|
:path: ".symlinks/plugins/shared_preferences/ios"
|
||||||
url_launcher:
|
url_launcher:
|
||||||
|
@ -43,6 +48,7 @@ SPEC CHECKSUMS:
|
||||||
flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec
|
flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec
|
||||||
package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62
|
package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62
|
||||||
path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c
|
path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c
|
||||||
|
share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68
|
||||||
shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d
|
shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d
|
||||||
url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef
|
url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef
|
||||||
wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f
|
wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f
|
||||||
|
|
|
@ -17,7 +17,7 @@ class BlocAndProviderConfig extends StatelessWidget {
|
||||||
// SchedulerBinding.instance.window.platformBrightness;
|
// SchedulerBinding.instance.window.platformBrightness;
|
||||||
// var isDark = platformBrightness == Brightness.dark;
|
// var isDark = platformBrightness == Brightness.dark;
|
||||||
var isDark = false;
|
var isDark = false;
|
||||||
|
var usersCubit = UsersCubit();
|
||||||
return MultiProvider(
|
return MultiProvider(
|
||||||
providers: [
|
providers: [
|
||||||
BlocProvider(
|
BlocProvider(
|
||||||
|
@ -31,8 +31,8 @@ class BlocAndProviderConfig extends StatelessWidget {
|
||||||
create: (_) => AppConfigCubit()..load(),
|
create: (_) => AppConfigCubit()..load(),
|
||||||
),
|
),
|
||||||
BlocProvider(create: (_) => ProvidersCubit()),
|
BlocProvider(create: (_) => ProvidersCubit()),
|
||||||
BlocProvider(create: (_) => UsersCubit()),
|
BlocProvider(create: (_) => usersCubit..load(), lazy: false),
|
||||||
BlocProvider(create: (_) => JobsCubit()),
|
BlocProvider(create: (_) => JobsCubit(usersCubit)),
|
||||||
],
|
],
|
||||||
child: child,
|
child: child,
|
||||||
);
|
);
|
||||||
|
|
|
@ -19,6 +19,8 @@ class HiveConfig {
|
||||||
Hive.registerAdapter(HetznerDataBaseAdapter());
|
Hive.registerAdapter(HetznerDataBaseAdapter());
|
||||||
|
|
||||||
await Hive.openBox(BNames.appSettings);
|
await Hive.openBox(BNames.appSettings);
|
||||||
|
await Hive.openBox<User>(BNames.users);
|
||||||
|
|
||||||
var cipher = HiveAesCipher(await getEncriptedKey());
|
var cipher = HiveAesCipher(await getEncriptedKey());
|
||||||
|
|
||||||
await Hive.openBox(BNames.appConfig, encryptionCipher: cipher);
|
await Hive.openBox(BNames.appConfig, encryptionCipher: cipher);
|
||||||
|
@ -42,6 +44,7 @@ class BNames {
|
||||||
static String appConfig = 'appConfig';
|
static String appConfig = 'appConfig';
|
||||||
static String isDarkModeOn = 'isDarkModeOn';
|
static String isDarkModeOn = 'isDarkModeOn';
|
||||||
static String isOnbordingShowing = 'isOnbordingShowing';
|
static String isOnbordingShowing = 'isOnbordingShowing';
|
||||||
|
static String users = 'users';
|
||||||
|
|
||||||
static String appSettings = 'appSettings';
|
static String appSettings = 'appSettings';
|
||||||
|
|
||||||
|
|
|
@ -95,7 +95,7 @@ class HetznerApi extends ApiMap {
|
||||||
var dbId = dbCreateResponse.data['volume']['id'];
|
var dbId = dbCreateResponse.data['volume']['id'];
|
||||||
|
|
||||||
var data = jsonDecode(
|
var data = jsonDecode(
|
||||||
'''{"name":"$domainName","server_type":"cx11","start_after_create":false,"image":"ubuntu-20.04", "volumes":[$dbId], "networks":[],"user_data":"#cloud-config\\nruncmd:\\n- curl https://git.selfprivacy.org/ilchub/selfprivacy-nixos-infect/raw/branch/master/nixos-infect | PROVIDER=hetzner NIX_CHANNEL=nixos-20.09 DOMAIN=$domainName LUSER=${rootUser.login} PASSWORD=${rootUser.password} HASHED_PASSWORD=${rootUser.hashPassword.hash} SALT=${rootUser.hashPassword.salt} CF_TOKEN=$cloudFlareKey DB_PASSWORD=$dbPassword bash 2>&1 | tee /tmp/infect.log","labels":{},"automount":true, "location": "fsn1"}''',
|
'''{"name":"$domainName","server_type":"cx11","start_after_create":false,"image":"ubuntu-20.04", "volumes":[$dbId], "networks":[], "user_data":"#cloud-config\\nruncmd:\\n- curl https://git.selfprivacy.org/ilchub/selfprivacy-nixos-infect/raw/branch/master/nixos-infect | PROVIDER=hetzner NIX_CHANNEL=nixos-21.05 DOMAIN=$domainName LUSER=${rootUser.login} PASSWORD=${rootUser.password} HASHED_PASSWORD=${rootUser.hashPassword.hash} SALT=${rootUser.hashPassword.salt} CF_TOKEN=$cloudFlareKey DB_PASSWORD=$dbPassword bash 2>&1 | tee /tmp/infect.log","labels":{},"automount":true, "location": "fsn1"}'''
|
||||||
);
|
);
|
||||||
|
|
||||||
Response serverCreateResponse = await client.post(
|
Response serverCreateResponse = await client.post(
|
||||||
|
|
|
@ -3,6 +3,7 @@ import 'dart:io';
|
||||||
|
|
||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
import 'package:selfprivacy/config/get_it_config.dart';
|
import 'package:selfprivacy/config/get_it_config.dart';
|
||||||
|
import 'package:selfprivacy/logic/models/user.dart';
|
||||||
|
|
||||||
import 'api_map.dart';
|
import 'api_map.dart';
|
||||||
|
|
||||||
|
@ -40,6 +41,52 @@ class ServerApi extends ApiMap {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<bool> createUser(User user) async {
|
||||||
|
bool res;
|
||||||
|
Response response;
|
||||||
|
|
||||||
|
var client = await getClient();
|
||||||
|
try {
|
||||||
|
response = await client.post(
|
||||||
|
'/createUser',
|
||||||
|
options: Options(
|
||||||
|
headers: {
|
||||||
|
"X-User": user.login,
|
||||||
|
"X-Password":
|
||||||
|
'\$6\$${user.hashPassword.salt}\$${user.hashPassword.hash}',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
res = response.statusCode == HttpStatus.ok;
|
||||||
|
} catch (e) {
|
||||||
|
print(e);
|
||||||
|
res = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(client);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
String get rootAddress =>
|
String get rootAddress =>
|
||||||
throw UnimplementedError('not used in with implementation');
|
throw UnimplementedError('not used in with implementation');
|
||||||
|
|
||||||
|
Future<bool> apply() async {
|
||||||
|
bool res;
|
||||||
|
Response response;
|
||||||
|
|
||||||
|
var client = await getClient();
|
||||||
|
try {
|
||||||
|
response = await client.get(
|
||||||
|
'/apply',
|
||||||
|
);
|
||||||
|
|
||||||
|
res = response.statusCode == HttpStatus.ok;
|
||||||
|
} catch (e) {
|
||||||
|
print(e);
|
||||||
|
res = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(client);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,6 +87,16 @@ class AppConfigState extends Equatable {
|
||||||
bool get isFullyInitilized => _fulfilementList.every((el) => el!);
|
bool get isFullyInitilized => _fulfilementList.every((el) => el!);
|
||||||
int get progress => _fulfilementList.where((el) => el!).length ;
|
int get progress => _fulfilementList.where((el) => el!).length ;
|
||||||
|
|
||||||
|
int get porgressBar {
|
||||||
|
if (progress < 6) {
|
||||||
|
return progress;
|
||||||
|
} else if (progress < 10) {
|
||||||
|
return 6;
|
||||||
|
} else {
|
||||||
|
return 7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
List<bool?> get _fulfilementList {
|
List<bool?> get _fulfilementList {
|
||||||
var res = [
|
var res = [
|
||||||
isHetznerFilled,
|
isHetznerFilled,
|
||||||
|
|
|
@ -3,6 +3,7 @@ import 'package:cubit_form/cubit_form.dart';
|
||||||
import 'package:selfprivacy/logic/api_maps/backblaze.dart';
|
import 'package:selfprivacy/logic/api_maps/backblaze.dart';
|
||||||
import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart';
|
import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart';
|
||||||
import 'package:selfprivacy/logic/models/backblaze_credential.dart';
|
import 'package:selfprivacy/logic/models/backblaze_credential.dart';
|
||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
|
||||||
class BackblazeFormCubit extends FormCubit {
|
class BackblazeFormCubit extends FormCubit {
|
||||||
BackblazeFormCubit(this.initializingCubit) {
|
BackblazeFormCubit(this.initializingCubit) {
|
||||||
|
@ -10,7 +11,7 @@ class BackblazeFormCubit extends FormCubit {
|
||||||
keyId = FieldCubit(
|
keyId = FieldCubit(
|
||||||
initalValue: '',
|
initalValue: '',
|
||||||
validations: [
|
validations: [
|
||||||
RequiredStringValidation('required'),
|
RequiredStringValidation('validations.required'.tr()),
|
||||||
//ValidationModel<String>(
|
//ValidationModel<String>(
|
||||||
//(s) => regExp.hasMatch(s), 'invalid key format'),
|
//(s) => regExp.hasMatch(s), 'invalid key format'),
|
||||||
//LegnthStringValidationWithLenghShowing(64, 'length is [] shoud be 64')
|
//LegnthStringValidationWithLenghShowing(64, 'length is [] shoud be 64')
|
||||||
|
|
|
@ -4,6 +4,7 @@ import 'package:cubit_form/cubit_form.dart';
|
||||||
import 'package:selfprivacy/logic/api_maps/cloudflare.dart';
|
import 'package:selfprivacy/logic/api_maps/cloudflare.dart';
|
||||||
import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart';
|
import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart';
|
||||||
import 'package:selfprivacy/logic/cubit/forms/validations/validations.dart';
|
import 'package:selfprivacy/logic/cubit/forms/validations/validations.dart';
|
||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
|
||||||
class CloudFlareFormCubit extends FormCubit {
|
class CloudFlareFormCubit extends FormCubit {
|
||||||
CloudFlareFormCubit(this.initializingCubit) {
|
CloudFlareFormCubit(this.initializingCubit) {
|
||||||
|
@ -11,10 +12,11 @@ class CloudFlareFormCubit extends FormCubit {
|
||||||
apiKey = FieldCubit(
|
apiKey = FieldCubit(
|
||||||
initalValue: '',
|
initalValue: '',
|
||||||
validations: [
|
validations: [
|
||||||
RequiredStringValidation('required'),
|
RequiredStringValidation('validations.required'.tr()),
|
||||||
ValidationModel<String>(
|
ValidationModel<String>(
|
||||||
(s) => regExp.hasMatch(s), 'invalid key format'),
|
(s) => regExp.hasMatch(s), 'validations.key_format'.tr()),
|
||||||
LegnthStringValidationWithLenghShowing(40, 'length is [] shoud be 40')
|
LegnthStringValidationWithLenghShowing(
|
||||||
|
40, 'validations.length'.tr(args: ["40"]))
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ import 'package:cubit_form/cubit_form.dart';
|
||||||
import 'package:selfprivacy/logic/api_maps/hetzner.dart';
|
import 'package:selfprivacy/logic/api_maps/hetzner.dart';
|
||||||
import 'package:selfprivacy/logic/cubit/forms/validations/validations.dart';
|
import 'package:selfprivacy/logic/cubit/forms/validations/validations.dart';
|
||||||
import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart';
|
import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart';
|
||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
|
||||||
class HetznerFormCubit extends FormCubit {
|
class HetznerFormCubit extends FormCubit {
|
||||||
HetznerFormCubit(this.initializingCubit) {
|
HetznerFormCubit(this.initializingCubit) {
|
||||||
|
@ -11,10 +12,10 @@ class HetznerFormCubit extends FormCubit {
|
||||||
apiKey = FieldCubit(
|
apiKey = FieldCubit(
|
||||||
initalValue: '',
|
initalValue: '',
|
||||||
validations: [
|
validations: [
|
||||||
RequiredStringValidation('required'),
|
RequiredStringValidation('validations.required'.tr()),
|
||||||
ValidationModel<String>(
|
ValidationModel<String>(
|
||||||
(s) => regExp.hasMatch(s), 'invalid key format'),
|
(s) => regExp.hasMatch(s), 'validations.key_format'.tr()),
|
||||||
LegnthStringValidationWithLenghShowing(64, 'length is [] shoud be 64')
|
LegnthStringValidationWithLenghShowing(64, 'validations.length'.tr(args: ["64"]))
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ import 'dart:async';
|
||||||
import 'package:cubit_form/cubit_form.dart';
|
import 'package:cubit_form/cubit_form.dart';
|
||||||
import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart';
|
import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart';
|
||||||
import 'package:selfprivacy/logic/models/user.dart';
|
import 'package:selfprivacy/logic/models/user.dart';
|
||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
|
||||||
class RootUserFormCubit extends FormCubit {
|
class RootUserFormCubit extends FormCubit {
|
||||||
RootUserFormCubit(this.initializingCubit) {
|
RootUserFormCubit(this.initializingCubit) {
|
||||||
|
@ -12,18 +13,20 @@ class RootUserFormCubit extends FormCubit {
|
||||||
userName = FieldCubit(
|
userName = FieldCubit(
|
||||||
initalValue: '',
|
initalValue: '',
|
||||||
validations: [
|
validations: [
|
||||||
RequiredStringValidation('required'),
|
|
||||||
ValidationModel<String>(
|
ValidationModel<String>(
|
||||||
(s) => userRegExp.hasMatch(s), 'invalid format'),
|
(s) => s.toLowerCase() == 'root', 'validations.root_name'.tr()),
|
||||||
|
RequiredStringValidation('validations.required'.tr()),
|
||||||
|
ValidationModel<String>(
|
||||||
|
(s) => userRegExp.hasMatch(s), 'validations.invalid_format'.tr()),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
password = FieldCubit(
|
password = FieldCubit(
|
||||||
initalValue: '',
|
initalValue: '',
|
||||||
validations: [
|
validations: [
|
||||||
RequiredStringValidation('required'),
|
RequiredStringValidation('validations.required'.tr()),
|
||||||
ValidationModel<String>(
|
ValidationModel<String>(
|
||||||
(s) => passwordRegExp.hasMatch(s), 'invalid format'),
|
(s) => passwordRegExp.hasMatch(s), 'validations.invalid_format'.tr()),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,16 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:cubit_form/cubit_form.dart';
|
import 'package:cubit_form/cubit_form.dart';
|
||||||
import 'package:selfprivacy/logic/cubit/users/users_cubit.dart';
|
import 'package:selfprivacy/logic/cubit/jobs/jobs_cubit.dart';
|
||||||
|
import 'package:selfprivacy/logic/models/jobs/job.dart';
|
||||||
import 'package:selfprivacy/logic/models/user.dart';
|
import 'package:selfprivacy/logic/models/user.dart';
|
||||||
import 'package:selfprivacy/utils/password_generator.dart';
|
import 'package:selfprivacy/utils/password_generator.dart';
|
||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
|
||||||
class UserFormCubit extends FormCubit {
|
class UserFormCubit extends FormCubit {
|
||||||
UserFormCubit({
|
UserFormCubit({
|
||||||
required this.usersCubit,
|
required this.jobsCubit,
|
||||||
|
required List<User> users,
|
||||||
User? user,
|
User? user,
|
||||||
}) {
|
}) {
|
||||||
var isEdit = user != null;
|
var isEdit = user != null;
|
||||||
|
@ -18,18 +21,22 @@ class UserFormCubit extends FormCubit {
|
||||||
login = FieldCubit(
|
login = FieldCubit(
|
||||||
initalValue: isEdit ? user!.login : '',
|
initalValue: isEdit ? user!.login : '',
|
||||||
validations: [
|
validations: [
|
||||||
RequiredStringValidation('required'),
|
ValidationModel(
|
||||||
|
(login) => users.any((user) => user.login == login),
|
||||||
|
'validations.user_alredy_exist'.tr(),
|
||||||
|
),
|
||||||
|
RequiredStringValidation('validations.required'.tr()),
|
||||||
ValidationModel<String>(
|
ValidationModel<String>(
|
||||||
(s) => userRegExp.hasMatch(s), 'invalid format'),
|
(s) => userRegExp.hasMatch(s), 'validations.invalid_format'.tr()),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
password = FieldCubit(
|
password = FieldCubit(
|
||||||
initalValue: isEdit ? user!.password : genPass(),
|
initalValue: isEdit ? user!.password : genPass(),
|
||||||
validations: [
|
validations: [
|
||||||
RequiredStringValidation('required'),
|
RequiredStringValidation('validations.required'.tr()),
|
||||||
ValidationModel<String>(
|
ValidationModel<String>((s) => passwordRegExp.hasMatch(s),
|
||||||
(s) => passwordRegExp.hasMatch(s), 'invalid format'),
|
'validations.invalid_format'.tr()),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -42,7 +49,7 @@ class UserFormCubit extends FormCubit {
|
||||||
login: login.state.value,
|
login: login.state.value,
|
||||||
password: password.state.value,
|
password: password.state.value,
|
||||||
);
|
);
|
||||||
usersCubit.addUser(user);
|
jobsCubit.addJob(CreateUserJob(user: user));
|
||||||
}
|
}
|
||||||
|
|
||||||
late FieldCubit<String> login;
|
late FieldCubit<String> login;
|
||||||
|
@ -52,5 +59,5 @@ class UserFormCubit extends FormCubit {
|
||||||
password.externalSetValue(genPass());
|
password.externalSetValue(genPass());
|
||||||
}
|
}
|
||||||
|
|
||||||
late UsersCubit usersCubit;
|
final JobsCubit jobsCubit;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,27 +1,53 @@
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:selfprivacy/logic/models/job.dart';
|
import 'package:selfprivacy/config/get_it_config.dart';
|
||||||
|
import 'package:selfprivacy/logic/api_maps/server.dart';
|
||||||
|
import 'package:selfprivacy/logic/cubit/users/users_cubit.dart';
|
||||||
|
import 'package:selfprivacy/logic/models/jobs/job.dart';
|
||||||
import 'package:equatable/equatable.dart';
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:selfprivacy/logic/models/user.dart';
|
||||||
export 'package:provider/provider.dart';
|
export 'package:provider/provider.dart';
|
||||||
|
|
||||||
part 'jobs_state.dart';
|
part 'jobs_state.dart';
|
||||||
|
|
||||||
class JobsCubit extends Cubit<JobsState> {
|
class JobsCubit extends Cubit<JobsState> {
|
||||||
JobsCubit() : super(JobsState.emtpy());
|
JobsCubit(this.usersCubit) : super(JobsStateEmpty());
|
||||||
|
|
||||||
List<Job> jobsList = [];
|
final api = ServerApi();
|
||||||
|
final UsersCubit usersCubit;
|
||||||
|
|
||||||
void addJob(Job job) {
|
void addJob(Job job) {
|
||||||
final newState = state.addJob(job);
|
var newJobsList = <Job>[];
|
||||||
emit(newState);
|
if (state is JobsStateWithJobs) {
|
||||||
|
newJobsList.addAll((state as JobsStateWithJobs).jobList);
|
||||||
|
}
|
||||||
|
newJobsList.add(job);
|
||||||
|
emit(JobsStateWithJobs(newJobsList));
|
||||||
}
|
}
|
||||||
|
|
||||||
void removeJob(String id) {
|
void removeJob(String id) {
|
||||||
final newState = state.removeById(id);
|
final newState = (state as JobsStateWithJobs).removeById(id);
|
||||||
emit(newState);
|
emit(newState);
|
||||||
}
|
}
|
||||||
|
|
||||||
void applyAll() {
|
Future<void> applyAll() async {
|
||||||
print(state.jobList);
|
if (state is JobsStateWithJobs) {
|
||||||
emit(JobsState.emtpy());
|
var jobs = (state as JobsStateWithJobs).jobList;
|
||||||
|
emit(JobsStateLoading());
|
||||||
|
|
||||||
|
var newUsers = <User>[];
|
||||||
|
for (var job in jobs) {
|
||||||
|
if (job is CreateUserJob) {
|
||||||
|
newUsers.add(job.user);
|
||||||
|
await api.createUser(job.user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
usersCubit.addUsers(newUsers);
|
||||||
|
await api.apply();
|
||||||
|
|
||||||
|
emit(JobsStateEmpty());
|
||||||
|
|
||||||
|
getIt<NavigationService>().navigator!.pop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,25 +1,27 @@
|
||||||
part of 'jobs_cubit.dart';
|
part of 'jobs_cubit.dart';
|
||||||
|
|
||||||
class JobsState extends Equatable {
|
abstract class JobsState extends Equatable {
|
||||||
const JobsState(this.jobList);
|
@override
|
||||||
|
List<Object?> get props => [];
|
||||||
final List<Job> jobList;
|
|
||||||
|
|
||||||
static JobsState emtpy() => JobsState([]);
|
|
||||||
|
|
||||||
bool get isEmpty => jobList.isEmpty;
|
|
||||||
|
|
||||||
JobsState addJob(Job job) {
|
|
||||||
var newJobsList = [...jobList];
|
|
||||||
newJobsList.add(job);
|
|
||||||
return JobsState(newJobsList);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class JobsStateLoading extends JobsState {}
|
||||||
|
|
||||||
|
class JobsStateEmpty extends JobsState {}
|
||||||
|
|
||||||
|
class JobsStateWithJobs extends JobsState {
|
||||||
|
JobsStateWithJobs(this.jobList);
|
||||||
|
final List<Job> jobList;
|
||||||
|
|
||||||
JobsState removeById(String id) {
|
JobsState removeById(String id) {
|
||||||
var newJobsList = jobList.where((element) => element.id != id).toList();
|
var newJobsList = jobList.where((element) => element.id != id).toList();
|
||||||
return JobsState(newJobsList);
|
|
||||||
|
if (newJobsList.isEmpty) {
|
||||||
|
return JobsStateEmpty();
|
||||||
|
}
|
||||||
|
return JobsStateWithJobs(newJobsList);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object> get props => jobList;
|
List<Object?> get props => jobList;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,23 +1,35 @@
|
||||||
import 'package:bloc/bloc.dart';
|
import 'package:bloc/bloc.dart';
|
||||||
import 'package:equatable/equatable.dart';
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:hive/hive.dart';
|
||||||
|
import 'package:selfprivacy/config/hive_config.dart';
|
||||||
import 'package:selfprivacy/logic/models/user.dart';
|
import 'package:selfprivacy/logic/models/user.dart';
|
||||||
export 'package:provider/provider.dart';
|
export 'package:provider/provider.dart';
|
||||||
|
|
||||||
part 'users_state.dart';
|
part 'users_state.dart';
|
||||||
|
|
||||||
class UsersCubit extends Cubit<UsersState> {
|
class UsersCubit extends Cubit<UsersState> {
|
||||||
UsersCubit() : super(UsersState([]));
|
UsersCubit() : super(UsersState(<User>[]));
|
||||||
|
Box<User> box = Hive.box<User>(BNames.users);
|
||||||
|
|
||||||
void addUser(User user) {
|
void load() async {
|
||||||
var users = [...state.users];
|
var loadedUsers = box.values.toList();
|
||||||
users.add(user);
|
if (loadedUsers.isNotEmpty) {
|
||||||
|
emit(UsersState(loadedUsers));
|
||||||
emit(UsersState(users));
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void remove(User? user) {
|
void addUsers(List<User> users) async {
|
||||||
|
var newUserList = <User>[...state.users, ...users];
|
||||||
|
|
||||||
|
await box.addAll(users);
|
||||||
|
emit(UsersState(newUserList));
|
||||||
|
}
|
||||||
|
|
||||||
|
void remove(User user) async {
|
||||||
var users = [...state.users];
|
var users = [...state.users];
|
||||||
|
var index = users.indexOf(user);
|
||||||
users.remove(user);
|
users.remove(user);
|
||||||
|
await box.deleteAt(index);
|
||||||
|
|
||||||
emit(UsersState(users));
|
emit(UsersState(users));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
import 'package:equatable/equatable.dart';
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
import 'package:selfprivacy/utils/password_generator2.dart';
|
import 'package:selfprivacy/utils/password_generator2.dart';
|
||||||
|
|
||||||
|
import '../user.dart';
|
||||||
|
|
||||||
|
@immutable
|
||||||
class Job extends Equatable {
|
class Job extends Equatable {
|
||||||
Job({
|
Job({
|
||||||
String? id,
|
String? id,
|
||||||
|
@ -13,3 +17,14 @@ class Job extends Equatable {
|
||||||
@override
|
@override
|
||||||
List<Object> get props => [id, title];
|
List<Object> get props => [id, title];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class CreateUserJob extends Job {
|
||||||
|
CreateUserJob({
|
||||||
|
required this.user,
|
||||||
|
}) : super(title: 'Create ${user.login}');
|
||||||
|
|
||||||
|
final User user;
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [id, title];
|
||||||
|
}
|
|
@ -23,19 +23,16 @@ void main() async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
await EasyLocalization.ensureInitialized();
|
await EasyLocalization.ensureInitialized();
|
||||||
|
|
||||||
runApp(
|
runApp(MyApp());
|
||||||
Localization(
|
|
||||||
child: BlocAndProviderConfig(
|
|
||||||
child: MyApp(),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
class MyApp extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
AppSettingsState appSettings = context.watch<AppSettingsCubit>().state;
|
return Localization(
|
||||||
|
child: BlocAndProviderConfig(
|
||||||
|
child: Builder(builder: (context) {
|
||||||
|
var appSettings = context.watch<AppSettingsCubit>().state;
|
||||||
|
|
||||||
return AnnotatedRegion<SystemUiOverlayStyle>(
|
return AnnotatedRegion<SystemUiOverlayStyle>(
|
||||||
value: SystemUiOverlayStyle.light, // Manually changnig appbar color
|
value: SystemUiOverlayStyle.light, // Manually changnig appbar color
|
||||||
|
@ -54,10 +51,14 @@ class MyApp extends StatelessWidget {
|
||||||
Widget error = Text('...rendering error...');
|
Widget error = Text('...rendering error...');
|
||||||
if (widget is Scaffold || widget is Navigator)
|
if (widget is Scaffold || widget is Navigator)
|
||||||
error = Scaffold(body: Center(child: error));
|
error = Scaffold(body: Center(child: error));
|
||||||
ErrorWidget.builder = (FlutterErrorDetails errorDetails) => error;
|
ErrorWidget.builder =
|
||||||
|
(FlutterErrorDetails errorDetails) => error;
|
||||||
return widget!;
|
return widget!;
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,26 +1,59 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:selfprivacy/config/brand_theme.dart';
|
import 'package:selfprivacy/config/brand_colors.dart';
|
||||||
|
|
||||||
class BrandBottomSheet extends StatelessWidget {
|
class BrandBottomSheet extends StatelessWidget {
|
||||||
const BrandBottomSheet({Key? key, required this.child}) : super(key: key);
|
const BrandBottomSheet({
|
||||||
|
Key? key,
|
||||||
|
required this.child,
|
||||||
|
this.isExpended = false,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
final Widget child;
|
final Widget child;
|
||||||
|
final bool isExpended;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container(
|
var mainHeight = MediaQuery.of(context).size.height -
|
||||||
height: MediaQuery.of(context).size.height -
|
|
||||||
MediaQuery.of(context).padding.top -
|
MediaQuery.of(context).padding.top -
|
||||||
60,
|
100;
|
||||||
child: Scaffold(
|
late Widget innerWidget;
|
||||||
body: SingleChildScrollView(
|
if (isExpended) {
|
||||||
physics: ClampingScrollPhysics(),
|
innerWidget = Scaffold(
|
||||||
|
body: child,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
final ThemeData themeData = Theme.of(context);
|
||||||
|
|
||||||
|
innerWidget = Material(
|
||||||
|
color: themeData.scaffoldBackgroundColor,
|
||||||
|
child: IntrinsicHeight(child: child),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return ConstrainedBox(
|
||||||
|
constraints: BoxConstraints(maxHeight: mainHeight + 4 + 6),
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Center(
|
||||||
child: Container(
|
child: Container(
|
||||||
padding: paddingH15V0,
|
height: 4,
|
||||||
child: child,
|
width: 30,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(2),
|
||||||
|
color: BrandColors.gray4,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
SizedBox(height: 6),
|
||||||
|
ClipRRect(
|
||||||
|
borderRadius: BorderRadius.vertical(top: Radius.circular(20)),
|
||||||
|
child: ConstrainedBox(
|
||||||
|
constraints: BoxConstraints(maxHeight: mainHeight),
|
||||||
|
child: innerWidget,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
21
lib/ui/components/brand_loader/brand_loader.dart
Normal file
21
lib/ui/components/brand_loader/brand_loader.dart
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
|
||||||
|
class BrandLoader {
|
||||||
|
static horizontal() => _HorizontalLoader();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _HorizontalLoader extends StatelessWidget {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Text('basis.wait'.tr()),
|
||||||
|
SizedBox(height: 10),
|
||||||
|
LinearProgressIndicator(minHeight: 3),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -56,6 +56,7 @@ class _BrandMarkdownState extends State<BrandMarkdown> {
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
return Markdown(
|
return Markdown(
|
||||||
|
shrinkWrap: true,
|
||||||
styleSheet: markdown,
|
styleSheet: markdown,
|
||||||
onTapLink: (String text, String? href, String title) {
|
onTapLink: (String text, String? href, String title) {
|
||||||
if (href != null) {
|
if (href != null) {
|
||||||
|
|
|
@ -1,63 +1,63 @@
|
||||||
import 'package:flutter/material.dart';
|
// import 'package:flutter/material.dart';
|
||||||
|
|
||||||
var navigatorKey = GlobalKey<NavigatorState>();
|
// var navigatorKey = GlobalKey<NavigatorState>();
|
||||||
|
|
||||||
class BrandModalSheet extends StatelessWidget {
|
// class BrandModalSheet extends StatelessWidget {
|
||||||
const BrandModalSheet({
|
// const BrandModalSheet({
|
||||||
Key? key,
|
// Key? key,
|
||||||
this.child,
|
// this.child,
|
||||||
}) : super(key: key);
|
// }) : super(key: key);
|
||||||
|
|
||||||
final Widget? child;
|
// final Widget? child;
|
||||||
@override
|
// @override
|
||||||
Widget build(BuildContext context) {
|
// Widget build(BuildContext context) {
|
||||||
return DraggableScrollableSheet(
|
// return DraggableScrollableSheet(
|
||||||
minChildSize: 0.95,
|
// minChildSize: 1,
|
||||||
initialChildSize: 1,
|
// initialChildSize: 1,
|
||||||
maxChildSize: 1,
|
// maxChildSize: 1,
|
||||||
builder: (context, scrollController) {
|
// builder: (context, scrollController) {
|
||||||
return SingleChildScrollView(
|
// return SingleChildScrollView(
|
||||||
controller: scrollController,
|
// controller: scrollController,
|
||||||
physics: ClampingScrollPhysics(),
|
// physics: ClampingScrollPhysics(),
|
||||||
child: Container(
|
// child: Container(
|
||||||
child: Column(
|
// child: Column(
|
||||||
children: [
|
// children: [
|
||||||
GestureDetector(
|
// GestureDetector(
|
||||||
onTap: () => Navigator.of(context).pop(),
|
// onTap: () => Navigator.of(context).pop(),
|
||||||
behavior: HitTestBehavior.opaque,
|
// behavior: HitTestBehavior.opaque,
|
||||||
child: Container(
|
// child: Container(
|
||||||
width: double.infinity,
|
// width: double.infinity,
|
||||||
child: Center(
|
// child: Center(
|
||||||
child: Padding(
|
// child: Padding(
|
||||||
padding: EdgeInsets.only(top: 132, bottom: 6),
|
// padding: EdgeInsets.only(top: 132, bottom: 6),
|
||||||
child: Container(
|
// child: Container(
|
||||||
height: 4,
|
// height: 4,
|
||||||
width: 30,
|
// width: 30,
|
||||||
decoration: BoxDecoration(
|
// decoration: BoxDecoration(
|
||||||
borderRadius: BorderRadius.circular(2),
|
// borderRadius: BorderRadius.circular(2),
|
||||||
color: Color(0xFFE3E3E3).withOpacity(0.65),
|
// color: Color(0xFFE3E3E3).withOpacity(0.65),
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
Container(
|
// Container(
|
||||||
constraints: BoxConstraints(
|
// constraints: BoxConstraints(
|
||||||
minHeight: MediaQuery.of(context).size.height - 132,
|
// minHeight: MediaQuery.of(context).size.height - 132,
|
||||||
maxHeight: MediaQuery.of(context).size.height - 132,
|
// maxHeight: MediaQuery.of(context).size.height - 132,
|
||||||
),
|
// ),
|
||||||
decoration: BoxDecoration(
|
// decoration: BoxDecoration(
|
||||||
borderRadius:
|
// borderRadius:
|
||||||
BorderRadius.vertical(top: Radius.circular(20)),
|
// BorderRadius.vertical(top: Radius.circular(20)),
|
||||||
color: Theme.of(context).scaffoldBackgroundColor,
|
// color: Theme.of(context).scaffoldBackgroundColor,
|
||||||
),
|
// ),
|
||||||
width: double.infinity,
|
// width: double.infinity,
|
||||||
child: child),
|
// child: child),
|
||||||
],
|
// ],
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
);
|
// );
|
||||||
});
|
// });
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:selfprivacy/config/text_themes.dart';
|
import 'package:selfprivacy/config/text_themes.dart';
|
||||||
|
export 'package:selfprivacy/utils/extensions/text_extensions.dart';
|
||||||
|
|
||||||
enum TextType {
|
enum TextType {
|
||||||
h1, // right now only at onboarding and opened providers
|
h1, // right now only at onboarding and opened providers
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:selfprivacy/config/brand_colors.dart';
|
import 'package:selfprivacy/config/brand_colors.dart';
|
||||||
|
import 'package:selfprivacy/config/brand_theme.dart';
|
||||||
import 'package:selfprivacy/logic/cubit/jobs/jobs_cubit.dart';
|
import 'package:selfprivacy/logic/cubit/jobs/jobs_cubit.dart';
|
||||||
|
import 'package:selfprivacy/logic/cubit/users/users_cubit.dart';
|
||||||
import 'package:selfprivacy/ui/components/brand_button/brand_button.dart';
|
import 'package:selfprivacy/ui/components/brand_button/brand_button.dart';
|
||||||
import 'package:selfprivacy/ui/components/brand_cards/brand_cards.dart';
|
import 'package:selfprivacy/ui/components/brand_cards/brand_cards.dart';
|
||||||
|
import 'package:selfprivacy/ui/components/brand_loader/brand_loader.dart';
|
||||||
import 'package:selfprivacy/ui/components/brand_text/brand_text.dart';
|
import 'package:selfprivacy/ui/components/brand_text/brand_text.dart';
|
||||||
|
|
||||||
class JobsContent extends StatelessWidget {
|
class JobsContent extends StatelessWidget {
|
||||||
|
@ -11,22 +15,22 @@ class JobsContent extends StatelessWidget {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
var jobs = context.watch<JobsCubit>().state;
|
return BlocBuilder<JobsCubit, JobsState>(
|
||||||
return Column(
|
builder: (context, state) {
|
||||||
children: [
|
late final List<Widget> widgets;
|
||||||
SizedBox(height: 15),
|
if (state is JobsStateEmpty) {
|
||||||
Center(
|
widgets = [
|
||||||
child: BrandText.h2(
|
SizedBox(height: 80),
|
||||||
'jobs.title'.tr(),
|
Center(child: BrandText.body1('jobs.empty'.tr())),
|
||||||
),
|
];
|
||||||
),
|
} else if (state is JobsStateLoading) {
|
||||||
if (jobs.isEmpty)
|
widgets = [
|
||||||
Padding(
|
SizedBox(height: 80),
|
||||||
padding: const EdgeInsets.only(top: 50),
|
BrandLoader.horizontal(),
|
||||||
child: BrandText.body1('jobs.empty'.tr()),
|
];
|
||||||
),
|
} else if (state is JobsStateWithJobs) {
|
||||||
if (!jobs.isEmpty) ...[
|
widgets = [
|
||||||
...jobs.jobList
|
...state.jobList
|
||||||
.map(
|
.map(
|
||||||
(j) => Row(
|
(j) => Row(
|
||||||
children: [
|
children: [
|
||||||
|
@ -49,7 +53,7 @@ class JobsContent extends StatelessWidget {
|
||||||
),
|
),
|
||||||
onPressed: () =>
|
onPressed: () =>
|
||||||
context.read<JobsCubit>().removeJob(j.id),
|
context.read<JobsCubit>().removeJob(j.id),
|
||||||
child: Text('Remove'),
|
child: Text('basis.remove'.tr()),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -60,8 +64,22 @@ class JobsContent extends StatelessWidget {
|
||||||
onPressed: () => context.read<JobsCubit>().applyAll(),
|
onPressed: () => context.read<JobsCubit>().applyAll(),
|
||||||
text: 'jobs.start'.tr(),
|
text: 'jobs.start'.tr(),
|
||||||
),
|
),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
return ListView(
|
||||||
|
padding: paddingH15V0,
|
||||||
|
children: [
|
||||||
|
SizedBox(height: 15),
|
||||||
|
Center(
|
||||||
|
child: BrandText.h2(
|
||||||
|
'jobs.title'.tr(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 20),
|
||||||
|
...widgets
|
||||||
],
|
],
|
||||||
],
|
);
|
||||||
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,12 +15,25 @@ class _BrandFlashButtonState extends State<_BrandFlashButton>
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
_animationController =
|
_animationController =
|
||||||
AnimationController(vsync: this, duration: Duration(milliseconds: 600));
|
AnimationController(vsync: this, duration: Duration(milliseconds: 800));
|
||||||
_colorTween = ColorTween(
|
_colorTween = ColorTween(
|
||||||
begin: BrandColors.black,
|
begin: BrandColors.black,
|
||||||
end: BrandColors.primary,
|
end: BrandColors.primary,
|
||||||
).animate(_animationController);
|
).animate(_animationController);
|
||||||
|
|
||||||
super.initState();
|
super.initState();
|
||||||
|
WidgetsBinding.instance!.addPostFrameCallback(_afterLayout);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _afterLayout(_) {
|
||||||
|
if (Theme.of(context).brightness == Brightness.dark) {
|
||||||
|
setState(() {
|
||||||
|
_colorTween = ColorTween(
|
||||||
|
begin: BrandColors.white,
|
||||||
|
end: BrandColors.primary,
|
||||||
|
).animate(_animationController);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -29,29 +42,27 @@ class _BrandFlashButtonState extends State<_BrandFlashButton>
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
late bool wasPrevStateIsEmpty;
|
bool wasPrevStateIsEmpty = true;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
var hasNoJobs = context.watch<JobsCubit>().state.isEmpty;
|
|
||||||
wasPrevStateIsEmpty = hasNoJobs;
|
|
||||||
var icon = hasNoJobs ? Ionicons.flash_outline : Ionicons.flash;
|
|
||||||
|
|
||||||
return BlocListener<JobsCubit, JobsState>(
|
return BlocListener<JobsCubit, JobsState>(
|
||||||
listener: (context, state) {
|
listener: (context, state) {
|
||||||
if (wasPrevStateIsEmpty && state.jobList.isNotEmpty) {
|
if (wasPrevStateIsEmpty && state is! JobsStateEmpty) {
|
||||||
wasPrevStateIsEmpty = false;
|
wasPrevStateIsEmpty = false;
|
||||||
_animationController.forward();
|
_animationController.forward();
|
||||||
} else if (!wasPrevStateIsEmpty && state.jobList.isEmpty) {
|
} else if (!wasPrevStateIsEmpty && state is JobsStateEmpty) {
|
||||||
|
wasPrevStateIsEmpty = true;
|
||||||
|
|
||||||
_animationController.reverse();
|
_animationController.reverse();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: IconButton(
|
child: IconButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
showCupertinoModalBottomSheet(
|
showBrandBottomSheet(
|
||||||
expand: false,
|
|
||||||
context: context,
|
context: context,
|
||||||
builder: (context) => BrandBottomSheet(
|
builder: (context) => BrandBottomSheet(
|
||||||
|
isExpended: true,
|
||||||
child: JobsContent(),
|
child: JobsContent(),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -59,9 +70,14 @@ class _BrandFlashButtonState extends State<_BrandFlashButton>
|
||||||
icon: AnimatedBuilder(
|
icon: AnimatedBuilder(
|
||||||
animation: _colorTween,
|
animation: _colorTween,
|
||||||
builder: (context, child) {
|
builder: (context, child) {
|
||||||
return Icon(
|
var v = _animationController.value;
|
||||||
|
var icon = v > 0.5 ? Ionicons.flash : Ionicons.flash_outline;
|
||||||
|
return Transform.scale(
|
||||||
|
scale: 1 + (v < 0.5 ? v : 1 - v) * 2,
|
||||||
|
child: Icon(
|
||||||
icon,
|
icon,
|
||||||
color: _colorTween.value,
|
color: _colorTween.value,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/scheduler.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:ionicons/ionicons.dart';
|
import 'package:ionicons/ionicons.dart';
|
||||||
import 'package:selfprivacy/config/brand_colors.dart';
|
import 'package:selfprivacy/config/brand_colors.dart';
|
||||||
|
@ -6,8 +7,8 @@ import 'package:selfprivacy/logic/cubit/jobs/jobs_cubit.dart';
|
||||||
import 'package:selfprivacy/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart';
|
import 'package:selfprivacy/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart';
|
||||||
import 'package:selfprivacy/ui/components/brand_text/brand_text.dart';
|
import 'package:selfprivacy/ui/components/brand_text/brand_text.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
|
|
||||||
import 'package:selfprivacy/ui/components/jobs_content/jobs_content.dart';
|
import 'package:selfprivacy/ui/components/jobs_content/jobs_content.dart';
|
||||||
|
import 'package:selfprivacy/ui/helpers/modals.dart';
|
||||||
|
|
||||||
part 'close.dart';
|
part 'close.dart';
|
||||||
part 'flash.dart';
|
part 'flash.dart';
|
||||||
|
|
|
@ -53,9 +53,9 @@ class _ProgressBarState extends State<ProgressBar> {
|
||||||
width: 10,
|
width: 10,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
even.add(
|
odd.add(
|
||||||
SizedBox(
|
SizedBox(
|
||||||
width: 10,
|
width: 20,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
14
lib/ui/helpers/modals.dart
Normal file
14
lib/ui/helpers/modals.dart
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
|
||||||
|
|
||||||
|
Future<T?> showBrandBottomSheet<T>({
|
||||||
|
required BuildContext context,
|
||||||
|
required WidgetBuilder builder,
|
||||||
|
}) =>
|
||||||
|
showCupertinoModalBottomSheet<T>(
|
||||||
|
builder: builder,
|
||||||
|
barrierColor: Colors.black45,
|
||||||
|
context: context,
|
||||||
|
shadow: BoxShadow(color: Colors.transparent),
|
||||||
|
backgroundColor: Colors.transparent,
|
||||||
|
);
|
|
@ -10,10 +10,10 @@ import 'package:selfprivacy/logic/cubit/forms/initializing/hetzner_form_cubit.da
|
||||||
import 'package:selfprivacy/logic/cubit/forms/initializing/root_user_form_cubit.dart';
|
import 'package:selfprivacy/logic/cubit/forms/initializing/root_user_form_cubit.dart';
|
||||||
import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart';
|
import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart';
|
||||||
import 'package:selfprivacy/logic/cubit/providers/providers_cubit.dart';
|
import 'package:selfprivacy/logic/cubit/providers/providers_cubit.dart';
|
||||||
|
import 'package:selfprivacy/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart';
|
||||||
import 'package:selfprivacy/ui/components/brand_button/brand_button.dart';
|
import 'package:selfprivacy/ui/components/brand_button/brand_button.dart';
|
||||||
import 'package:selfprivacy/ui/components/brand_cards/brand_cards.dart';
|
import 'package:selfprivacy/ui/components/brand_cards/brand_cards.dart';
|
||||||
import 'package:selfprivacy/ui/components/brand_md/brand_md.dart';
|
import 'package:selfprivacy/ui/components/brand_md/brand_md.dart';
|
||||||
import 'package:selfprivacy/ui/components/brand_modal_sheet/brand_modal_sheet.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/components/brand_timer/brand_timer.dart';
|
import 'package:selfprivacy/ui/components/brand_timer/brand_timer.dart';
|
||||||
import 'package:selfprivacy/ui/components/progress_bar/progress_bar.dart';
|
import 'package:selfprivacy/ui/components/progress_bar/progress_bar.dart';
|
||||||
|
@ -36,7 +36,7 @@ class InitializingPage extends StatelessWidget {
|
||||||
() => _stepCheck(cubit),
|
() => _stepCheck(cubit),
|
||||||
() => _stepCheck(cubit),
|
() => _stepCheck(cubit),
|
||||||
() => _stepCheck(cubit),
|
() => _stepCheck(cubit),
|
||||||
() => Container(child: Text('Everythigng is initialized'))
|
() => Container(child: Center(child: Text('initializing.finish'.tr())))
|
||||||
][cubit.state.progress]();
|
][cubit.state.progress]();
|
||||||
return BlocListener<AppConfigCubit, AppConfigState>(
|
return BlocListener<AppConfigCubit, AppConfigState>(
|
||||||
listener: (context, state) {
|
listener: (context, state) {
|
||||||
|
@ -59,12 +59,9 @@ class InitializingPage extends StatelessWidget {
|
||||||
'Domain',
|
'Domain',
|
||||||
'User',
|
'User',
|
||||||
'Server',
|
'Server',
|
||||||
' ✅',
|
'✅ Check',
|
||||||
' ✅',
|
|
||||||
' ✅',
|
|
||||||
' ✅',
|
|
||||||
],
|
],
|
||||||
activeIndex: cubit.state.progress,
|
activeIndex: cubit.state.porgressBar,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
_addCard(
|
_addCard(
|
||||||
|
@ -443,21 +440,29 @@ class InitializingPage extends StatelessWidget {
|
||||||
Widget _stepCheck(AppConfigCubit appConfigCubit) {
|
Widget _stepCheck(AppConfigCubit appConfigCubit) {
|
||||||
assert(appConfigCubit.state is TimerState, 'wronge state');
|
assert(appConfigCubit.state is TimerState, 'wronge state');
|
||||||
var state = appConfigCubit.state as TimerState;
|
var state = appConfigCubit.state as TimerState;
|
||||||
|
late int doneCount;
|
||||||
late String? text;
|
late String? text;
|
||||||
if (state.isServerResetedSecondTime) {
|
if (state.isServerResetedSecondTime) {
|
||||||
text = 'initializing.13'.tr();
|
text = 'initializing.13'.tr();
|
||||||
|
doneCount = 3;
|
||||||
} else if (state.isServerResetedFirstTime) {
|
} else if (state.isServerResetedFirstTime) {
|
||||||
text = 'initializing.21'.tr();
|
text = 'initializing.21'.tr();
|
||||||
|
doneCount = 2;
|
||||||
} else if (state.isServerStarted) {
|
} else if (state.isServerStarted) {
|
||||||
text = 'initializing.14'.tr();
|
text = 'initializing.14'.tr();
|
||||||
|
doneCount = 1;
|
||||||
} else if (state.isServerCreated) {
|
} else if (state.isServerCreated) {
|
||||||
text = 'initializing.15'.tr();
|
text = 'initializing.15'.tr();
|
||||||
|
doneCount = 0;
|
||||||
}
|
}
|
||||||
return Builder(builder: (context) {
|
return Builder(builder: (context) {
|
||||||
return Column(
|
return Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
|
SizedBox(height: 15),
|
||||||
|
BrandText.h4(
|
||||||
|
'initializing.checks'.tr(args: [doneCount.toString(), "4"]),
|
||||||
|
),
|
||||||
Spacer(flex: 2),
|
Spacer(flex: 2),
|
||||||
SizedBox(height: 10),
|
SizedBox(height: 10),
|
||||||
BrandText.body2(text),
|
BrandText.body2(text),
|
||||||
|
@ -501,12 +506,14 @@ class _HowHetzner extends StatelessWidget {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return BrandModalSheet(
|
return BrandBottomSheet(
|
||||||
|
isExpended: true,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: paddingH15V0.copyWith(top: 25),
|
padding: paddingH15V0,
|
||||||
child: BrandMarkdown(
|
child: BrandMarkdown(
|
||||||
fileName: 'how_hetzner',
|
fileName: 'how_hetzner',
|
||||||
)),
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,21 +3,17 @@ import 'package:selfprivacy/config/brand_theme.dart';
|
||||||
import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart';
|
import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart';
|
||||||
import 'package:selfprivacy/logic/cubit/jobs/jobs_cubit.dart';
|
import 'package:selfprivacy/logic/cubit/jobs/jobs_cubit.dart';
|
||||||
import 'package:selfprivacy/logic/cubit/providers/providers_cubit.dart';
|
import 'package:selfprivacy/logic/cubit/providers/providers_cubit.dart';
|
||||||
import 'package:selfprivacy/logic/models/job.dart';
|
|
||||||
import 'package:selfprivacy/logic/models/provider.dart';
|
import 'package:selfprivacy/logic/models/provider.dart';
|
||||||
import 'package:selfprivacy/logic/models/state_types.dart';
|
import 'package:selfprivacy/logic/models/state_types.dart';
|
||||||
import 'package:selfprivacy/ui/components/brand_button/brand_button.dart';
|
import 'package:selfprivacy/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart';
|
||||||
import 'package:selfprivacy/ui/components/brand_cards/brand_cards.dart';
|
import 'package:selfprivacy/ui/components/brand_cards/brand_cards.dart';
|
||||||
import 'package:selfprivacy/ui/components/brand_header/brand_header.dart';
|
import 'package:selfprivacy/ui/components/brand_header/brand_header.dart';
|
||||||
import 'package:selfprivacy/ui/components/brand_modal_sheet/brand_modal_sheet.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/components/icon_status_mask/icon_status_mask.dart';
|
import 'package:selfprivacy/ui/components/icon_status_mask/icon_status_mask.dart';
|
||||||
import 'package:selfprivacy/ui/components/not_ready_card/not_ready_card.dart';
|
import 'package:selfprivacy/ui/components/not_ready_card/not_ready_card.dart';
|
||||||
import 'package:selfprivacy/ui/components/one_page/one_page.dart';
|
import 'package:selfprivacy/ui/helpers/modals.dart';
|
||||||
import 'package:selfprivacy/ui/pages/server_details/server_details.dart';
|
import 'package:selfprivacy/ui/pages/server_details/server_details.dart';
|
||||||
import 'package:selfprivacy/utils/route_transitions/basic.dart';
|
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:selfprivacy/utils/route_transitions/slide_bottom.dart';
|
|
||||||
import 'package:selfprivacy/utils/ui_helpers.dart';
|
import 'package:selfprivacy/utils/ui_helpers.dart';
|
||||||
|
|
||||||
var navigatorKey = GlobalKey<NavigatorState>();
|
var navigatorKey = GlobalKey<NavigatorState>();
|
||||||
|
@ -79,7 +75,7 @@ class _Card extends StatelessWidget {
|
||||||
String? message;
|
String? message;
|
||||||
late String stableText;
|
late String stableText;
|
||||||
late VoidCallback onTap;
|
late VoidCallback onTap;
|
||||||
|
var isReady = context.watch<AppConfigCubit>().state.isFullyInitilized;
|
||||||
AppConfigState appConfig = context.watch<AppConfigCubit>().state;
|
AppConfigState appConfig = context.watch<AppConfigCubit>().state;
|
||||||
|
|
||||||
var domainName =
|
var domainName =
|
||||||
|
@ -89,24 +85,22 @@ class _Card extends StatelessWidget {
|
||||||
case ProviderType.server:
|
case ProviderType.server:
|
||||||
title = 'providers.server.card_title'.tr();
|
title = 'providers.server.card_title'.tr();
|
||||||
stableText = 'providers.server.status'.tr();
|
stableText = 'providers.server.status'.tr();
|
||||||
onTap = () => Navigator.of(context).push(
|
onTap = () => showBrandBottomSheet(
|
||||||
SlideBottomRoute(
|
context: context,
|
||||||
OnePage(
|
builder: (context) => BrandBottomSheet(
|
||||||
title: title,
|
isExpended: true,
|
||||||
child: ServerDetails(),
|
child: ServerDetails(),
|
||||||
),
|
),
|
||||||
),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case ProviderType.domain:
|
case ProviderType.domain:
|
||||||
title = 'providers.domain.card_title'.tr();
|
title = 'providers.domain.card_title'.tr();
|
||||||
message = domainName;
|
message = domainName;
|
||||||
stableText = 'providers.domain.status'.tr();
|
stableText = 'providers.domain.status'.tr();
|
||||||
|
|
||||||
onTap = () => showModalBottomSheet<void>(
|
onTap = () => showBrandBottomSheet<void>(
|
||||||
context: context,
|
context: context,
|
||||||
isScrollControlled: true,
|
|
||||||
backgroundColor: Colors.transparent,
|
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
return _ProviderDetails(
|
return _ProviderDetails(
|
||||||
provider: provider,
|
provider: provider,
|
||||||
|
@ -133,7 +127,7 @@ class _Card extends StatelessWidget {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
onTap: onTap,
|
onTap: isReady ? onTap : null,
|
||||||
child: BrandCards.big(
|
child: BrandCards.big(
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
@ -199,21 +193,12 @@ class _ProviderDetails extends StatelessWidget {
|
||||||
'providers.backup.bottom_sheet.2'.tr(args: [domainName, 'Time'])),
|
'providers.backup.bottom_sheet.2'.tr(args: [domainName, 'Time'])),
|
||||||
SizedBox(height: 10),
|
SizedBox(height: 10),
|
||||||
BrandText.body1('providers.backup.status'.tr()),
|
BrandText.body1('providers.backup.status'.tr()),
|
||||||
BrandButton.rised(
|
|
||||||
onPressed: () =>
|
|
||||||
context.read<JobsCubit>().addJob(Job(title: 'text')),
|
|
||||||
text: 'add job',
|
|
||||||
)
|
|
||||||
];
|
];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return BrandModalSheet(
|
return BrandBottomSheet(
|
||||||
child: Navigator(
|
child: SafeArea(
|
||||||
key: navigatorKey,
|
child: Column(
|
||||||
initialRoute: '/',
|
|
||||||
onGenerateRoute: (_) {
|
|
||||||
return materialRoute(
|
|
||||||
Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
SizedBox(height: 40),
|
SizedBox(height: 40),
|
||||||
|
@ -224,20 +209,18 @@ class _ProviderDetails extends StatelessWidget {
|
||||||
children: [
|
children: [
|
||||||
IconStatusMask(
|
IconStatusMask(
|
||||||
status: provider.state,
|
status: provider.state,
|
||||||
child:
|
child: Icon(provider.icon, size: 40, color: Colors.white),
|
||||||
Icon(provider.icon, size: 40, color: Colors.white),
|
|
||||||
),
|
),
|
||||||
SizedBox(height: 10),
|
SizedBox(height: 10),
|
||||||
BrandText.h1(title),
|
BrandText.h1(title),
|
||||||
SizedBox(height: 10),
|
SizedBox(height: 10),
|
||||||
...children
|
...children,
|
||||||
|
SizedBox(height: 30),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,7 +82,6 @@ class CpuChart extends StatelessWidget {
|
||||||
double appliedInterval,
|
double appliedInterval,
|
||||||
double value,
|
double value,
|
||||||
) {
|
) {
|
||||||
print(value);
|
|
||||||
if (value < 0) {
|
if (value < 0) {
|
||||||
return false;
|
return false;
|
||||||
} else if (value == 0) {
|
} else if (value == 0) {
|
||||||
|
|
|
@ -56,11 +56,27 @@ class _ServerDetailsState extends State<ServerDetails>
|
||||||
var isReady = context.watch<AppConfigCubit>().state.isFullyInitilized;
|
var isReady = context.watch<AppConfigCubit>().state.isFullyInitilized;
|
||||||
var providerState = isReady ? StateType.stable : StateType.uninitialized;
|
var providerState = isReady ? StateType.stable : StateType.uninitialized;
|
||||||
|
|
||||||
return TabBarView(
|
return Scaffold(
|
||||||
|
appBar: PreferredSize(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
height: 51,
|
||||||
|
alignment: Alignment.center,
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 15),
|
||||||
|
child: BrandText.h4('basis.details'.tr()),
|
||||||
|
),
|
||||||
|
BrandDivider(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
preferredSize: Size.fromHeight(52),
|
||||||
|
),
|
||||||
|
body: TabBarView(
|
||||||
physics: NeverScrollableScrollPhysics(),
|
physics: NeverScrollableScrollPhysics(),
|
||||||
controller: tabController,
|
controller: tabController,
|
||||||
children: [
|
children: [
|
||||||
SingleChildScrollView(
|
SingleChildScrollView(
|
||||||
|
physics: ClampingScrollPhysics(),
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
|
@ -91,6 +107,7 @@ class _ServerDetailsState extends State<ServerDetails>
|
||||||
),
|
),
|
||||||
_ServerSettings(tabController: tabController),
|
_ServerSettings(tabController: tabController),
|
||||||
],
|
],
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,20 +108,23 @@ class _Card extends StatelessWidget {
|
||||||
var isReady = context.watch<AppConfigCubit>().state.isFullyInitilized;
|
var isReady = context.watch<AppConfigCubit>().state.isFullyInitilized;
|
||||||
var changeTab = context.read<ChangeTab>().onPress;
|
var changeTab = context.read<ChangeTab>().onPress;
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
onTap: () => showDialog<void>(
|
onTap: isReady
|
||||||
|
? () => showDialog<void>(
|
||||||
context: context,
|
context: context,
|
||||||
// isScrollControlled: true,
|
// isScrollControlled: true,
|
||||||
// backgroundColor: Colors.transparent,
|
// backgroundColor: Colors.transparent,
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
return _ServiceDetails(
|
return _ServiceDetails(
|
||||||
serviceType: serviceType,
|
serviceType: serviceType,
|
||||||
status: isReady ? StateType.stable : StateType.uninitialized,
|
status:
|
||||||
|
isReady ? StateType.stable : StateType.uninitialized,
|
||||||
title: title,
|
title: title,
|
||||||
icon: iconData,
|
icon: iconData,
|
||||||
changeTab: changeTab,
|
changeTab: changeTab,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
)
|
||||||
|
: null,
|
||||||
child: BrandCards.big(
|
child: BrandCards.big(
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
|
|
@ -7,10 +7,26 @@ class _NewUser extends StatelessWidget {
|
||||||
|
|
||||||
var domainName = UiHelpers.getDomainName(config);
|
var domainName = UiHelpers.getDomainName(config);
|
||||||
|
|
||||||
return BrandModalSheet(
|
return BrandBottomSheet(
|
||||||
child: BlocProvider(
|
child: BlocProvider(
|
||||||
create: (context) =>
|
create: (context) {
|
||||||
UserFormCubit(usersCubit: context.read<UsersCubit>()),
|
var jobCubit = context.read<JobsCubit>();
|
||||||
|
var jobState = jobCubit.state;
|
||||||
|
var users = <User>[];
|
||||||
|
users.addAll(context.read<UsersCubit>().state.users);
|
||||||
|
if (jobState is JobsStateWithJobs) {
|
||||||
|
var jobs = jobState.jobList;
|
||||||
|
jobs.forEach((job) {
|
||||||
|
if (job is CreateUserJob) {
|
||||||
|
users.add(job.user);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return UserFormCubit(
|
||||||
|
jobsCubit: jobCubit,
|
||||||
|
users: users,
|
||||||
|
);
|
||||||
|
},
|
||||||
child: Builder(builder: (context) {
|
child: Builder(builder: (context) {
|
||||||
var formCubitState = context.watch<UserFormCubit>().state;
|
var formCubitState = context.watch<UserFormCubit>().state;
|
||||||
|
|
||||||
|
@ -22,6 +38,7 @@ class _NewUser extends StatelessWidget {
|
||||||
},
|
},
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
BrandHeader(
|
BrandHeader(
|
||||||
title: 'users.new_user'.tr(),
|
title: 'users.new_user'.tr(),
|
||||||
|
@ -30,14 +47,17 @@ class _NewUser extends StatelessWidget {
|
||||||
Padding(
|
Padding(
|
||||||
padding: paddingH15V0,
|
padding: paddingH15V0,
|
||||||
child: Column(
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
CubitFormTextField(
|
IntrinsicHeight(
|
||||||
|
child: CubitFormTextField(
|
||||||
formFieldCubit: context.read<UserFormCubit>().login,
|
formFieldCubit: context.read<UserFormCubit>().login,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: 'users.login'.tr(),
|
labelText: 'users.login'.tr(),
|
||||||
suffixText: '@$domainName',
|
suffixText: '@$domainName',
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
SizedBox(height: 20),
|
SizedBox(height: 20),
|
||||||
CubitFormTextField(
|
CubitFormTextField(
|
||||||
formFieldCubit: context.read<UserFormCubit>().password,
|
formFieldCubit: context.read<UserFormCubit>().password,
|
||||||
|
|
|
@ -1,17 +1,15 @@
|
||||||
part of 'users.dart';
|
part of 'users.dart';
|
||||||
|
|
||||||
class _User extends StatelessWidget {
|
class _User extends StatelessWidget {
|
||||||
const _User({Key? key, this.user}) : super(key: key);
|
const _User({Key? key, required this.user}) : super(key: key);
|
||||||
|
|
||||||
final User? user;
|
final User user;
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return InkWell(
|
return InkWell(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
showModalBottomSheet<void>(
|
showBrandBottomSheet<void>(
|
||||||
context: context,
|
context: context,
|
||||||
isScrollControlled: true,
|
|
||||||
backgroundColor: Colors.transparent,
|
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
return _UserDetails(user: user);
|
return _UserDetails(user: user);
|
||||||
},
|
},
|
||||||
|
@ -26,12 +24,12 @@ class _User extends StatelessWidget {
|
||||||
width: 17,
|
width: 17,
|
||||||
height: 17,
|
height: 17,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: user!.color,
|
color: user.color,
|
||||||
shape: BoxShape.circle,
|
shape: BoxShape.circle,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
SizedBox(width: 20),
|
SizedBox(width: 20),
|
||||||
BrandText.h4(user!.login),
|
BrandText.h4(user.login),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -3,10 +3,10 @@ part of 'users.dart';
|
||||||
class _UserDetails extends StatelessWidget {
|
class _UserDetails extends StatelessWidget {
|
||||||
const _UserDetails({
|
const _UserDetails({
|
||||||
Key? key,
|
Key? key,
|
||||||
this.user,
|
required this.user,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
final User? user;
|
final User user;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
@ -14,14 +14,16 @@ class _UserDetails extends StatelessWidget {
|
||||||
|
|
||||||
var domainName = UiHelpers.getDomainName(config);
|
var domainName = UiHelpers.getDomainName(config);
|
||||||
|
|
||||||
return BrandModalSheet(
|
return BrandBottomSheet(
|
||||||
|
isExpended: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Container(
|
Container(
|
||||||
height: 200,
|
height: 200,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: user!.color,
|
color: user.color,
|
||||||
borderRadius: BorderRadius.vertical(
|
borderRadius: BorderRadius.vertical(
|
||||||
top: Radius.circular(20),
|
top: Radius.circular(20),
|
||||||
),
|
),
|
||||||
|
@ -114,7 +116,7 @@ class _UserDetails extends StatelessWidget {
|
||||||
horizontal: 15,
|
horizontal: 15,
|
||||||
),
|
),
|
||||||
child: BrandText.h1(
|
child: BrandText.h1(
|
||||||
user!.login,
|
user.login,
|
||||||
softWrap: true,
|
softWrap: true,
|
||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
)),
|
)),
|
||||||
|
@ -131,14 +133,14 @@ class _UserDetails extends StatelessWidget {
|
||||||
Container(
|
Container(
|
||||||
height: 40,
|
height: 40,
|
||||||
alignment: Alignment.centerLeft,
|
alignment: Alignment.centerLeft,
|
||||||
child: BrandText.h4('${user!.login}@$domainName'),
|
child: BrandText.h4('${user.login}@$domainName'),
|
||||||
),
|
),
|
||||||
SizedBox(height: 14),
|
SizedBox(height: 14),
|
||||||
BrandText.small('basis.password'.tr()),
|
BrandText.small('basis.password'.tr()),
|
||||||
Container(
|
Container(
|
||||||
height: 40,
|
height: 40,
|
||||||
alignment: Alignment.centerLeft,
|
alignment: Alignment.centerLeft,
|
||||||
child: BrandText.h4(user!.password),
|
child: BrandText.h4(user.password),
|
||||||
),
|
),
|
||||||
SizedBox(height: 24),
|
SizedBox(height: 24),
|
||||||
BrandDivider(),
|
BrandDivider(),
|
||||||
|
@ -146,7 +148,10 @@ class _UserDetails extends StatelessWidget {
|
||||||
BrandButton.emptyWithIconText(
|
BrandButton.emptyWithIconText(
|
||||||
title: 'users.send_regisration_data'.tr(),
|
title: 'users.send_regisration_data'.tr(),
|
||||||
icon: Icon(BrandIcons.share),
|
icon: Icon(BrandIcons.share),
|
||||||
onPressed: () {},
|
onPressed: () {
|
||||||
|
Share.share(
|
||||||
|
'login: ${user.login}, password: ${user.password}');
|
||||||
|
},
|
||||||
),
|
),
|
||||||
SizedBox(height: 20),
|
SizedBox(height: 20),
|
||||||
],
|
],
|
||||||
|
|
|
@ -4,17 +4,21 @@ import 'package:selfprivacy/config/brand_colors.dart';
|
||||||
import 'package:selfprivacy/config/brand_theme.dart';
|
import 'package:selfprivacy/config/brand_theme.dart';
|
||||||
import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart';
|
import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart';
|
||||||
import 'package:selfprivacy/logic/cubit/forms/user/user_form_cubit.dart';
|
import 'package:selfprivacy/logic/cubit/forms/user/user_form_cubit.dart';
|
||||||
|
import 'package:selfprivacy/logic/cubit/jobs/jobs_cubit.dart';
|
||||||
import 'package:selfprivacy/logic/cubit/users/users_cubit.dart';
|
import 'package:selfprivacy/logic/cubit/users/users_cubit.dart';
|
||||||
|
import 'package:selfprivacy/logic/models/jobs/job.dart';
|
||||||
import 'package:selfprivacy/logic/models/user.dart';
|
import 'package:selfprivacy/logic/models/user.dart';
|
||||||
|
import 'package:selfprivacy/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart';
|
||||||
import 'package:selfprivacy/ui/components/brand_button/brand_button.dart';
|
import 'package:selfprivacy/ui/components/brand_button/brand_button.dart';
|
||||||
import 'package:selfprivacy/ui/components/brand_divider/brand_divider.dart';
|
import 'package:selfprivacy/ui/components/brand_divider/brand_divider.dart';
|
||||||
import 'package:selfprivacy/ui/components/brand_header/brand_header.dart';
|
import 'package:selfprivacy/ui/components/brand_header/brand_header.dart';
|
||||||
import 'package:selfprivacy/ui/components/brand_icons/brand_icons.dart';
|
import 'package:selfprivacy/ui/components/brand_icons/brand_icons.dart';
|
||||||
import 'package:selfprivacy/ui/components/brand_modal_sheet/brand_modal_sheet.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/components/not_ready_card/not_ready_card.dart';
|
import 'package:selfprivacy/ui/components/not_ready_card/not_ready_card.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
import 'package:selfprivacy/ui/helpers/modals.dart';
|
||||||
import 'package:selfprivacy/utils/ui_helpers.dart';
|
import 'package:selfprivacy/utils/ui_helpers.dart';
|
||||||
|
import 'package:share_plus/share_plus.dart';
|
||||||
|
|
||||||
part 'fab.dart';
|
part 'fab.dart';
|
||||||
part 'new_user.dart';
|
part 'new_user.dart';
|
||||||
|
@ -31,7 +35,6 @@ class UsersPage extends StatelessWidget {
|
||||||
var isReady = context.watch<AppConfigCubit>().state.isFullyInitilized;
|
var isReady = context.watch<AppConfigCubit>().state.isFullyInitilized;
|
||||||
final users = usersCubitState.users;
|
final users = usersCubitState.users;
|
||||||
final isEmpty = usersCubitState.isEmpty;
|
final isEmpty = usersCubitState.isEmpty;
|
||||||
|
|
||||||
Widget child;
|
Widget child;
|
||||||
|
|
||||||
if (!isReady) {
|
if (!isReady) {
|
||||||
|
@ -46,7 +49,7 @@ class UsersPage extends StatelessWidget {
|
||||||
)
|
)
|
||||||
: ListView(
|
: ListView(
|
||||||
children: [
|
children: [
|
||||||
...users.map((user) => _User(user: user)),
|
...users.map((user) => _User(user: user)).toList(),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
51
lib/utils/extensions/text_extensions.dart
Normal file
51
lib/utils/extensions/text_extensions.dart
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
import 'dart:ui';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
|
||||||
|
extension TextExtension on Text {
|
||||||
|
Text withColor(Color color) => Text(
|
||||||
|
data!,
|
||||||
|
key: this.key,
|
||||||
|
strutStyle: this.strutStyle,
|
||||||
|
textAlign: this.textAlign,
|
||||||
|
textDirection: this.textDirection,
|
||||||
|
locale: this.locale,
|
||||||
|
softWrap: this.softWrap,
|
||||||
|
overflow: this.overflow,
|
||||||
|
textScaleFactor: this.textScaleFactor,
|
||||||
|
maxLines: this.maxLines,
|
||||||
|
semanticsLabel: this.semanticsLabel,
|
||||||
|
textWidthBasis: textWidthBasis ?? this.textWidthBasis,
|
||||||
|
style: this.style != null
|
||||||
|
? this.style!.copyWith(color: color)
|
||||||
|
: TextStyle(color: color),
|
||||||
|
);
|
||||||
|
|
||||||
|
Text copyWith({
|
||||||
|
Key? key,
|
||||||
|
StrutStyle? strutStyle,
|
||||||
|
TextAlign? textAlign,
|
||||||
|
TextDirection? textDirection,
|
||||||
|
Locale? locale,
|
||||||
|
bool? softWrap,
|
||||||
|
TextOverflow? overflow,
|
||||||
|
double? textScaleFactor,
|
||||||
|
int? maxLines,
|
||||||
|
String? semanticsLabel,
|
||||||
|
TextWidthBasis? textWidthBasis,
|
||||||
|
TextStyle? style,
|
||||||
|
}) {
|
||||||
|
return Text(data!,
|
||||||
|
key: key ?? this.key,
|
||||||
|
strutStyle: strutStyle ?? this.strutStyle,
|
||||||
|
textAlign: textAlign ?? this.textAlign,
|
||||||
|
textDirection: textDirection ?? this.textDirection,
|
||||||
|
locale: locale ?? this.locale,
|
||||||
|
softWrap: softWrap ?? this.softWrap,
|
||||||
|
overflow: overflow ?? this.overflow,
|
||||||
|
textScaleFactor: textScaleFactor ?? this.textScaleFactor,
|
||||||
|
maxLines: maxLines ?? this.maxLines,
|
||||||
|
semanticsLabel: semanticsLabel ?? this.semanticsLabel,
|
||||||
|
textWidthBasis: textWidthBasis ?? this.textWidthBasis,
|
||||||
|
style: style != null ? this.style?.merge(style) ?? style : this.style);
|
||||||
|
}
|
||||||
|
}
|
167
pubspec.lock
167
pubspec.lock
|
@ -7,14 +7,14 @@ packages:
|
||||||
name: _fe_analyzer_shared
|
name: _fe_analyzer_shared
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "19.0.0"
|
version: "22.0.0"
|
||||||
analyzer:
|
analyzer:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: analyzer
|
name: analyzer
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.0"
|
version: "1.7.1"
|
||||||
archive:
|
archive:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -35,14 +35,14 @@ packages:
|
||||||
name: async
|
name: async
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.5.0"
|
version: "2.6.1"
|
||||||
basic_utils:
|
basic_utils:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: basic_utils
|
name: basic_utils
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.0-nullsafety.3"
|
version: "3.1.0"
|
||||||
bloc:
|
bloc:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -63,7 +63,7 @@ packages:
|
||||||
name: build
|
name: build
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.0.2"
|
||||||
build_config:
|
build_config:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -84,7 +84,7 @@ packages:
|
||||||
name: build_resolvers
|
name: build_resolvers
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.0.3"
|
||||||
build_runner:
|
build_runner:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
|
@ -105,14 +105,14 @@ packages:
|
||||||
name: built_collection
|
name: built_collection
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.0.0"
|
version: "5.1.0"
|
||||||
built_value:
|
built_value:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: built_value
|
name: built_value
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "8.0.4"
|
version: "8.1.0"
|
||||||
characters:
|
characters:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -175,7 +175,7 @@ packages:
|
||||||
name: coverage
|
name: coverage
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.2"
|
version: "1.0.3"
|
||||||
crypt:
|
crypt:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -189,28 +189,28 @@ packages:
|
||||||
name: crypto
|
name: crypto
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.0"
|
version: "3.0.1"
|
||||||
cubit_form:
|
cubit_form:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: cubit_form
|
name: cubit_form
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.2-nullsafety.0"
|
version: "1.0.16"
|
||||||
cupertino_icons:
|
cupertino_icons:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: cupertino_icons
|
name: cupertino_icons
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.2"
|
version: "1.0.3"
|
||||||
dart_style:
|
dart_style:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: dart_style
|
name: dart_style
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.0.1"
|
||||||
dio:
|
dio:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -252,7 +252,14 @@ packages:
|
||||||
name: equatable
|
name: equatable
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.0.3"
|
||||||
|
extended_masked_text:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: extended_masked_text
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.2.1"
|
||||||
fake_async:
|
fake_async:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -266,14 +273,14 @@ packages:
|
||||||
name: ffi
|
name: ffi
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.0"
|
version: "1.1.2"
|
||||||
file:
|
file:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: file
|
name: file
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.1.0"
|
version: "6.1.2"
|
||||||
fixnum:
|
fixnum:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -299,7 +306,7 @@ packages:
|
||||||
name: flutter_bloc
|
name: flutter_bloc
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "7.0.0"
|
version: "7.0.1"
|
||||||
flutter_launcher_icons:
|
flutter_launcher_icons:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
|
@ -318,14 +325,14 @@ packages:
|
||||||
name: flutter_markdown
|
name: flutter_markdown
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.6.1"
|
version: "0.6.2"
|
||||||
flutter_secure_storage:
|
flutter_secure_storage:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flutter_secure_storage
|
name: flutter_secure_storage
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.1.0"
|
version: "4.2.0"
|
||||||
flutter_test:
|
flutter_test:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description: flutter
|
description: flutter
|
||||||
|
@ -342,7 +349,7 @@ packages:
|
||||||
name: get_it
|
name: get_it
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.0.0"
|
version: "6.1.1"
|
||||||
glob:
|
glob:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -363,35 +370,35 @@ packages:
|
||||||
name: hive
|
name: hive
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.1"
|
version: "2.0.4"
|
||||||
hive_flutter:
|
hive_flutter:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: hive_flutter
|
name: hive_flutter
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.0"
|
version: "1.1.0"
|
||||||
hive_generator:
|
hive_generator:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: hive_generator
|
name: hive_generator
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.1"
|
version: "1.1.0"
|
||||||
http:
|
http:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: http
|
name: http
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.13.1"
|
version: "0.13.3"
|
||||||
http_multi_server:
|
http_multi_server:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: http_multi_server
|
name: http_multi_server
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.0"
|
version: "3.0.1"
|
||||||
http_parser:
|
http_parser:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -447,7 +454,7 @@ packages:
|
||||||
name: json_serializable
|
name: json_serializable
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.1.0"
|
version: "4.1.3"
|
||||||
logging:
|
logging:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -462,13 +469,6 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.0"
|
version: "4.0.0"
|
||||||
mask_text_input_formatter:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: mask_text_input_formatter
|
|
||||||
url: "https://pub.dartlang.org"
|
|
||||||
source: hosted
|
|
||||||
version: "2.0.0-nullsafety.2"
|
|
||||||
matcher:
|
matcher:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -517,7 +517,7 @@ packages:
|
||||||
name: node_preamble
|
name: node_preamble
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.4.13"
|
version: "2.0.1"
|
||||||
package_config:
|
package_config:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -531,7 +531,7 @@ packages:
|
||||||
name: package_info
|
name: package_info
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.0.2"
|
||||||
path:
|
path:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -545,7 +545,7 @@ packages:
|
||||||
name: path_provider
|
name: path_provider
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.1"
|
version: "2.0.2"
|
||||||
path_provider_linux:
|
path_provider_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -573,21 +573,21 @@ packages:
|
||||||
name: path_provider_windows
|
name: path_provider_windows
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.0.1"
|
||||||
pedantic:
|
pedantic:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: pedantic
|
name: pedantic
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.11.0"
|
version: "1.11.1"
|
||||||
petitparser:
|
petitparser:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: petitparser
|
name: petitparser
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.2"
|
version: "4.1.0"
|
||||||
platform:
|
platform:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -608,7 +608,7 @@ packages:
|
||||||
name: pointycastle
|
name: pointycastle
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.1"
|
version: "3.1.2"
|
||||||
pool:
|
pool:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -651,13 +651,55 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.0"
|
version: "1.0.0"
|
||||||
|
share_plus:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: share_plus
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.1.4"
|
||||||
|
share_plus_linux:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: share_plus_linux
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.3"
|
||||||
|
share_plus_macos:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: share_plus_macos
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.2"
|
||||||
|
share_plus_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: share_plus_platform_interface
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.1"
|
||||||
|
share_plus_web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: share_plus_web
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.4"
|
||||||
|
share_plus_windows:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: share_plus_windows
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.3"
|
||||||
shared_preferences:
|
shared_preferences:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences
|
name: shared_preferences
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.5"
|
version: "2.0.6"
|
||||||
shared_preferences_linux:
|
shared_preferences_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -699,7 +741,7 @@ packages:
|
||||||
name: shelf
|
name: shelf
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.0"
|
version: "1.1.4"
|
||||||
shelf_packages_handler:
|
shelf_packages_handler:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -732,7 +774,14 @@ packages:
|
||||||
name: source_gen
|
name: source_gen
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.0"
|
version: "1.0.2"
|
||||||
|
source_helper:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: source_helper
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.1.0"
|
||||||
source_map_stack_trace:
|
source_map_stack_trace:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -753,7 +802,7 @@ packages:
|
||||||
name: source_span
|
name: source_span
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.8.0"
|
version: "1.8.1"
|
||||||
stack_trace:
|
stack_trace:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -795,21 +844,21 @@ packages:
|
||||||
name: test
|
name: test
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.16.5"
|
version: "1.16.8"
|
||||||
test_api:
|
test_api:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.2.19"
|
version: "0.3.0"
|
||||||
test_core:
|
test_core:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_core
|
name: test_core
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.3.15"
|
version: "0.3.19"
|
||||||
timing:
|
timing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -837,7 +886,7 @@ packages:
|
||||||
name: url_launcher
|
name: url_launcher
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.0.3"
|
version: "6.0.6"
|
||||||
url_launcher_linux:
|
url_launcher_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -858,14 +907,14 @@ packages:
|
||||||
name: url_launcher_platform_interface
|
name: url_launcher_platform_interface
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.2"
|
version: "2.0.3"
|
||||||
url_launcher_web:
|
url_launcher_web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_web
|
name: url_launcher_web
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.0.1"
|
||||||
url_launcher_windows:
|
url_launcher_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -886,35 +935,35 @@ packages:
|
||||||
name: vm_service
|
name: vm_service
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.1.0+1"
|
version: "6.2.0"
|
||||||
wakelock:
|
wakelock:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: wakelock
|
name: wakelock
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.5.0+2"
|
version: "0.5.2"
|
||||||
wakelock_macos:
|
wakelock_macos:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: wakelock_macos
|
name: wakelock_macos
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.1.0"
|
version: "0.1.0+1"
|
||||||
wakelock_platform_interface:
|
wakelock_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: wakelock_platform_interface
|
name: wakelock_platform_interface
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.2.0"
|
version: "0.2.1+1"
|
||||||
wakelock_web:
|
wakelock_web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: wakelock_web
|
name: wakelock_web
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.2.0"
|
version: "0.2.0+1"
|
||||||
wakelock_windows:
|
wakelock_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -935,7 +984,7 @@ packages:
|
||||||
name: web_socket_channel
|
name: web_socket_channel
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.1.0"
|
||||||
webkit_inspection_protocol:
|
webkit_inspection_protocol:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -949,7 +998,7 @@ packages:
|
||||||
name: win32
|
name: win32
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.5"
|
version: "2.2.1"
|
||||||
xdg_directories:
|
xdg_directories:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -963,7 +1012,7 @@ packages:
|
||||||
name: xml
|
name: xml
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.0.2"
|
version: "5.1.2"
|
||||||
yaml:
|
yaml:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -972,5 +1021,5 @@ packages:
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.0"
|
version: "3.1.0"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=2.12.0 <3.0.0"
|
dart: ">=2.13.0 <3.0.0"
|
||||||
flutter: ">=2.0.0"
|
flutter: ">=2.0.0"
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
name: selfprivacy
|
name: selfprivacy
|
||||||
description: selfprivacy.org
|
description: selfprivacy.org
|
||||||
publish_to: 'none'
|
publish_to: 'none'
|
||||||
version: 0.1.1+1
|
version: 0.1.3+1
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=2.12.0 <3.0.0'
|
sdk: '>=2.12.0 <3.0.0'
|
||||||
|
@ -31,6 +31,7 @@ dependencies:
|
||||||
package_info: ^2.0.0
|
package_info: ^2.0.0
|
||||||
pretty_dio_logger: ^1.1.1
|
pretty_dio_logger: ^1.1.1
|
||||||
provider: ^5.0.0
|
provider: ^5.0.0
|
||||||
|
share_plus: ^2.1.4
|
||||||
unicons: ^1.0.2
|
unicons: ^1.0.2
|
||||||
url_launcher: ^6.0.2
|
url_launcher: ^6.0.2
|
||||||
wakelock: ^0.5.0+2
|
wakelock: ^0.5.0+2
|
||||||
|
|
Loading…
Reference in a new issue