import 'dart:io'; import 'package:flutter/material.dart'; import 'package:remever/common/resources.dart'; import 'package:remever/common/widgets/typography.dart'; import 'package:remever/common/widgets/w_if.dart'; import 'package:remever/common/widgets/wspace.dart'; import 'package:remever/components/extensions/context.dart'; import 'package:remever/database/database.dart'; import 'package:remever/models/training_dto.dart'; class TrainingTicket extends StatelessWidget { const TrainingTicket({ super.key, this.isAnswer = false, required this.trainingDto, }); final TrainingDto trainingDto; final bool isAnswer; @override Widget build(BuildContext context) { return Container( width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.circular(12).r, color: Colors.white, ), constraints: BoxConstraints(minHeight: 50.h), child: Stack( children: [ SizedBox( height: 90.h, width: double.infinity, child: DecoratedBox(decoration: getDecoration()), ), Padding( padding: const EdgeInsets.all(12).r, child: Column( children: [ _buildCollectionInfo(), _buildImage(), HSpace(4), _buildText(context), ], ), ), ], ), ); } Widget _buildCollectionInfo() { final collection = trainingDto.collection; return Wif( condition: !isAnswer && collection != null, builder: (context) { return Padding( padding: const EdgeInsets.only(bottom: 8).r, child: Row( children: [ SizedBox( height: 24.h, width: 24.w, child: Wif( condition: collection!.image != null, builder: (context) => ClipOval( child: Image.file( File(collection.image!), fit: BoxFit.cover, ), ), fallback: (context) => Center( child: AppTypography( collection.title.substring(0, 1), type: Bold34px(), ), ), ), ), WSpace(4), AppTypography( collection.title, type: Regular14px(), color: AppColors.disabled, ), ], ), ); }, fallback: (context) => Row(children: []), ); } /// Декорирование контейнера BoxDecoration getDecoration() { return BoxDecoration( borderRadius: BorderRadius.circular(12).r, gradient: LinearGradient( colors: [ isAnswer ? AppColors.answer : AppColors.question, Colors.white, ], begin: Alignment.topLeft, end: const Alignment(-0.5, 1), stops: const [0.25, 0.25], ), ); } Widget _buildText(BuildContext context) { final ticket = trainingDto.ticket; return AppTypography( isAnswer ? ticket.answer : ticket.question, maxLines: 99, type: Regular14px(), ); } Widget _buildImage() { final ticket = trainingDto.ticket; final String? imagePath = isAnswer ? ticket.answerImage : ticket.questionImage; return Wif( condition: imagePath != null, builder: (context) => Padding( padding: const EdgeInsets.only(right: 8).r, child: SizedBox.square( dimension: 100.r, child: ClipRRect( borderRadius: BorderRadius.circular(8).r, child: Image.file(File(imagePath!), fit: BoxFit.cover), ), ), ), ); } }