From 55c0d434cdfddd9b66fff94e634abeffb300b3af Mon Sep 17 00:00:00 2001 From: NaiJi Date: Tue, 27 Dec 2022 10:23:01 +0400 Subject: [PATCH] feat: Implement couriers derails page --- lib/logic/courierformcubit.dart | 56 +++++++++++++++++++++++ lib/models/courier.dart | 10 ++-- lib/ui/bottomsheet.dart | 58 +++++++++++++++++++++++ lib/ui/button.dart | 41 +++++++++++++++++ lib/ui/courier.dart | 19 ++++---- lib/ui/courierdetails.dart | 81 +++++++++++++++++++++++++++++++++ lib/ui/courierspage.dart | 4 ++ 7 files changed, 255 insertions(+), 14 deletions(-) create mode 100644 lib/logic/courierformcubit.dart create mode 100644 lib/ui/bottomsheet.dart create mode 100644 lib/ui/button.dart diff --git a/lib/logic/courierformcubit.dart b/lib/logic/courierformcubit.dart new file mode 100644 index 0000000..374d855 --- /dev/null +++ b/lib/logic/courierformcubit.dart @@ -0,0 +1,56 @@ +import 'dart:async'; + +import 'package:cubit_form/cubit_form.dart'; +import 'package:selfprivacy/logic/courierscubit.dart'; +import 'package:selfprivacy/models/courier.dart'; + +class CourierFormCubit extends FormCubit { + CourierFormCubit({ + required this.cubit, + }) { + name = FieldCubit( + initalValue: 'Имя', + validations: [ + RequiredStringValidation('Поле обязательно'), + ], + ); + surname = FieldCubit( + initalValue: 'Фамилия', + validations: [ + RequiredStringValidation('Поле обязательно'), + ], + ); + + phone = FieldCubit( + initalValue: 'Телефон', + validations: [ + RequiredStringValidation('Поле обязательно'), + ], + ); + + super.addFields([name, surname, phone]); + } + + @override + FutureOr onSubmit() { + print('onSubmit'); + print('name: ${name.state.value}'); + print('surname: ${surname.state.value}'); + print('phone: ${phone.state.value}'); + + final Courier courier = Courier( + name: name.state.value, + surname: name.state.value, + phone: name.state.value, + id: cubit.state.couriers.isEmpty ? 0 : cubit.state.couriers.last.id + 1, + ); + + cubit.create(courier); + } + + late FieldCubit name; + late FieldCubit surname; + late FieldCubit phone; + + final CouriersCubit cubit; +} diff --git a/lib/models/courier.dart b/lib/models/courier.dart index ebd9e9c..d41a5e1 100644 --- a/lib/models/courier.dart +++ b/lib/models/courier.dart @@ -25,9 +25,9 @@ class Courier extends Equatable { @override List get props => [ - name, - surname, - phone, - id, - ]; + name, + surname, + phone, + id, + ]; } diff --git a/lib/ui/bottomsheet.dart b/lib/ui/bottomsheet.dart new file mode 100644 index 0000000..da53a88 --- /dev/null +++ b/lib/ui/bottomsheet.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; + +class BrandBottomSheet extends StatelessWidget { + const BrandBottomSheet({ + required this.child, + super.key, + this.isExpended = false, + }); + + final Widget child; + final bool isExpended; + + @override + Widget build(final BuildContext context) { + final double mainHeight = MediaQuery.of(context).size.height - + MediaQuery.of(context).padding.top - + 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( + constraints: BoxConstraints(maxHeight: mainHeight + 4 + 6), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Center( + child: Container( + height: 4, + width: 30, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(2), + color: const Color.fromARGB(120, 120, 120, 100), + ), + ), + ), + const SizedBox(height: 6), + ClipRRect( + borderRadius: const BorderRadius.vertical(top: Radius.circular(20)), + child: ConstrainedBox( + constraints: BoxConstraints(maxHeight: mainHeight), + child: innerWidget, + ), + ), + ], + ), + ); + } +} diff --git a/lib/ui/button.dart b/lib/ui/button.dart new file mode 100644 index 0000000..93f8e46 --- /dev/null +++ b/lib/ui/button.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; + +class FilledButton extends StatelessWidget { + const FilledButton({ + super.key, + this.onPressed, + this.title, + this.child, + this.disabled = false, + }); + + final VoidCallback? onPressed; + final String? title; + final Widget? child; + final bool disabled; + + @override + Widget build(final BuildContext context) { + final ButtonStyle enabledStyle = ElevatedButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.onPrimary, + backgroundColor: Theme.of(context).colorScheme.primary, + ).copyWith(elevation: ButtonStyleButton.allOrNull(0.0)); + + final ButtonStyle disabledStyle = ElevatedButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.onSurface.withAlpha(30), + backgroundColor: Theme.of(context).colorScheme.onSurface.withAlpha(98), + ).copyWith(elevation: ButtonStyleButton.allOrNull(0.0)); + + return ConstrainedBox( + constraints: const BoxConstraints( + minHeight: 40, + minWidth: double.infinity, + ), + child: ElevatedButton( + onPressed: onPressed, + style: disabled ? disabledStyle : enabledStyle, + child: child ?? Text(title ?? ''), + ), + ); + } +} diff --git a/lib/ui/courier.dart b/lib/ui/courier.dart index 585569d..001075e 100644 --- a/lib/ui/courier.dart +++ b/lib/ui/courier.dart @@ -9,12 +9,13 @@ class _Courier extends StatelessWidget { @override Widget build(final BuildContext context) => InkWell( - //onTap: () { - //Navigator.of(context).push( - // MaterialPageRoute( - //builder: (final BuildContext context) => CourierDetails(courier), - //); - // }, + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (final BuildContext context) => CouriersDetails(), + ), + ); + }, child: Container( padding: const EdgeInsets.symmetric(horizontal: 15), height: 48, @@ -25,9 +26,9 @@ class _Courier extends StatelessWidget { height: 17, decoration: const BoxDecoration( color: Color.fromRGBO( - 133, - 133, - 200, + 233, + 333, + 30, 100, ), shape: BoxShape.circle, diff --git a/lib/ui/courierdetails.dart b/lib/ui/courierdetails.dart index e69de29..e999c2f 100644 --- a/lib/ui/courierdetails.dart +++ b/lib/ui/courierdetails.dart @@ -0,0 +1,81 @@ +part of 'courierspage.dart'; + +class CouriersDetails extends StatelessWidget { + const CouriersDetails({super.key}); + + @override + Widget build(final BuildContext context) => BrandBottomSheet( + child: BlocProvider( + create: (final BuildContext context) => CourierFormCubit( + cubit: context.read(), + ), + child: Builder( + builder: (final BuildContext context) => + BlocListener( + listener: + (final BuildContext context, final FormCubitState state) { + if (state.isSubmitted) { + Navigator.pop(context); + } + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + AppBar( + title: const Padding( + padding: EdgeInsets.only(top: 4.0), + child: Text('Новый курьер!'), + ), + ), + const SizedBox(width: 14), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 15), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(width: 14), + IntrinsicHeight( + child: CubitFormTextField( + formFieldCubit: + context.read().name, + decoration: const InputDecoration( + labelText: 'Имя', + ), + ), + ), + const SizedBox(height: 20), + CubitFormTextField( + formFieldCubit: + context.read().surname, + decoration: const InputDecoration( + alignLabelWithHint: false, + labelText: 'Фамилия', + ), + ), + const SizedBox(height: 20), + CubitFormTextField( + formFieldCubit: + context.read().phone, + decoration: const InputDecoration( + alignLabelWithHint: false, + labelText: 'Телефон', + ), + ), + const SizedBox(height: 30), + FilledButton( + onPressed: () => + context.read().trySubmit(), + title: 'Создать', + ), + const SizedBox(height: 40), + ], + ), + ), + ], + ), + ), + ), + ), + ); +} diff --git a/lib/ui/courierspage.dart b/lib/ui/courierspage.dart index 658fac7..4b13606 100644 --- a/lib/ui/courierspage.dart +++ b/lib/ui/courierspage.dart @@ -1,9 +1,13 @@ import 'package:cubit_form/cubit_form.dart'; import 'package:flutter/material.dart'; import 'package:selfprivacy/logic/courierscubit.dart'; +import 'package:selfprivacy/logic/courierformcubit.dart'; import 'package:selfprivacy/models/courier.dart'; +import 'package:selfprivacy/ui/bottomsheet.dart'; +import 'package:selfprivacy/ui/button.dart'; part 'courier.dart'; +part 'courierdetails.dart'; class CouriersPage extends StatelessWidget { const CouriersPage({super.key});