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:url_launcher/url_launcher.dart'; class BusinessDetail extends StatefulWidget { final Business inputBusiness; const BusinessDetail({super.key, required this.inputBusiness}); @override State createState() => _CreateBusinessDetailState(); } class _CreateBusinessDetailState extends State { @override Widget build(BuildContext context) { Business business = Business.copy(widget.inputBusiness); return Scaffold( appBar: AppBar( title: Text(business.name), actions: _getActions(business), ), body: 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 getIconFromType(business.type, 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: [ Text( 'Available Postitions', style: const 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.isNotEmpty || business.contactPhone.isNotEmpty), 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.isEmpty ? 'Contact ${business.name}' : business.contactName, textAlign: TextAlign.left, style: const TextStyle( fontSize: 20, fontWeight: FontWeight.bold), ), ), ], ), Visibility( visible: business.contactPhone.isNotEmpty, child: ListTile( leading: Icon(Icons.phone), title: Text(business.contactPhone), 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.isNotEmpty, 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.isNotEmpty, 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) { if (loggedIn) { return [ IconButton( icon: const Icon(Icons.edit), onPressed: () { Navigator.of(context).push(MaterialPageRoute( builder: (context) => CreateEditBusiness(inputBusiness: business))); }, ), 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, 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; } }