Untitled

mail@pastecode.io avatar
unknown
dart
16 days ago
16 kB
2
Indexable
Never
class NotificationPage extends StatefulWidget {
  const NotificationPage(
      {Key? key,
      required this.id,
      required this.notificationTypeId,
      required this.isRead,
      this.notificationsData})
      : super(key: key);
  final String id, notificationTypeId;
  final bool isRead;

  final NotificationsData? notificationsData;

  @override
  State<NotificationPage> createState() => _NotificationPageState();
}

class _NotificationPageState extends State<NotificationPage> {
  late NotificationsNotifier notificationsNotifier;
  @override
  void initState() {
    _getData();
    super.initState();
  }

  void _getData() {
    notificationsNotifier =
        Provider.of<NotificationsNotifier>(context, listen: false);
    notificationsNotifier.executeNotificationDetails(widget.id);
  }

  @override
  void dispose() {
    // get last count of  notifications
    if (!widget.isRead) {
      widget.notificationsData?.statusId = 1;
      notificationsNotifier.executeGetNotificationsCount();
    }
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final themeNotifier = Provider.of<ThemeNotifier>(context, listen: true);
    bool isDarkTheme = (themeNotifier.getTheme() == AppThemes().darkTheme);
    notificationsNotifier =
        Provider.of<NotificationsNotifier>(context, listen: true);
    return Scaffold(
      appBar: _appBar(isDarkTheme, context, themeNotifier),
      backgroundColor: Theme.of(context).primaryColorDark,
      body: Consumer<AuthNotifier>(
        builder: (context, authProvider, child) {
          if (authProvider.user != null &&
              notificationsNotifier.notificationsEntity == null &&
              !notificationsNotifier.isNotificationsLoading) {
            notificationsNotifier.executeNotificationDetails(widget.id);
          }
          return authProvider.user == null
              ? const LoginView(
                  title: Strings.pleaseReSignIn,
                )
              : notificationsNotifier.isNotificationsLoading
                  ? const CircularProgressIndicator().center()
                  : _notificationView(context, isDarkTheme, themeNotifier);
        },
      ),
    );
  }

  Widget _notificationView(
      BuildContext context, bool isDarkTheme, ThemeNotifier themeNotifier) {
    return notificationsNotifier.notificationsEntity?.success ?? false
        ? _stackView(context, isDarkTheme, themeNotifier)
        : _errorView(notificationsNotifier);
  }

  Center _errorView(NotificationsNotifier provider) {
    return Center(
        child: Text(
      provider.notificationsEntity?.message ?? Strings.networkError,
    ));
  }

  Widget _stackView(
      BuildContext context, bool isDarkTheme, ThemeNotifier themeNotifier) {
    var data = notificationsNotifier.notificationsEntity?.data;
    _setData(data?.notificationdetailsList);

    return Stack(
      children: [
        Stack(
          children: [
            if (image != null && html == null)
              FancyShimmerImage(
                  width: double.maxFinite,
                  boxFit: BoxFit.fill,
                  height: AppSize.s160,
                  errorWidget: const Icon(
                    Icons.image_not_supported_sharp,
                    size: 60,
                  ),
                  imageUrl: image!),
            if (html == null)
              SizedBox(
                width: double.infinity,
                height: MediaQuery.of(context).size.height,
                child: Padding(
                    padding: const EdgeInsets.only(top: 140),
                    child: _detiles(isDarkTheme)),
              ),
            if (html != null) _htmlView(),
          ],
        ),
        _footer(themeNotifier, isDarkTheme)
      ],
    );
  }

  WinnersAppBar _appBar(
      bool isDarkTheme, BuildContext context, ThemeNotifier themeNotifier) {
    return WinnersAppBar(
      title: "",
      action: Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          if (widget.notificationTypeId == "1")
            Padding(
              padding: const EdgeInsets.only(top: 10),
              child: InkWell(
                onTap: () {
                  showModalBottomSheet(
                    context: context,
                    backgroundColor: themeNotifier.getTheme().primaryColorDark,
                    shape: const RoundedRectangleBorder(
                      borderRadius:
                          BorderRadius.vertical(top: Radius.circular(15)),
                    ),
                    builder: (context) {
                      return _actions(isDarkTheme, widget.id);
                    },
                  );
                },
                child: const Icon(
                  Icons.more_horiz,
                  size: 30,
                ).padding(
                    padding: const EdgeInsets.only(
                        top: AppPadding.p6,
                        right: AppPadding.p6,
                        left: AppPadding.p6,
                        bottom: 63)),
              ),
            )
        ],
      ),
    );
  }

  Widget _detiles(bool isDarkTheme) {
    return Container(
      decoration: BoxDecoration(
        borderRadius: const BorderRadius.only(
          topLeft: Radius.circular(30.0),
          topRight: Radius.circular(30.0),
        ),
        color: isDarkTheme
            ? const Color(0xFF14213C).withOpacity(1)
            : Theme.of(context).primaryColor,
      ),
      child: SingleChildScrollView(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            const SizedBox(
              height: AppSize.s12,
            ),
            if (title != null)
              Text(
                title!,
                style: Theme.of(context)
                    .textTheme
                    .titleLarge!
                    .copyWith(color: isDarkTheme ? null : Colors.black),
              ).padding(
                  padding: const EdgeInsets.only(
                      right: AppPadding.p12,
                      left: AppPadding.p12,
                      top: AppPadding.p8,
                      bottom: AppPadding.p8)),
            if (desc != null)
              Text(
                desc!.replaceAll('/n', '\n'),
              ).padding(
                  padding: const EdgeInsets.only(
                      right: AppPadding.p12,
                      left: AppPadding.p12,
                      top: AppPadding.p8,
                      bottom: AppPadding.p20)),
          ],
        ),
      ),
    );
  }

  Widget _footer(
    ThemeNotifier themeNotifier,
    bool isDarkTheme,
  ) {
    bool isAction = actions.isNotEmpty;
    return Align(
      alignment: Alignment.bottomCenter,
      child: Container(
        height: isAction
            ? jackpotAmount != null
                ? AppSize.s260
                : AppSize.s110
            : AppSize.s160,
        width: double.infinity,
        decoration: isAction
            ? BoxDecoration(
                color: isDarkTheme
                    ? const Color(0xFF14213C).withOpacity(1)
                    : Theme.of(context).primaryColor,
              )
            : null,
        child: Column(
          children: [_jackpotView(), if (isAction) _actionsList(themeNotifier)],
        ),
      ),
    );
  }

  Column _jackpotView() {
    return Column(
      children: [
        if (jackpotDesc != null)
          Text(
            jackpotDesc!,
            style: GoogleFonts.poppins(
                textStyle: getMediumStyle(
                    color: jackpotColor == null
                        ? ColorManager.accentColor
                        : HexColor(jackpotColor!.trim()),
                    fontSize: FontSize.s17)),
          ),
        if (jackpotImg != null)
          Padding(
            padding:
                const EdgeInsets.only(right: 15, left: 15, bottom: 10, top: 9),
            child: Stack(
              alignment: Alignment.center,
              children: [
                FancyShimmerImage(
                  imageUrl: jackpotImg!,
                  height: 90,
                  width: MediaQuery.of(context).size.width,
                  errorWidget: Image.asset(
                    Assets.shape,
                    height: 90,
                    fit: BoxFit.fill,
                  ),
                ),
                Center(
                  child: Text(
                    jackpotAmount ?? '',
                    style: Theme.of(context)
                        .textTheme
                        .titleLarge!
                        .copyWith(fontSize: 20, color: Colors.white),
                  ),
                ),
              ],
            ),
          )
      ],
    );
  }

  Column _actionsList(ThemeNotifier themeNotifier) {
    return Column(children: [
      const Divider(
        thickness: 0.8,
        height: 0.10,
      ).padding(padding: const EdgeInsets.only(bottom: AppPadding.p6)),
      Padding(
        padding: const EdgeInsets.only(top: AppPadding.p12),
        child: SizedBox(
            height: 60,
            child: ListView.builder(
              scrollDirection: Axis.horizontal,
              itemBuilder: (context, index) {
                return Padding(
                  padding: const EdgeInsets.only(
                      top: AppPadding.p4,
                      right: AppPadding.p12,
                      left: AppPadding.p12),
                  child: InkWell(
                    onTap: () {
                      if (actions[index].notificationTemplateActionId == 1) {
                        NotificationsActions().onTap(notificationsNotifier
                                .notificationsEntity?.data?.filters ??
                            {});
                      } else if (actions[index].notificationTemplateActionId ==
                          2) {
                        Navigator.of(context).pop();
                      }
                    },
                    child: Container(
                      constraints: const BoxConstraints(
                        maxWidth: 180,
                      ),
                      height: 55,
                      margin: EdgeInsets.only(
                          right: 12,
                          left: actions.length == 1
                              ? MediaQuery.of(context).size.width / 4
                              : 0),
                      decoration: BoxDecoration(
                          color: themeNotifier.getTheme().colorScheme.secondary,
                          borderRadius: BorderRadius.circular(30)),
                      padding: const EdgeInsets.symmetric(
                          vertical: AppPadding.p16, horizontal: AppPadding.p20),
                      child: Text(
                        actions[index].notificationTemplateTypeValue!,
                        style: GoogleFonts.poppins(
                            textStyle: getMediumStyle(
                                color: ColorManager.white,
                                fontSize: FontSize.s17)),
                      ).center(),
                    ),
                  ),
                );
              },
              itemCount: actions.length,
            )),
      )
    ]);
  }

  Consumer<NotificationsNotifier> _actions(bool isDarkTheme, String id) {
    return Consumer<NotificationsNotifier>(
      builder: (context, provider, child) {
        return SizedBox(
            height: AppSize.s120,
            child: provider.deleteIsLoading
                ? const Center(child: CircularProgressIndicator())
                : Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: [
                      const Icon(
                        Icons.remove_outlined,
                        size: 55,
                        color: Colors.grey,
                      ),
                      TextButton.icon(
                          onPressed: () async {
                            provider
                                .executeDeleteNotification(id)
                                .whenComplete(() {
                              Navigator.of(context).pop();
                              if (provider.deleteEntity?.success ?? false) {
                                provider.executeGetNotifications(true);
                                Navigator.of(context).pop();
                              } else {
                                _showAlert(
                                    '',
                                    provider.deleteEntity?.message ??
                                        Strings.errorMessage);
                              }
                            });
                          },
                          icon: SvgPicture.asset(
                            Assets.delete,
                            width: 20,
                            color: !isDarkTheme ? Colors.black : null,
                          ),
                          label: const Text(
                            Strings.delete,
                          ),
                          style: TextButton.styleFrom(
                            foregroundColor: !isDarkTheme
                                ? Colors.black
                                : Colors.white, // Text Color
                          )).padding(padding: const EdgeInsets.only(bottom: 15))
                    ],
                  ));
      },
    );
  }

  void _showAlert(String tilte, String body) {
    var baseDialog = BaseAlertDialog(
      title: tilte,
      content: body,
      yesOnPressed: () {
        Navigator.of(context).pop();
      },
      yes: Strings.ok,
    );

    showDialog(
        context: context,
        barrierDismissible: false,
        builder: (BuildContext context) => baseDialog);
  }

  String? title,
      desc,
      image,
      jackpotDesc,
      jackpotColor,
      jackpotImg,
      jackpotAmount,
      html;
  List<NotificationDetailsList> actions = [];

  void _setData(List<NotificationDetailsList>? data) {
    actions = data!
        .where(
          (element) => element.notificationStructureTypeId == 6,
        )
        .toList();
    image = data.firstWhere(
        (element) => element.notificationStructureTypeId == 1, orElse: () {
      return const NotificationDetailsList();
    }).notificationTemplateTypeValue;
    title = data.firstWhere(
        (element) => element.notificationStructureTypeId == 2, orElse: () {
      return const NotificationDetailsList();
    }).notificationTemplateTypeValue;
    desc = data.firstWhere(
        (element) => element.notificationStructureTypeId == 3, orElse: () {
      return const NotificationDetailsList();
    }).notificationTemplateTypeValue;
    jackpotDesc = data.firstWhere(
        (element) => element.notificationStructureTypeId == 8, orElse: () {
      return const NotificationDetailsList();
    }).notificationTemplateTypeValue;
    jackpotColor = data.firstWhere(
        (element) => element.notificationStructureTypeId == 8, orElse: () {
      return const NotificationDetailsList();
    }).notificationTemplateTypeColor;
    jackpotImg = data.firstWhere(
        (element) => element.notificationStructureTypeId == 9, orElse: () {
      return const NotificationDetailsList();
    }).notificationTemplateTypeValue;
    jackpotAmount = data.firstWhere(
        (element) => element.notificationStructureTypeId == 7, orElse: () {
      return const NotificationDetailsList();
    }).notificationTemplateTypeValue;
    html = data.firstWhere(
        (element) => element.notificationStructureTypeId == 5, orElse: () {
      return const NotificationDetailsList();
    }).notificationTemplateTypeValue;
  }

  Widget _htmlView() {
    return SizedBox(
        width: double.infinity,
        height: MediaQuery.of(context).size.height,
        child: InAppWebView(initialData: InAppWebViewInitialData(data: html!)));
  }
}
Leave a Comment