cancelSubscription method

  1. @override
Future<void> cancelSubscription()
override

Implementation

@override
Future<void> cancelSubscription() async {
  AppConfig.logger.d("Cancelling Subscription");

  try {
    final subscription = userServiceImpl.userSubscription;
    if (subscription == null || subscription.subscriptionId.isEmpty) return;

    final planName = subscription.level?.name ?? '';
    final periodEndSeconds = await Sint.find<StripeApiService>().cancelSubscription(subscription.subscriptionId);

    if (periodEndSeconds > 0) {
      // Stripe will keep the subscription active until period end
      final endDateMs = periodEndSeconds * 1000;
      subscription.endDate = endDateMs;

      // Store scheduled cancellation in Firestore (keeps status active until end date)
      UserSubscriptionFirestore().scheduleCancellation(subscription.subscriptionId, endDateMs);

      final endDate = DateTime.fromMillisecondsSinceEpoch(endDateMs);
      final formattedDate = '${endDate.day}/${endDate.month}/${endDate.year}';

      AppConfig.logger.i('Subscription $planName scheduled to cancel on $formattedDate');

      Sint.snackbar(
        'cancellationScheduled'.tr,
        'subscriptionActiveUntil'.tr
            .replaceAll('@plan', planName)
            .replaceAll('@date', formattedDate),
        snackPosition: SnackPosition.bottom,
        duration: const Duration(seconds: 5),
      );
    } else {
      AppConfig.logger.e('Failed to cancel subscription with Stripe');
      Sint.snackbar(
        'error'.tr,
        'cancellationError'.tr,
        snackPosition: SnackPosition.bottom,
      );
    }
  } catch (e, st) {
    NeomErrorLogger.recordError(e, st, module: 'neom_core', operation: 'cancelSubscription');
  }

  update();
}