added guardian letters with chat and multiple answer functionalities
This commit is contained in:
@@ -0,0 +1,161 @@
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_linkify/flutter_linkify.dart';
|
||||
|
||||
import '../../../api/marianumconnect/queries/get_capabilities/guardian_child.dart';
|
||||
import '../../../api/marianumconnect/queries/parent_letters/parent_letter_models.dart';
|
||||
import '../../../extensions/date_time.dart';
|
||||
import '../../../notification/notification_tasks.dart';
|
||||
import '../../../state/app/infrastructure/loadable_state/loadable_state.dart';
|
||||
import '../../../state/app/infrastructure/loadable_state/view/loadable_state_consumer.dart';
|
||||
import '../../../state/app/infrastructure/utility_widgets/bloc_module.dart';
|
||||
import '../../../state/app/modules/capabilities/bloc/capabilities_cubit.dart';
|
||||
import '../../../state/app/modules/parent_letters/bloc/parent_letter_bloc.dart';
|
||||
import '../../../state/app/modules/parent_letters/bloc/parent_letter_state.dart';
|
||||
import '../../../state/app/modules/parent_letters/bloc/parent_letters_bloc.dart';
|
||||
import '../../../utils/url_opener.dart';
|
||||
import 'parent_letter_form_policy.dart';
|
||||
import 'widgets/parent_letter_attachments.dart';
|
||||
import 'widgets/parent_letter_response_card.dart';
|
||||
import 'widgets/parent_letter_thread.dart';
|
||||
|
||||
class ParentLetterView extends StatelessWidget {
|
||||
final String id;
|
||||
|
||||
const ParentLetterView({required this.id, super.key});
|
||||
|
||||
@override
|
||||
Widget build(
|
||||
BuildContext context,
|
||||
) => BlocModule<ParentLetterBloc, LoadableState<ParentLetterState>>(
|
||||
create: (context) =>
|
||||
ParentLetterBloc(id, inbox: context.read<ParentLettersBloc>()),
|
||||
autoRebuild: true,
|
||||
onInitialisation: (_, _) =>
|
||||
NotificationTasks.clearParentLetterNotification(id),
|
||||
child: (context, bloc, state) {
|
||||
final letter = state.data?.letter;
|
||||
return Scaffold(
|
||||
appBar: AppBar(title: const Text('Elternbrief')),
|
||||
body: Column(
|
||||
children: [
|
||||
Expanded(
|
||||
child: LoadableStateConsumer<ParentLetterBloc, ParentLetterState>(
|
||||
isReady: (state) => state.letter != null,
|
||||
child: (state, loading) => _LetterBody(
|
||||
letter: state.letter!,
|
||||
children: context.watch<CapabilitiesCubit>().state.children,
|
||||
bloc: bloc,
|
||||
),
|
||||
),
|
||||
),
|
||||
if (letter != null && letter.content.thread.enabled)
|
||||
ParentLetterThreadInput(
|
||||
recipientName: letter.summary.sender.displayName,
|
||||
onSend: bloc.sendThreadMessage,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
class _LetterBody extends StatelessWidget {
|
||||
final ParentLetterDetail letter;
|
||||
final List<GuardianChild> children;
|
||||
final ParentLetterBloc bloc;
|
||||
|
||||
const _LetterBody({
|
||||
required this.letter,
|
||||
required this.children,
|
||||
required this.bloc,
|
||||
});
|
||||
|
||||
String _childName(String childId) =>
|
||||
children.firstWhereOrNull((child) => child.id == childId)?.displayName ??
|
||||
'dein Kind';
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final theme = Theme.of(context);
|
||||
final summary = letter.summary;
|
||||
final content = letter.content;
|
||||
final editedAt = summary.editedAt;
|
||||
return ListView(
|
||||
physics: const AlwaysScrollableScrollPhysics(),
|
||||
padding: const EdgeInsets.only(bottom: 16),
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.fromLTRB(16, 16, 16, 0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(summary.subject, style: theme.textTheme.titleLarge),
|
||||
const SizedBox(height: 4),
|
||||
Text(
|
||||
[
|
||||
summary.sender.displayName,
|
||||
summary.sentAt.formatDateTime(),
|
||||
if (editedAt != null)
|
||||
'bearbeitet am ${editedAt.formatDateTime()}',
|
||||
].join(' · '),
|
||||
style: theme.textTheme.bodySmall,
|
||||
),
|
||||
if (children.length > 1)
|
||||
Text(
|
||||
'Betrifft: ${summary.childIds.map(_childName).join(', ')}',
|
||||
style: theme.textTheme.bodySmall,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
SelectableLinkify(
|
||||
text: content.body,
|
||||
onOpen: UrlOpener.onOpen,
|
||||
options: const LinkifyOptions(humanize: false),
|
||||
style: theme.textTheme.bodyLarge,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
if (content.attachments.isNotEmpty) ...[
|
||||
const SizedBox(height: 8),
|
||||
ParentLetterAttachments(
|
||||
letterId: summary.id,
|
||||
attachments: content.attachments,
|
||||
load: bloc.loadAttachment,
|
||||
),
|
||||
],
|
||||
const SizedBox(height: 8),
|
||||
for (final child in content.children)
|
||||
if (ParentLetterFormPolicy.resolve(
|
||||
request: content.request,
|
||||
child: child,
|
||||
)
|
||||
case final policy?)
|
||||
ParentLetterResponseCard(
|
||||
key: ValueKey((child.childId, child.response)),
|
||||
childName: _childName(child.childId),
|
||||
child: child,
|
||||
policy: policy,
|
||||
deadline: content.request?.deadline,
|
||||
onSubmit: (answers, signaturePng) => bloc.submitResponse(
|
||||
childId: child.childId,
|
||||
answers: answers,
|
||||
signaturePng: signaturePng,
|
||||
),
|
||||
),
|
||||
if (content.thread.messages.isNotEmpty) ...[
|
||||
const Padding(
|
||||
padding: EdgeInsets.fromLTRB(16, 12, 16, 4),
|
||||
child: Text(
|
||||
'Nachrichten',
|
||||
style: TextStyle(fontWeight: FontWeight.w600),
|
||||
),
|
||||
),
|
||||
ParentLetterThreadMessages(content.thread.messages),
|
||||
],
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user