96 lines
2.9 KiB
PHP
96 lines
2.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Http\Requests\SubscribePublicPageRequest;
|
|
use App\Jobs\SyncSubscriberToMailwizz;
|
|
use App\Models\PageBlock;
|
|
use App\Models\PreregistrationPage;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Support\Collection;
|
|
use Illuminate\View\View;
|
|
|
|
class PublicPageController extends Controller
|
|
{
|
|
public function show(PreregistrationPage $publicPage): View
|
|
{
|
|
$publicPage->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);
|
|
}
|
|
|
|
$subscriber = $publicPage->subscribers()->create($validated);
|
|
|
|
if ($publicPage->mailwizzConfig !== null) {
|
|
SyncSubscriberToMailwizz::dispatch($subscriber);
|
|
}
|
|
|
|
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<int, PageBlock>
|
|
*/
|
|
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();
|
|
}
|
|
}
|