master
Kherel 2021-06-20 23:08:52 +02:00
parent d8393f75ea
commit 21611e63c7
26 changed files with 340 additions and 223 deletions

View File

@ -34,7 +34,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 +188,10 @@
"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",
@ -208,5 +211,12 @@
"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 {}"
} }
} }

View File

@ -188,7 +188,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 +211,12 @@
"title": "Задачи", "title": "Задачи",
"start": "Начать выполенение", "start": "Начать выполенение",
"empty": "Пусто" "empty": "Пусто"
},
"validations": {
"required": "обязательное поле",
"invalid_format": "неверный формат",
"root_name": "Имя пользователя не может быть'root'",
"key_format": "неверный формат",
"length": "Длина строки [] должна быть {}"
} }
} }

View File

@ -47,11 +47,21 @@ class ServerApi extends ApiMap {
var client = await getClient(); var client = await getClient();
try { try {
response = await client.get('/createUser'); response = await client.post(
'/createUser',
options: Options(
headers: {
"X-Username": user.login,
"X-Password": user.password,
},
),
);
res = response.statusCode == HttpStatus.ok; res = response.statusCode == HttpStatus.ok;
} catch (e) { } catch (e) {
print(e);
res = false; res = false;
} }
close(client); close(client);
return res; return res;
} }

View File

@ -85,7 +85,17 @@ class AppConfigState extends Equatable {
bool get isServerCreated => hetznerServer != null; bool get isServerCreated => hetznerServer != null;
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 = [

View File

@ -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')

View File

@ -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"]))
], ],
); );

View File

@ -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"]))
], ],
); );

View File

@ -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()),
], ],
); );

View File

@ -1,9 +1,11 @@
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({
@ -18,18 +20,18 @@ class UserFormCubit extends FormCubit {
login = FieldCubit( login = FieldCubit(
initalValue: isEdit ? user!.login : '', initalValue: isEdit ? user!.login : '',
validations: [ validations: [
RequiredStringValidation('required'), 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 +44,7 @@ class UserFormCubit extends FormCubit {
login: login.state.value, login: login.state.value,
password: password.state.value, password: password.state.value,
); );
usersCubit.addUser(user); usersCubit.addJob(CreateUserJob(user: user));
} }
late FieldCubit<String> login; late FieldCubit<String> login;
@ -52,5 +54,5 @@ class UserFormCubit extends FormCubit {
password.externalSetValue(genPass()); password.externalSetValue(genPass());
} }
late UsersCubit usersCubit; late JobsCubit usersCubit;
} }

View File

@ -24,7 +24,7 @@ class JobsCubit extends Cubit<JobsState> {
Future<void> applyAll() async { Future<void> applyAll() async {
for (var job in state.jobList) { for (var job in state.jobList) {
if (job is CreateUserJob) { if (job is CreateUserJob) {
await api.createUser(job.user); // await api.createUser(job.user);
} }
} }
emit(JobsState.emtpy()); emit(JobsState.emtpy());

View File

@ -2,18 +2,37 @@ import 'package:flutter/material.dart';
import 'package:selfprivacy/config/brand_colors.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) {
var mainHeight = MediaQuery.of(context).size.height - var mainHeight = MediaQuery.of(context).size.height -
MediaQuery.of(context).padding.top - MediaQuery.of(context).padding.top -
100; 100;
late Widget innerWidget;
if (isExpended) {
innerWidget = Scaffold(
body: child,
);
} else {
final ThemeData themeData = Theme.of(context);
innerWidget = Material(
color: themeData.scaffoldBackgroundColor,
child: IntrinsicHeight(child: child),
);
}
return ConstrainedBox( return ConstrainedBox(
constraints: BoxConstraints(maxHeight: mainHeight + 4 + 6), constraints: BoxConstraints(maxHeight: mainHeight + 4 + 6),
child: Column( child: Column(
mainAxisSize: MainAxisSize.min,
children: [ children: [
Center( Center(
child: Container( child: Container(
@ -27,10 +46,10 @@ class BrandBottomSheet extends StatelessWidget {
), ),
SizedBox(height: 6), SizedBox(height: 6),
ClipRRect( ClipRRect(
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.vertical(top: Radius.circular(20)),
child: ConstrainedBox( child: ConstrainedBox(
constraints: BoxConstraints(maxHeight: mainHeight), constraints: BoxConstraints(maxHeight: mainHeight),
child: Scaffold(body: child), child: innerWidget,
), ),
), ),
], ],

View File

@ -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) {

View File

@ -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),
], // ],
), // ),
), // ),
); // );
}); // });
} // }
} // }

View File

@ -1,6 +1,7 @@
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: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/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';
@ -12,7 +13,8 @@ class JobsContent extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var jobs = context.watch<JobsCubit>().state; var jobs = context.watch<JobsCubit>().state;
return Column( return ListView(
padding: paddingH15V0,
children: [ children: [
SizedBox(height: 15), SizedBox(height: 15),
Center( Center(
@ -20,11 +22,8 @@ class JobsContent extends StatelessWidget {
'jobs.title'.tr(), 'jobs.title'.tr(),
), ),
), ),
if (jobs.isEmpty) SizedBox(height: 20),
Padding( if (jobs.isEmpty) BrandText.body1('jobs.empty'.tr()),
padding: const EdgeInsets.only(top: 50),
child: BrandText.body1('jobs.empty'.tr()),
),
if (!jobs.isEmpty) ...[ if (!jobs.isEmpty) ...[
...jobs.jobList ...jobs.jobList
.map( .map(

View File

@ -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
@ -48,13 +61,10 @@ class _BrandFlashButtonState extends State<_BrandFlashButton>
}, },
child: IconButton( child: IconButton(
onPressed: () { onPressed: () {
showCupertinoModalBottomSheet( showBrandBottomSheet(
barrierColor: Colors.black45,
expand: false,
context: context, context: context,
shadow: BoxShadow(color: Colors.transparent),
backgroundColor: Colors.transparent,
builder: (context) => BrandBottomSheet( builder: (context) => BrandBottomSheet(
isExpended: true,
child: JobsContent(), child: JobsContent(),
), ),
); );
@ -62,9 +72,13 @@ 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;
icon, return Transform.scale(
color: _colorTween.value, scale: 1 + (v < 0.5 ? v : 1 - v) * 2,
child: Icon(
icon,
color: _colorTween.value,
),
); );
}), }),
), ),

View File

@ -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';

View File

@ -53,9 +53,9 @@ class _ProgressBarState extends State<ProgressBar> {
width: 10, width: 10,
), ),
); );
even.add( odd.add(
SizedBox( SizedBox(
width: 10, width: 20,
), ),
); );

View 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,
);

View File

@ -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',
)), ),
),
); );
} }
} }

View File

@ -1,5 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:modal_bottom_sheet/modal_bottom_sheet.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/jobs/jobs_cubit.dart'; import 'package:selfprivacy/logic/cubit/jobs/jobs_cubit.dart';
@ -9,12 +8,11 @@ import 'package:selfprivacy/logic/models/state_types.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_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/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/ui_helpers.dart'; import 'package:selfprivacy/utils/ui_helpers.dart';
@ -87,13 +85,10 @@ 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 = () => showCupertinoModalBottomSheet( onTap = () => showBrandBottomSheet(
barrierColor: Colors.black45,
expand: false,
context: context, context: context,
shadow: BoxShadow(color: Colors.transparent),
backgroundColor: Colors.transparent,
builder: (context) => BrandBottomSheet( builder: (context) => BrandBottomSheet(
isExpended: true,
child: ServerDetails(), child: ServerDetails(),
), ),
); );
@ -104,10 +99,8 @@ class _Card extends StatelessWidget {
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,
@ -203,37 +196,31 @@ class _ProviderDetails extends StatelessWidget {
]; ];
break; break;
} }
return BrandModalSheet( return BrandBottomSheet(
child: Navigator( child: SafeArea(
key: navigatorKey, child: Column(
initialRoute: '/', crossAxisAlignment: CrossAxisAlignment.start,
onGenerateRoute: (_) { children: [
return materialRoute( SizedBox(height: 40),
Column( Padding(
crossAxisAlignment: CrossAxisAlignment.start, padding: paddingH15V0,
children: [ child: Column(
SizedBox(height: 40), crossAxisAlignment: CrossAxisAlignment.start,
Padding( children: [
padding: paddingH15V0, IconStatusMask(
child: Column( status: provider.state,
crossAxisAlignment: CrossAxisAlignment.start, child: Icon(provider.icon, size: 40, color: Colors.white),
children: [
IconStatusMask(
status: provider.state,
child:
Icon(provider.icon, size: 40, color: Colors.white),
),
SizedBox(height: 10),
BrandText.h1(title),
SizedBox(height: 10),
...children
],
), ),
) SizedBox(height: 10),
], BrandText.h1(title),
), SizedBox(height: 10),
); ...children,
}, SizedBox(height: 30),
],
),
)
],
),
), ),
); );
} }

View File

@ -7,10 +7,10 @@ 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>()), UserFormCubit(usersCubit: context.read<JobsCubit>()),
child: Builder(builder: (context) { child: Builder(builder: (context) {
var formCubitState = context.watch<UserFormCubit>().state; var formCubitState = context.watch<UserFormCubit>().state;
@ -22,6 +22,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,12 +31,15 @@ class _NewUser extends StatelessWidget {
Padding( Padding(
padding: paddingH15V0, padding: paddingH15V0,
child: Column( child: Column(
mainAxisSize: MainAxisSize.min,
children: [ children: [
CubitFormTextField( IntrinsicHeight(
formFieldCubit: context.read<UserFormCubit>().login, child: CubitFormTextField(
decoration: InputDecoration( formFieldCubit: context.read<UserFormCubit>().login,
labelText: 'users.login'.tr(), decoration: InputDecoration(
suffixText: '@$domainName', labelText: 'users.login'.tr(),
suffixText: '@$domainName',
),
), ),
), ),
SizedBox(height: 20), SizedBox(height: 20),

View File

@ -8,10 +8,8 @@ class _User extends StatelessWidget {
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);
}, },

View File

@ -14,9 +14,11 @@ 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,

View File

@ -4,16 +4,18 @@ 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/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';
part 'fab.dart'; part 'fab.dart';

View File

@ -42,7 +42,7 @@ packages:
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:
@ -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:
@ -176,7 +176,7 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.3" version: "1.0.3"
crypto: crypt:
dependency: "direct main" dependency: "direct main"
description: description:
name: crypt name: crypt
@ -189,21 +189,21 @@ 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:
@ -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,28 +370,28 @@ 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:
@ -420,6 +427,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "1.0.0"
ionicons:
dependency: "direct main"
description:
name: ionicons
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.2"
js: js:
dependency: transitive dependency: transitive
description: description:
@ -455,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:
@ -483,6 +490,20 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "1.0.0"
modal_bottom_sheet:
dependency: "direct main"
description:
name: modal_bottom_sheet
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
nanoid:
dependency: "direct main"
description:
name: nanoid
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
nested: nested:
dependency: transitive dependency: transitive
description: description:
@ -510,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:
@ -524,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:
@ -552,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:
@ -587,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:
@ -630,20 +651,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "1.0.0"
quiver:
dependency: transitive
description:
name: quiver
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.5"
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:
@ -685,7 +699,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:
@ -719,6 +733,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.2" 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:
@ -823,7 +844,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:
@ -844,14 +865,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:
@ -879,28 +900,28 @@ packages:
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 +956,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:
@ -949,7 +970,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:
@ -958,5 +979,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"

View File

@ -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'