forked from kherel/selfprivacy.org.app
Merge pull request 'jobs' (#28) from jobs into master
Reviewed-on: kherel/selfprivacy.org.app#28master
commit
b130960113
@ -1,27 +1,53 @@ |
||||
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:selfprivacy/logic/models/user.dart'; |
||||
export 'package:provider/provider.dart'; |
||||
|
||||
part 'jobs_state.dart'; |
||||
|
||||
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) { |
||||
final newState = state.addJob(job); |
||||
emit(newState); |
||||
var newJobsList = <Job>[]; |
||||
if (state is JobsStateWithJobs) { |
||||
newJobsList.addAll((state as JobsStateWithJobs).jobList); |
||||
} |
||||
newJobsList.add(job); |
||||
emit(JobsStateWithJobs(newJobsList)); |
||||
} |
||||
|
||||
void removeJob(String id) { |
||||
final newState = state.removeById(id); |
||||
final newState = (state as JobsStateWithJobs).removeById(id); |
||||
emit(newState); |
||||
} |
||||
|
||||
void applyAll() { |
||||
print(state.jobList); |
||||
emit(JobsState.emtpy()); |
||||
Future<void> applyAll() async { |
||||
if (state is JobsStateWithJobs) { |
||||
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'; |
||||
|
||||
class JobsState extends Equatable { |
||||
const JobsState(this.jobList); |
||||
|
||||
final List<Job> jobList; |
||||
abstract class JobsState extends Equatable { |
||||
@override |
||||
List<Object?> get props => []; |
||||
} |
||||
|
||||
static JobsState emtpy() => JobsState([]); |
||||
class JobsStateLoading extends JobsState {} |
||||
|
||||
bool get isEmpty => jobList.isEmpty; |
||||
class JobsStateEmpty extends JobsState {} |
||||
|
||||
JobsState addJob(Job job) { |
||||
var newJobsList = [...jobList]; |
||||
newJobsList.add(job); |
||||
return JobsState(newJobsList); |
||||
} |
||||
class JobsStateWithJobs extends JobsState { |
||||
JobsStateWithJobs(this.jobList); |
||||
final List<Job> jobList; |
||||
|
||||
JobsState removeById(String id) { |
||||
var newJobsList = jobList.where((element) => element.id != id).toList(); |
||||
return JobsState(newJobsList); |
||||
|
||||
if (newJobsList.isEmpty) { |
||||
return JobsStateEmpty(); |
||||
} |
||||
return JobsStateWithJobs(newJobsList); |
||||
} |
||||
|
||||
@override |
||||
List<Object> get props => jobList; |
||||
List<Object?> get props => jobList; |
||||
} |
||||
|
@ -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), |
||||
], |
||||
); |
||||
} |
||||
} |
@ -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 { |
||||
const BrandModalSheet({ |
||||
Key? key, |
||||
this.child, |
||||
}) : super(key: key); |
||||
// class BrandModalSheet extends StatelessWidget { |
||||
// const BrandModalSheet({ |
||||
// Key? key, |
||||
// this.child, |
||||
// }) : super(key: key); |
||||
|
||||
final Widget? child; |
||||
@override |
||||
Widget build(BuildContext context) { |
||||
return DraggableScrollableSheet( |
||||
minChildSize: 0.95, |
||||
initialChildSize: 1, |
||||
maxChildSize: 1, |
||||
builder: (context, scrollController) { |
||||
return SingleChildScrollView( |
||||
controller: scrollController, |
||||
physics: ClampingScrollPhysics(), |
||||
child: Container( |
||||
child: Column( |
||||
children: [ |
||||
GestureDetector( |
||||
onTap: () => Navigator.of(context).pop(), |
||||
behavior: HitTestBehavior.opaque, |
||||
child: Container( |
||||
width: double.infinity, |
||||
child: Center( |
||||
child: Padding( |
||||
padding: EdgeInsets.only(top: 132, bottom: 6), |
||||
child: Container( |
||||
height: 4, |
||||
width: 30, |
||||
decoration: BoxDecoration( |
||||
borderRadius: BorderRadius.circular(2), |
||||
color: Color(0xFFE3E3E3).withOpacity(0.65), |
||||
), |
||||
), |
||||
), |
||||
), |
||||
), |
||||
), |
||||
Container( |
||||
constraints: BoxConstraints( |
||||
minHeight: MediaQuery.of(context).size.height - 132, |
||||
maxHeight: MediaQuery.of(context).size.height - 132, |
||||
), |
||||
decoration: BoxDecoration( |
||||
borderRadius: |
||||
BorderRadius.vertical(top: Radius.circular(20)), |
||||
color: Theme.of(context).scaffoldBackgroundColor, |
||||
), |
||||
width: double.infinity, |
||||
child: child), |
||||
], |
||||
), |
||||
), |
||||
); |
||||
}); |
||||
} |
||||
} |
||||
// final Widget? child; |
||||
// @override |
||||
// Widget build(BuildContext context) { |
||||
// return DraggableScrollableSheet( |
||||
// minChildSize: 1, |
||||
// initialChildSize: 1, |
||||
// maxChildSize: 1, |
||||
// builder: (context, scrollController) { |
||||
// return SingleChildScrollView( |
||||
// controller: scrollController, |
||||
// physics: ClampingScrollPhysics(), |
||||
// child: Container( |
||||
// child: Column( |
||||
// children: [ |
||||
// GestureDetector( |
||||
// onTap: () => Navigator.of(context).pop(), |
||||
// behavior: HitTestBehavior.opaque, |
||||
// child: Container( |
||||
// width: double.infinity, |
||||
// child: Center( |
||||
// child: Padding( |
||||
// padding: EdgeInsets.only(top: 132, bottom: 6), |
||||
// child: Container( |
||||
// height: 4, |
||||
// width: 30, |
||||
// decoration: BoxDecoration( |
||||
// borderRadius: BorderRadius.circular(2), |
||||
// color: Color(0xFFE3E3E3).withOpacity(0.65), |
||||
// ), |
||||
// ), |
||||
// ), |
||||
// ), |
||||
// ), |
||||
// ), |
||||
// Container( |
||||
// constraints: BoxConstraints( |
||||
// minHeight: MediaQuery.of(context).size.height - 132, |
||||
// maxHeight: MediaQuery.of(context).size.height - 132, |
||||
// ), |
||||
// decoration: BoxDecoration( |
||||
// borderRadius: |
||||
// BorderRadius.vertical(top: Radius.circular(20)), |
||||
// color: Theme.of(context).scaffoldBackgroundColor, |
||||
// ), |
||||
// width: double.infinity, |
||||
// child: child), |
||||
// ], |
||||
// ), |
||||
// ), |
||||
// ); |
||||
// }); |
||||
// } |
||||
// } |
||||
|
@ -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, |
||||
); |