diff --git a/lib/app/components/counter_items_footer/post_token_button.dart b/lib/app/components/counter_items_footer/post_token_button.dart index 69def18d97..e7732d6590 100644 --- a/lib/app/components/counter_items_footer/post_token_button.dart +++ b/lib/app/components/counter_items_footer/post_token_button.dart @@ -4,19 +4,17 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:ion/app/extensions/extensions.dart'; import 'package:ion/app/features/feed/providers/ion_connect_entity_with_counters_provider.r.dart'; +import 'package:ion/app/features/feed/providers/token_creation_availability_provider.r.dart'; import 'package:ion/app/features/feed/views/pages/token_creation_not_available_modal/token_creation_not_available_modal.dart'; import 'package:ion/app/features/ion_connect/model/event_reference.f.dart'; import 'package:ion/app/features/ion_connect/model/ion_connect_entity.dart'; import 'package:ion/app/features/ion_connect/providers/ion_connect_entity_provider.r.dart'; import 'package:ion/app/features/tokenized_communities/models/entities/community_token_action.f.dart'; import 'package:ion/app/features/tokenized_communities/models/entities/community_token_definition.f.dart'; -import 'package:ion/app/features/tokenized_communities/providers/community_token_definition_provider.r.dart'; import 'package:ion/app/features/tokenized_communities/providers/token_action_first_buy_provider.r.dart'; import 'package:ion/app/features/tokenized_communities/providers/token_market_info_provider.r.dart'; import 'package:ion/app/features/tokenized_communities/utils/external_address_extension.dart'; import 'package:ion/app/features/tokenized_communities/utils/position_formatters.dart'; -import 'package:ion/app/features/user/extensions/user_metadata.dart'; -import 'package:ion/app/features/user/providers/user_metadata_provider.r.dart'; import 'package:ion/app/router/app_routes.gr.dart'; import 'package:ion/app/router/utils/show_simple_bottom_sheet.dart'; import 'package:ion/generated/assets.gen.dart'; @@ -140,23 +138,14 @@ class _ContentEntityButton extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final eventReference = entity.toEventReference(); - final ownerHasBscWallet = ref - .watch( - userMetadataProvider(eventReference.masterPubkey) - .select((e) => e.valueOrNull?.hasBscWallet), - ) - .falseOrValue; - final hasTokenDefinition = ref - .watch(ionConnectEntityHasTokenDefinitionProvider(eventReference: eventReference)) - .valueOrNull - .falseOrValue; + final isTokenCreationAvailable = ref.watch( + tokenCreationAvailabilityProvider(entity: entity), + ); final hasToken = ref .watch(ionConnectEntityHasTokenProvider(eventReference: eventReference)) .valueOrNull .falseOrValue; - final isTokenCreationAvailable = ownerHasBscWallet && hasTokenDefinition; - final externalAddressType = entity.externalAddressType; return _TokenAvailability( diff --git a/lib/app/features/feed/providers/token_creation_availability_provider.r.dart b/lib/app/features/feed/providers/token_creation_availability_provider.r.dart new file mode 100644 index 0000000000..395d8455bc --- /dev/null +++ b/lib/app/features/feed/providers/token_creation_availability_provider.r.dart @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: ice License 1.0 + +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:ion/app/extensions/bool.dart'; +import 'package:ion/app/features/ion_connect/model/ion_connect_entity.dart'; +import 'package:ion/app/features/user/extensions/user_metadata.dart'; +import 'package:ion/app/features/user/providers/user_metadata_provider.r.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'token_creation_availability_provider.r.g.dart'; + +@riverpod +bool tokenCreationAvailability( + Ref ref, { + required IonConnectEntity entity, +}) { + final eventReference = entity.toEventReference(); + final userMetadata = ref.watch(userMetadataProvider(eventReference.masterPubkey)); + final ownerHasBscWallet = (userMetadata.valueOrNull?.hasBscWallet).falseOrValue; + + // TODO: Get tokenized communities release timestamp from Remote Config and compare with entity.publishedTimestamp. + const isPublishedAfterTcRelease = true; + + return ownerHasBscWallet && isPublishedAfterTcRelease; +} diff --git a/lib/app/features/tokenized_communities/utils/external_address_extension.dart b/lib/app/features/tokenized_communities/utils/external_address_extension.dart index 886a62f5f6..ebec09aeed 100644 --- a/lib/app/features/tokenized_communities/utils/external_address_extension.dart +++ b/lib/app/features/tokenized_communities/utils/external_address_extension.dart @@ -59,4 +59,15 @@ extension ExternalAddressExtension on IonConnectEntity { _ => null, }; } + + /// Returns the published timestamp for posts, comments, and articles. + /// Returns null for entities that don't have a published timestamp. + int? get publishedTimestamp { + return switch (this) { + ModifiablePostEntity(:final data) => data.publishedAt.value, + PostEntity() => createdAt, + ArticleEntity(:final data) => data.publishedAt.value, + _ => null, + }; + } }