IAPBuilder -> IAPListTile

This commit is contained in:
Vadim 2023-09-11 23:02:37 +02:00
parent 3e8e9d9426
commit 483453f69a
5 changed files with 68 additions and 73 deletions

View file

@ -1,8 +1,7 @@
import 'package:flutter/material.dart';
import 'package:lightmeter/generated/l10n.dart';
import 'package:lightmeter/screens/settings/components/equipment/components/equipment_profiles/components/equipment_profile_screen/screen_equipment_profile.dart';
import 'package:lightmeter/screens/settings/components/shared/iap_builder/widget_builder_iap.dart';
import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart';
import 'package:lightmeter/screens/settings/components/shared/iap_list_tile/widget_list_tile_iap.dart';
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
class EquipmentProfilesListTile extends StatelessWidget {
@ -10,18 +9,14 @@ class EquipmentProfilesListTile extends StatelessWidget {
@override
Widget build(BuildContext context) {
return IAPBuilder(
builder: (context, status) => ListTile(
leading: const Icon(Icons.camera),
title: Text(S.of(context).equipmentProfiles),
onTap: status == IAPProductStatus.purchased
? () {
Navigator.of(context).push<EquipmentProfile>(
MaterialPageRoute(builder: (_) => const EquipmentProfilesScreen()),
);
}
: null,
),
return IAPListTile(
leading: const Icon(Icons.camera),
title: Text(S.of(context).equipmentProfiles),
onTap: () {
Navigator.of(context).push<EquipmentProfile>(
MaterialPageRoute(builder: (_) => const EquipmentProfilesScreen()),
);
},
);
}
}

View file

@ -2,36 +2,31 @@ import 'package:flutter/material.dart';
import 'package:lightmeter/data/models/film.dart';
import 'package:lightmeter/generated/l10n.dart';
import 'package:lightmeter/screens/settings/components/shared/dialog_filter/widget_dialog_filter.dart';
import 'package:lightmeter/screens/settings/components/shared/iap_builder/widget_builder_iap.dart';
import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart';
import 'package:lightmeter/screens/settings/components/shared/iap_list_tile/widget_list_tile_iap.dart';
class FilmsListTile extends StatelessWidget {
const FilmsListTile({super.key});
@override
Widget build(BuildContext context) {
return IAPBuilder(
builder: (context, status) => ListTile(
leading: const Icon(Icons.camera_roll),
title: Text(S.of(context).filmsInUse),
onTap: status == IAPProductStatus.purchased
? () {
showDialog<List<Film>>(
context: context,
builder: (_) => DialogFilter<Film>(
icon: const Icon(Icons.camera_roll),
title: S.of(context).filmsInUse,
description: S.of(context).filmsInUseDescription,
values: Film.values.sublist(1),
selectedValues: Film.values.sublist(1),
titleAdapter: (_, value) => value.name,
),
).then((values) {
if (values != null) {}
});
}
: null,
),
return IAPListTile(
leading: const Icon(Icons.camera_roll),
title: Text(S.of(context).filmsInUse),
onTap: () {
showDialog<List<Film>>(
context: context,
builder: (_) => DialogFilter<Film>(
icon: const Icon(Icons.camera_roll),
title: S.of(context).filmsInUse,
description: S.of(context).filmsInUseDescription,
values: Film.values.sublist(1),
selectedValues: Film.values.sublist(1),
titleAdapter: (_, value) => value.name,
),
).then((values) {
if (values != null) {}
});
},
);
}
}

View file

@ -1,26 +1,20 @@
import 'package:flutter/material.dart';
import 'package:lightmeter/generated/l10n.dart';
import 'package:lightmeter/screens/settings/components/equipment/components/equipment_profiles/widget_list_tile_equipment_profiles.dart';
import 'package:lightmeter/screens/settings/components/equipment/components/films/widget_list_tile_films.dart';
import 'package:lightmeter/screens/settings/components/shared/iap_builder/widget_builder_iap.dart';
import 'package:lightmeter/screens/settings/components/shared/settings_section/widget_settings_section.dart';
import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart';
class EquipmentSettingsSection extends StatelessWidget {
const EquipmentSettingsSection({super.key});
@override
Widget build(BuildContext context) {
return IAPBuilder(
builder: (context, status) {
return SettingsSection(
title: "Equipment",
children: const [
EquipmentProfilesListTile(),
FilmsListTile(),
],
enabled: status == IAPProductStatus.purchased,
);
},
return SettingsSection(
title: S.of(context).equipment,
children: const [
EquipmentProfilesListTile(),
FilmsListTile(),
],
);
}
}

View file

@ -1,22 +0,0 @@
import 'package:flutter/material.dart';
import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart';
class IAPBuilder extends StatelessWidget {
final IAPProductType product;
final Widget Function(BuildContext context, IAPProductStatus status) builder;
const IAPBuilder({
this.product = IAPProductType.paidFeatures,
required this.builder,
super.key,
});
@override
Widget build(BuildContext context) {
return builder(
context,
IAPProducts.productOf(context, IAPProductType.paidFeatures)?.status ??
IAPProductStatus.pending,
);
}
}

View file

@ -0,0 +1,33 @@
import 'package:flutter/material.dart';
import 'package:m3_lightmeter_iap/m3_lightmeter_iap.dart';
/// Depends on the product status and replaces [onTap] with purchase callback
/// if the product is purchasable.
class IAPListTile extends StatelessWidget {
final IAPProductType product;
final Icon leading;
final Text title;
final VoidCallback onTap;
const IAPListTile({
this.product = IAPProductType.paidFeatures,
required this.leading,
required this.title,
required this.onTap,
super.key,
});
@override
Widget build(BuildContext context) {
return ListTile(
leading: leading,
title: title,
onTap: switch (IAPProducts.productOf(context, product)?.status) {
IAPProductStatus.purchasable => () => IAPProductsProvider.of(context).buy(product),
IAPProductStatus.pending => null,
IAPProductStatus.purchased => onTap,
null => null,
},
);
}
}