Compare commits
10 Commits
c5648f82e3
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
026a4382e4 | ||
|
|
150ca82f74 | ||
|
|
4a53decc74 | ||
|
|
314874a142 | ||
|
|
77451787f5 | ||
|
|
f9d37e6831 | ||
|
|
bc9ffeda59 | ||
|
|
f492aad527 | ||
|
|
374e3c648b | ||
|
|
c344ae4051 |
@@ -17,19 +17,58 @@ class Registration {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Coordinates {
|
||||||
|
String? symbol;
|
||||||
|
String? type;
|
||||||
|
String? systemSymbol;
|
||||||
|
int? x;
|
||||||
|
int? y;
|
||||||
|
|
||||||
|
Coordinates({this.symbol, this.type, this.systemSymbol, this.x, this.y });
|
||||||
|
|
||||||
|
factory Coordinates.fromJson(Map<String, dynamic> json) {
|
||||||
|
return Coordinates(
|
||||||
|
symbol: json['symbol'],
|
||||||
|
type: json['type'],
|
||||||
|
systemSymbol: json['systemSymbol'],
|
||||||
|
x: json['x'],
|
||||||
|
y: json['y'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Route {
|
||||||
|
Coordinates? departure;
|
||||||
|
Coordinates? destination;
|
||||||
|
String? arrival;
|
||||||
|
String? departureTime;
|
||||||
|
|
||||||
|
Route({this.departure, this.destination, this.arrival, this.departureTime});
|
||||||
|
|
||||||
|
factory Route.fromJson(Map<String, dynamic> json) {
|
||||||
|
return Route(
|
||||||
|
departure: Coordinates.fromJson(json['departure']),
|
||||||
|
destination: Coordinates.fromJson(json['destination']),
|
||||||
|
arrival: json['arrival'],
|
||||||
|
departureTime: json['departureTime'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class Nav {
|
class Nav {
|
||||||
String? systemSymbol;
|
String? systemSymbol;
|
||||||
String? waypointSymbol;
|
String? waypointSymbol;
|
||||||
//TODO Route
|
Route? route;
|
||||||
String? status;
|
String? status;
|
||||||
String? flightMode;
|
String? flightMode;
|
||||||
|
|
||||||
Nav({this.systemSymbol, this.waypointSymbol, this.status, this.flightMode});
|
Nav({this.systemSymbol, this.waypointSymbol, this.route, this.status, this.flightMode});
|
||||||
|
|
||||||
factory Nav.fromJson(Map<String, dynamic> json) {
|
factory Nav.fromJson(Map<String, dynamic> json) {
|
||||||
return Nav(
|
return Nav(
|
||||||
systemSymbol: json['systemSymbol'],
|
systemSymbol: json['systemSymbol'],
|
||||||
waypointSymbol: json['waypointSymbol'],
|
waypointSymbol: json['waypointSymbol'],
|
||||||
|
route: Route.fromJson(json['route']),
|
||||||
status: json['status'],
|
status: json['status'],
|
||||||
flightMode: json['flightMode'],
|
flightMode: json['flightMode'],
|
||||||
);
|
);
|
||||||
@@ -58,15 +97,22 @@ class Inventory {
|
|||||||
class Cargo {
|
class Cargo {
|
||||||
int? capacity;
|
int? capacity;
|
||||||
int? units;
|
int? units;
|
||||||
//List<Inventory>? inventory;
|
List<Inventory>? inventory;
|
||||||
|
|
||||||
Cargo({this.capacity, this.units});//, this.inventory});
|
Cargo({this.capacity, this.units, this.inventory});
|
||||||
|
|
||||||
factory Cargo.fromJson(Map<String, dynamic> json) {
|
factory Cargo.fromJson(Map<String, dynamic> json) {
|
||||||
|
var inventoryList = json['inventory'] as List<dynamic>?;
|
||||||
|
List<Inventory>? parsedInventoryList;
|
||||||
|
if (inventoryList != null) {
|
||||||
|
parsedInventoryList = inventoryList
|
||||||
|
.map((item) => Inventory.fromJson(item))
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
return Cargo(
|
return Cargo(
|
||||||
capacity: json['capacity'],
|
capacity: json['capacity'],
|
||||||
units: json['units'],
|
units: json['units'],
|
||||||
//inventory: json.decode(json['inventory']),
|
inventory: parsedInventoryList,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import 'package:space_traders/models/agent_model.dart';
|
|||||||
import 'package:space_traders/providers/agent_provider.dart';
|
import 'package:space_traders/providers/agent_provider.dart';
|
||||||
import 'package:space_traders/models/ship_model.dart';
|
import 'package:space_traders/models/ship_model.dart';
|
||||||
import 'package:space_traders/providers/ship_provider.dart';
|
import 'package:space_traders/providers/ship_provider.dart';
|
||||||
|
import 'package:space_traders/pages/ship_page.dart';
|
||||||
|
|
||||||
class HomePage extends StatefulWidget {
|
class HomePage extends StatefulWidget {
|
||||||
@override
|
@override
|
||||||
@@ -13,8 +14,18 @@ class _HomePageState extends State<HomePage> {
|
|||||||
final agent = AgentProvider();
|
final agent = AgentProvider();
|
||||||
ShipProvider shipProvider = ShipProvider();
|
ShipProvider shipProvider = ShipProvider();
|
||||||
|
|
||||||
Future<List<ShipModel>> getShips() async {
|
Future<List<ShipModel>>? shipsFuture;
|
||||||
List<ShipModel> ships = await shipProvider.getShips();
|
|
||||||
|
@override
|
||||||
|
void didChangeDependencies() {
|
||||||
|
super.didChangeDependencies();
|
||||||
|
shipsFuture = listShips();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Future<List<ShipModel>> listShips() async {
|
||||||
|
List<ShipModel> ships = await shipProvider.listShips();
|
||||||
return ships;
|
return ships;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,45 +75,106 @@ class _HomePageState extends State<HomePage> {
|
|||||||
)
|
)
|
||||||
),
|
),
|
||||||
Card(
|
Card(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
child: FutureBuilder<List<ShipModel>>(
|
child: FutureBuilder<List<ShipModel>>(
|
||||||
future: getShips(),
|
future: shipsFuture,//listShips(),
|
||||||
builder: (BuildContext context, AsyncSnapshot<List<ShipModel>> snapshot) {
|
builder: (BuildContext context, AsyncSnapshot<List<ShipModel>> snapshot) {
|
||||||
if (snapshot.hasData) {
|
if (snapshot.hasData) {
|
||||||
List<ShipModel> ships = snapshot.data!;
|
List<ShipModel> ships = snapshot.data!;
|
||||||
return SingleChildScrollView(
|
return SingleChildScrollView(
|
||||||
scrollDirection: Axis.horizontal,
|
scrollDirection: Axis.horizontal,
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: ships.map((ship) {
|
children: [
|
||||||
return Container(
|
Container(
|
||||||
width: MediaQuery.of(context).size.width,
|
width: MediaQuery.of(context).size.width, // Utiliser la largeur de l'écran
|
||||||
child: Card(
|
child: Card(
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.all(8.0),
|
padding: const EdgeInsets.all(8.0),
|
||||||
child: Row(
|
child: Table(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
defaultColumnWidth: IntrinsicColumnWidth(),
|
||||||
children: <Widget>[
|
children: ships.map((ship) {
|
||||||
Text('${ship.symbol ?? 'N/A'}'),
|
return TableRow(
|
||||||
Text('${ship.nav?.status ?? 'N/A'}'),
|
children: [
|
||||||
Text('Fuel: ${ship.fuel?.current ?? 'N/A'} / ${ship.fuel?.capacity ?? 'N/A'}'),
|
GestureDetector(
|
||||||
Text('Cargo: ${ship.cargo?.units ?? 'N/A'} / ${ship.cargo?.capacity ?? 'N/A'}'),
|
onTap: () {
|
||||||
],
|
Navigator.push(
|
||||||
|
context,
|
||||||
|
MaterialPageRoute(
|
||||||
|
builder: (context) => ShipPage(ship: ship),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
alignment: Alignment.centerLeft,
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: Text('${ship.symbol ?? 'N/A'}'),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
Navigator.push(
|
||||||
|
context,
|
||||||
|
MaterialPageRoute(
|
||||||
|
builder: (context) => ShipPage(ship: ship),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
alignment: Alignment.centerLeft,
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: Text('${ship.nav?.status ?? 'N/A'}'),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
Navigator.push(
|
||||||
|
context,
|
||||||
|
MaterialPageRoute(
|
||||||
|
builder: (context) => ShipPage(ship: ship),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
alignment: Alignment.centerLeft,
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: Text('Fuel: ${ship.fuel?.current ?? 'N/A'} / ${ship.fuel?.capacity ?? 'N/A'}'),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
Navigator.push(
|
||||||
|
context,
|
||||||
|
MaterialPageRoute(
|
||||||
|
builder: (context) => ShipPage(ship: ship),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
alignment: Alignment.centerLeft,
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: Text('Cargo: ${ship.cargo?.units ?? 'N/A'} / ${ship.cargo?.capacity ?? 'N/A'}'),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}).toList(),
|
||||||
),
|
),
|
||||||
),),
|
),
|
||||||
);
|
),
|
||||||
}).toList(),
|
),
|
||||||
),
|
],
|
||||||
);
|
),
|
||||||
}else if (snapshot.hasError) {
|
);
|
||||||
return Text('Error: ${snapshot.error}');
|
} else if (snapshot.hasError) {
|
||||||
}else {
|
return Text('Error: ${snapshot.error}');
|
||||||
return CircularProgressIndicator();
|
} else {
|
||||||
}
|
return CircularProgressIndicator();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
255
lib/pages/ship_page.dart
Normal file
255
lib/pages/ship_page.dart
Normal file
@@ -0,0 +1,255 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:space_traders/models/ship_model.dart';
|
||||||
|
import 'package:space_traders/providers/ship_provider.dart';
|
||||||
|
|
||||||
|
class ShipPage extends StatefulWidget {
|
||||||
|
final ShipModel ship;
|
||||||
|
|
||||||
|
ShipPage({required this.ship});
|
||||||
|
|
||||||
|
@override
|
||||||
|
_ShipPageState createState() => _ShipPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ShipPageState extends State<ShipPage> {
|
||||||
|
ShipModel? ship;
|
||||||
|
Timer? _timer;
|
||||||
|
Timer? _timermin;
|
||||||
|
bool isButtonEnabled = true;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_startTimer();
|
||||||
|
ship = widget.ship;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_stopTimer();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _startTimer() {
|
||||||
|
_timer = Timer.periodic(Duration(seconds: 5), (_) {
|
||||||
|
setState(() {
|
||||||
|
_fetchShipData();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _fetchShipData() async {
|
||||||
|
ShipModel refreshedShip = await ShipProvider.getShip(widget.ship.symbol!);
|
||||||
|
setState(() {
|
||||||
|
ship = refreshedShip;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void _stopTimer() {
|
||||||
|
_timer?.cancel();
|
||||||
|
_timermin?.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
ElevatedButton buildActionButton(String status) {
|
||||||
|
String buttonText = '';
|
||||||
|
VoidCallback? buttonAction;
|
||||||
|
|
||||||
|
if (status == 'IN_ORBIT') {
|
||||||
|
buttonText = 'Dock';
|
||||||
|
buttonAction = () async {
|
||||||
|
Nav newNav = await ShipProvider.dockShip(widget.ship.symbol!);
|
||||||
|
ship?.nav = newNav;
|
||||||
|
};
|
||||||
|
} else if (status == 'DOCKED') {
|
||||||
|
buttonText = 'Orbit';
|
||||||
|
buttonAction = () async{
|
||||||
|
Nav newNav = await ShipProvider.orbitShip(widget.ship.symbol!);
|
||||||
|
ship?.nav = newNav;
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
buttonText = '';
|
||||||
|
buttonAction = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ElevatedButton(
|
||||||
|
onPressed: buttonAction,
|
||||||
|
child: Text(buttonText),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onButtonPressed() async {
|
||||||
|
int duration;
|
||||||
|
if (isButtonEnabled) {
|
||||||
|
setState(() {
|
||||||
|
isButtonEnabled = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
duration = await ShipProvider.extract(widget.ship.symbol!);
|
||||||
|
final disabledDuration = Duration(seconds: duration);
|
||||||
|
|
||||||
|
_timermin = Timer(disabledDuration, () {
|
||||||
|
setState(() {
|
||||||
|
isButtonEnabled = true;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: Text('Ship Details'),
|
||||||
|
),
|
||||||
|
body: Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.grey[300],
|
||||||
|
),
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(16.0),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
|
children: [
|
||||||
|
Card(
|
||||||
|
color: Colors.white,
|
||||||
|
child: Align(
|
||||||
|
alignment: Alignment.topLeft,
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
'Name: ${ship?.symbol}',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 18,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Text('${ship?.nav?.status ?? 'N/A'}'),
|
||||||
|
SizedBox(height: 32),
|
||||||
|
SizedBox(width: 32),
|
||||||
|
buildActionButton(ship?.nav?.status ?? ''),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Text('Fuel: ${ship?.fuel?.current ?? 'N/A'} / ${ship?.fuel?.capacity ?? 'N/A'}'),
|
||||||
|
SizedBox(height: 32),
|
||||||
|
SizedBox(width: 32),
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed: () {
|
||||||
|
},
|
||||||
|
child: Text('Refuel'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Column(
|
||||||
|
children:[
|
||||||
|
Text('${ship?.nav?.waypointSymbol ?? 'N/A'}'),
|
||||||
|
Text('${ship?.nav?.route?.destination?.type ?? 'N/A'}'),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
SizedBox(height: 32),
|
||||||
|
SizedBox(width: 32),
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed: () {
|
||||||
|
},
|
||||||
|
child: Text('Select Destination'),
|
||||||
|
),
|
||||||
|
SizedBox(width: 32),
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed: () {
|
||||||
|
},
|
||||||
|
child: Text('View System'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Card(
|
||||||
|
color: Colors.white,
|
||||||
|
child: Align(
|
||||||
|
alignment: Alignment.topLeft,
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
'Cargo: ${ship?.cargo?.units ?? 'N/A'} / ${ship?.cargo?.capacity ?? 'N/A'}',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 18,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
//ElevatedButton(
|
||||||
|
// onPressed: () {
|
||||||
|
// },
|
||||||
|
// child: Text('Markets'),
|
||||||
|
// ),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
SizedBox(height: 10),
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: ship?.cargo?.inventory?.map((item) {
|
||||||
|
return Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
'${item.name ?? 'N/A'} - ${item.units ?? 'N/A'}',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 16,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed: () async {
|
||||||
|
Cargo newCargo = await ShipProvider.sell(widget.ship.symbol!, item.name!, item.units!);
|
||||||
|
},
|
||||||
|
child: Text('Sell'),
|
||||||
|
),
|
||||||
|
Divider(),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}).toList() ?? [],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Card(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: Text(
|
||||||
|
'Mining',
|
||||||
|
style: TextStyle(
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
fontSize: 18,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed: isButtonEnabled ? _onButtonPressed : null,
|
||||||
|
child: Text('Start Mining'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,8 +7,8 @@ class AgentProvider {
|
|||||||
|
|
||||||
Future<AgentModel> getAgent() async {
|
Future<AgentModel> getAgent() async {
|
||||||
final url = 'https://api.spacetraders.io/v2/my/agent';
|
final url = 'https://api.spacetraders.io/v2/my/agent';
|
||||||
final token = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGlmaWVyIjoiVFJJUExFRkEiLCJ2ZXJzaW9uIjoidjIiLCJyZXNldF9kYXRlIjoiMjAyMy0wNS0yMCIsImlhdCI6MTY4NTA4MzgwNiwic3ViIjoiYWdlbnQtdG9rZW4ifQ.F90krgDq6p2yAiQtWIjFEYqMRqepaUQ8j6hnoKIrj9FrSLLvYhY2LEIII70ta6b97Fqsr5szAhmIP0AfXovCONXXq9EIR74SOojGsyt5-8LoNvZlNt6LrmNyuhiJgipogKNrSuUt0L3SEjLjUGeF_k-85rEMcH_Gts31IGfYD6mFWlj142ORJUIzF6gCqVYXYYKw99VObAvGwQnpbd3LrDGJShJn0Bjh5Fb0ACbaesTgFzktSW0FP_lxsf9m3uQastgnX3otioq1CnwfDTQC6uNwFK2KvCEcebnGqUU9l5GNrMEnqZ02YXnbFZx6b1icop_1wsyajsrJHsqNs6zliw';
|
final token = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGlmaWVyIjoiVEZBIiwidmVyc2lvbiI6InYyIiwicmVzZXRfZGF0ZSI6IjIwMjMtMDYtMDMiLCJpYXQiOjE2ODU5NTMwODksInN1YiI6ImFnZW50LXRva2VuIn0.PPGF4B1ZtgqyWXBuGiLR71aHo9XJw9cA5OxP8xxriVuje3RDjdDstP3nEt0NiXSk4yP6N15DHJqIFe9BHH2sG1yVxcYXOvXQeoYMfnfg-HzdsmCv_tZmyC7Ey0go9HiMbt0WeNyNQYgJBonA5XicmfoqAXiggI51kMAdxq-zerwQAfBvfgDLmIqb1QwD0cMEy-VugkWe-CUUQDAXdarDnFRYlqP2lVLdtBdWVArpMYYFniR-Id5FQjOCiCyrtJ5pYPs6Ih0O9Lab9JU9_lncCqrG_FllVOwyvrE2kV8ScSKpotKhfI0_qV3FL2T_z25ZBEvfad0WFqmiubiRGuo0XQ';
|
||||||
|
|
||||||
final resp = await http.get(
|
final resp = await http.get(
|
||||||
Uri.parse(url),
|
Uri.parse(url),
|
||||||
headers: {'Authorization': 'Bearer $token'},
|
headers: {'Authorization': 'Bearer $token'},
|
||||||
|
|||||||
@@ -5,16 +5,16 @@ import 'package:space_traders/models/ship_model.dart';
|
|||||||
|
|
||||||
class ShipProvider {
|
class ShipProvider {
|
||||||
|
|
||||||
Future<List<ShipModel>> getShips() async {
|
Future<List<ShipModel>> listShips() async {
|
||||||
final url = 'https://api.spacetraders.io/v2/my/ships';
|
final url = 'https://api.spacetraders.io/v2/my/ships';
|
||||||
final token = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGlmaWVyIjoiVFJJUExFRkEiLCJ2ZXJzaW9uIjoidjIiLCJyZXNldF9kYXRlIjoiMjAyMy0wNS0yMCIsImlhdCI6MTY4NTA4MzgwNiwic3ViIjoiYWdlbnQtdG9rZW4ifQ.F90krgDq6p2yAiQtWIjFEYqMRqepaUQ8j6hnoKIrj9FrSLLvYhY2LEIII70ta6b97Fqsr5szAhmIP0AfXovCONXXq9EIR74SOojGsyt5-8LoNvZlNt6LrmNyuhiJgipogKNrSuUt0L3SEjLjUGeF_k-85rEMcH_Gts31IGfYD6mFWlj142ORJUIzF6gCqVYXYYKw99VObAvGwQnpbd3LrDGJShJn0Bjh5Fb0ACbaesTgFzktSW0FP_lxsf9m3uQastgnX3otioq1CnwfDTQC6uNwFK2KvCEcebnGqUU9l5GNrMEnqZ02YXnbFZx6b1icop_1wsyajsrJHsqNs6zliw';
|
final token ='eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGlmaWVyIjoiVEZBIiwidmVyc2lvbiI6InYyIiwicmVzZXRfZGF0ZSI6IjIwMjMtMDYtMDMiLCJpYXQiOjE2ODU5NTMwODksInN1YiI6ImFnZW50LXRva2VuIn0.PPGF4B1ZtgqyWXBuGiLR71aHo9XJw9cA5OxP8xxriVuje3RDjdDstP3nEt0NiXSk4yP6N15DHJqIFe9BHH2sG1yVxcYXOvXQeoYMfnfg-HzdsmCv_tZmyC7Ey0go9HiMbt0WeNyNQYgJBonA5XicmfoqAXiggI51kMAdxq-zerwQAfBvfgDLmIqb1QwD0cMEy-VugkWe-CUUQDAXdarDnFRYlqP2lVLdtBdWVArpMYYFniR-Id5FQjOCiCyrtJ5pYPs6Ih0O9Lab9JU9_lncCqrG_FllVOwyvrE2kV8ScSKpotKhfI0_qV3FL2T_z25ZBEvfad0WFqmiubiRGuo0XQ';
|
||||||
|
|
||||||
final resp = await http.get(
|
final resp = await http.get(
|
||||||
Uri.parse(url),
|
Uri.parse(url),
|
||||||
headers: {'Authorization': 'Bearer $token'},
|
headers: {'Authorization': 'Bearer $token'},
|
||||||
);
|
);
|
||||||
|
|
||||||
final decodedData = json.decode(utf8.decode(resp.bodyBytes));
|
final decodedData = json.decode(utf8.decode(resp.bodyBytes));
|
||||||
//final fleet = FleetModel.fromJson(decodedData['data']);
|
|
||||||
final List<ShipModel> fleet = [];
|
final List<ShipModel> fleet = [];
|
||||||
final List<dynamic> data = decodedData['data'];
|
final List<dynamic> data = decodedData['data'];
|
||||||
|
|
||||||
@@ -25,5 +25,91 @@ class ShipProvider {
|
|||||||
|
|
||||||
return fleet;
|
return fleet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Future<ShipModel> getShip(String shipSymbol) async {
|
||||||
|
final url = 'https://api.spacetraders.io/v2/my/ships/$shipSymbol';
|
||||||
|
final token ='eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGlmaWVyIjoiVEZBIiwidmVyc2lvbiI6InYyIiwicmVzZXRfZGF0ZSI6IjIwMjMtMDYtMDMiLCJpYXQiOjE2ODU5NTMwODksInN1YiI6ImFnZW50LXRva2VuIn0.PPGF4B1ZtgqyWXBuGiLR71aHo9XJw9cA5OxP8xxriVuje3RDjdDstP3nEt0NiXSk4yP6N15DHJqIFe9BHH2sG1yVxcYXOvXQeoYMfnfg-HzdsmCv_tZmyC7Ey0go9HiMbt0WeNyNQYgJBonA5XicmfoqAXiggI51kMAdxq-zerwQAfBvfgDLmIqb1QwD0cMEy-VugkWe-CUUQDAXdarDnFRYlqP2lVLdtBdWVArpMYYFniR-Id5FQjOCiCyrtJ5pYPs6Ih0O9Lab9JU9_lncCqrG_FllVOwyvrE2kV8ScSKpotKhfI0_qV3FL2T_z25ZBEvfad0WFqmiubiRGuo0XQ';
|
||||||
|
|
||||||
|
final resp = await http.get(
|
||||||
|
Uri.parse(url),
|
||||||
|
headers: {'Authorization': 'Bearer $token'},
|
||||||
|
);
|
||||||
|
|
||||||
|
final decodedData = json.decode(utf8.decode(resp.bodyBytes));
|
||||||
|
|
||||||
|
return ShipModel.fromJson(decodedData['data']);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<Nav> dockShip(String shipSymbol) async {
|
||||||
|
final url = 'https://api.spacetraders.io/v2/my/ships/$shipSymbol/dock';
|
||||||
|
final token ='eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGlmaWVyIjoiVEZBIiwidmVyc2lvbiI6InYyIiwicmVzZXRfZGF0ZSI6IjIwMjMtMDYtMDMiLCJpYXQiOjE2ODU5NTMwODksInN1YiI6ImFnZW50LXRva2VuIn0.PPGF4B1ZtgqyWXBuGiLR71aHo9XJw9cA5OxP8xxriVuje3RDjdDstP3nEt0NiXSk4yP6N15DHJqIFe9BHH2sG1yVxcYXOvXQeoYMfnfg-HzdsmCv_tZmyC7Ey0go9HiMbt0WeNyNQYgJBonA5XicmfoqAXiggI51kMAdxq-zerwQAfBvfgDLmIqb1QwD0cMEy-VugkWe-CUUQDAXdarDnFRYlqP2lVLdtBdWVArpMYYFniR-Id5FQjOCiCyrtJ5pYPs6Ih0O9Lab9JU9_lncCqrG_FllVOwyvrE2kV8ScSKpotKhfI0_qV3FL2T_z25ZBEvfad0WFqmiubiRGuo0XQ';
|
||||||
|
|
||||||
|
final resp = await http.post(
|
||||||
|
Uri.parse(url),
|
||||||
|
headers: {'Authorization': 'Bearer $token'},
|
||||||
|
);
|
||||||
|
|
||||||
|
final decodedData = json.decode(utf8.decode(resp.bodyBytes));
|
||||||
|
|
||||||
|
return Nav.fromJson(decodedData['data']['nav']);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<Nav> orbitShip(String shipSymbol) async {
|
||||||
|
final url = 'https://api.spacetraders.io/v2/my/ships/$shipSymbol/orbit';
|
||||||
|
final token ='eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGlmaWVyIjoiVEZBIiwidmVyc2lvbiI6InYyIiwicmVzZXRfZGF0ZSI6IjIwMjMtMDYtMDMiLCJpYXQiOjE2ODU5NTMwODksInN1YiI6ImFnZW50LXRva2VuIn0.PPGF4B1ZtgqyWXBuGiLR71aHo9XJw9cA5OxP8xxriVuje3RDjdDstP3nEt0NiXSk4yP6N15DHJqIFe9BHH2sG1yVxcYXOvXQeoYMfnfg-HzdsmCv_tZmyC7Ey0go9HiMbt0WeNyNQYgJBonA5XicmfoqAXiggI51kMAdxq-zerwQAfBvfgDLmIqb1QwD0cMEy-VugkWe-CUUQDAXdarDnFRYlqP2lVLdtBdWVArpMYYFniR-Id5FQjOCiCyrtJ5pYPs6Ih0O9Lab9JU9_lncCqrG_FllVOwyvrE2kV8ScSKpotKhfI0_qV3FL2T_z25ZBEvfad0WFqmiubiRGuo0XQ';
|
||||||
|
|
||||||
|
final resp = await http.post(
|
||||||
|
Uri.parse(url),
|
||||||
|
headers: {'Authorization': 'Bearer $token'},
|
||||||
|
);
|
||||||
|
|
||||||
|
final decodedData = json.decode(utf8.decode(resp.bodyBytes));
|
||||||
|
return Nav.fromJson(decodedData['data']['nav']);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<int> extract(String shipSymbol) async {
|
||||||
|
final url = 'https://api.spacetraders.io/v2/my/ships/$shipSymbol/extract';
|
||||||
|
final token ='eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGlmaWVyIjoiVEZBIiwidmVyc2lvbiI6InYyIiwicmVzZXRfZGF0ZSI6IjIwMjMtMDYtMDMiLCJpYXQiOjE2ODU5NTMwODksInN1YiI6ImFnZW50LXRva2VuIn0.PPGF4B1ZtgqyWXBuGiLR71aHo9XJw9cA5OxP8xxriVuje3RDjdDstP3nEt0NiXSk4yP6N15DHJqIFe9BHH2sG1yVxcYXOvXQeoYMfnfg-HzdsmCv_tZmyC7Ey0go9HiMbt0WeNyNQYgJBonA5XicmfoqAXiggI51kMAdxq-zerwQAfBvfgDLmIqb1QwD0cMEy-VugkWe-CUUQDAXdarDnFRYlqP2lVLdtBdWVArpMYYFniR-Id5FQjOCiCyrtJ5pYPs6Ih0O9Lab9JU9_lncCqrG_FllVOwyvrE2kV8ScSKpotKhfI0_qV3FL2T_z25ZBEvfad0WFqmiubiRGuo0XQ';
|
||||||
|
|
||||||
|
final resp = await http.post(
|
||||||
|
Uri.parse(url),
|
||||||
|
headers: {'Authorization': 'Bearer $token'},
|
||||||
|
);
|
||||||
|
|
||||||
|
final decodedData = json.decode(utf8.decode(resp.bodyBytes));
|
||||||
|
print(decodedData);
|
||||||
|
return decodedData['data']['cooldown']['remainingSeconds'];
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<Cargo> sell(String shipSymbol, String symbol, int units) async {
|
||||||
|
final url = 'https://api.spacetraders.io/v2/my/ships/$shipSymbol/sell';
|
||||||
|
final token ='eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGlmaWVyIjoiVEZBIiwidmVyc2lvbiI6InYyIiwicmVzZXRfZGF0ZSI6IjIwMjMtMDYtMDMiLCJpYXQiOjE2ODU5NTMwODksInN1YiI6ImFnZW50LXRva2VuIn0.PPGF4B1ZtgqyWXBuGiLR71aHo9XJw9cA5OxP8xxriVuje3RDjdDstP3nEt0NiXSk4yP6N15DHJqIFe9BHH2sG1yVxcYXOvXQeoYMfnfg-HzdsmCv_tZmyC7Ey0go9HiMbt0WeNyNQYgJBonA5XicmfoqAXiggI51kMAdxq-zerwQAfBvfgDLmIqb1QwD0cMEy-VugkWe-CUUQDAXdarDnFRYlqP2lVLdtBdWVArpMYYFniR-Id5FQjOCiCyrtJ5pYPs6Ih0O9Lab9JU9_lncCqrG_FllVOwyvrE2kV8ScSKpotKhfI0_qV3FL2T_z25ZBEvfad0WFqmiubiRGuo0XQ';
|
||||||
|
|
||||||
|
Map<String, String> headers = {
|
||||||
|
'Authorization': 'Bearer $token',
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
};
|
||||||
|
|
||||||
|
String newsymbol = symbol.toUpperCase().replaceAll(' ', '_');
|
||||||
|
if(newsymbol == 'FRESH_WATER')
|
||||||
|
newsymbol = 'ICE_WATER';
|
||||||
|
Map<String, dynamic> body = {
|
||||||
|
'symbol': '$newsymbol',
|
||||||
|
'units': units,
|
||||||
|
};
|
||||||
|
|
||||||
|
String jsonString = jsonEncode(body);
|
||||||
|
|
||||||
|
print(jsonString);
|
||||||
|
|
||||||
|
final resp = await http.post(
|
||||||
|
Uri.parse(url),
|
||||||
|
headers: headers,
|
||||||
|
body: jsonString,
|
||||||
|
);
|
||||||
|
|
||||||
|
final decodedData = json.decode(utf8.decode(resp.bodyBytes));
|
||||||
|
print(decodedData);
|
||||||
|
return Cargo.fromJson(decodedData['data']['cargo']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user