250 lines
11 KiB
Dart
250 lines
11 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:handyman_provider_flutter/components/disabled_rating_bar_widget.dart';
|
|
import 'package:handyman_provider_flutter/components/handyman_name_widget.dart';
|
|
import 'package:handyman_provider_flutter/components/image_border_component.dart';
|
|
import 'package:handyman_provider_flutter/main.dart';
|
|
import 'package:handyman_provider_flutter/models/booking_list_response.dart';
|
|
import 'package:handyman_provider_flutter/models/service_model.dart';
|
|
import 'package:handyman_provider_flutter/models/user_data.dart';
|
|
import 'package:handyman_provider_flutter/screens/chat/user_chat_screen.dart';
|
|
import 'package:handyman_provider_flutter/utils/common.dart';
|
|
import 'package:handyman_provider_flutter/utils/configs.dart';
|
|
import 'package:handyman_provider_flutter/utils/constant.dart';
|
|
import 'package:handyman_provider_flutter/utils/extensions/string_extension.dart';
|
|
import 'package:handyman_provider_flutter/utils/images.dart';
|
|
import 'package:nb_utils/nb_utils.dart';
|
|
import 'package:url_launcher/url_launcher.dart';
|
|
import 'package:handyman_provider_flutter/models/booking_detail_response.dart';
|
|
|
|
import 'package:handyman_provider_flutter/networks/rest_apis.dart';
|
|
import 'package:handyman_provider_flutter/services/call_service.dart';
|
|
|
|
class BasicInfoComponent extends StatefulWidget {
|
|
final UserData? handymanData;
|
|
final UserData? customerData;
|
|
final UserData? providerData;
|
|
final ServiceData? service;
|
|
final BookingDetailResponse? bookingInfo;
|
|
|
|
/// flag == 0 = customer
|
|
/// flag == 1 = handyman
|
|
/// else provider
|
|
final int flag;
|
|
final BookingData? bookingDetail;
|
|
|
|
BasicInfoComponent(this.flag, {this.customerData, this.handymanData, this.providerData, this.service, this.bookingDetail, this.bookingInfo});
|
|
|
|
@override
|
|
BasicInfoComponentState createState() => BasicInfoComponentState();
|
|
}
|
|
|
|
class BasicInfoComponentState extends State<BasicInfoComponent> {
|
|
UserData customer = UserData();
|
|
UserData provider = UserData();
|
|
UserData userData = UserData();
|
|
ServiceData service = ServiceData();
|
|
|
|
String? googleUrl;
|
|
String? address;
|
|
String? name;
|
|
String? contactNumber;
|
|
String? profileUrl;
|
|
int? profileId;
|
|
int? handymanRating;
|
|
|
|
int? flag;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
init();
|
|
}
|
|
|
|
Future<void> init() async {
|
|
if (widget.flag == 0) {
|
|
profileId = widget.customerData!.id.validate();
|
|
name = widget.customerData!.displayName.validate();
|
|
profileUrl = widget.customerData!.profileImage.validate();
|
|
contactNumber = widget.customerData!.contactNumber.validate();
|
|
address = widget.customerData!.address.validate();
|
|
|
|
userData = widget.customerData!;
|
|
await userService.getUser(email: widget.customerData!.email.validate()).then((value) {
|
|
widget.customerData!.uid = value.uid;
|
|
}).catchError((e) {
|
|
log(e.toString());
|
|
});
|
|
} else if (widget.flag == 1) {
|
|
profileId = widget.handymanData!.id.validate();
|
|
name = widget.handymanData!.displayName.validate();
|
|
profileUrl = widget.handymanData!.profileImage.validate();
|
|
contactNumber = widget.handymanData!.contactNumber.validate();
|
|
address = widget.handymanData!.address.validate();
|
|
|
|
userData = widget.handymanData!;
|
|
await userService.getUser(email: widget.handymanData!.email.validate()).then((value) {
|
|
widget.handymanData!.uid = value.uid;
|
|
}).catchError((e) {
|
|
log(e.toString());
|
|
});
|
|
} else {
|
|
profileId = widget.providerData!.id.validate();
|
|
name = widget.providerData!.displayName.validate();
|
|
profileUrl = widget.providerData!.profileImage.validate();
|
|
contactNumber = widget.providerData!.contactNumber.validate();
|
|
address = widget.providerData!.address.validate();
|
|
provider = widget.providerData!;
|
|
}
|
|
setState(() {});
|
|
}
|
|
|
|
@override
|
|
void setState(fn) {
|
|
if (mounted) super.setState(fn);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Container(
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Row(
|
|
children: [
|
|
if (profileUrl.validate().isNotEmpty) ImageBorder(src: profileUrl.validate(), height: 65),
|
|
16.width,
|
|
Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Row(
|
|
children: [
|
|
HandymanNameWidget(name: name.validate(), size: 14).flexible(),
|
|
if (widget.flag == 1)
|
|
Row(
|
|
children: [
|
|
16.width,
|
|
ic_info.iconImage(size: 15),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
10.height,
|
|
if (userData.email.validate().isNotEmpty && widget.flag == 0 && widget.bookingDetail!.canCustomerContact)
|
|
// Row(
|
|
// children: [
|
|
// ic_message.iconImage(size: 16, color: textSecondaryColorGlobal),
|
|
// 6.width,
|
|
// Text(userData.email.validate(), style: secondaryTextStyle()).flexible(),
|
|
// ],
|
|
// ).onTap(() {
|
|
// launchMail(userData.email.validate());
|
|
// }),
|
|
if (widget.bookingDetail != null && widget.flag == 0 && widget.bookingDetail!.canCustomerContact)
|
|
Column(
|
|
children: [
|
|
8.height,
|
|
Row(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
servicesAddress.iconImage(size: 18, color: textSecondaryColorGlobal),
|
|
3.width,
|
|
Text(widget.bookingDetail!.address.validate(), style: secondaryTextStyle()).flexible(),
|
|
],
|
|
),
|
|
],
|
|
).visible(widget.bookingDetail!.address.validate().isNotEmpty).onTap(() {
|
|
commonLaunchUrl('$GOOGLE_MAP_PREFIX${Uri.encodeFull(widget.bookingDetail!.address.validate())}', launchMode: LaunchMode.externalApplication);
|
|
}),
|
|
if (widget.flag == 1) DisabledRatingBarWidget(rating: userData.handymanRating.validate().toDouble(), size: 14),
|
|
],
|
|
).expand()
|
|
],
|
|
),
|
|
if (userData.userType.validate() == IS_USER || widget.bookingInfo != null && (widget.bookingInfo!.providerData!.id.validate() != widget.handymanData!.id.validate()))
|
|
if (widget.bookingDetail!.canCustomerContact ||
|
|
widget.bookingDetail!.status == BOOKING_STATUS_PENDING)
|
|
Column(
|
|
children: [
|
|
8.height,
|
|
Divider(color: context.dividerColor),
|
|
8.height,
|
|
Row(
|
|
children: [
|
|
if (contactNumber.validate().isNotEmpty)
|
|
AppButton(
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Image.asset(calling, color: white, height: 18, width: 18),
|
|
16.width,
|
|
Text(languages.lblCall, style: boldTextStyle(color: white)),
|
|
],
|
|
),
|
|
width: context.width(),
|
|
color: primaryColor,
|
|
elevation: 0,
|
|
onTap: () async {
|
|
if (widget.bookingDetail == null) return;
|
|
appStore.setLoading(true);
|
|
await startVideoCall(bookingId: widget.bookingDetail!.id.validate()).then((res) async {
|
|
appStore.setLoading(false);
|
|
if (res != null) {
|
|
var data = res;
|
|
if (res['data'] != null) data = res['data'];
|
|
|
|
if (data['token'] != null) {
|
|
CallService().startCall(
|
|
channelId: data['channel_id'] ?? widget.bookingDetail!.id.toString(),
|
|
token: data['token'],
|
|
uid: appStore.userId.validate(),
|
|
receiverName: name.validate(),
|
|
receiverAvatar: profileUrl.validate(),
|
|
);
|
|
}
|
|
}
|
|
}).catchError((e) {
|
|
appStore.setLoading(false);
|
|
toast(e.toString());
|
|
});
|
|
},
|
|
).expand(),
|
|
if (contactNumber.validate().isNotEmpty) 24.width,
|
|
AppButton(
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Image.asset(chat, color: context.iconColor, height: 18, width: 18),
|
|
16.width,
|
|
Text(languages.lblChat, style: boldTextStyle()),
|
|
],
|
|
),
|
|
width: context.width(),
|
|
elevation: 0,
|
|
color: context.scaffoldBackgroundColor,
|
|
onTap: () async {
|
|
//ChatScreen(chatUser: ChatUserModel(id: userData.uid!, email: userData.email!, name: userData.firstName!)).launch(context);
|
|
toast(languages.pleaseWaitWhileWeLoadChatDetails);
|
|
UserData? user = await userService.getUserNull(email: userData.email.validate());
|
|
if (user != null) {
|
|
Fluttertoast.cancel();
|
|
UserChatScreen(receiverUser: user).launch(context);
|
|
} else {
|
|
Fluttertoast.cancel();
|
|
toast("${userData.firstName} ${languages.isNotAvailableForChat}");
|
|
}
|
|
},
|
|
).expand(),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
} |