Fladder/lib/screens/collections/add_to_collection.dart
PartyDonut 5578076fdb
chore: Move to different iconsax library (#301)
Co-authored-by: PartyDonut <PartyDonut@users.noreply.github.com>
2025-04-05 23:36:48 +02:00

169 lines
6.6 KiB
Dart

import 'package:flutter/material.dart';
import 'package:iconsax_plus/iconsax_plus.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:fladder/models/item_base_model.dart';
import 'package:fladder/providers/collections_provider.dart';
import 'package:fladder/screens/shared/adaptive_dialog.dart';
import 'package:fladder/screens/shared/fladder_snackbar.dart';
import 'package:fladder/screens/shared/outlined_text_field.dart';
import 'package:fladder/util/localization_helper.dart';
import 'package:fladder/widgets/shared/alert_content.dart';
import 'package:fladder/widgets/shared/modal_bottom_sheet.dart';
Future<void> addItemToCollection(BuildContext context, List<ItemBaseModel> item) {
return showDialogAdaptive(
context: context,
builder: (context) => AddToCollection(
items: item,
),
);
}
class AddToCollection extends ConsumerStatefulWidget {
final List<ItemBaseModel> items;
const AddToCollection({required this.items, super.key});
@override
ConsumerState<ConsumerStatefulWidget> createState() => _AddToCollectionState();
}
class _AddToCollectionState extends ConsumerState<AddToCollection> {
final TextEditingController controller = TextEditingController();
late final provider = collectionsProvider;
@override
void initState() {
super.initState();
Future.microtask(() => ref.read(provider.notifier).setItems(widget.items));
}
@override
Widget build(BuildContext context) {
final collectonOptions = ref.watch(provider);
return ActionContent(
title: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
if (widget.items.length == 1)
Text(
context.localized.addToCollection,
style: Theme.of(context).textTheme.titleLarge,
)
else
Text(
context.localized.addItemsToCollection(widget.items.length),
style: Theme.of(context).textTheme.titleLarge,
),
IconButton(
onPressed: () => ref.read(provider.notifier).setItems(widget.items),
icon: const Icon(IconsaxPlusLinear.refresh),
)
],
),
if (widget.items.length == 1) ItemBottomSheetPreview(item: widget.items.first),
],
),
child: Column(
children: [
Row(
children: [
Flexible(
child: OutlinedTextField(
label: context.localized.addToNewCollection,
controller: controller,
onChanged: (value) => setState(() {}),
),
),
const SizedBox(width: 32),
IconButton(
onPressed: controller.text.isNotEmpty
? () async {
await ref.read(provider.notifier).addToNewCollection(
name: controller.text,
);
setState(() => controller.text = '');
}
: null,
icon: const Icon(Icons.add_rounded)),
],
),
Flexible(
child: ListView(
shrinkWrap: true,
padding: const EdgeInsets.symmetric(vertical: 12),
children: [
...collectonOptions.collections.entries.map(
(e) {
if (e.value != null) {
return CheckboxListTile.adaptive(
title: Text(e.key.name),
value: e.value,
onChanged: (value) async {
final response = await ref
.read(provider.notifier)
.toggleCollection(boxSet: e.key, value: value == true, item: widget.items.first);
if (context.mounted) {
fladderSnackbar(context,
title: response.isSuccessful
? value == true
? context.localized.addedToCollection(e.key.name)
: context.localized.removedFromCollection(e.key.name)
: '${context.localized.somethingWentWrong} - (${response.statusCode}) - ${response.base.reasonPhrase}');
}
},
);
} else {
return Container(
margin: const EdgeInsets.all(8),
child: Card(
elevation: 0,
child: Padding(
padding: const EdgeInsets.all(8),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Expanded(
child: Text(
e.key.name,
style: Theme.of(context).textTheme.bodyLarge,
),
),
ElevatedButton(
onPressed: () async {
final response =
await ref.read(provider.notifier).addToCollection(boxSet: e.key, add: true);
if (context.mounted) {
fladderSnackbar(context,
title: response.isSuccessful
? context.localized.addedToCollection(e.key.name)
: '${context.localized.somethingWentWrong} - (${response.statusCode}) - ${response.base.reasonPhrase}');
}
},
child: Icon(Icons.add_rounded, color: Theme.of(context).colorScheme.primary),
),
],
),
),
),
);
}
},
),
],
),
),
],
),
actions: [
FilledButton(
onPressed: () => Navigator.of(context).pop(),
child: Text(context.localized.close),
)
],
);
}
}