diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 2d3d32b..fbfcec0 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -14,8 +14,8 @@ class _HomePageState extends State { final agent = AgentProvider(); ShipProvider shipProvider = ShipProvider(); - Future> getShips() async { - List ships = await shipProvider.getShips(); + Future> listShips() async { + List ships = await shipProvider.listShips(); return ships; } @@ -67,7 +67,7 @@ class _HomePageState extends State { Card( color: Colors.white, child: FutureBuilder>( - future: getShips(), + future: listShips(), builder: (BuildContext context, AsyncSnapshot> snapshot) { if (snapshot.hasData) { List ships = snapshot.data!; diff --git a/lib/pages/ship_page.dart b/lib/pages/ship_page.dart index 5457373..3c8efc4 100644 --- a/lib/pages/ship_page.dart +++ b/lib/pages/ship_page.dart @@ -1,10 +1,52 @@ +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 StatelessWidget { - final ShipModel ship; +class ShipPage extends StatefulWidget { + final ShipModel ship; - ShipPage({required this.ship}); + ShipPage({required this.ship}); + + @override + _ShipPageState createState() => _ShipPageState(); +} + +class _ShipPageState extends State { + ShipModel? ship; + Timer? _timer; + + @override + void initState() { + super.initState(); + _startTimer(); + ship = widget.ship; + } + + @override + void dispose() { + _stopTimer(); + super.dispose(); + } + + void _startTimer() { + _timer = Timer.periodic(Duration(seconds: 15), (_) { + setState(() { + _fetchShipData(); + }); + }); + } + + Future _fetchShipData() async { + ShipModel refreshedShip = await ShipProvider.getShip(widget.ship.symbol!); + setState(() { + ship = refreshedShip; + }); + } + + void _stopTimer() { + _timer?.cancel(); + } ElevatedButton buildActionButton(String status) { String buttonText = ''; @@ -59,7 +101,7 @@ class ShipPage extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'Name: ${ship.symbol}', + 'Name: ${ship?.symbol}', style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, @@ -67,15 +109,15 @@ class ShipPage extends StatelessWidget { ), Row( children: [ - Text('${ship.nav?.status ?? 'N/A'}'), + Text('${ship?.nav?.status ?? 'N/A'}'), SizedBox(height: 32), SizedBox(width: 32), - buildActionButton(ship.nav?.status ?? ''), + buildActionButton(ship?.nav?.status ?? ''), ], ), Row( children: [ - Text('Fuel: ${ship.fuel?.current ?? 'N/A'} / ${ship.fuel?.capacity ?? 'N/A'}'), + Text('Fuel: ${ship?.fuel?.current ?? 'N/A'} / ${ship?.fuel?.capacity ?? 'N/A'}'), SizedBox(height: 32), SizedBox(width: 32), ElevatedButton( @@ -89,8 +131,8 @@ class ShipPage extends StatelessWidget { children: [ Column( children:[ - Text('${ship.nav?.waypointSymbol ?? 'N/A'}'), - Text('${ship.nav?.route?.destination?.type ?? 'N/A'}'), + Text('${ship?.nav?.waypointSymbol ?? 'N/A'}'), + Text('${ship?.nav?.route?.destination?.type ?? 'N/A'}'), ], ), SizedBox(height: 32), @@ -123,7 +165,7 @@ class ShipPage extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - 'Cargo: ${ship.cargo?.units ?? 'N/A'} / ${ship.cargo?.capacity ?? 'N/A'}', + 'Cargo: ${ship?.cargo?.units ?? 'N/A'} / ${ship?.cargo?.capacity ?? 'N/A'}', style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, @@ -139,7 +181,7 @@ class ShipPage extends StatelessWidget { SizedBox(height: 10), Column( crossAxisAlignment: CrossAxisAlignment.start, - children: ship.cargo?.inventory?.map((item) { + children: ship?.cargo?.inventory?.map((item) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ diff --git a/lib/providers/ship_provider.dart b/lib/providers/ship_provider.dart index 9ddf28e..1db04b0 100644 --- a/lib/providers/ship_provider.dart +++ b/lib/providers/ship_provider.dart @@ -5,7 +5,7 @@ import 'package:space_traders/models/ship_model.dart'; class ShipProvider { - Future> getShips() async { + Future> listShips() async { final url = 'https://api.spacetraders.io/v2/my/ships'; final token ='eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGlmaWVyIjoiVEZBIiwidmVyc2lvbiI6InYyIiwicmVzZXRfZGF0ZSI6IjIwMjMtMDYtMDMiLCJpYXQiOjE2ODU5NTMwODksInN1YiI6ImFnZW50LXRva2VuIn0.PPGF4B1ZtgqyWXBuGiLR71aHo9XJw9cA5OxP8xxriVuje3RDjdDstP3nEt0NiXSk4yP6N15DHJqIFe9BHH2sG1yVxcYXOvXQeoYMfnfg-HzdsmCv_tZmyC7Ey0go9HiMbt0WeNyNQYgJBonA5XicmfoqAXiggI51kMAdxq-zerwQAfBvfgDLmIqb1QwD0cMEy-VugkWe-CUUQDAXdarDnFRYlqP2lVLdtBdWVArpMYYFniR-Id5FQjOCiCyrtJ5pYPs6Ih0O9Lab9JU9_lncCqrG_FllVOwyvrE2kV8ScSKpotKhfI0_qV3FL2T_z25ZBEvfad0WFqmiubiRGuo0XQ'; @@ -25,5 +25,19 @@ class ShipProvider { return fleet; } + + static Future 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']); + } }