You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

338 lines
11 KiB

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'dart:async';
import 'package:flutter/services.dart' show PlatformException, rootBundle;
import 'package:flutter/cupertino.dart';
import 'package:location/location.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:geolocator/geolocator.dart';
import 'package:teso/Classes/API%20Clasess/TesoBusinessDetail.dart';
import 'package:teso/Classes/TesoShop.dart';
import 'package:teso/Pages/Sub_Pages/BusinessDetails.dart';
import 'package:flutter_polyline_points/flutter_polyline_points.dart';
import 'package:teso/util/consts.dart';
class CouponLocator extends StatefulWidget {
final TesoBusinessDetail shop;
const CouponLocator({Key key, this.shop}) : super(key: key);
@override
_CouponLocatorState createState() => _CouponLocatorState(
shop: new TesoShop(
categoryShop: this.shop.businessCategory,
dateEst: this.shop.dateOfEst,
email: this.shop.businessEmail,
handle: this.shop.handle,
latitude: double.parse(this.shop.businessLat),
logo: this.shop.businessLogo,
longitude: double.parse(this.shop.businessLng),
shopAddress: this.shop.businessAddress,
shopDescription: this.shop.businessDescription,
shopID: this.shop.businessId,
shopName: this.shop.businessName,
shopPhone: this.shop.businessContact,
shopTin: this.shop.businessTin,
));
}
class _CouponLocatorState extends State<CouponLocator> {
String mapstyle;
var _future;
static LatLng _initialPosition;
Map<MarkerId, Marker> markers = {};
GoogleMapController mapController;
static const double CAMERA_ZOOM = 14.4746;
static const double CAMERA_TILT = 80;
static const double CAMERA_BEARING = 30;
TesoShop shop;
_CouponLocatorState({this.shop});
Map<PolylineId, Polyline> polylines = {};
String selectedshop = "";
Location location = Location();
LocationData _location;
bool ios = false;
Future<bool> _determinePosition() async {
try {
final LocationData _locationResult = await location.getLocation();
setState(() {
_location = _locationResult;
_initialPosition = LatLng(_location.latitude, _location.longitude);
});
await getLocations();
return await navigateToShop(shop);
} on PlatformException catch (err) {
setState(() {
print(err.code);
});
return false;
}
}
getLocations() async {
MarkerId markerId = MarkerId(widget.shop.businessId);
Marker marker = Marker(
markerId: markerId,
position: LatLng(double.parse(widget.shop.businessLat),
double.parse(widget.shop.businessLng)),
icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueCyan),
infoWindow: InfoWindow(
title: widget.shop.businessName,
snippet: widget.shop.businessAddress,
),
onTap: () => showModalBottomSheet(
context: context,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(top: Radius.circular(30.0)),
),
builder: (BuildContext bc) {
return buildShopDetails(bc, shop, navigateToShop);
},
),
);
if (mounted) {
setState(() {
markers[markerId] = marker;
});
}
}
@override
void initState() {
super.initState();
ios = Platform.isIOS;
SharedPreferences.getInstance().then((prefs) {
String currentTheme = prefs.getString("theme");
if (currentTheme == "light") {
rootBundle.loadString('assets/styles/light.txt').then((string) {
mapstyle = string;
});
} else {
rootBundle.loadString('assets/styles/dark.txt').then((string) {
mapstyle = string;
});
}
});
_future = _determinePosition();
location.onLocationChanged.listen((LocationData cLoc) {
_initialPosition = LatLng(cLoc.latitude, cLoc.longitude);
});
}
navigateToShop(TesoShop tesoShop) async {
MarkerId markerId = MarkerId(tesoShop.shopName + " Location");
Marker marker = Marker(
markerId: markerId,
position: LatLng(tesoShop.latitude, tesoShop.longitude),
icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueGreen),
infoWindow: InfoWindow(
title: tesoShop.shopName,
snippet: tesoShop.shopAddress,
),
);
setState(() {
markers.clear();
markers[markerId] = marker;
selectedshop = tesoShop.shopName;
});
Position user = Position(
latitude: _initialPosition.latitude,
longitude: _initialPosition.longitude,
accuracy: 100,
altitude: 100,
heading: 100,
speed: 100,
speedAccuracy: 100,
timestamp: DateTime.now());
Position shopLoc = Position(
latitude: tesoShop.latitude,
longitude: tesoShop.longitude,
accuracy: 100,
altitude: 100,
heading: 100,
speed: 100,
speedAccuracy: 100,
timestamp: DateTime.now());
if (await createPolylines(user, shopLoc)) {
return true;
} else {
return false;
}
}
createPolylines(Position start, Position destination) async {
try {
PolylinePoints polylinePoints;
List<LatLng> polylineCoordinates = [];
polylinePoints = PolylinePoints();
PolylineResult result = await polylinePoints.getRouteBetweenCoordinates(
mapsKey,
PointLatLng(start.latitude, start.longitude),
PointLatLng(destination.latitude, destination.longitude),
travelMode: TravelMode.driving,
);
if (result.points.isNotEmpty) {
result.points.forEach((PointLatLng point) {
polylineCoordinates.add(LatLng(point.latitude, point.longitude));
});
}
PolylineId id = PolylineId('poly');
Polyline polyline = Polyline(
polylineId: id,
color: Theme.of(context).colorScheme.secondary,
points: polylineCoordinates,
width: 5,
);
setState(() {
polylines[id] = polyline;
});
return true;
} catch (e) {
print(e);
return false;
}
}
@override
void dispose() {
mapController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body: FutureBuilder(
future: _future,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Stack(
children: [
ios
? Container(
margin: EdgeInsets.only(
top: (MediaQuery.of(context).size.height) -
(MediaQuery.of(context).size.height * 0.935),
left: 10),
child: Material(
elevation: 5,
color: Color.fromRGBO(0, 0, 0, 0.4),
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(25),
bottomRight: Radius.circular(25),
topLeft: Radius.circular(25),
topRight: Radius.circular(25),
),
child: ClipRRect(
borderRadius: BorderRadius.circular(25.0),
child: IconButton(
icon: Icon(
Icons.arrow_back_ios,
size: 20,
),
color: Colors.white,
onPressed: () => Navigator.pop(context),
),
),
),
)
: Container(),
Container(
padding: EdgeInsets.only(
top: MediaQuery.of(context).size.width * 0.7),
height: MediaQuery.of(context).size.height,
width: MediaQuery.of(context).size.width,
child: Center(
child: Column(
children: [
CupertinoActivityIndicator(
animating: true,
radius: 15,
),
Text("Routing to shop....."),
],
),
),
),
],
);
} else if (snapshot.data == false &&
snapshot.connectionState == ConnectionState.done) {
Navigator.of(context).pop();
return Container();
} else {
return Stack(
children: [
GoogleMap(
padding: EdgeInsets.only(
top: 70.0,
),
zoomGesturesEnabled: true,
zoomControlsEnabled: false,
compassEnabled: true,
myLocationButtonEnabled: true,
myLocationEnabled: true,
markers: Set.of(markers.values),
initialCameraPosition: CameraPosition(
target: _initialPosition,
zoom: CAMERA_ZOOM,
tilt: CAMERA_TILT,
bearing: CAMERA_BEARING,
),
onMapCreated: (GoogleMapController controller) {
controller.setMapStyle(mapstyle);
mapController = controller;
},
onCameraMove: (position) {
setState(() {
_initialPosition = LatLng(
position.target.latitude, position.target.longitude);
});
},
polylines: Set<Polyline>.of(polylines.values),
),
Container(
margin: EdgeInsets.only(
top: (MediaQuery.of(context).size.height) -
(MediaQuery.of(context).size.height * 0.935),
left: 10),
child: Material(
elevation: 5,
color: Color.fromRGBO(0, 0, 0, 0.4),
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(25),
bottomRight: Radius.circular(25),
topLeft: Radius.circular(25),
topRight: Radius.circular(25),
),
child: ClipRRect(
borderRadius: BorderRadius.circular(25.0),
child: IconButton(
icon: Icon(
Icons.arrow_back_ios,
size: 20,
),
color: Colors.white,
onPressed: () => Navigator.pop(context),
),
),
),
),
],
);
}
},
),
);
}
}