added guardian login with views for their assigned childs
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
|
||||
import '../api/marianumconnect/queries/get_capabilities/guardian_child.dart';
|
||||
import '../state/app/modules/capabilities/bloc/capabilities_cubit.dart';
|
||||
import '../state/app/modules/children/child_selection_cubit.dart';
|
||||
import '../utils/haptics.dart';
|
||||
import 'centered_leading.dart';
|
||||
import 'details_bottom_sheet.dart';
|
||||
import 'placeholder_view.dart';
|
||||
|
||||
/// AppBar action that shows the selected child and lets a guardian switch to
|
||||
/// another one. Invisible unless there is a choice to make.
|
||||
class ChildSwitcher extends StatelessWidget {
|
||||
const ChildSwitcher({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final children = context.watch<CapabilitiesCubit>().state.children;
|
||||
if (children.length < 2) return const SizedBox.shrink();
|
||||
final selected = effectiveChild(
|
||||
children,
|
||||
context.watch<ChildSelectionCubit>().state,
|
||||
)!;
|
||||
return TextButton.icon(
|
||||
icon: const Icon(Icons.face_outlined),
|
||||
label: Text(selected.firstName),
|
||||
onPressed: () => _pick(context, selected.id),
|
||||
);
|
||||
}
|
||||
|
||||
void _pick(BuildContext context, String selectedId) {
|
||||
final selection = context.read<ChildSelectionCubit>();
|
||||
final children = context.read<CapabilitiesCubit>().state.children;
|
||||
showDetailsBottomSheet(
|
||||
context,
|
||||
header: const ListTile(title: Text('Kind auswählen')),
|
||||
children: (sheetContext) => [
|
||||
for (final child in children)
|
||||
ChildTile(
|
||||
child: child,
|
||||
trailing: child.id == selectedId ? const Icon(Icons.check) : null,
|
||||
onTap: () {
|
||||
Haptics.selection();
|
||||
selection.select(child.id);
|
||||
Navigator.pop(sheetContext);
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// One linked child: name and class.
|
||||
class ChildTile extends StatelessWidget {
|
||||
final GuardianChild child;
|
||||
final Widget? trailing;
|
||||
final VoidCallback? onTap;
|
||||
|
||||
const ChildTile({required this.child, this.trailing, this.onTap, super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => ListTile(
|
||||
leading: const CenteredLeading(Icon(Icons.face_outlined)),
|
||||
title: Text(child.displayName),
|
||||
subtitle: child.className.isEmpty
|
||||
? null
|
||||
: Text('Klasse ${child.className}'),
|
||||
trailing: trailing,
|
||||
onTap: onTap,
|
||||
);
|
||||
}
|
||||
|
||||
/// Shown by per-child modules while a guardian has no linked child.
|
||||
class NoChildrenPlaceholder extends StatelessWidget {
|
||||
const NoChildrenPlaceholder({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => const PlaceholderView(
|
||||
icon: Icons.family_restroom_outlined,
|
||||
text:
|
||||
'Deinem Konto ist noch kein Kind zugeordnet. Bitte wende dich an '
|
||||
'das Sekretariat.',
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user