PostsView.dart

 avatar
unknown
dart
3 years ago
72 kB
2
Indexable
import 'package:cached_network_image/cached_network_image.dart';
import 'package:carousel_slider/carousel_slider.dart';
import 'package:chewie/chewie.dart';
import 'package:dio/dio.dart';
import 'package:dots_indicator/dots_indicator.dart';
import 'package:fancy_shimmer_image/fancy_shimmer_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
import 'package:flutter_svg/svg.dart';
import 'package:get/get.dart';
import 'package:indexed_list_view/indexed_list_view.dart';
import 'package:lazy_loading_list/lazy_loading_list.dart';
import 'package:mobile/app/Dto/like_dto.dart';
import 'package:mobile/app/Dto/post_report_dto.dart';
import 'package:mobile/app/Dto/provider_comment_model.dart';
import 'package:mobile/app/Dto/provider_follow_dto.dart';
import 'package:mobile/app/Utilities/methods.dart';
import 'package:mobile/app/global_widgets/circular_block_button_widget.dart';
import 'package:mobile/app/global_widgets/favorite_button.dart';
import 'package:mobile/app/global_widgets/text_field_widget.dart';
import 'package:mobile/app/models/new/app_user_model.dart';
import 'package:mobile/app/models/one_signal_device.dart';
import 'package:mobile/app/models/responses/get_all_posts_response.dart';
import 'package:mobile/app/models/responses/get_all_provider_likes.dart';
import 'package:mobile/app/models/responses/get_all_provier_following.dart';
import 'package:mobile/app/models/responses/provider_posts_model.dart';
import 'package:mobile/app/modules/account/controllers/account_controller.dart';
import 'package:mobile/app/modules/account/controllers/posts_comments_controller.dart';
import 'package:mobile/app/modules/account/controllers/posts_likes_controller.dart';
import 'package:mobile/app/modules/account/widgets/post_comments.dart';
import 'package:mobile/app/modules/account/widgets/post_likes.dart';
// import 'package:mobile/app/modules/account/views/posts_view.dart';
import 'package:mobile/app/modules/account/views/comments_list.dart';
import 'package:mobile/app/modules/account/views/likes.dart';
import 'package:mobile/app/modules/root/controllers/root_controller.dart';
import 'package:mobile/app/modules/root/views/root_view.dart';
import 'package:mobile/app/other_provider_account/controller/other_provider_controller.dart';
import 'package:mobile/app/other_provider_account/views/another_provider_account_view.dart';
import 'package:mobile/app/providers/api_provider.dart';
import 'package:mobile/app/routes/app_pages.dart';
import 'package:mobile/app/services/auth_service.dart';
import 'package:onesignal_flutter/onesignal_flutter.dart';
import 'package:readmore/readmore.dart';
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
import 'package:video_player/video_player.dart';
import 'package:mobile/common/ui.dart';
import 'package:visibility_detector/visibility_detector.dart';
import 'package:volume_watcher/volume_watcher.dart';

class PostsView extends GetView<AccountController>{
  AppUser _currentUser = Get.find<AuthService>().appUser.value;

  Widget build (BuildContext context){
    controller.itemScrollController = ItemScrollController();
    return Scaffold(
      extendBodyBehindAppBar: false,
      body: Obx(
          () => controller.providerGridPosts.length <= 0
              ? Center(
                  child: CupertinoActivityIndicator(
                  radius: 10,
                ))
              : Padding(
                padding: EdgeInsets.only(top: 25),
                child: Column(
                  children: [
                    Expanded(
                        flex: 1,
                        child: Container(
                          color: Get.theme.primaryColor,
                          // margin: EdgeInsets.only(left: 8, right: 8, top: 35),
                          child: Row(
                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            crossAxisAlignment: CrossAxisAlignment.center,
                            children: [
                              IconButton(
                              icon: new Icon(Icons.arrow_back_ios,
                                  color: Get.theme.hoverColor),
                              onPressed: () {
                                // controller.vController?.pause();
                                Get.back();
                              },
                            ),
                              TextButton(
                                onPressed: () async {
                                  
                                    controller.itemScrollController
                                      .scrollTo(index: 1, duration: Duration(milliseconds: 300));
                                  },
                                  
                                      
                                
                                child: Text(
                                  "Posts".tr,
                                  style: Get.theme.textTheme.headline5
                                      .merge(
                                        TextStyle(
                                            color: context.theme.hoverColor,
                                            fontWeight: FontWeight.w600),
                                      )
                                      .copyWith(fontSize: 21.0),
                                ),
                              ),
                              IconButton(
                                icon: _currentUser.id != null
                                    ? SvgPicture.asset(
                                        'assets/svg/Icon-notifications.svg',
                                      )
                                    : Icon(
                                        Icons.notifications_active,
                                      ),
                                onPressed: () async {
                                  // await OneSignal.shared
                                  //     .clearOneSignalNotifications();
                                  Get.toNamed(Routes.NOTIFICATIONS);
                                },
                              ),
                            ],
                          ),
                        ),
                      ),
                      Expanded(
                        flex: 9,
                        child: Container(
                          decoration: BoxDecoration(),
                          child: IgnorePointer(
                            ignoring: controller
                                .commentsController.text.isNotEmpty,
                            child: ScrollablePositionedList.builder(
                              initialScrollIndex: Get.arguments,
                              padding: EdgeInsets.zero,
                              itemScrollController: controller.itemScrollController,
                              // minCacheExtent: Get.height * 5,
                              itemCount: controller.providerGridPosts
                                  .where(
                                    (p0) => p0.url != null,
                                  )
                                  .length,
                              // cacheExtent: Get.height,
                              itemBuilder: (BuildContext context, int index) {
                                if (index<0 || index >= controller.providerGridPosts.length) return null;
                                else
                                return listItem(
                                    controller.providerGridPosts
                                        .where((p0) => p0.url != null)
                                        .toList()[index], context);
                              },
                            ),
                          ),
                        ),
                      ),
                //       Container(
                //         height: controller.isLoading.value ? 50.0 : 0,
                //         child: controller.isLoading.value ? Center(
                //   child: CupertinoActivityIndicator(
                //   radius: 8,
                // )):SizedBox()
                //       ),
                  ],
                ),
                )
    ));
  }
}

Widget listItem(PostsItems e, BuildContext context) {
    AppUser _currentUser = Get.find<AuthService>().appUser.value;
    return PostItem(
      e: e,
      currentUser: _currentUser,
      rootController: Get.put(RootController()),
      accountController: Get.put(AccountController()),
      postLikesController: Get.put(PostsLikesController()),
      postCommentsController: Get.put(PostsCommentsController()),
    );
  }


class PostItem extends StatelessWidget {
  const PostItem({
    Key key,
    @required AppUser currentUser,
    @required this.rootController,
    @required this.e,
    @required this.postLikesController,
    @required this.postCommentsController,
        this.accountController,
  })  : _currentUser = currentUser,
        super(key: key);

  final AccountController accountController;
  final PostsItems e;
  final RootController rootController;
  final PostsCommentsController postCommentsController;
  final PostsLikesController postLikesController;
  final AppUser _currentUser;
  @override
  Widget build(BuildContext context) {
    dynamic like = e.isLiked;
    RegExp regExp1 = new RegExp("[a-zA-Z]");
    return e.url.isNotEmpty
        ? Container(
            color: Get.theme.primaryColor,
            width: Get.width,
            child: Column(
              children: [
                Column(
                  children: [
                    Container(
                      decoration: BoxDecoration(
                        color: Colors.white,
                      ),
                      child: Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: <Widget>[
                          Row(
                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            children: [
                              InkWell(
                                onTap: () async {
                                   
                                    Get.back();
                                  
                                },
                                child: Container(
                                  margin:
                                      EdgeInsets.only(top: 10.0, bottom: 5.0),
                                  padding: EdgeInsets.all(5.0),
                                  child: Row(
                                    mainAxisAlignment: MainAxisAlignment.center,
                                    crossAxisAlignment:
                                        CrossAxisAlignment.center,
                                    children: <Widget>[
                                      Stack(
                                        children: [
                                          e.providerProfileUrl != null
                                              ? ClipRRect(
                                                  borderRadius:
                                                      new BorderRadius.circular(
                                                          50.0),
                                                  child: CircleAvatar(
                                                    backgroundColor:
                                                        Ui.parseColor(
                                                            "#BEBEBE"),
                                                    radius: 22,
                                                    backgroundImage:
                                                        CachedNetworkImageProvider(
                                                      '${e.providerProfileUrl}',
                                                      cacheKey:
                                                          e.providerProfileUrl,
                                                    ),
                                                  ),
                                                )
                                              : ClipRRect(
                                                  borderRadius:
                                                      new BorderRadius.circular(
                                                          50.0),
                                                  child: Image.asset(
                                                    'assets/img/def_user.jpg',
                                                    width: 60,
                                                    height: 60,
                                                  ),
                                                ),
                                          Positioned(
                                            top: e.providerProfileUrl == null
                                                ? 8
                                                : 0,
                                            right: e.providerProfileUrl == null
                                                ? 8
                                                : 0,
                                            child: InkWell(
                                              onTap: () {},
                                              child: e.isLicenseActive == true
                                                  ? CircleAvatar(
                                                      backgroundColor:
                                                          Get.theme.focusColor,
                                                      radius: 8,
                                                      child: Icon(
                                                        Icons.check,
                                                        size: 12,
                                                        color: Get
                                                            .theme.primaryColor,
                                                      ),
                                                    )
                                                  : SizedBox(),
                                            ),
                                          ),
                                        ],
                                      ),
                                      SizedBox(
                                        width: 5.0,
                                      ),
                                      Column(
                                        crossAxisAlignment:
                                            CrossAxisAlignment.start,
                                        mainAxisAlignment:
                                            MainAxisAlignment.start,
                                        mainAxisSize: MainAxisSize.min,
                                        children: <Widget>[
                                          Row(
                                            mainAxisAlignment:
                                                MainAxisAlignment.start,
                                            crossAxisAlignment:
                                                CrossAxisAlignment.start,
                                            children: [
                                              Column(
                                                crossAxisAlignment:
                                                    CrossAxisAlignment.start,
                                                mainAxisAlignment:
                                                    MainAxisAlignment.start,
                                                children: [
                                                  Text(
                                                    e.providerName,
                                                    textScaleFactor: 1.0,
                                                    style: TextStyle(
                                                      color: Colors.black,
                                                      fontSize: 14.0,
                                                      fontWeight:
                                                          FontWeight.bold,
                                                    ),
                                                  ),
                                                  SizedBox(
                                                    height: 4,
                                                  ),
                                                  Directionality(
                                                    textDirection:
                                                        TextDirection.ltr,
                                                    child: Text(
                                                      "${e.providerUserName}",
                                                      textScaleFactor: 1.0,
                                                      style: TextStyle(
                                                        color:
                                                            Get.theme.hintColor,
                                                        fontSize: 11.0,
                                                        fontWeight:
                                                            FontWeight.bold,
                                                      ),
                                                    ),
                                                  ),
                                                ],
                                              ),
                                            ],
                                          ).marginOnly(top: 8, bottom: 8),
                                        ],
                                      ),
                                    ],
                                  ),
                                ),
                              ),
                               IconButton(
                                      icon: SvgPicture.asset(
                                        'assets/svg/options.svg',
                                        height: 20,
                                      ),
                                      onPressed: () {
                                        showModalBottomSheet(
                                            shape: RoundedRectangleBorder(
                                              borderRadius:
                                                  BorderRadius.vertical(
                                                      top: Radius.circular(
                                                          15)),
                                            ),
                                            context: context,
                                            builder: (context) {
                                              return Container(
                                                  height: Get.height * 0.21,
                                                  width: Get.width,
                                                  decoration: BoxDecoration(
                                                      borderRadius:
                                                          BorderRadius.vertical(
                                                              top: Radius
                                                                  .circular(
                                                                      20))),
                                                  child: Column(
                                                    children: [
                                                      SvgPicture.asset(
                                                        'assets/svg/bottomSheetGrip.svg',
                                                        height: 25,
                                                        width: 50,
                                                        color: Colors
                                                            .grey[400],
                                                      ).paddingOnly(
                                                          bottom: 20),
                                                      Column(
                                                        children: [
                                                          InkWell(
                                                            onTap:
                                                                () async {
                                                                  Get.back();
                                                              showDialog(
                                    context: context,
                                    builder: (context) {
                                      TextEditingController newDescription =
                                          TextEditingController(
                                        text:
                                            accountController.postDescription == 'null'
                                                ? ''
                                                : accountController.postDescription,
                                      );
                                      // TextEditingController()..text = "${controller.postDescription.toString().isEmpty ? ' ' : controller.postDescription.toString() }";

                                      return new Scaffold(
                                        backgroundColor: Colors.transparent,
                                        body: Center(
                                          child: Container(
                                            decoration: BoxDecoration(
                                                color: Get.theme.primaryColor,
                                                borderRadius: BorderRadius.all(
                                                    Radius.circular(25))),
                                            width: Get.width * 0.8,
                                            height: Get.height * 0.35,
                                            child: Padding(
                                              padding:
                                                  const EdgeInsets.symmetric(
                                                      vertical: 18.0),
                                              child: Column(
                                                crossAxisAlignment:
                                                    CrossAxisAlignment.center,
                                                children: [
                                                  Row(
                                                    children: [
                                                      Expanded(
                                                          child: Divider(
                                                        color: Colors.grey,
                                                      )),
                                                      Text(
                                                        "Edit my post".tr,
                                                        style: Get.textTheme
                                                            .headline5,
                                                      ).paddingSymmetric(
                                                          horizontal: 5),
                                                      Expanded(
                                                          child: Divider(
                                                        color: Colors.grey,
                                                      )),
                                                    ],
                                                  ),
                                                  SizedBox(
                                                    height: 15,
                                                  ),
                                                  TextFieldWidget(
                                                    controller: newDescription,
                                                    hintText:
                                                        "enter new description"
                                                            .tr,
                                                    style:
                                                        Get.textTheme.bodyText1,
                                                    isFirst: true,
                                                  ),
                                                  SizedBox(
                                                    height: 15,
                                                  ),
                                                  Row(
                                                    mainAxisAlignment:
                                                        MainAxisAlignment
                                                            .spaceEvenly,
                                                    crossAxisAlignment:
                                                        CrossAxisAlignment
                                                            .center,
                                                    children: [
                                                      MaterialButton(
                                                        color: Get
                                                            .theme.focusColor,
                                                        shape: RoundedRectangleBorder(
                                                            borderRadius:
                                                                BorderRadius
                                                                    .circular(
                                                                        10)),
                                                        onPressed: () {
                                                          Get.back();
                                                        },
                                                        child: Text(
                                                          "Cancel".tr,
                                                          style: Get.textTheme
                                                              .bodyText1
                                                              .copyWith(
                                                            color: Get.theme
                                                                .primaryColor,
                                                          ),
                                                        ),
                                                      ),
                                                      MaterialButton(
                                                        color: Get
                                                            .theme.focusColor,
                                                        shape: RoundedRectangleBorder(
                                                            borderRadius:
                                                                BorderRadius
                                                                    .circular(
                                                                        10)),
                                                        onPressed: () async {
                                                          ProviderPostsModel
                                                              posts =
                                                              ProviderPostsModel(
                                                            providerId:
                                                                _currentUser.id,
                                                            description:
                                                                newDescription
                                                                    .text,
                                                            id: accountController
                                                                .postId,
                                                            IgnoreFile: true,
                                                          );
                                                          await ApiProvider(
                                                                  httpClient:
                                                                      Dio())
                                                              .editProviderPosts(
                                                                  posts, null);
                                                          // accountController.getAll(accountController.pageIndex.value);
                                                          accountController.getAllGridPosts();
                                                          accountController.providerGridPosts.refresh();
                                                          // Get.to(RootView());
                                                          Get.back();
                                                        },
                                                        child: Text(
                                                          "Save".tr,
                                                          style: Get.textTheme
                                                              .bodyText1
                                                              .copyWith(
                                                            color: Get.theme
                                                                .primaryColor,
                                                          ),
                                                        ),
                                                      ),
                                                    ],
                                                  ),
                                                ],
                                              ),
                                            ),
                                          ),
                                        ),
                                      );
                                    },
                                  );
                                                            },
                                                            child:
                                                                Container(
                                                              width:
                                                                  Get.width,
                                                              child: Text(
                                                                "Edit post".tr,
                                                                style: Get
                                                                    .textTheme
                                                                    .headline4
                                                                    .copyWith(
                                                                        fontSize:
                                                                            16,
                                                                        fontWeight:
                                                                            FontWeight.w600),
                                                              ),
                                                            ),
                                                          ),
                                                          Divider(
                                                                color: Colors
                                                                    .black,
                                                              ).paddingSymmetric(
                                                                  vertical: 5),
                                                          InkWell(
                                                            onTap: (){
                                                        ApiProvider(httpClient: Dio())
                                                        .deleteProviderPosts(accountController.postId);
                                                        accountController.providerPosts.removeWhere(
                                                        (element) =>
                                                        element.id == accountController.postId);
                                                        ApiProvider(httpClient: Dio())
                                                        .deleteProviderPosts(accountController.postId);
                                                        accountController.providerGridPosts.removeWhere(
                                                        (element) =>
                                                        element.id == accountController.postId);
                                                        accountController.changeAccountViewHeight(0);
                                                        Get.back();
                                                            },
                                                            child: Container(
                                                                width:
                                                                    Get.width,
                                                                child: Text(
                                                                  "Delete post".tr,
                                                                  style: Get
                                                                      .textTheme
                                                                      .headline4
                                                                      .copyWith(
                                                                          fontSize:
                                                                              16,
                                                                          fontWeight:
                                                                              FontWeight.w600),
                                                                ),
                                                              ),
                                                          ),
                                                          
                                                        ],
                                                      ).paddingSymmetric(
                                                          horizontal: 30)
                                                    ],
                                                  ));
                                            });
                                      },
                                    )
                                  
                            ],
                          ),
                          e.url.length <= 2
                              ? e.url.first.contains("mp4") ||
                                      e.url.first.contains('MOV') ||
                                      e.url.first.contains('m3u8')
                                  ? VideoWidget(
                                      url: e.url.first,
                                    )
                                  : Column(
                                      mainAxisSize: MainAxisSize.min,
                                      children: [
                                        CarouselSlider.builder(
                                          itemCount: e.url.length,
                                          itemBuilder:
                                              (context, index, realIndex) {
                                            return FancyShimmerImage(
                                              imageUrl: e.url[index],
                                              width: Get.width,
                                              boxFit: BoxFit.fitWidth
                                            );
                                          },
                                          options: CarouselOptions(
                                            viewportFraction: 1.0,
                                            enableInfiniteScroll: false,
                                            aspectRatio: 1 / 1,
                                            onPageChanged: (index, reason) {
                                              accountController.onPageChanged(
                                                  index, reason, e.id);
                                            },
                                          ),
                                        ),
                                      ],
                                    )
                              : CarouselSlider.builder(
                                  itemCount: e.url.length,
                                  itemBuilder: (context, index, realIndex) {
                                    return FancyShimmerImage(
                                      imageUrl: e.url[index],
                                      width: Get.width,
                                      boxFit: BoxFit.cover,
                                    );
                                  },
                                  options: CarouselOptions(
                                      viewportFraction: 1.0,
                                      enableInfiniteScroll: false,
                                      aspectRatio: 1 / 1,
                                      onPageChanged: (index, reason) {
                                        accountController.onPageChanged(
                                            index, reason, e.id);
                                      }),
                                ),
                        ],
                      ),
                    ),
                    e.url.length >= 2 &&
                            !e.url.first.contains("mp4") &&
                            !e.url.first.contains('MOV') &&
                            !e.url.first.contains('m3u8')
                        ? Row(
                            mainAxisAlignment: MainAxisAlignment.center,
                            children: [
                              DotsIndicator(
                                dotsCount: e.url.length,
                                position: e.index.toDouble(),
                                decorator: DotsDecorator(
                                  color: Colors.grey[300], // Inactive color
                                  activeColor: Colors.grey[600],
                                ),
                              ),
                            ],
                          ).marginOnly(bottom: 10.0)
                        : SizedBox(),
                    SizedBox(
                      height: 8,
                    ),
                    Row(
                        mainAxisAlignment: MainAxisAlignment.start,
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: <Widget>[
                          Icon(
                            Icons.access_time,
                            color: Colors.black.withOpacity(0.7),
                            size: 15.0,
                          ),
                          SizedBox(
                            width: 5.0,
                          ),
                          Text(
                            AppMethodsAndUtilities()
                                .getVerboseDateTimeRepresentation(
                                    e.createdDate),
                            style: TextStyle(
                                color: Colors.black.withOpacity(0.7),
                                fontSize: 13),
                          ),
                        ]).paddingOnly(left: 6, right: 6),
                    e.description != null
                        ? Directionality(
                            textDirection: TextDirection.ltr,
                            child: Container(
                                child: Row(
                              mainAxisAlignment: e.description != null &&
                                      !regExp1.hasMatch(e.description)
                                  ? MainAxisAlignment.end
                                  : MainAxisAlignment.start,
                              children: [
                                Flexible(
                                  child: ReadMoreText(
                                    e.description,
                                    style: Get.textTheme.bodyText2.copyWith(
                                      fontWeight: FontWeight.w600,
                                      fontSize: 12,
                                    ),
                                    trimLines: 1,
                                    colorClickableText: Colors.black,
                                    trimMode: TrimMode.Line,
                                    textDirection:
                                        !regExp1.hasMatch(e.description)
                                            ? TextDirection.rtl
                                            : TextDirection.ltr,
                                    trimCollapsedText: 'more'.tr,
                                    trimExpandedText: 'less'.tr,
                                    lessStyle: TextStyle(
                                      color: Colors.grey[400],
                                      fontSize: 14,
                                      fontWeight: FontWeight.normal,
                                    ),
                                    moreStyle: TextStyle(
                                      color: Colors.grey[400],
                                      fontSize: 14,
                                      fontWeight: FontWeight.normal,
                                    ),
                                  ),
                                ),
                              ],
                            )).paddingOnly(
                                top: 10, left: 22, right: 22, bottom: 10),
                          )
                        : SizedBox()
                  ],
                ),

                // Don't Touch Pls...
                Container(
                  margin: EdgeInsets.only(right: 5.0, left: 5.0),
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [
                      Row(
                        children: [
                          // love icon
                          Row(
                            mainAxisAlignment: MainAxisAlignment.center,
                            children: [
                              FavoriteButton(
                                iconDisabledColor: Colors.black87,
                                isFavorite: like,
                                iconSize: 35,
                                valueChanged: (like) async {
                                  print('Is Favorite : $like');
                                  if (!e.isLiked) {
                                    LikeDto likeDto = LikeDto(
                                      providerId: e.providerId,
                                      requesterId: _currentUser.id,
                                      isLike: true,
                                      postId: e.id,
                                    );
                                    await ApiProvider(httpClient: Dio())
                                        .providerAddLikes(likeDto)
                                        .then((value) {
                                      accountController.providerGridPosts
                                          .where(
                                              (element) => element.id == e.id)
                                          .first
                                          .likeCount++;
                                    });
                                    accountController.isHeartAnimating.value =
                                        true;
                                    accountController.providerGridPosts.refresh();
                                    accountController.likes.refresh();
                                    e.isLiked = true;
                                    await ApiProvider(httpClient: Dio())
                                        .getAllProviderLikes(e.id);
                                  } else {
                                    print('unlike');

                                    await postLikesController
                                        .getAllProviderLikes(e.id);

                                    var likeId = postLikesController.likes.value
                                        .where((element) =>
                                            element.requesterId ==
                                            _currentUser.id)
                                        .last
                                        .id;

                                    await ApiProvider(httpClient: Dio())
                                        .providerFeedDeleteLike(likeId)
                                        .then((value) {
                                      accountController.providerGridPosts
                                          .where(
                                              (element) => element.id == e.id)
                                          .first
                                          .likeCount--;
                                    });
                                    accountController.isHeartAnimating.value =
                                        false;
                                    accountController.providerGridPosts.refresh();
                                    postLikesController.likes.refresh();
                                    e.isLiked = false;
                                  }
                                },
                              ),
                              SizedBox(
                                width: 12.0,
                              ),
                              InkWell(
                                child: Text(
                                  "${e.likeCount}",
                                  style: Get.textTheme.bodyText1
                                      .copyWith(fontWeight: FontWeight.bold),
                                ),
                                onTap: () async {
                                  Get.lazyPut(() => PostsLikesController());
                                  await postLikesController
                                      .getAllProviderLikes(e.id)
                                      .then((value) {
                                    Get.to(
                                      PostLikes(),
                                    );
                                  });
                                },
                              ),
                            ],
                          ),

                          SizedBox(width: 3.0),
                          Row(
                            mainAxisAlignment: MainAxisAlignment.center,
                            children: [
                              IconButton(
                                icon: SvgPicture.asset(
                                  "assets/svg/instagram-comment.svg",
                                  width: 19,
                                ),
                                onPressed: () async {
                                  Get.lazyPut(() => PostsCommentsController());
                                  await accountController
                                      .getAllComments(e.id)
                                      .then((value) {
                                    postCommentsController.setPostId(e.id);
                                    postCommentsController
                                        .setPostOwner(e.providerId);
                                    accountController.inFeed.value = false;
                                    Get.to(
                                      PostComments(),
                                    ).then(
                                      (value) =>
                                          accountController.inFeed.value = true,
                                    );
                                  });
                                },
                              ),
                              Text(
                                "${e.commentCount}",
                                style: Get.textTheme.bodyText1
                                    .copyWith(fontWeight: FontWeight.bold),
                              ),
                            ],
                          ),
                        ],
                      ),
                      e.postPrice != null
                          ? Flexible(
                              child: Ui.getPrice(e.postPrice)
                                  .paddingOnly(right: 20))
                          : SizedBox(),
                    ],
                  ),
                ),
                e.comments != null && e.comments.isNotEmpty
                    ? Container(
                        margin: EdgeInsets.only(
                          left: 10,
                          right: 10,
                        ),
                        child: Row(
                          mainAxisAlignment: MainAxisAlignment.start,
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: [
                            e.commentCount > 0
                                ? Container(
                                    margin: EdgeInsets.only(top: 10.0),
                                    child: InkWell(
                                      child: IgnorePointer(
                                        child: RichText(
                                          textAlign: TextAlign.start,
                                          overflow: TextOverflow.ellipsis,
                                          maxLines: 2,
                                          text: TextSpan(
                                            text: "See all ".tr,
                                            style: Get.textTheme.bodyText1
                                                .copyWith(
                                              fontSize: 12,
                                              fontWeight: FontWeight.w500,
                                              color: Ui.parseColor("#949494"),
                                            ),
                                            children: <TextSpan>[
                                              TextSpan(
                                                text: " (${e.commentCount}) ",
                                                style: Get.textTheme.bodyText1
                                                    .copyWith(
                                                  fontSize: 12,
                                                  fontWeight: FontWeight.w500,
                                                  color:
                                                      Ui.parseColor("#949494"),
                                                ),
                                              ),
                                              TextSpan(
                                                text: "comments".tr,
                                                style: Get.textTheme.bodyText1
                                                    .copyWith(
                                                  fontSize: 12,
                                                  fontWeight: FontWeight.w500,
                                                  color:
                                                      Ui.parseColor("#949494"),
                                                ),
                                              ),
                                            ],
                                          ),
                                        ),
                                      ),
                                      onTap: () async {
                                        Get.lazyPut(
                                            () => PostsCommentsController());
                                        await postCommentsController
                                            .getAllComments(e.id)
                                            .then((value) {
                                          postCommentsController
                                              .setPostId(e.id);
                                          postCommentsController
                                              .setPostOwner(e.providerId);
                                          accountController.inFeed.value = false;

                                          Get.to(
                                            PostComments(),
                                          ).then(
                                            (value) => accountController
                                                .inFeed.value = true,
                                          );
                                        });
                                      },
                                    ),
                                  )
                                : SizedBox(),
                          ],
                        ),
                      )
                    : SizedBox(),
                SizedBox(
                  height: 8,
                ),
                Container(
                  margin: EdgeInsets.symmetric(horizontal: 10),
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.all(
                      Radius.circular(30),
                    ),
                  ),
                  height: Get.height * 0.06,
                  width: Get.width,
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [
                      InkWell(
                        onTap: () async {
                          accountController.commentsController.clear();
                          Get.log("trying to add comments on post ");
                          Get.log('Current User=${_currentUser.name}');
                          showModalBottomSheet(
                            backgroundColor: Get.theme.primaryColor,
                            context: context,
                            constraints: BoxConstraints(
                              maxHeight: Get.height * 0.5,
                            ),
                            builder: (context) {
                              return new Scaffold(
                                body: Container(
                                  height: Get.height * 0.5,
                                  child: Row(
                                    mainAxisAlignment: MainAxisAlignment.start,
                                    crossAxisAlignment:
                                        CrossAxisAlignment.start,
                                    children: [
                                      Expanded(
                                        flex: 5,
                                        child: TextFormField(
                                          textAlign: TextAlign.start,
                                          autofocus: true,
                                          maxLines: 2,
                                          maxLength: 160,
                                          onEditingComplete: () {},
                                          onFieldSubmitted: (value) async {
                                            // print("onFieldSubmitted");
                                            ProviderCommentModel comments =
                                                ProviderCommentModel(
                                                    providerId: e
                                                        .providerId, // controller.postOwner,
                                                    requesterId: _currentUser
                                                        .id, //.appUser.value.id,
                                                    comments: accountController
                                                        .commentsController
                                                        .text,
                                                    postId: e.id // .postId
                                                    );

                                            await ApiProvider(httpClient: Dio())
                                                .providerAddComments(comments)
                                                .then((value) {
                                              accountController.providerGridPosts
                                                  .where((element) =>
                                                      element.id ==
                                                      comments.postId)
                                                  .first
                                                  .commentCount++;
                                              accountController.providerGridPosts.refresh();
                                            });
                                            Comments c = Comments(
                                                comments: accountController
                                                    .commentsController.text,
                                                postId: e.id,
                                                providerId: e.providerId,
                                                requesterName:
                                                    _currentUser.name,
                                                providerName: e.providerName);
                                            e.comments.add(c);
                                            accountController.commentsController
                                                .clear();
                                          },
                                          controller:
                                              accountController.commentsController,
                                          textInputAction: TextInputAction.done,
                                          cursorColor: Colors.black,
                                          keyboardType: TextInputType.multiline,
                                          style:
                                              TextStyle(color: Colors.black87),
                                          decoration: new InputDecoration(
                                            border: InputBorder.none,
                                            focusedBorder: InputBorder.none,
                                            enabledBorder: InputBorder.none,
                                            errorBorder: InputBorder.none,
                                            disabledBorder: InputBorder.none,
                                            contentPadding: EdgeInsets.only(
                                                left: 15,
                                                bottom: 4,
                                                top: 4,
                                                right: 15),
                                            hintText: "Add comment".tr,
                                          ),
                                        ),
                                      ),
                                      Expanded(
                                        child: TextButton(
                                          onPressed: () async {
                                            ProviderCommentModel comments =
                                                ProviderCommentModel(
                                                    providerId: e
                                                        .providerId, // controller.postOwner,
                                                    requesterId: _currentUser
                                                        .id, //.appUser.value.id,
                                                    comments: accountController
                                                        .commentsController
                                                        .text,
                                                    postId: e.id // .postId
                                                    );

                                            await ApiProvider(httpClient: Dio())
                                                .providerAddComments(comments)
                                                .then((value) {
                                              accountController.providerGridPosts
                                                  .where((element) =>
                                                      element.id ==
                                                      comments.postId)
                                                  .first
                                                  .commentCount++;
                                              accountController.providerGridPosts.refresh();
                                            });
                                            Comments c = Comments(
                                                comments: accountController
                                                    .commentsController.text,
                                                postId: e.id,
                                                providerId: e.providerId,
                                                requesterName:
                                                    _currentUser.name,
                                                providerName: e.providerName);
                                            e.comments.add(c);
                                            accountController.commentsController
                                                .clear();
                                            Get.back();
                                          },
                                          child: Text(
                                            "Post".tr,
                                            style: Get.textTheme.bodyText2
                                                .copyWith(
                                              color: Ui.parseColor("#4c68d7"),
                                              fontSize: 12,
                                              fontWeight: FontWeight.bold,
                                            ),
                                          ),
                                        ),
                                      ),
                                    ],
                                  ),
                                ),
                              );
                            },
                          );
                        },
                        child: Row(
                          children: [
                            CircleAvatar(
                              radius: 16,
                              backgroundColor: Colors.grey[400],
                              child: CircleAvatar(
                                backgroundColor: Ui.parseColor("#BEBEBE"),
                                radius: 16,
                                backgroundImage: NetworkImage(
                                  '${_currentUser.profilePictureUrl}',
                                ),
                              ),
                            ),
                            SizedBox(
                              width: 8,
                            ),
                            Text(
                              "Add Comment...".tr,
                              style: Get.textTheme.bodyText1.copyWith(
                                color: Get.theme.hintColor,
                              ),
                            ),
                          ],
                        ),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          )
        : SizedBox();
  }
}

class PostVideoWidget extends StatefulWidget {
  const PostVideoWidget({Key key, this.videoUrl, this.autoPlay})
      : super(key: key);

  final bool autoPlay;
  final String videoUrl;

  @override
  _PostVideoWidgetState createState() => _PostVideoWidgetState();
}

class _PostVideoWidgetState extends State<PostVideoWidget> {
  VideoPlayerController _controller;

  @override
  void dispose() {
    super.dispose();
    _controller?.dispose();
  }

  @override
  void initState() {
    super.initState();
    _controller = VideoPlayerController.network(widget.videoUrl)
      ..initialize().then((_) {
        _controller.setLooping(widget.autoPlay);
        Future.delayed(
          Duration(
            milliseconds: 500,
          ),
          () {
            if (widget.autoPlay) {
              _controller.play();
              _controller.setVolume(0.0);
            } else {
              _controller.pause();
              _controller.setVolume(0.0);
            }

            setState(() {});
          },
        );
      });
  }

  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: () {
        if (_controller.value.volume == 0.0) {
          _controller.setVolume(1.0);
        } else {
          _controller.setVolume(0.0);
        }
        setState(() {});
      },
      child: _controller.value.isInitialized
          ? Center(
              child: Stack(
                children: [
                  AspectRatio(
                    aspectRatio: 1,
                    child: VideoPlayer(_controller),
                  ),
                  widget.autoPlay
                      ? Container(
                          margin: EdgeInsets.all(5.0),
                          child: _controller.value.volume == 0.0
                              ? Icon(
                                  Icons.volume_off,
                                  color: Get.theme.primaryColor,
                                  size: 25,
                                )
                              : Icon(
                                  Icons.volume_up,
                                  color: Get.theme.primaryColor,
                                  size: 25,
                                ),
                        )
                      : Icon(
                          Icons.play_arrow,
                          color: Get.theme.primaryColor,
                          size: 25,
                        )
                ],
              ),
            )
          : Container(),
    );
  }
}

// Forbidden
class VideoWidget extends StatefulWidget {
  const VideoWidget({
    @required this.url,
  });

  final String url;

  @override
  _VideoWidgetState createState() => _VideoWidgetState();
}

class _VideoWidgetState extends State<VideoWidget> {
  double aRatio = 0.5;
  ChewieController chewieController;

  VideoPlayerController _controller;
  Future<void> _initializeVideoPlayerFuture;

  @override
  void dispose() {
    _controller?.dispose();
    chewieController?.dispose();
    super.dispose();
  }

  @override
  void initState() {
    super.initState();
    _controller = VideoPlayerController.network(widget.url);
    _initializeVideoPlayerFuture = _controller.initialize().then((_) {
      // Ensure the first frame is shown after the video is initialized, even before the play button has been pressed.
      setState(
        () {
          aRatio = _controller.value.aspectRatio <
                  ((MediaQuery.of(context).size.width /
                          MediaQuery.of(context).size.height) +
                      0.4)
              ? _controller.value.aspectRatio / 0.7
              : _controller.value.aspectRatio;
          chewieController = ChewieController(
            cupertinoProgressColors: ChewieProgressColors(
              playedColor: Colors.transparent,
              bufferedColor: Colors.transparent,
              handleColor: Colors.transparent,
            ),
            materialProgressColors: ChewieProgressColors(
              playedColor: Colors.transparent,
              bufferedColor: Colors.transparent,
              handleColor: Colors.transparent,
            ),
            videoPlayerController: _controller,
            autoPlay: false,
            looping: false,
            autoInitialize: true,
            allowMuting: true,
            deviceOrientationsOnEnterFullScreen: [
              DeviceOrientation.portraitUp,
              DeviceOrientation.landscapeLeft,
              DeviceOrientation.landscapeRight,
            ],
            deviceOrientationsAfterFullScreen: [DeviceOrientation.portraitUp],
            aspectRatio: aRatio,
          );
          _controller.pause();
          _controller.setLooping(false);
        },
      
      );
    });
  }

  @override
  Widget build(BuildContext context) {
    return VisibilityDetector(
      key: ObjectKey(_controller),
      onVisibilityChanged: (visibility) {
        if (visibility.visibleFraction == 0 &&
            this.mounted &&
            !chewieController.isFullScreen) {
          _controller.pause();
        } else if (chewieController.isFullScreen) {
          _controller.play();
        } else {
          _controller.pause();
        }
      },
      child: FutureBuilder(
        future: _initializeVideoPlayerFuture,
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
            return _controller.value.isInitialized
                ? AspectRatio(
                    aspectRatio: aRatio,
                    child: Stack(
                      children: [
                        VolumeWatcher(
                          onVolumeChangeListener: (double volume) {
                            chewieController.setVolume(volume);
                          },
                          child: Chewie(
                            controller: chewieController,
                          ),
                        ),
                        Positioned.fill(
                          child: GestureDetector(
                            child: Container(
                              color: Colors.transparent,
                            ).marginSymmetric(vertical: 40),
                            onTap: () {
                              if (_controller.value.isPlaying) {
                                _controller.pause();
                              } else {
                                _controller.play();
                              }
                            },
                          ),
                        ),
                      ],
                    ),
                  )
                : Container();
          } else {
            return Container(
              width: double.infinity,
              height: 400,
              color: Colors.black,
              child: Center(
                child: CircularProgressIndicator(),
              ),
              // child: FancyShimmerImage(
              //     imageUrl: 'https://i.imgur.com/j57mwe4.jpg'),
            );
          }
        },
      ),
    );
  }
}