import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:on_field_work/controller/layout/layout_controller.dart'; import 'package:on_field_work/helpers/widgets/my_responsive.dart'; import 'package:on_field_work/helpers/widgets/my_text.dart'; import 'package:on_field_work/helpers/services/storage/local_storage.dart'; import 'package:on_field_work/model/employees/employee_info.dart'; import 'package:on_field_work/helpers/services/api_endpoints.dart'; import 'package:on_field_work/images.dart'; import 'package:on_field_work/view/layouts/user_profile_right_bar.dart'; import 'package:on_field_work/helpers/services/tenant_service.dart'; class Layout extends StatefulWidget { final Widget? child; final Widget? floatingActionButton; const Layout({super.key, this.child, this.floatingActionButton}); @override State createState() => _LayoutState(); } class _LayoutState extends State { final LayoutController controller = LayoutController(); final EmployeeInfo? employeeInfo = LocalStorage.getEmployeeInfo(); final bool isBetaEnvironment = ApiEndpoints.baseUrl.contains("stage"); bool hasMpin = true; @override void initState() { super.initState(); _checkMpinStatus(); } Future _checkMpinStatus() async { final bool mpinStatus = await LocalStorage.getIsMpin(); if (mounted) { setState(() { hasMpin = mpinStatus; }); } } @override Widget build(BuildContext context) { return MyResponsive(builder: (context, _, screenMT) { return GetBuilder( init: controller, builder: (_) { return (screenMT.isMobile || screenMT.isTablet) ? _buildScaffold(context, isMobile: true) : _buildScaffold(context); }, ); }); } Widget _buildScaffold(BuildContext context, {bool isMobile = false}) { return Scaffold( key: controller.scaffoldKey, endDrawer: const UserProfileBar(), floatingActionButton: widget.floatingActionButton, body: SafeArea( child: GestureDetector( behavior: HitTestBehavior.translucent, onTap: () {}, child: Column( children: [ _buildHeader(context, isMobile), Expanded( child: SingleChildScrollView( key: controller.scrollKey, // Removed redundant vertical padding here. DashboardScreen's // SingleChildScrollView now handles all internal padding. padding: EdgeInsets.symmetric(horizontal: 0, vertical: 0), child: widget.child, ), ), ], ), ), ), ); } /// Header Section (Project selection removed) Widget _buildHeader(BuildContext context, bool isMobile) { final selectedTenant = TenantService.currentTenant; return Padding( padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 0), child: Card( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5), ), margin: EdgeInsets.zero, clipBehavior: Clip.antiAlias, child: Padding( padding: const EdgeInsets.all(10), child: Row( children: [ ClipRRect( child: Stack( clipBehavior: Clip.none, children: [ Image.asset( Images.logoDark, height: 50, width: 50, fit: BoxFit.contain, ), if (isBetaEnvironment) Positioned( bottom: 0, left: 0, child: Container( padding: const EdgeInsets.symmetric( horizontal: 4, vertical: 2), decoration: BoxDecoration( color: Colors.deepPurple, borderRadius: BorderRadius.circular(6), border: Border.all(color: Colors.white, width: 1.2), ), child: const Text( 'B', style: TextStyle( fontSize: 10, fontWeight: FontWeight.bold, color: Colors.white, ), ), ), ), ], ), ), const SizedBox(width: 12), /// Dashboard title + current organization Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ MyText.bodyLarge( "Dashboard", fontWeight: 700, maxLines: 1, overflow: TextOverflow.ellipsis, ), // MyText.bodyMedium( // "Hi, ${employeeInfo?.firstName ?? ''}", // color: Colors.black54, // ), if (selectedTenant != null) MyText.bodySmall( "Organization: ${selectedTenant.name}", color: Colors.black54, maxLines: 1, overflow: TextOverflow.ellipsis, ), ], ), ), /// Menu Button Stack( clipBehavior: Clip.none, alignment: Alignment.center, children: [ IconButton( icon: const Icon(Icons.menu), onPressed: () => controller.scaffoldKey.currentState?.openEndDrawer(), ), if (!hasMpin) Positioned( right: 10, top: 10, child: Container( width: 14, height: 14, decoration: BoxDecoration( color: Colors.redAccent, shape: BoxShape.circle, border: Border.all(color: Colors.white, width: 2), ), ), ), ], ) ], ), ), ), ); } }