showPollingViewDialog function

void showPollingViewDialog(
  1. BuildContext context,
  2. EnxController obj
)

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),
                  ),
                ),
              ),
              ],
            ),
            ),
            ),
            ),
            ),
            ),
          );
        },
      );
    },
  );
}