load(['blocks' => fn ($q) => $q->orderBy('sort_order')]); $pageState = $this->resolvePageState($publicPage); $blocksToRender = $this->filterBlocksForPageState($publicPage, $pageState); $subscriberCount = $publicPage->subscribers()->count(); $title = $publicPage->headlineForMeta(); return view('public.page', [ 'page' => $publicPage, 'pageState' => $pageState, 'blocksToRender' => $blocksToRender, 'subscriberCount' => $subscriberCount, 'title' => $title, ]); } public function subscribe(SubscribePublicPageRequest $request, PreregistrationPage $publicPage): JsonResponse { abort_if(now()->lt($publicPage->start_date) || now()->gt($publicPage->end_date), 403); $validated = $request->validated(); $exists = $publicPage->subscribers() ->where('email', $validated['email']) ->exists(); if ($exists) { return response()->json([ 'success' => false, 'message' => __('You are already registered for this event.'), ], 422); } $this->registerSubscriberOnPage->storeAndQueueIntegrations($publicPage, $validated); return response()->json([ 'success' => true, 'message' => $publicPage->thank_you_message ?? __('Thank you for registering!'), ]); } private function resolvePageState(PreregistrationPage $page): string { if ($page->isBeforeStart()) { return 'countdown'; } if ($page->isExpired()) { return 'expired'; } return 'active'; } /** * @return Collection */ private function filterBlocksForPageState(PreregistrationPage $page, string $pageState): Collection { return $page->visibleBlocks() ->orderBy('sort_order') ->get() ->filter(function (PageBlock $block) use ($pageState): bool { return match ($pageState) { 'countdown' => in_array($block->type, ['hero', 'countdown', 'image'], true), 'expired' => in_array($block->type, ['hero', 'image', 'cta_banner'], true), default => true, }; }) ->values(); } }