import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:onufitness/constants/color_constant.dart'; import 'package:onufitness/constants/text_constant.dart'; import 'package:onufitness/routes/route_constant.dart'; import 'package:onufitness/screens/echoboard/controllers/poll_controller.dart'; import 'package:onufitness/screens/echoboard/controllers/echoboard_controller.dart'; import 'package:onufitness/widgets/appbars/custom_appbar.dart'; import 'package:onufitness/widgets/Buttons/custom_submit_button.dart'; class PollCreationView extends StatelessWidget { int tribeID; PollCreationView({super.key, this.tribeID = 0}); @override Widget build(BuildContext context) { final controller = Get.find(); final echoBoardController = Get.find(); return Scaffold( appBar: CustomAppBar( title: tribeID != 0 ? "Create Tribe Poll" : "Create Poll", leading: IconButton( onPressed: () { Get.back(); }, icon: Icon(Icons.arrow_back_ios), ), textColor: appbarTextColor, titleFontSize: appBarHeardingText, backgroundColor: Colors.white, ), body: Obx(() { return SingleChildScrollView( padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 15.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Question input questionSection(controller), SizedBox(height: 15.h), // Poll options optionsSection(controller), SizedBox(height: 15.h), // Visibility selector tribeID == 0 ? visibilitySection(controller) : SizedBox.shrink(), SizedBox(height: 20.h), // Create Poll Button CustomSubmitButton( backgroundColor: Color(primaryColor), textColor: Colors.black, isLoading: controller.isLoading.value, fontWeight: FontWeight.bold, fontSize: mediumSizeText, text: "Create and Post", onPressed: () async { await controller .createPoll(tribeIdForTribeEchoboard: tribeID) .then((value) async { if (value) { //................ if (tribeID != 0) { // For tribe echoboard echoBoardController.fetchPosts( tribeId: tribeID, refresh: true, ); await Future.delayed(const Duration(seconds: 1)); Get.back(); Get.back(); } if (tribeID == 0) { echoBoardController.refreshPosts(); await Future.delayed(const Duration(seconds: 1)); Get.back(); Get.back(); } } }); }, ), SizedBox(height: 10.h), Container( color: Colors.white, padding: EdgeInsetsDirectional.only( bottom: MediaQuery.of(context).viewPadding.bottom, ), ), ], ), ); }), ); } Widget questionSection(PollController controller) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Ask a question', style: TextStyle( fontSize: mediumSizeText, fontWeight: FontWeight.bold, ), ), SizedBox(height: 8.h), TextFormField( controller: controller.questionController, style: TextStyle(fontSize: regularSizeText), maxLines: 3, minLines: 1, decoration: InputDecoration( hintText: 'Ask something...', hintStyle: TextStyle(fontSize: regularSizeText, color: Colors.grey), filled: true, fillColor: Colors.grey.shade100, border: OutlineInputBorder( borderRadius: BorderRadius.circular(12.r), borderSide: BorderSide.none, ), contentPadding: EdgeInsets.all(16.r), ), ), ], ); } Widget optionsSection(PollController controller) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( 'Poll Options', style: TextStyle( fontSize: mediumSizeText, fontWeight: FontWeight.bold, ), ), Obx( () => controller.optionControllers.length < 5 ? TextButton.icon( onPressed: controller.addOptionField, icon: Icon(Icons.add_circle_outline, size: 18.r), label: Text( 'Add Option', style: TextStyle(fontSize: smallSizeText), ), ) : const SizedBox.shrink(), ), ], ), SizedBox(height: 12.h), // Option fields Obx( () => ListView.separated( physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, itemCount: controller.optionControllers.length, separatorBuilder: (context, index) => SizedBox(height: 12.h), itemBuilder: (context, index) { return PollOptionField( controller: controller.optionControllers[index], index: index, canRemove: controller.optionControllers.length > 2, onRemove: () => controller.removeOptionField(index), ); }, ), ), ], ); } Widget visibilitySection(PollController controller) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Who can see your poll?', style: TextStyle( fontSize: mediumSizeText, fontWeight: FontWeight.bold, ), ), SizedBox(height: 12.h), Container( decoration: BoxDecoration(color: Colors.white), child: Column( children: controller.visibilityOptions.map((option) { final bool isSelected = controller.postVisibilityID.value == option['id']; return InkWell( onTap: () { controller.setVisibility(option['id']); if (controller.postVisibilityID.value == 3) { Get.toNamed( RouteConstant.exclusiveConnectionSelectionScreen, ); } }, child: Container( color: isSelected ? Colors.grey.shade200 : Colors.transparent, padding: const EdgeInsets.symmetric(vertical: 12.0), child: Row( children: [ const SizedBox(width: 16), CircleAvatar( backgroundColor: textFieldFillColor, radius: 28, child: Icon( option['icon'], color: Colors.black, size: 24, ), ), const SizedBox(width: 16), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( option['name'], style: const TextStyle( fontSize: 16, fontWeight: FontWeight.w600, color: Colors.black, ), ), const SizedBox(height: 4), Text( option['description'], style: TextStyle( fontSize: 14, color: greyTextColor1, ), ), ], ), ), Padding( padding: const EdgeInsets.only(right: 16), child: option['id'] == 3 ? const Icon( Icons.chevron_right, color: greyTextColor1, ) : Icon( isSelected ? Icons.radio_button_checked : Icons.radio_button_unchecked, color: Colors.grey.shade700, ), ), ], ), ), ); }).toList(), ), ), ], ); } } class PollOptionField extends StatelessWidget { final TextEditingController controller; final int index; final bool canRemove; final VoidCallback onRemove; const PollOptionField({ super.key, required this.controller, required this.index, required this.canRemove, required this.onRemove, }); @override Widget build(BuildContext context) { return Row( children: [ Container( width: 36.r, height: 36.r, alignment: Alignment.center, decoration: BoxDecoration( color: _getOptionColor(index), shape: BoxShape.circle, ), child: Text( String.fromCharCode(65 + index), // A, B, C, etc. style: TextStyle( color: Colors.white, fontWeight: FontWeight.bold, fontSize: mediumSizeText, ), ), ), SizedBox(width: 12.w), Expanded( child: TextFormField( controller: controller, style: TextStyle(fontSize: regularSizeText), decoration: InputDecoration( hintText: 'Option ${index + 1}', hintStyle: TextStyle( fontSize: regularSizeText, color: Colors.grey, ), filled: true, fillColor: Colors.grey.shade100, border: OutlineInputBorder( borderRadius: BorderRadius.circular(12.r), borderSide: BorderSide.none, ), contentPadding: EdgeInsets.symmetric( horizontal: 16.w, vertical: 12.h, ), ), ), ), if (canRemove) ...[ SizedBox(width: 8.w), IconButton( onPressed: onRemove, icon: Icon(Icons.close, color: Colors.grey, size: 20.r), padding: EdgeInsets.zero, constraints: BoxConstraints(minWidth: 32.r, minHeight: 32.r), ), ], ], ); } // Color _getOptionColor(int index) { // final List colors = [ // Get.theme.primaryColor, // Color.fromRGBO(186, 211, 0, 1), // Color.fromRGBO(175, 182, 165, 1), // Color.fromRGBO(152, 152, 152, 1), // Color.fromRGBO(110, 108, 127, 1), // ]; // return colors[index % colors.length]; // } Color _getOptionColor(int index) { final List colors = [ Get.theme.primaryColor, Colors.orange, Colors.green, Colors.purple, Colors.teal, ]; return colors[index % colors.length]; } }