updateMonetizationSettings method

  1. @override
Future<void> updateMonetizationSettings({
  1. UserId? userId,
  2. bool? donationsEnabled,
  3. Sum? donationsMinimum,
})
override

Updates MonetizationSettings of the authenticated MyUser.

If the userId argument is specified, then MonetizationSettings will be updated individually for that User. Otherwise, common MonetizationSettings are updated, affecting all Users. Naturally, individual MonetizationSettings take precedence over common MonetizationSettings.

Implementation

@override
Future<void> updateMonetizationSettings({
  UserId? userId,
  bool? donationsEnabled,
  Sum? donationsMinimum,
}) async {
  Log.debug(
    'updateMonetizationSettings(userId: $userId, donationsEnabled: $donationsEnabled, donationsMinimum: $donationsMinimum)',
    '$runtimeType',
  );

  final bool hasAny = donationsEnabled != null || donationsMinimum != null;

  if (userId != null) {
    final Rx<MonetizationSettings>? existing = individual[userId];

    // If any setting is provided, then apply the [MonetizationSettings].
    if (hasAny) {
      final settings = MonetizationSettings(
        createdAt: PreciseDateTime.now(),
        donation: MonetizationSettingsDonation(
          enabled: donationsEnabled ?? true,
          min: Price.xxx(donationsMinimum?.val ?? 1),
        ),
      );

      if (existing != null) {
        existing.value = settings;
      } else {
        individual[userId] = Rx(settings);
      }
    }
    // Otherwise remove the applied settings, if any.
    else {
      individual.remove(userId);
      paginated.remove(userId);
    }
  }

  final mixin = await _graphQlProvider.updateMonetizationSettings(
    userId: userId,
    settings: MonetizationSettingsInput(
      donation: MonetizationSettingsDonationInput(
        // `null` provided in the `new` argument resets the settings to use
        // the default one set by [MyUser].
        kw$new: donationsEnabled == null && donationsMinimum == null
            ? null
            : MonetizationSettingsDonationSettingsInput(
                enabled:
                    donationsEnabled ??
                    settings.value.donation?.enabled ??
                    true,
                min:
                    donationsMinimum ??
                    settings.value.donation?.min.sum ??
                    Sum(1),
              ),
      ),
    ),
  );

  if (mixin != null) {
    final events = MonetizationSettingsEventsEvent(
      MonetizationSettingsEventsVersioned(
        mixin.events.map(_decodeMonetizationSettingsEvent).toList(),
        mixin.ver,
        mixin.listVer,
      ),
    );

    if (userId == null) {
      _myMonetizationSettingsEvent(events);
    } else {
      _monetizationSettingsEvent(events, userId);
    }
  }
}