Untitled
unknown
plain_text
3 years ago
22 kB
8
Indexable
import 'package:Seekqua/util/missingInfo.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_masked_text2/flutter_masked_text2.dart';
import 'package:Seekqua/components/CloseIcon.dart';
import 'package:Seekqua/enums/colors.dart';
import 'package:Seekqua/models/account.model.dart';
import 'package:Seekqua/pages/createListing/RentalPhotos.dart';
import 'package:Seekqua/providers/RentalItemProvider.dart';
import 'package:Seekqua/services/database.dart';
import 'package:Seekqua/util/CategoryInfo.dart';
import 'package:Seekqua/util/toast.dart';
// import 'package:platform_alert_dialog/platform_alert_dialog.dart';
import 'package:provider/provider.dart';
class RentalInfo extends StatefulWidget {
const RentalInfo({
Key key,
@required this.bottomNavTapped,
}) : super(key: key);
final Function bottomNavTapped;
@override
_RentalInfoState createState() => _RentalInfoState();
}
class _RentalInfoState extends State<RentalInfo> {
final descriptionController =
TextEditingController.fromValue(TextEditingValue.empty);
final titleController =
TextEditingController.fromValue(TextEditingValue.empty);
final categoryController =
TextEditingController.fromValue(TextEditingValue.empty);
int descriptionCount = 0;
int titleCount = 0;
int titleLimit = 60;
int descriptionLimit = 500;
final focusNode = FocusNode();
MoneyMaskedTextController priceController = MoneyMaskedTextController(
decimalSeparator: '.', thousandSeparator: ',', leftSymbol: ' \$');
List<CategoryInfo> categories = [];
@override
void initState() {
final AccountModel account =
Provider.of<AccountModel>(context, listen: false);
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
if (account.displayName == null || account.displayName.isEmpty) {
showMissingInfoModal(context, () => Navigator.of(context).pop());
}
});
descriptionCount = 0;
descriptionController.addListener(() {
setState(() => descriptionCount = descriptionController.text.length);
});
titleController.addListener(() {
setState(() => titleCount = titleController.text.length);
});
final RentalItemProvider rentalItem =
Provider.of<RentalItemProvider>(context, listen: false);
rentalItem.clearRentalItem();
if (rentalItem.price != null) {
priceController.updateValue(rentalItem.price);
}
priceController.addListener(() {
rentalItem.setPrice(priceController.numberValue);
});
focusNode.addListener(() {
if (!focusNode.hasFocus && priceController.numberValue < 1) {
showToast(msg: 'Price must be at least \$1');
}
});
fetchCategories(account.uid);
super.initState();
}
@override
void dispose() {
descriptionController.removeListener(() {});
descriptionController.dispose();
titleController.removeListener(() {});
titleController.dispose();
categoryController.removeListener(() {});
categoryController.dispose();
priceController.dispose();
focusNode.dispose();
super.dispose();
}
fetchCategories(uid) async {
categories =
await DatabaseService(uid: uid).getCategories(includeAll: false);
setState(() {
categories = categories;
});
}
storeCategories(String category) {
final RentalItemProvider rentalItem =
Provider.of<RentalItemProvider>(context, listen: false);
if (category != null) {
rentalItem.setTaggedCategory(category);
}
}
bool isFormValid(RentalItemProvider rentalItem) {
bool valid = rentalItem.taggedCategory != null &&
descriptionCount > 1 &&
titleCount > 1 &&
rentalItem.price != null &&
rentalItem.price > 0.99;
return valid;
}
Future<String> showCategories(
RentalItemProvider rentalItem, AccountModel account) async {
Size size = MediaQuery.of(context).copyWith().size;
updateCategory(String _category) {
rentalItem.setTaggedCategory(_category);
}
String category = rentalItem.taggedCategory;
await showDialog<void>(
context: context,
builder: (BuildContext context) {
return StatefulBuilder(
builder: (context, setState) {
close() {
if (Navigator.canPop(context)) {
Navigator.of(context).pop();
}
}
return AlertDialog(
title: const Text('Select a category'),
content: SingleChildScrollView(
child: SizedBox(
height: size.height * 0.5,
child: Column(
children: <Widget>[
for (CategoryInfo _category in categories)
GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
setState(() => {category = _category.title});
updateCategory(_category.title);
close();
// Future.delayed(Duration(milliseconds: 500))
// .then(close()),
},
child: SizedBox(
height: (size.height * .5) / categories.length,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
_category.title,
style: TextStyle(
color: KalanaColors.text,
fontSize: 16,
),
),
if (category == _category.title)
Icon(
Icons.check,
color: KalanaColors.secondary,
),
],
),
),
),
],
),
),
),
actions: <Widget>[],
);
},
);
},
);
return category;
}
updateCategory(RentalItemProvider rentalItem, AccountModel account) async {
String category = await showCategories(rentalItem, account);
if (category != null) {
setState(() => {
categoryController.text = category,
});
}
}
@override
Widget build(BuildContext context) {
final RentalItemProvider rentalItem =
Provider.of<RentalItemProvider>(context);
final AccountModel account = Provider.of<AccountModel>(context);
Size size = MediaQuery.of(context).copyWith().size;
double padding = size.width * .025;
double safePadding = MediaQuery.of(context).copyWith().padding.bottom +
MediaQuery.of(context).copyWith().padding.top;
AppBar appBar = AppBar(
leading: GestureDetector(
child: const CloseIcon(isBack: true),
onTap: () => {
Navigator.of(context).pop(),
},
),
backgroundColor: Colors.transparent,
elevation: 0,
);
return
// GestureDetector(
// onTap: () {
// FocusScope.of(context).requestFocus(FocusNode());
// },
// child:
// Stack(
// children: [
// Container(
// width: size.width,
// height: size.height,
// decoration: const BoxDecoration(
// image: DecorationImage(
// fit: BoxFit.cover,
// image: AssetImage(
// 'assets/images/fog_mountains.jpg',
// ),
// ),
// ),
// ),
Scaffold(
backgroundColor: Colors.transparent,
body: Container(
width: size.width,
height: size.height,
decoration: BoxDecoration(color: Colors.transparent),
child:
// SafeArea(
// child:
SingleChildScrollView(
scrollDirection: Axis.vertical,
child: Column(
children: [
appBar,
Center(
child: Container(
width: size.width * .90,
height: size.height -
appBar.preferredSize.height -
safePadding,
decoration: BoxDecoration(
color: KalanaColors.light,
borderRadius: BorderRadius.circular(10),
boxShadow: const [
BoxShadow(
color: Color.fromRGBO(0, 0, 0, .5),
blurRadius: 10,
spreadRadius: 0,
offset: Offset(
4,
4,
),
),
],
),
padding: EdgeInsets.all(size.width * 0.085),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
// FittedBox(
// child:
Text(
'What are you renting?',
style: TextStyle(
color: KalanaColors.text,
fontSize: 30,
fontWeight: FontWeight.bold,
),
),
// ),
Text(
'Write a detailed description of what you are renting.',
style: TextStyle(
color: KalanaColors.label,
fontSize: 14,
),
),
Padding(
padding: EdgeInsets.only(top: padding),
child: Align(
alignment: Alignment.centerLeft,
child: Text(
'Give a title to your rental ($titleCount/60)',
style: TextStyle(
color: KalanaColors.text,
fontSize: 15,
),
),
),
),
Padding(
padding: EdgeInsets.only(bottom: padding),
child: SizedBox(
width: size.width * 0.9,
child: TextField(
maxLengthEnforcement:
MaxLengthEnforcement.enforced,
controller: titleController,
maxLength: titleLimit,
decoration: InputDecoration(
contentPadding: EdgeInsets.all(
size.width * .025,
),
counterText: '',
),
style: TextStyle(
color: KalanaColors.text,
fontSize: 15,
),
keyboardType: TextInputType.text,
maxLines: 2,
minLines: 1,
),
),
),
Padding(
padding: EdgeInsets.only(top: padding),
child: Align(
alignment: Alignment.centerLeft,
child: Text(
'What category is your rental in?',
style: TextStyle(
color: KalanaColors.text,
fontSize: 15,
),
),
),
),
Padding(
padding: EdgeInsets.only(bottom: padding),
child: SizedBox(
width: size.width * 0.9,
child: GestureDetector(
onTap: () => {
updateCategory(rentalItem, account),
},
behavior: HitTestBehavior.opaque,
child: AbsorbPointer(
child: TextField(
controller: categoryController,
decoration: InputDecoration(
contentPadding: EdgeInsets.all(
size.width * .025,
),
counterText: '',
),
style: TextStyle(
color: KalanaColors.text,
fontSize: 15,
),
keyboardType: TextInputType.text,
maxLines: 1,
minLines: 1,
),
),
),
),
),
Padding(
padding: EdgeInsets.only(top: padding),
child: Align(
alignment: Alignment.centerLeft,
child: Text(
'What price will you charge per day?',
style: TextStyle(
color: KalanaColors.text,
fontSize: 15,
),
),
),
),
Padding(
padding: EdgeInsets.only(bottom: padding),
child: SizedBox(
width: size.width * 0.9,
child: TextField(
controller: priceController,
focusNode: focusNode,
maxLines: 1,
keyboardType: TextInputType.number,
decoration: InputDecoration(
contentPadding: EdgeInsets.all(
size.width * .025,
),
),
style: TextStyle(
color: KalanaColors.text,
fontSize: 15,
),
),
),
),
Padding(
padding: EdgeInsets.only(top: padding),
child: Align(
alignment: Alignment.centerLeft,
child: Text(
'Describe your rental ($descriptionCount/500)',
style: TextStyle(
color: KalanaColors.text,
fontSize: 15,
),
),
),
),
Padding(
padding: EdgeInsets.only(bottom: padding),
child: SizedBox(
width: size.width * 0.9,
child: TextField(
maxLengthEnforcement:
MaxLengthEnforcement.enforced,
controller: descriptionController,
maxLength: descriptionLimit,
decoration: InputDecoration(
contentPadding: EdgeInsets.all(
size.width * .025,
),
counterText: '',
),
style: TextStyle(
color: KalanaColors.text,
fontSize: 15,
),
keyboardType: TextInputType.text,
maxLines: null,
minLines: 1,
),
),
),
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
InkWell(
onTap: isFormValid(rentalItem)
? () {
rentalItem.setItemTitle(
titleController.text);
rentalItem.setItemDescription(
descriptionController.text);
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
RentalPhotos(
bottomNavTapped: widget
.bottomNavTapped),
),
);
}
: null,
child: Container(
decoration: BoxDecoration(
color: isFormValid(rentalItem)
? KalanaColors.secondary
: KalanaColors.disabled,
borderRadius: BorderRadius.circular(
50,
),
),
child: SizedBox(
width: size.width * .65,
height: size.height * .085,
child: Align(
alignment: Alignment.center,
child: Text(
'Next',
style: TextStyle(
fontSize: 20,
color: KalanaColors.light,
fontWeight: FontWeight.bold,
),
),
),
),
),
),
],
),
),
],
),
),
),
],
),
),
// ),
),
// ),
// ],
// ),
);
}
}
Editor is loading...