HEX
Server: LiteSpeed
System: Linux s1049.use1.mysecurecloudhost.com 4.18.0-477.27.2.lve.el8.x86_64 #1 SMP Wed Oct 11 12:32:56 UTC 2023 x86_64
User: xedaptot (3356)
PHP: 8.3.31
Disabled: NONE
Upload Files
File: /home/xedaptot/be.naniguide.com/app/Library/MailListTemplateTagResolver.php
<?php

namespace App\Library;

use App\Library\Contracts\TagResolverInterface;
use App\Model\MailListTemplate;
use App\Model\Subscriber;
use Carbon\Carbon;

/**
 * Resolves page-context tags for sign-up / profile-update / unsubscribe pages
 * rendered from a {@see MailListTemplate}.
 *
 * Companion to existing TagResolverInterface implementations:
 *  - GeneralTagResolver        — current_year / current_date / etc.
 *  - MailList                  — list.* (name, uid, from_email, from_name)
 *  - Subscriber                — subscriber.<field>, email, name, first_name, ...
 *
 * This resolver supplies what only the page context can know:
 *  page_title, fields (rendered form), email_field, the four buttons,
 *  subscribe_url, current_date (customer-localized override),
 *  plus subscriber-flow URLs (subscribe_confirm_url, unsubscribe_url,
 *  update_profile_url, subscriber_summary). When no subscriber is bound
 *  the same keys render with preview placeholders.
 */
class MailListTemplateTagResolver implements TagResolverInterface
{
    public function __construct(
        private MailListTemplate $template,
        private mixed $values = null,
        private ?Subscriber $subscriber = null,
        private ?string $messageId = null,
    ) {
    }

    public function getResolvedTags(): array
    {
        $list = $this->template->mailList;

        $tags = [
            'page_title' => trans('messages.' . $this->template->alias),
            'fields' => view('pub.mail_lists._subscribe_form', [
                'list' => $list,
                'is_page' => true,
                'col' => '12',
                'values' => $this->values,
                'email_readonly' => true,
            ])->render(),
            'subscribe_button' => '<button class="btn btn-info bg-teal-800" type="submit">' . trans('messages.subscribe') . ' <span class="material-symbols-rounded">east</span></button>',
            'email_field' => view('helpers.form_control', [
                'type' => 'text',
                'name' => 'EMAIL',
                'label' => trans('messages.email_address'),
                'value' => '',
                'rules' => $list->getFieldRules(),
            ])->render(),
            'unsubscribe_button' => '<button class="btn btn-info bg-teal-800" type="submit">' . trans('messages.unsubscribe') . ' <span class="material-symbols-rounded">east</span></button>',
            'update_profile_button' => '<button class="btn btn-info bg-teal-800" type="submit">' . trans('messages.update_profile') . ' <span class="material-symbols-rounded">east</span></button>',
            'subscribe_url' => action(
                'Pub\MailListController@signUpForm',
                ['list_uid' => $list->uid, 'customer_uid' => $list->customer->uid],
                true
            ),
            // Override GeneralTagResolver's ISO current_date with the customer-localized format
            'current_date' => $list->customer->formatDateTime(Carbon::now(), 'date_without_year'),
        ];

        return array_merge(
            $tags,
            $this->subscriber ? $this->subscriberFlowTags() : $this->previewFlowTags()
        );
    }

    private function subscriberFlowTags(): array
    {
        $list = $this->template->mailList;
        $subscriberService = app(\App\Services\SubscriberService::class);

        return [
            'subscribe_confirm_url' => $subscriberService->generateSignedConfirmationUrl($this->subscriber),
            'subscriber_summary' => view('subscribers._summary', [
                'list' => $list,
                'subscriber' => $this->subscriber,
            ])->render(),
            'update_profile_url' => action(
                'Pub\MailListController@profileUpdateForm',
                ['list_uid' => $list->uid, 'id' => $this->subscriber->id, 'customer_uid' => $list->customer->uid],
                true
            ),
            'unsubscribe_url' => $this->subscriber->generateUnsubscribeFormUrl($this->messageId),
        ];
    }

    private function previewFlowTags(): array
    {
        return [
            'subscribe_confirm_url' => '<a href="http://domain.example/secure_token">http://domain.example/secure_token</a>',
            'subscriber_summary' => '<p><strong>' . trans('messages.email') . ':</strong></p>'
                . '<p><strong>' . trans('messages.first_name') . ':</strong></p>'
                . '<p><strong>' . trans('messages.last_name') . ':</strong></p>',
            'update_profile_url' => 'http://domain.example/secure_token',
            'unsubscribe_url' => 'http://domain.example/secure_token',
        ];
    }
}