BookInfoTab

mail@pastecode.io avatar
unknown
dart
2 years ago
27 kB
1
Indexable
Never
import 'package:base_architecture/core/extensions/widget_extensions.dart';
import 'package:base_architecture/data_layer/models/api_models/Dto/categories_selections.dart';
import 'package:base_architecture/data_layer/models/api_models/book_details_model.dart';
import 'package:base_architecture/data_layer/models/api_models/categories_model.dart';
import 'package:base_architecture/presentation/notifiers/bottom_nav_bar_notifier.dart/bottom_nav_bar_notifier.dart';
import 'package:base_architecture/presentation/notifiers/categories_notifier/categories_notifier.dart';
import 'package:base_architecture/presentation/notifiers/theme_notifier.dart';
import 'package:base_architecture/presentation/pages/more_category_page/more_category_page.dart';
import 'package:base_architecture/presentation/pages/following_page/pages_widgets/integrated_following_details_page.dart';
import 'package:base_architecture/presentation/pages/more_category_page/tags_more_category_page.dart';
import 'package:base_architecture/presentation/pages/notifications/widgets/more_text_widget.dart';
import 'package:base_architecture/presentation/props/book_info_props.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class BookInfoTab extends StatelessWidget {
  const BookInfoTab({
    Key? key,
    required this.selectedIndex,
    required this.props,
  }) : super(key: key);

  final int selectedIndex;
  final BookInfoProps props;

  @override
  Widget build(BuildContext context) {
    Size mediaQuery = MediaQuery.of(context).size;
    final ThemeNotifier themeNotifier = Provider.of<ThemeNotifier>(
      context,
      listen: true,
    );
    final BottomNavBarNotifier bottomNavNotifier =
        Provider.of<BottomNavBarNotifier>(
      context,
      listen: false,
    );
    final CategoriesNotifier categoriesNotifier =
        Provider.of<CategoriesNotifier>(
      context,
      listen: false,
    );
    final Data book = props.bookInfo.data!.first;
    bool language = context.locale == const Locale('en');
    int readerId = book.readers!.first.id!;
    int translatorId = book.translators!.first.id!;
    int publisherId = book.publishers!.first.id!;
    int categoryId = book.category!.id!;
    int subCategoryId = book.subcategory!.id!;
    int subSubCategoryId = book.subSubcategory!.id!;
    String categoryName = language
        ? book.category!.nameEn! +
            ' ' +
            book.subcategory!.nameEn! +
            ' ' +
            book.subSubcategory!.nameEn!
        : book.category!.nameAr! +
            ', ' +
            book.subcategory!.nameAr! +
            ', ' +
            book.subSubcategory!.nameAr!;
    String? bookTag =
        language ? book.tags!.first.nameEn! : book.tags!.first.nameAr!;
    String readerName = language
        ? book.readers!.first.fullNameDecode!.first.firstNameEn! +
            ' ' +
            book.readers!.first.fullNameDecode!.last.lastNameEn!
        : book.readers!.first.fullNameDecode!.first.firstNameAr! +
            ' ' +
            book.readers!.first.fullNameDecode!.last.lastNameAr!;
    String publisherName = language
        ? book.publishers!.first.fullNameDecode!.first.firstNameEn! +
            ' ' +
            book.publishers!.first.fullNameDecode!.last.lastNameEn!
        : book.publishers!.first.fullNameDecode!.first.firstNameAr! +
            ' ' +
            book.publishers!.first.fullNameDecode!.last.lastNameAr!;
    String translatorName = language
        ? book.translators!.first.fullNameDecode!.first.firstNameEn! +
            ' ' +
            book.translators!.first.fullNameDecode!.last.lastNameEn!
        : book.translators!.first.fullNameDecode!.first.firstNameAr! +
            ' ' +
            book.translators!.first.fullNameDecode!.last.lastNameAr!;
    return Visibility(
      child: Container(
        width: mediaQuery.width,
        padding: const EdgeInsets.only(top: 20),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Visibility(
              visible: !book.readers!.isEmpty,
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Container(
                    child: Text(
                      'reader'.tr() + '  ',
                      style: themeNotifier
                          .getTheme()
                          .textTheme
                          .headline2!
                          .copyWith(
                            fontSize: 16,
                            color: Colors.grey,
                          ),
                    ),
                  ),
                  Expanded(
                    child: ListView.builder(
                      physics: const NeverScrollableScrollPhysics(),
                      shrinkWrap: true,
                      itemCount: book.readers!.length,
                      itemBuilder: (BuildContext context, int indexPath) =>
                          InkWell(
                        child: Text(
                          language
                              ? book.readers![indexPath].fullNameDecode!.first
                                      .firstNameEn! +
                                  ' ' +
                                  book.readers![indexPath].fullNameDecode!.last
                                      .lastNameEn! +
                                  ','
                              : book.readers![indexPath].fullNameDecode!.first
                                      .firstNameAr! +
                                  ' ' +
                                  book.readers![indexPath].fullNameDecode!.last
                                      .lastNameAr! +
                                  ',',
                          style: themeNotifier
                              .getTheme()
                              .textTheme
                              .bodyText1!
                              .copyWith(
                                fontSize: 16,
                                color: themeNotifier.getTheme().canvasColor,
                                decoration: TextDecoration.underline,
                                decorationThickness: 1,
                                decorationColor:
                                    themeNotifier.getTheme().canvasColor,
                              ),
                        ),
                        onTap: () async {
                          CategoriesSelections lastSelections =
                              CategoriesSelections(
                            type: categoriesNotifier.selections.type!,
                            id: categoriesNotifier.selections.id,
                            keyword: categoriesNotifier.selections.keyword,
                          );
                          await categoriesNotifier.setLastSelections(
                            lastSelections,
                          );
                          print(categoriesNotifier.lastSelectionType);
                          categoriesNotifier.selections.id =
                              book.readers![indexPath].id!;

                          categoriesNotifier.selections.type = 'readers';
                          categoriesNotifier.resetPageIndex();
                          categoriesNotifier.categories.clear();
                          await categoriesNotifier.getAllCategories(
                            categoriesNotifier.selections,
                          );

                          await Navigator.of(context).push(
                            MaterialPageRoute(
                              builder: (BuildContext context) =>
                                  IntegratedFollowingDetailsPage(
                                contributor: categoriesNotifier.contributor ??
                                    ContributorCategories(),
                                contributorBooks:
                                    categoriesNotifier.subcategoriesBooks,
                                backToContributor: false,
                              ),
                            ),
                          );
                        },
                      ),
                    ),
                  )
                ],
              ),
            ),
            Visibility(
              visible: !book.readers!.isEmpty,
              child: const Divider(
                color: Colors.grey,
              ).padding(padding: const EdgeInsets.symmetric(vertical: 3)),
            ),
            Visibility(
              visible: book.isbn != null,
              child: Row(
                children: <Widget>[
                  Text(
                    'International ISBN'.tr() + ' ',
                    style:
                        themeNotifier.getTheme().textTheme.headline2!.copyWith(
                              fontSize: 16,
                              color: Colors.grey,
                            ),
                  ),
                  Text(
                    book.isbn!,
                    overflow: TextOverflow.ellipsis,
                    style:
                        themeNotifier.getTheme().textTheme.headline2!.copyWith(
                              fontSize: 16,
                              color: Colors.grey,
                            ),
                  ),
                ],
              ),
            ),
            Visibility(
              visible: book.isbn != null,
              child: const Divider(
                color: Colors.grey,
              ).padding(padding: const EdgeInsets.symmetric(vertical: 3)),
            ),
            Visibility(
              visible: !book.translators!.isEmpty,
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Container(
                    child: Text(
                      'translator'.tr() + '  ',
                      style: themeNotifier
                          .getTheme()
                          .textTheme
                          .headline2!
                          .copyWith(
                            fontSize: 16,
                            color: Colors.grey,
                          ),
                    ),
                  ),
                  Expanded(
                    child: ListView.builder(
                      shrinkWrap: true,
                      physics: const NeverScrollableScrollPhysics(),
                      itemCount: book.translators!.length,
                      itemBuilder: (BuildContext context, int indexPath) =>
                          InkWell(
                        child: Text(
                          language
                              ? book.translators![indexPath].fullNameDecode!
                                      .first.firstNameEn! +
                                  ' ' +
                                  book.translators![indexPath].fullNameDecode!
                                      .last.lastNameEn! +
                                  ','
                              : book.translators![indexPath].fullNameDecode!
                                      .first.firstNameAr! +
                                  ' ' +
                                  book.translators![indexPath].fullNameDecode!
                                      .last.lastNameAr! +
                                  ',',
                          style: themeNotifier
                              .getTheme()
                              .textTheme
                              .bodyText1!
                              .copyWith(
                                fontSize: 16,
                                color: themeNotifier.getTheme().canvasColor,
                                decoration: TextDecoration.underline,
                                decorationThickness: 1,
                                decorationColor:
                                    themeNotifier.getTheme().canvasColor,
                              ),
                        ),
                        onTap: () async {
                          CategoriesSelections lastSelections =
                              CategoriesSelections(
                            type: categoriesNotifier.selections.type!,
                            id: categoriesNotifier.selections.id,
                            keyword: categoriesNotifier.selections.keyword,
                          );
                          await categoriesNotifier.setLastSelections(
                            lastSelections,
                          );
                          categoriesNotifier.selections.id =
                              book.translators![indexPath].id!;
                          categoriesNotifier.selections.type = 'translators';
                          categoriesNotifier.resetPageIndex();
                          await categoriesNotifier.getAllCategories(
                            categoriesNotifier.selections,
                          );

                          await Navigator.of(context).push(
                            MaterialPageRoute(
                              builder: (BuildContext context) =>
                                  IntegratedFollowingDetailsPage(
                                contributor: categoriesNotifier.contributor ??
                                    ContributorCategories(),
                                contributorBooks:
                                    categoriesNotifier.subcategoriesBooks,
                                backToContributor: false,
                              ),
                            ),
                          );
                        },
                      ),
                    ),
                  )
                ],
              ),
            ),
            Visibility(
              visible: !book.translators!.isEmpty,
              child: const Divider(
                color: Colors.grey,
              ).padding(padding: const EdgeInsets.symmetric(vertical: 3)),
            ),
            Visibility(
              visible: !book.publishers!.isEmpty,
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Container(
                    child: Text(
                      'publishing house'.tr() + '  ',
                      style: themeNotifier
                          .getTheme()
                          .textTheme
                          .headline2!
                          .copyWith(
                            fontSize: 16,
                            color: Colors.grey,
                          ),
                    ),
                  ),
                  Expanded(
                    child: ListView.builder(
                      shrinkWrap: true,
                      physics: const NeverScrollableScrollPhysics(),
                      itemCount: book.publishers!.length,
                      itemBuilder: (BuildContext context, int indexPath) =>
                          InkWell(
                        child: Text(
                          language
                              ? book.publishers![indexPath].fullNameDecode!
                                      .first.firstNameEn! +
                                  ' ' +
                                  book.publishers![indexPath].fullNameDecode!
                                      .last.lastNameEn! +
                                  ','
                              : book.publishers![indexPath].fullNameDecode!
                                      .first.firstNameAr! +
                                  ' ' +
                                  book.publishers![indexPath].fullNameDecode!
                                      .last.lastNameAr! +
                                  ',',
                          style: themeNotifier
                              .getTheme()
                              .textTheme
                              .bodyText1!
                              .copyWith(
                                fontSize: 16,
                                color: themeNotifier.getTheme().canvasColor,
                                decoration: TextDecoration.underline,
                                decorationThickness: 1,
                                decorationColor:
                                    themeNotifier.getTheme().canvasColor,
                              ),
                        ),
                        onTap: () async {
                          CategoriesSelections lastSelections =
                              CategoriesSelections(
                            type: categoriesNotifier.selections.type!,
                            id: categoriesNotifier.selections.id,
                            keyword: categoriesNotifier.selections.keyword,
                          );
                          await categoriesNotifier.setLastSelections(
                            lastSelections,
                          );
                          categoriesNotifier.selections.id =
                              book.publishers![indexPath].id;
                          categoriesNotifier.selections.type = 'publishers';
                          categoriesNotifier.resetPageIndex();
                          await categoriesNotifier.getAllCategories(
                            categoriesNotifier.selections,
                          );

                          await Navigator.of(context).push(
                            MaterialPageRoute(
                              builder: (BuildContext context) =>
                                  IntegratedFollowingDetailsPage(
                                contributor: categoriesNotifier.contributor ??
                                    ContributorCategories(),
                                contributorBooks:
                                    categoriesNotifier.subcategoriesBooks,
                                backToContributor: false,
                              ),
                            ),
                          );
                        },
                      ),
                    ),
                  )
                ],
              ),
            ),
            Visibility(
              visible: !book.publishers!.isEmpty,
              child: const Divider(
                color: Colors.grey,
              ).padding(padding: const EdgeInsets.symmetric(vertical: 3)),
            ),
            RichText(
              text: TextSpan(
                text: 'Year of Publication'.tr() + ' ',
                style: themeNotifier.getTheme().textTheme.headline2!.copyWith(
                      fontSize: 16,
                      color: Colors.grey,
                    ),
                children: <TextSpan>[
                  TextSpan(
                    text: book.publicationYear,
                    style:
                        themeNotifier.getTheme().textTheme.bodyText1!.copyWith(
                              fontSize: 16,
                              color: themeNotifier.getTheme().hoverColor,
                            ),
                  ),
                ],
              ),
              overflow: TextOverflow.ellipsis,
            ),
            const Divider(
              color: Colors.grey,
            ).padding(padding: const EdgeInsets.symmetric(vertical: 3)),
            InkWell(
              onTap: () async {
                print(subSubCategoryId);
                categoriesNotifier.selections.type = 'category';
                categoriesNotifier.selections.id = categoryId;
                categoriesNotifier.selections.sub_id = subCategoryId;
                categoriesNotifier.selections.sub_sub_id = subSubCategoryId;
                categoriesNotifier.categories.clear();
                categoriesNotifier.resetPageIndex();
                categoriesNotifier
                    .getAllCategories(
                      categoriesNotifier.selections,
                    )
                    .then((value) => categoriesNotifier.setMoreCategoryIndex(
                          categoriesNotifier.subCategoriesTab.indexWhere(
                            (MainCategoriesTabs element) =>
                                element.id == book.subSubcategory!.id,
                          ),
                        ));
                // "id":1,"sub_id":2,"sub_sub_id":15

                await Navigator.of(context).push(
                  MaterialPageRoute(
                    builder: (BuildContext context) => MoreCategoryPage(
                      categoryName: language
                          ? book.subSubcategory!.nameEn!
                          : book.subSubcategory!.nameAr!,
                      moreBooks: categoriesNotifier.subcategoriesBooks,
                    ),
                  ),
                );

                // id":19,"sub_id":21,"sub_sub_id":28
                // "id":19,"sub_id":null,"sub_sub_id":null
              },
              child: RichText(
                text: TextSpan(
                  text: 'book category'.tr() + ' ',
                  style: themeNotifier.getTheme().textTheme.headline2!.copyWith(
                        fontSize: 16,
                        color: Colors.grey,
                      ),
                  children: <TextSpan>[
                    TextSpan(
                      text: categoryName,
                      style: themeNotifier
                          .getTheme()
                          .textTheme
                          .bodyText1!
                          .copyWith(
                            fontSize: 16,
                            color: themeNotifier.getTheme().canvasColor,
                            decoration: TextDecoration.underline,
                            decorationThickness: 1,
                            decorationColor:
                                themeNotifier.getTheme().canvasColor,
                          ),
                    ),
                  ],
                ),
                overflow: TextOverflow.ellipsis,
              ),
            ),
            const Divider(
              color: Colors.grey,
            ).padding(padding: const EdgeInsets.symmetric(vertical: 3)),
            Visibility(
              visible: !book.tags!.isEmpty,
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Container(
                    child: Text(
                      'Tags'.tr() + '  ',
                      style: themeNotifier
                          .getTheme()
                          .textTheme
                          .headline2!
                          .copyWith(
                            fontSize: 16,
                            color: Colors.grey,
                          ),
                    ),
                  ),
                  Expanded(
                    child: ListView.builder(
                      shrinkWrap: true,
                      physics: const NeverScrollableScrollPhysics(),
                      itemCount: book.tags!.length,
                      itemBuilder: (BuildContext context, int indexPath) =>
                          InkWell(
                        child: Text(
                          language
                              ? book.tags![indexPath].nameEn!
                              : book.tags![indexPath].nameAr!,
                          style: themeNotifier
                              .getTheme()
                              .textTheme
                              .bodyText1!
                              .copyWith(
                                fontSize: 16,
                                color: themeNotifier.getTheme().canvasColor,
                                decoration: TextDecoration.underline,
                                decorationThickness: 1,
                                decorationColor:
                                    themeNotifier.getTheme().canvasColor,
                              ),
                        ),
                        onTap: () async {
                          categoriesNotifier.selections.id =
                              book.tags![indexPath].id;
                          categoriesNotifier.selections.type = 'tag';
                          categoriesNotifier.resetPageIndex();
                          categoriesNotifier.categories.clear();
                          categoriesNotifier
                              .getAllCategories(categoriesNotifier.selections);
                          await Navigator.of(context).push(
                            MaterialPageRoute(
                              builder: (BuildContext context) =>
                                  TagsMoreCategoryPage(
                                categoryName: language
                                    ? book.tags![indexPath].nameEn!
                                    : book.tags![indexPath].nameAr!,
                                moreBooks:
                                    categoriesNotifier.subcategoriesBooks,
                              ),
                            ),
                          );
                        },
                      ),
                    ),
                  )
                ],
              ),
            ),
            Visibility(
              visible: !book.tags!.isEmpty,
              child: const Divider(
                color: Colors.grey,
              ).padding(padding: const EdgeInsets.symmetric(vertical: 3)),
            ),
            ListTile(
              contentPadding: const EdgeInsets.only(bottom: 10),
              title: Padding(
                padding: const EdgeInsets.only(bottom: 10.0),
                child: Text(
                  'About the book'.tr(),
                  style: themeNotifier.getTheme().textTheme.headline2!.copyWith(
                        height: 1.5,
                        color: Colors.grey,
                        fontSize: 16,
                      ),
                ),
              ),
              subtitle: MoreTextWidget(
                firstPart: 300,
                text: book.description!,
                textStyle:
                    themeNotifier.getTheme().textTheme.headline2!.copyWith(
                          height: 1.3,
                          color: themeNotifier.getTheme().hoverColor,
                          fontSize: 16,
                        ),
              ),
            )
          ],
        ),
      ),
      maintainState: true,
      visible: selectedIndex == 0,
    );
  }
}