import 'package:hmg_patient_app/core/viewModels/project_view_model.dart'; import 'package:hmg_patient_app/theme/colors.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class Texts extends StatefulWidget { final String? text; final String? variant; final Color? color; final bool? bold; final bool? regular; final bool? medium; final int? maxLength; final bool? italic; final TextAlign? textAlign; final int? maxLines; final bool? readMore; final String? style; final bool? allowExpand; final double? fontSize; final FontWeight? fontWeight; final double? margin; final double? marginTop; final double? marginRight; final double? marginBottom; final double? marginLeft; final TextDecoration? decoration; final double? heightFactor; Texts( this.text, { Key? key, this.variant, this.color, this.bold, this.regular, this.medium, this.allowExpand = true, this.italic = false, this.textAlign, this.maxLength = 60, this.maxLines, this.readMore = false, this.style, this.fontSize, this.fontWeight, this.margin, this.marginBottom, this.marginLeft, this.marginRight, this.marginTop, this.decoration, this.heightFactor, }) : super(key: key); @override _TextsState createState() => _TextsState(); } class _TextsState extends State { bool hidden = false; String text = ""; @override void didUpdateWidget(Texts oldWidget) { setState(() { if (widget.style == "overline") text = widget.text!.toUpperCase(); else { text = widget.text!; } }); super.didUpdateWidget(oldWidget); } @override void initState() { hidden = widget.readMore!; if (widget.style == "overline") text = widget.text!.toUpperCase(); else { text = widget.text!; } super.initState(); } double _getFontSize() { switch (widget.variant) { case "heading0": return 40.0; case "heading": return 32.0; case "heading2": return 28.0; case "heading3": return 18.0; case "body1": return 18.0; case "body2": return 20.0; case "body2Link": return 16.0; case "caption": return 16.0; case "caption2": return 14.0; case "bodyText": return 15.0; case "bodyText2": return 17.0; case "caption3": return 12.0; case "caption4": return 9.0; case "overline": return 11.0; case "date": return 24.0; default: return 16.0; } } FontWeight? _getFontWeight() { if (widget.bold ?? false) { return FontWeight.w900; } else if (widget.regular ?? false) { return FontWeight.w500; } else if (widget.medium ?? false) { return FontWeight.w800; } else { if (widget.style == null) { switch (widget.variant) { case "heading": return FontWeight.w900; case "heading2": return FontWeight.w900; case "heading3": return FontWeight.w900; case "body1": return FontWeight.w800; case "body2": return FontWeight.w900; case "body2Link": return FontWeight.w800; case "caption": return FontWeight.w700; case "caption2": return FontWeight.w700; case "bodyText": return FontWeight.w500; case "bodyText2": return FontWeight.w500; case "caption3": return FontWeight.w600; case "caption4": return FontWeight.w600; case "overline": return FontWeight.w800; case "date": return FontWeight.w900; default: return FontWeight.w500; } } else { return null; } } } @override Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); TextStyle? _getFontStyle() { switch (widget.style) { case "headline2": // return Theme.of(context).textTheme.headline2; return TextStyle(color: Colors.white); case "headline3": return TextStyle(color: Colors.white); case "headline4": return TextStyle(color: Colors.white); case "headline5": return TextStyle(color: Colors.white); case "headline6": return TextStyle(color: Colors.white); case "bodyText2": return TextStyle(color: Colors.white); case "bodyText_15": return TextStyle(color: Colors.white, fontSize: 15.0); case "bodyText1": return TextStyle(color: Colors.white); case "caption": return TextStyle(color: Colors.white); case "overline": return TextStyle(color: Colors.white); case "button": return TextStyle(color: Colors.white); default: return TextStyle(); } } return Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start, children: [ Stack( children: [ Text( !hidden ? text : (text.substring(0, text.length > widget.maxLength! ? widget.maxLength : text.length)), textAlign: widget.textAlign, overflow: widget.maxLines != null ? ((widget.maxLines! > 1) ? TextOverflow.fade : TextOverflow.ellipsis) : null, maxLines: widget.maxLines ?? null, style: widget.style != null ? _getFontStyle()!.copyWith( fontStyle: widget.italic! ? FontStyle.italic : null, color: widget.color != null ? widget.color : Colors.black, fontWeight: widget.fontWeight ?? _getFontWeight(), ) : TextStyle( height: widget.heightFactor, decoration: widget.decoration, fontStyle: widget.italic! ? FontStyle.italic : null, color: widget.color ?? Colors.black, fontSize: widget.fontSize ?? _getFontSize(), letterSpacing: widget.variant == "overline" ? 1 : null, fontWeight: widget.fontWeight ?? _getFontWeight(), fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins'), ), if (widget.readMore! && text.length > widget.maxLength! && hidden) Positioned( bottom: 0, left: 0, right: 0, child: Container( decoration: BoxDecoration( gradient: LinearGradient(colors: [ CustomColors.white, CustomColors.white.withOpacity(0), ], begin: Alignment.bottomCenter, end: Alignment.topCenter), ), height: 30.0, ), ) ], ), if (widget.allowExpand! && widget.readMore! && text.length > widget.maxLength!) Padding( padding: EdgeInsets.only(top: 8.0, right: 8.0, bottom: 8.0), child: InkWell( onTap: () { setState(() { hidden = !hidden; }); }, child: Text( hidden ? "Read More" : "Read less", style: _getFontStyle()!.copyWith( color: Theme.of(context).primaryColor, fontWeight: FontWeight.w800, fontFamily: projectViewModel.isArabic ? 'Poppins' : 'Poppins', ), ), ), ), ], ); } }