final class HolidayCampaignProvider extends ChangeNotifier {
HolidayCampaignProvider({required this.engine});
final PresentumEngine<HolidayItem, AppSurface, AppVariant> engine;
Future<void> syncNewYearCampaign() async {
final payload = HolidayPayload(
id: 'holiday:new_year_2026',
priority: 100,
metadata: {
'title': 'Happy New Year!',
'subtitle': 'Wishing you a year full of wins ✨',
// Scheduling window (UTC ISO)
'startsAt': '2025-12-31T18:00:00Z',
'endsAt': '2026-01-03T23:59:59Z',
},
options: const [
HolidayOption(
surface: AppSurface.homeHeader,
variant: AppVariant.snowyBanner,
isDismissible: true,
maxImpressions: 3,
cooldownMinutes: 12 * 60,
alwaysOnIfEligible: true,
),
HolidayOption(
surface: AppSurface.popup,
variant: AppVariant.fullscreenGreeting,
isDismissible: true,
stage: 0,
maxImpressions: 1,
cooldownMinutes: 24 * 60,
alwaysOnIfEligible: false,
),
],
);
final items = payload.options
.map((opt) => HolidayItem(payload: payload, option: opt))
.toList(growable: false);
await engine.setCandidatesWithDiff((state) => items);
notifyListeners();
}
}