// Label StoreMAX // // Created by Anthony Gordon. // 2020, WooSignal Ltd. All rights reserved. // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. import 'package:bubble_tab_indicator/bubble_tab_indicator.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:label_storemax/helpers/shared_pref/sp_auth.dart'; import 'package:label_storemax/helpers/shared_pref/sp_user_id.dart'; import 'package:label_storemax/helpers/tools.dart'; import 'package:label_storemax/widgets/app_loader.dart'; import 'package:label_storemax/widgets/woosignal_ui.dart'; import 'package:woosignal/models/response/order.dart'; import 'package:wp_json_api/models/responses/WCCustomerInfoResponse.dart'; import 'package:wp_json_api/wp_json_api.dart'; class AccountDetailPage extends StatefulWidget { @override _AccountDetailPageState createState() => _AccountDetailPageState(); } class _AccountDetailPageState extends State with SingleTickerProviderStateMixin { int _page; List _orders; WCCustomerInfoResponse _wcCustomerInfoResponse; bool _isLoading; bool _isLoadingOrders; int _currentTabIndex = 0; Widget _activeBody; TabController _tabController; List _tabs = []; @override void initState() { super.initState(); _isLoading = true; _isLoadingOrders = true; _page = 1; _orders = []; _tabs = [ new Tab(text: "Orders"), new Tab(text: "Settings"), ]; _tabController = TabController(vsync: this, length: _tabs.length); _activeBody = showAppLoader(); _fetchWpUserData(); _fetchOrders(); } _fetchWpUserData() async { WCCustomerInfoResponse wcCustomerInfoResponse = await WPJsonAPI.instance.api((request) async { return request.wcCustomerInfo(await readAuthToken()); }); if (wcCustomerInfoResponse != null) { _wcCustomerInfoResponse = wcCustomerInfoResponse; } setState(() { _isLoading = false; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Colors.transparent, leading: Container( child: IconButton( icon: Icon(Icons.arrow_back_ios), onPressed: () => Navigator.pop(context), ), margin: EdgeInsets.only(left: 0), ), title: Text( trans(context, "Account"), style: Theme.of(context).primaryTextTheme.headline6, ), centerTitle: true, ), resizeToAvoidBottomPadding: false, body: SafeArea( minimum: safeAreaDefault(), child: _isLoading ? showAppLoader() : Column( children: [ Container( margin: EdgeInsets.only(top: 10, bottom: 10), padding: EdgeInsets.symmetric(horizontal: 16), child: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.start, children: [ Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Container( margin: EdgeInsets.only(top: 10), child: CircleAvatar( backgroundImage: NetworkImage( _wcCustomerInfoResponse.data.avatar, ), ), height: 90, width: 90, ), Expanded( child: Padding( child: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.start, children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Text( (_wcCustomerInfoResponse == null ? "" : [ _wcCustomerInfoResponse .data.firstName, _wcCustomerInfoResponse .data.lastName ] .where((t) => (t != null || t != "")) .toList() .join(" ")), style: TextStyle( fontSize: 20, fontWeight: FontWeight.w600, ), ), ], ) ], ), padding: EdgeInsets.only(left: 16), ), ), ], ), Padding( child: TabBar( tabs: _tabs, controller: _tabController, indicatorSize: TabBarIndicatorSize.tab, labelColor: Colors.white, unselectedLabelColor: Colors.black87, indicator: new BubbleTabIndicator( indicatorHeight: 25.0, indicatorColor: Colors.black87, tabBarIndicatorSize: TabBarIndicatorSize.tab, ), onTap: _tabsTapped, ), padding: EdgeInsets.symmetric(vertical: 8), ), ], ), decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), boxShadow: wsBoxShadow(), color: Colors.white, ), ), Expanded(child: _activeBody), ], ), ), ); } @override void dispose() { _tabController.dispose(); super.dispose(); } _tabsTapped(int i) { _currentTabIndex = i; setState(() { if (_currentTabIndex == 0) { _activeBody = _widgetOrders(); } else { _activeBody = _widgetSettings(); } }); } ListView _widgetSettings() { return ListView( children: [ Card( child: ListTile( leading: Icon(Icons.account_circle), title: Text(trans(context, "Update details")), onTap: () => Navigator.pushNamed(context, "/account-update").then((onValue) { setState(() { _isLoading = true; }); _fetchWpUserData(); }), ), ), Card( child: ListTile( leading: Icon(Icons.local_shipping), title: Text(trans(context, "Shipping Details")), onTap: () => Navigator.pushNamed(context, "/account-shipping-details"), ), ), Card( child: ListTile( leading: Icon(Icons.credit_card), title: Text(trans(context, "Billing Details")), onTap: () => Navigator.pushNamed(context, "/account-billing-details"), ), ), Card( child: ListTile( leading: Icon(Icons.exit_to_app), title: Text(trans(context, "Logout")), onTap: () => authLogout(context), ), ), ], ); } _fetchOrders() async { String userId = await readUserId(); if (userId == null) { setState(() { _isLoadingOrders = false; _activeBody = _widgetOrders(); }); return; } _orders = await appWooSignal((api) { return api.getOrders( customer: int.parse(userId), page: _page, perPage: 100); }); setState(() { _isLoadingOrders = false; _activeBody = _widgetOrders(); }); } Widget _widgetOrders() { return _isLoadingOrders ? showAppLoader() : _orders.length <= 0 ? Center( child: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( Icons.shopping_cart, color: Colors.black54, size: 40, ), Text( trans(context, "No orders found"), ), ], ), ) : ListView.builder( itemBuilder: (cxt, i) { return Card( child: ListTile( contentPadding: EdgeInsets.only(top: 5, bottom: 5, left: 8, right: 6), title: Container( decoration: BoxDecoration( border: Border( bottom: BorderSide( color: HexColor("#fcfcfc"), width: 1, ), ), ), child: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "#" + _orders[i].id.toString(), maxLines: 1, overflow: TextOverflow.ellipsis, ), Text( capitalize(_orders[i].status), maxLines: 1, overflow: TextOverflow.ellipsis, ), ], ), ), subtitle: Padding( padding: const EdgeInsets.only(top: 10), child: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ Text( formatStringCurrency(total: _orders[i].total), style: Theme.of(context) .primaryTextTheme .bodyText2 .copyWith( fontWeight: FontWeight.w600, color: Colors.black), textAlign: TextAlign.left, ), Text( _orders[i].lineItems.length.toString() + " " + trans(context, "items"), style: Theme.of(context) .primaryTextTheme .bodyText1 .copyWith( fontWeight: FontWeight.w600, color: Colors.black), textAlign: TextAlign.left, ), ], ), Text( dateFormatted( date: _orders[i].dateCreated, formatType: formatForDateTime(FormatType.Date), ) + "\n" + dateFormatted( date: _orders[i].dateCreated, formatType: formatForDateTime(FormatType.Time), ), textAlign: TextAlign.right, style: Theme.of(context) .primaryTextTheme .bodyText1 .copyWith( fontWeight: FontWeight.w400, color: Colors.black), ), ], ), ), trailing: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon(Icons.chevron_right), ], ), onTap: () { int orderId = _orders[i].id; Navigator.pushNamed(context, "/account-order-detail", arguments: orderId); }, ), ); }, itemCount: _orders.length, ); } }