master
Kherel 2021-06-08 20:52:44 +02:00
parent d3f494adeb
commit 9e8fdf2965
10 changed files with 160 additions and 91 deletions

View File

@ -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,21 @@ 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.get('/createUser');
res = response.statusCode == HttpStatus.ok;
} catch (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');
} }

View File

@ -164,10 +164,10 @@ class AppConfigRepository {
cloudFlareDomain: cloudFlareDomain, cloudFlareDomain: cloudFlareDomain,
); );
await HetznerApi().createReverseDns( // await HetznerApi().createReverseDns(
ip4: ip4, // ip4: ip4,
domainName: cloudFlareDomain.domainName, // domainName: cloudFlareDomain.domainName,
); // );
} }
Future<bool> isHttpServerWorking() async { Future<bool> isHttpServerWorking() async {

View File

@ -1,5 +1,6 @@
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:selfprivacy/logic/models/job.dart'; import 'package:selfprivacy/logic/api_maps/server.dart';
import 'package:selfprivacy/logic/models/jobs/job.dart';
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
export 'package:provider/provider.dart'; export 'package:provider/provider.dart';
@ -8,7 +9,7 @@ part 'jobs_state.dart';
class JobsCubit extends Cubit<JobsState> { class JobsCubit extends Cubit<JobsState> {
JobsCubit() : super(JobsState.emtpy()); JobsCubit() : super(JobsState.emtpy());
List<Job> jobsList = []; final api = ServerApi();
void addJob(Job job) { void addJob(Job job) {
final newState = state.addJob(job); final newState = state.addJob(job);
@ -20,8 +21,12 @@ class JobsCubit extends Cubit<JobsState> {
emit(newState); emit(newState);
} }
void applyAll() { Future<void> applyAll() async {
print(state.jobList); for (var job in state.jobList) {
if (job is CreateUserJob) {
await api.createUser(job.user);
}
}
emit(JobsState.emtpy()); emit(JobsState.emtpy());
} }
} }

View File

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

View File

@ -1,5 +1,5 @@
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}) : super(key: key);
@ -8,18 +8,32 @@ class BrandBottomSheet extends StatelessWidget {
@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 - 100;
60, return ConstrainedBox(
child: Scaffold( constraints: BoxConstraints(maxHeight: mainHeight + 4 + 6),
body: SingleChildScrollView( child: Column(
physics: ClampingScrollPhysics(), children: [
child: Container( Center(
padding: paddingH15V0, child: Container(
child: child, height: 4,
width: 30,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(2),
color: BrandColors.gray4,
),
),
), ),
), SizedBox(height: 6),
ClipRRect(
borderRadius: BorderRadius.circular(20),
child: ConstrainedBox(
constraints: BoxConstraints(maxHeight: mainHeight),
child: Scaffold(body: child),
),
),
],
), ),
); );
} }

View File

@ -49,8 +49,11 @@ class _BrandFlashButtonState extends State<_BrandFlashButton>
child: IconButton( child: IconButton(
onPressed: () { onPressed: () {
showCupertinoModalBottomSheet( showCupertinoModalBottomSheet(
barrierColor: Colors.black45,
expand: false, expand: false,
context: context, context: context,
shadow: BoxShadow(color: Colors.transparent),
backgroundColor: Colors.transparent,
builder: (context) => BrandBottomSheet( builder: (context) => BrandBottomSheet(
child: JobsContent(), child: JobsContent(),
), ),

View File

@ -1,23 +1,21 @@
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';
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_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/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: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 +77,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,14 +87,17 @@ 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 = () => showCupertinoModalBottomSheet(
SlideBottomRoute( barrierColor: Colors.black45,
OnePage( expand: false,
title: title, context: context,
child: ServerDetails(), shadow: BoxShadow(color: Colors.transparent),
), backgroundColor: Colors.transparent,
builder: (context) => BrandBottomSheet(
child: ServerDetails(),
), ),
); );
break; break;
case ProviderType.domain: case ProviderType.domain:
title = 'providers.domain.card_title'.tr(); title = 'providers.domain.card_title'.tr();
@ -133,7 +134,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,11 +200,6 @@ 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;
} }

View File

@ -56,41 +56,58 @@ 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(
physics: NeverScrollableScrollPhysics(), appBar: PreferredSize(
controller: tabController, child: Column(
children: [ children: [
SingleChildScrollView( Container(
child: Column( height: 51,
crossAxisAlignment: CrossAxisAlignment.start, alignment: Alignment.center,
children: [ padding: EdgeInsets.symmetric(horizontal: 15),
Padding( child: BrandText.h4('basis.details'.tr()),
padding: paddingH15V0, ),
child: Column( BrandDivider(),
crossAxisAlignment: CrossAxisAlignment.start, ],
children: [
_Header(
providerState: providerState,
tabController: tabController),
BrandText.body1('providers.server.bottom_sheet.1'.tr()),
SizedBox(height: 10),
BlocProvider(
create: (context) => HetznerMetricsCubit()..restart(),
child: _Chart(),
),
SizedBox(height: 20),
BlocProvider(
create: (context) => ServerDetailsCubit()..check(),
child: _TextDetails(),
),
],
),
),
],
),
), ),
_ServerSettings(tabController: tabController), preferredSize: Size.fromHeight(52),
], ),
body: TabBarView(
physics: NeverScrollableScrollPhysics(),
controller: tabController,
children: [
SingleChildScrollView(
physics: ClampingScrollPhysics(),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: paddingH15V0,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_Header(
providerState: providerState,
tabController: tabController),
BrandText.body1('providers.server.bottom_sheet.1'.tr()),
SizedBox(height: 10),
BlocProvider(
create: (context) => HetznerMetricsCubit()..restart(),
child: _Chart(),
),
SizedBox(height: 20),
BlocProvider(
create: (context) => ServerDetailsCubit()..check(),
child: _TextDetails(),
),
],
),
),
],
),
),
_ServerSettings(tabController: tabController),
],
),
); );
} }
} }

View File

@ -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
context: context, ? () => showDialog<void>(
// isScrollControlled: true, context: context,
// backgroundColor: Colors.transparent, // isScrollControlled: true,
builder: (BuildContext context) { // backgroundColor: Colors.transparent,
return _ServiceDetails( builder: (BuildContext context) {
serviceType: serviceType, return _ServiceDetails(
status: isReady ? StateType.stable : StateType.uninitialized, serviceType: serviceType,
title: title, status:
icon: iconData, isReady ? StateType.stable : StateType.uninitialized,
changeTab: changeTab, title: title,
); icon: iconData,
}, changeTab: changeTab,
), );
},
)
: null,
child: BrandCards.big( child: BrandCards.big(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,

View File

@ -35,7 +35,7 @@ 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:
@ -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.0"
package_config: package_config:
dependency: transitive dependency: transitive
description: description:
@ -753,7 +753,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 +795,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: