showPollingViewDialog function
Implementation
void showPollingViewDialog(BuildContext context, EnxController obj) {
showGeneralDialog(
context: context,
barrierDismissible: true, // Enable outside tap
barrierColor: Colors.black54, // Semi-transparent barrier
barrierLabel: 'Dismiss polling dialog', // Required for accessibility
transitionDuration: const Duration(milliseconds: 300),
pageBuilder: (context, animation1, animation2) {
return OrientationBuilder(
builder: (context, orientation) {
final isPortrait = orientation == Orientation.portrait;
final width = isPortrait
? MediaQuery.of(context).size.width // width in portrait
: MediaQuery.of(context).size.width * 0.5; // 50% width in landscape
final height = isPortrait
? MediaQuery.of(context).size.height // height in portrait
: MediaQuery.of(context).size.height; // Full height in landscape
return SafeArea(
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () => Get.back(),
child: SlideTransition(
position: Tween<Offset>(
begin: const Offset(1.0, 0.0), // Slide from right
end: Offset.zero,
).animate(CurvedAnimation(
parent: animation1,
curve: Curves.easeOut,
)),
child: Align(
alignment: isPortrait ? Alignment.center : Alignment.centerRight,
child: GestureDetector(
onTap: () {
// Prevent taps inside the dialog from closing it
},
child: Container(
width: width,
height: height,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: isPortrait
? BorderRadius.circular(16)
: const BorderRadius.only(
topLeft: Radius.circular(16),
bottomLeft: Radius.circular(16),
),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.2),
blurRadius: 10,
spreadRadius: 2,
)
],
),
padding: const EdgeInsets.only(
left: 8.0,
right: 8.0,
top: 16.0,
bottom: 8.0,
),
child: Column(
children: <Widget>[
// ... (rest of your existing content remains the same)
Expanded(
child: Obx(() => obj.data.isNotEmpty
? ListView.builder(
reverse: false,
itemCount: obj.data.length,
itemBuilder: (context, index) {
final reversedIndex = obj.data.length - 1 - index;
final question = obj.data.keys.elementAt(reversedIndex);
final answers = obj.data[question]!;
return Card(
child: ExpansionTile(
key: Key(reversedIndex.toString()),
title: Text(question.questionTitle),
children: answers.asMap().entries.map((entry) {
int index = entry.key;
var answer = entry.value;
bool isLastItem = index == answers.length - 1;
return Column(
children: [
ListTile(
title: Text(answer.title),
trailing: SizedBox(
width: isPortrait ? 200 : 150,
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: LinearProgressIndicator(
borderRadius: const BorderRadius.all(Radius.circular(8)),
minHeight: 20,
value: answer.percentage / 100,
backgroundColor: Colors.grey[300],
color: Colors.pink,
),
),
const SizedBox(width: 8),
Text('${answer.percentage}%'),
],
),
),
),
if (isLastItem)
Obx(() {
if (question.status == 'P') {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'All',
style: TextStyle(
fontWeight: FontWeight.w600,
fontSize: 15,
color: !obj.isAll.value ? Colors.pink : Colors.grey,
),
),
const SizedBox(width: 20),
Switch(
value: obj.isAll.value,
onChanged: (value) => obj.isAll.value = value,
activeColor: Colors.pink,
inactiveThumbColor: Colors.grey,
activeTrackColor: Colors.pink[200],
inactiveTrackColor: Colors.grey[300],
),
const SizedBox(width: 20),
Text(
'Moderator',
style: TextStyle(
color: !obj.isAll.value ? Colors.grey : Colors.pink,
fontWeight: FontWeight.w400,
fontSize: 15,
),
),
],
);
} else {
return const SizedBox.shrink();
}
}),
if (isLastItem)
SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Visibility(
visible: true,
child: Padding(
padding: const EdgeInsets.only(top: 16.0, right: 16.0),
child: ElevatedButton(
onPressed: () {
if (question.status == "I") {
obj.extendDuration(question.pollId);
} else if (question.status == "P") {
obj.publishResult(question.pollId);
} else {
obj.startPoll(question.pollId);
}
},
child: Obx(() => Text(
question.status == "I"
? "Extend 10Sec"
: question.status == "P"
? "Publish Poll"
: "Start Poll",
style: const TextStyle(color: Colors.white),
)),
style: ElevatedButton.styleFrom(
backgroundColor: Colors.pink,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15),
),
),
),
),
),
Obx(() => Visibility(
visible: question.status != "",
child: Padding(
padding: const EdgeInsets.only(top: 16.0, left: 16.0),
child: ElevatedButton(
onPressed: () {
if (question.status == "P") {
obj.repoll(question.pollId);
} else {
obj.stopPoll(question.pollId);
}
},
child: Text(
question.status == "P" ? "Repoll" : "Stop Poll",
style: const TextStyle(color: Colors.white),
),
style: ElevatedButton.styleFrom(
backgroundColor: Colors.pink,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15),
),
),
),
),
)),
],
),
),
],
);
}).toList(),
initiallyExpanded: index == 0,
onExpansionChanged: (isExpanded) => obj.toggleExpansion(index),
),
);
},
)
: const Center(
child: Text(
'No Poll Available, Please create poll',
style: TextStyle(
color: Colors.black87,
fontWeight: FontWeight.bold,
fontSize: 14
),
),
),
)),
Align(
alignment: Alignment.bottomRight,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: FloatingActionButton(
backgroundColor: Colors.pink,
onPressed: () {
Future.delayed(const Duration(milliseconds: 300), () {
showCreatePollingViewDialog(context, obj);
});
},
child: const Icon(Icons.add, color: Colors.white),
),
),
),
],
),
),
),
),
),
),
);
},
);
},
);
}