import 'package:fbla_ui/api_logic.dart'; import 'package:fbla_ui/main.dart'; import 'package:fbla_ui/pages/create_edit_business.dart'; import 'package:fbla_ui/pages/signin_page.dart'; import 'package:fbla_ui/shared.dart'; import 'package:flutter/material.dart'; import 'package:rive/rive.dart'; import 'package:url_launcher/url_launcher.dart'; class BusinessDetail extends StatefulWidget { final int id; final String name; final JobType clickFromType; const BusinessDetail( {super.key, required this.id, required this.name, required this.clickFromType}); @override State createState() => _CreateBusinessDetailState(); } class _CreateBusinessDetailState extends State { late Future loadBusiness; @override void initState() { super.initState(); loadBusiness = fetchBusiness(widget.id); } @override Widget build(BuildContext context) { return FutureBuilder( future: loadBusiness, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { if (snapshot.hasData) { if (snapshot.data.runtimeType != String) { return Scaffold( appBar: AppBar( title: Text(snapshot.data.name), actions: _getActions(snapshot.data, widget.clickFromType), ), body: _detailBody(snapshot.data), ); } else { return Scaffold( appBar: AppBar( title: Text(widget.name), ), body: Padding( padding: const EdgeInsets.all(16.0), child: Column(children: [ Center( child: Text(snapshot.data, textAlign: TextAlign.center)), Padding( padding: const EdgeInsets.all(8.0), child: FilledButton( child: const Text('Retry'), onPressed: () { var refreshedData = fetchBusiness(widget.id); setState(() { loadBusiness = refreshedData; }); }, ), ), ]), ), ); } } } else if (snapshot.connectionState == ConnectionState.waiting) { return Scaffold( appBar: AppBar( title: Text(widget.name), ), body: Container( padding: const EdgeInsets.all(8.0), alignment: Alignment.center, child: const SizedBox( width: 75, height: 75, child: RiveAnimation.asset('assets/mdev_triangle_loading.riv'), )), ); } return Padding( padding: const EdgeInsets.all(8.0), child: Scaffold( appBar: AppBar( title: Text(widget.name), ), body: Text( '\nError: ${snapshot.error}', style: const TextStyle(fontSize: 18), textAlign: TextAlign.center, ), ), ); }); } ListView _detailBody(Business business) { return ListView( children: [ // Title, logo, desc, website Card( clipBehavior: Clip.antiAlias, child: Column( children: [ ListTile( title: Text(business.name, textAlign: TextAlign.left, style: const TextStyle( fontSize: 24, fontWeight: FontWeight.bold)), subtitle: Text( business.description, textAlign: TextAlign.left, ), leading: ClipRRect( borderRadius: BorderRadius.circular(6.0), child: Image.network('$apiAddress/logos/${business.id}', width: 48, height: 48, errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) { return getIconFromJobType(widget.clickFromType, 48, Theme.of(context).colorScheme.onSurface); }), ), ), ListTile( leading: const Icon(Icons.link), title: const Text('Website'), subtitle: Text(business.website!, style: const TextStyle(color: Colors.blue)), onTap: () { launchUrl(Uri.parse('https://${business.website}')); }, ), ], ), ), // Available positions Card( child: Padding( padding: const EdgeInsets.only(left: 16.0, top: 8.0), child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Available Postitions', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), // Container( // height: 400, // width: 300, ListView( scrollDirection: Axis.vertical, shrinkWrap: true, children: [ ListTile( title: Text('Postition 1'), leading: Icon(Icons.work), onTap: () { // launchUrl(Uri.parse('')); }, ), ListTile( title: Text('Postition 2'), leading: Icon(Icons.work), onTap: () { // launchUrl(Uri.parse('')); }, ), ListTile( title: Text('Postition 3'), leading: Icon(Icons.work), onTap: () { // launchUrl(Uri.parse('')); }, ), ], ), ]), ), ), // Contact info Visibility( visible: (business.contactEmail != null || business.contactPhone != null), child: Card( clipBehavior: Clip.antiAlias, child: Column( children: [ Row( children: [ Padding( padding: const EdgeInsets.only(left: 16.0, top: 8.0), child: Text( business.contactName ?? 'Contact ${business.name}', textAlign: TextAlign.left, style: const TextStyle( fontSize: 20, fontWeight: FontWeight.bold), ), ), ], ), Visibility( visible: business.contactPhone != null, child: ListTile( leading: Icon(Icons.phone), title: Text(business.contactPhone!), // maybe replace ! with ?? ''. same is true for below onTap: () { showDialog( context: context, builder: (BuildContext context) { return AlertDialog( backgroundColor: Theme.of(context).colorScheme.background, title: Text(business.contactName!.isEmpty ? 'Contact ${business.name}?' : 'Contact ${business.contactName}'), content: Text(business.contactName!.isEmpty ? 'Would you like to call or text ${business.name}?' : 'Would you like to call or text ${business.contactName}?'), actions: [ TextButton( child: const Text('Text'), onPressed: () { launchUrl(Uri.parse( 'sms:${business.contactPhone}')); Navigator.of(context).pop(); }), TextButton( child: const Text('Call'), onPressed: () async { launchUrl(Uri.parse( 'tel:${business.contactPhone}')); Navigator.of(context).pop(); }), ], ); }); }, ), ), Visibility( visible: business.contactEmail != null, child: ListTile( leading: const Icon(Icons.email), title: Text(business.contactEmail!), onTap: () { launchUrl(Uri.parse('mailto:${business.contactEmail}')); }, ), ), ], ), ), ), // Location Visibility( child: Card( clipBehavior: Clip.antiAlias, child: ListTile( leading: const Icon(Icons.location_on), title: Text(business.locationName!), subtitle: Text(business.locationAddress!), onTap: () { launchUrl(Uri.parse(Uri.encodeFull( 'https://www.google.com/maps/search/?api=1&query=${business.locationName}'))); }, ), ), ), // Notes Visibility( visible: business.notes != null, child: Card( child: ListTile( leading: const Icon(Icons.notes), title: const Text( 'Additional Notes:', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), subtitle: Text(business.notes!), ), ), ), ], ); } List? _getActions(Business business, JobType clickFromType) { if (loggedIn) { return [ IconButton( icon: const Icon(Icons.edit), onPressed: () { Navigator.of(context).push(MaterialPageRoute( builder: (context) => CreateEditBusiness( inputBusiness: business, clickFromType: clickFromType, ))); }, ), IconButton( icon: const Icon(Icons.delete), onPressed: () { showDialog( context: context, builder: (BuildContext context) { return AlertDialog( backgroundColor: Theme.of(context).colorScheme.background, title: const Text('Are You Sure?'), content: Text('This will permanently delete ${business.name}.'), actions: [ TextButton( child: const Text('Cancel'), onPressed: () { Navigator.of(context).pop(); }), TextButton( child: const Text('Yes'), onPressed: () async { String? deleteResult = await deleteBusiness(business.id, jwt); if (deleteResult != null) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( width: 300, behavior: SnackBarBehavior.floating, content: Text(deleteResult))); } else { Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => const MainApp())); } }), ], ); }); }, ), ]; } return null; } }