403Webshell
Server IP : 192.158.238.246  /  Your IP : 18.191.54.249
Web Server : LiteSpeed
System : Linux uniform.iwebfusion.net 4.18.0-553.27.1.lve.1.el8.x86_64 #1 SMP Wed Nov 20 15:58:00 UTC 2024 x86_64
User : jenniferflocom ( 1321)
PHP Version : 8.1.32
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /proc/7779/root/proc/7779/cwd/plugins/give/src/DonationForms/ViewModels/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /proc/7779/root/proc/7779/cwd/plugins/give/src/DonationForms/ViewModels/DonationFormViewModel.php
<?php

namespace Give\DonationForms\ViewModels;

use Give\DonationForms\Actions\GenerateAuthUrl;
use Give\DonationForms\Actions\GenerateDonateRouteUrl;
use Give\DonationForms\Actions\GenerateDonationFormValidationRouteUrl;
use Give\DonationForms\DataTransferObjects\DonationFormGoalData;
use Give\DonationForms\DonationQuery;
use Give\DonationForms\Properties\FormSettings;
use Give\DonationForms\Repositories\DonationFormRepository;
use Give\DonationForms\ValueObjects\GoalType;
use Give\Framework\Blocks\BlockCollection;
use Give\Framework\DesignSystem\Actions\RegisterDesignSystemStyles;
use Give\Framework\FormDesigns\FormDesign;
use Give\Framework\FormDesigns\Registrars\FormDesignRegistrar;
use Give\Framework\Support\Scripts\Concerns\HasScriptAssetFile;
use Give\Helpers\Hooks;
use Give\Helpers\Language;

/**
 * @since 3.0.0
 */
class DonationFormViewModel
{
    use HasScriptAssetFile;

    /**
     * @var int
     */
    private $donationFormId;
    /**
     * @var BlockCollection
     */
    private $formBlocks;
    /**
     *
     * @var FormSettings
     */
    private $formSettings;
    /**
     * @var DonationFormRepository
     */
    private $donationFormRepository;
    /**
     * @var bool
     */
    private $previewMode;

    /**
     * @since 3.0.0
     */
    public function __construct(
        int $donationFormId,
        BlockCollection $formBlocks,
        FormSettings $formSettings,
        bool $previewMode = false
    ) {
        $this->donationFormId = $donationFormId;
        $this->formBlocks = $formBlocks;
        $this->formSettings = $formSettings;
        $this->donationFormRepository = give(DonationFormRepository::class);
        $this->previewMode = $previewMode;
    }

    /**
     * @since 3.0.0
     */
    public function designId(): string
    {
        return $this->formSettings->designId ?? '';
    }

    /**
     * @since 3.0.0
     */
    public function primaryColor(): string
    {
        return $this->formSettings->primaryColor ?? '';
    }

    /**
     * @since 3.0.0
     */
    public function secondaryColor(): string
    {
        return $this->formSettings->secondaryColor ?? '';
    }

    /**
     * @since 3.0.0
     */
    public function enqueueGlobalStyles()
    {
        (new RegisterDesignSystemStyles())();
        wp_enqueue_style('givewp-design-system-foundation');

        wp_register_style(
            'givewp-base-form-styles',
            GIVE_PLUGIN_URL . 'build/baseFormDesignCss.css'
        );

        wp_add_inline_style(
            'givewp-base-form-styles',
            ":root {
            --givewp-primary-color:{$this->primaryColor()};
            --givewp-secondary-color:{$this->secondaryColor()};
            }"
        );

        wp_enqueue_style('givewp-base-form-styles');
    }

    /**
     * @since 3.0.0
     */
    private function goalType(): GoalType
    {
        return $this->formSettings->goalType ?? GoalType::AMOUNT();
    }

    /**
     * @since 3.0.0
     */
    private function getTotalCountValue(GoalType $goalType): ?int
    {
        if ($goalType->isDonors()) {
            return $this->donationFormRepository->getTotalNumberOfDonors($this->donationFormId);
        }

        if ($goalType->isDonations() || $goalType->isAmount()) {
            return $this->donationFormRepository->getTotalNumberOfDonations($this->donationFormId);
        }

        if ($goalType->isSubscriptions() || $goalType->isAmountFromSubscriptions()) {
            return $this->donationFormRepository->getTotalNumberOfSubscriptions($this->donationFormId);
        }

        if ($goalType->isDonorsFromSubscriptions()) {
            return $this->donationFormRepository->getTotalNumberOfDonorsFromSubscriptions($this->donationFormId);
        }

        return 0;
    }

    /**
     * @since 3.0.0
     */
    private function getCountLabel(GoalType $goalType): ?string
    {
        if ($goalType->isDonors() || $goalType->isDonorsFromSubscriptions()) {
            return __('Donors', 'give');
        }

        if ($goalType->isDonations() || $goalType->isAmount()) {
            return __('Donations', 'give');
        }

        if ($goalType->isSubscriptions() || $goalType->isAmountFromSubscriptions()) {
            return __('Recurring Donations', 'give');
        }

        return __('Counted', 'give');
    }

    /**
     * @since 3.0.0
     */
    private function getTotalRevenue(GoalType $goalType)
    {
        if ($goalType->isAmountFromSubscriptions()) {
            return $this->donationFormRepository->getTotalInitialAmountFromSubscriptions($this->donationFormId);
        }

        return $this->donationFormRepository->getTotalRevenue($this->donationFormId);
    }

    /**
     * @since 3.0.0
     */
    private function formStatsData(): array
    {
        $goalType = $this->goalType();

        $donationQuery = (new DonationQuery)->form($this->donationFormId);

        if($this->formSettings->goalProgressType->isCustom()) {
            $donationQuery->between($this->formSettings->goalStartDate, $this->formSettings->goalEndDate);
        }

        return [
            'totalRevenue' => $donationQuery->sumIntendedAmount(),
            'totalCountValue' => $goalType->isDonations() || $goalType->isAmount()
                ? $donationQuery->count()
                : $this->getTotalCountValue($goalType),
            'totalCountLabel' => $this->getCountLabel($goalType),
        ];
    }

    /**
     * @since 3.6.0 added includeHeaderInMultiStep to form design export
     * @since 3.0.0
     */
    public function exports(): array
    {
        $donateUrl = (new GenerateDonateRouteUrl())();
        $validateUrl = (new GenerateDonationFormValidationRouteUrl())();
        $authUrl = (new GenerateAuthUrl())();
        $donationFormGoalData = new DonationFormGoalData($this->donationFormId, $this->formSettings);

        $formDataGateways = $this->donationFormRepository->getFormDataGateways($this->donationFormId);
        $formApi = $this->donationFormRepository->getFormSchemaFromBlocks(
            $this->donationFormId,
            $this->formBlocks
        );

        $formDesign = $this->getFormDesign($this->designId());

        return [
            'donateUrl' => $donateUrl,
            'validateUrl' => $validateUrl,
            'authUrl' => $authUrl,
            'inlineRedirectRoutes' => [
                'donation-confirmation-receipt-view',
            ],
            'registeredGateways' => $formDataGateways,
            'form' => array_merge($formApi->jsonSerialize(), [
                'settings' => $this->formSettings,
                'currency' => $formApi->getDefaultCurrency(),
                'goal' => $donationFormGoalData->toArray(),
                'stats' => $this->formStatsData(),
                'design' => $formDesign ? [
                    'id' => $formDesign::id(),
                    'name' => $formDesign::name(),
                    'isMultiStep' => $formDesign->isMultiStep(),
                    'includeHeaderInMultiStep' => $formDesign->shouldIncludeHeaderInMultiStep(),
                ] : null,
            ]),
            'previewMode' => $this->previewMode,
        ];
    }

    /**
     * This is the order of loading:
     * 1. Enqueue global styles from WP.
     *  - This ensures template compatability with global WP css variables as needed. Loads before our templates, so they can use things like global font-family, etc.
     * 2. Enqueue our donation form specific scripts & styles.
     *  - We will let WP handle the actual printing depending on how they were enqueued.
     * 3. Call the specific WP functions wp_print_styles() and wp_print_head_scripts()
     *  - This will only print the styles and scripts that are enqueued within our route - so we don't have to dequeue a bunch of stuff.
     * 4. Manually echo our window data and root div for our React app to consume
     * 5. Finally, call the specific WP function wp_print_footer_scripts()
     *  - This will only print the footer scripts that are enqueued within our route.
     *
     * @since 3.11.0 Sanitize customCSS property
     * @since 3.0.0
     */
    public function render(): string
    {
        $this->enqueueGlobalStyles();

        $this->enqueueFormScripts(
            $this->donationFormId,
            $this->designId()
        );

        ob_start();
        wp_print_styles();
        wp_print_head_scripts();
        ?>

        <?php
        if ($this->previewMode || $this->formSettings->customCss): ?>
            <style id="root-givewp-donation-form-style"><?php
                echo wp_strip_all_tags($this->formSettings->customCss); ?></style>
        <?php
        endif; ?>

        <?php
        $classNames = ['givewp-donation-form'];

        if ($this->previewMode) {
            $classNames[] = 'givewp-donation-form--preview';
        }
        ?>

        <div data-theme="light" id="root-givewp-donation-form"
             data-iframe-height
             class="<?= implode(' ', $classNames) ?>"></div>

        <?php
        wp_print_footer_scripts();

        echo ob_get_clean();

        exit();
    }

    /**
     * Loads scripts in order: [Registrars, Designs, Gateways, Block]
     *
     * @since 3.0.0
     *
     * @return void
     */
    private function enqueueFormScripts(int $formId, string $formDesignId)
    {
        $this->enqueueRegistrars();
        $this->enqueueDesign($formDesignId);
        $this->enqueueGateways($formId);
        $this->enqueueFormApp();
    }

    /**
     * @since 3.0.0
     *
     * @return FormDesign|null
     */
    protected function getFormDesign(string $designId)
    {
        /** @var FormDesignRegistrar $formDesignRegistrar */
        $formDesignRegistrar = give(FormDesignRegistrar::class);

        return $formDesignRegistrar->hasDesign($this->designId()) ? $formDesignRegistrar->getDesign($designId) : null;
    }

    /**
     * @since 3.0.0
     */
    private function enqueueRegistrars()
    {
        wp_enqueue_style(
            'givewp-donation-form-registrars',
            GIVE_PLUGIN_URL . 'build/donationFormRegistrars.css',
            [],
            GIVE_VERSION
        );

        $handle = 'givewp-donation-form-registrars';
        wp_enqueue_script(
            $handle,
            GIVE_PLUGIN_URL . 'build/donationFormRegistrars.js',
            $this->getScriptAssetDependencies(GIVE_PLUGIN_DIR . 'build/donationFormRegistrars.asset.php'),
            GIVE_VERSION,
            true
        );

        Language::setScriptTranslations($handle);

        wp_add_inline_script(
            'givewp-donation-form-registrars',
            'window.givewpDonationFormExports = ' . wp_json_encode($this->exports()) . ';',
            'before'
        );

        Hooks::doAction('givewp_donation_form_enqueue_scripts');
    }

    /**
     * @since 3.0.0
     */
    private function enqueueGateways(int $formId)
    {
        /** @var DonationFormRepository $donationFormRepository */
        $donationFormRepository = give(DonationFormRepository::class);

        // load gateway scripts
        foreach ($donationFormRepository->getEnabledPaymentGateways($formId) as $gateway) {
            if (method_exists($gateway, 'enqueueScript')) {
                $gateway->enqueueScript($formId);
            }
        }
    }

    /**
     * @since 3.0.0 Set script translations
     * @since 3.0.0
     */
    private function enqueueDesign(string $formDesignId)
    {
        $design = $this->getFormDesign($formDesignId);

        // silently fail if design is missing for some reason
        if ($design) {
            if ($design->css()) {
                wp_enqueue_style('givewp-form-design-' . $design::id(), $design->css());
            }

            if ($design->js()) {
                $handle = 'givewp-form-design-' . $design::id();
                wp_enqueue_script(
                    $handle,
                    $design->js(),
                    array_merge(
                        $design->dependencies(),
                        ['givewp-donation-form-registrars']
                    ),
                    true
                );

                Language::setScriptTranslations($handle);
            }
        }
    }

    /**
     * @since 3.0.0
     */
    private function enqueueFormApp()
    {
        // load block - since this is using render_callback viewScript in blocks.json will not work.
        $handle = 'givewp-donation-form-app';
        wp_enqueue_script(
            $handle,
            GIVE_PLUGIN_URL . 'build/donationFormApp.js',
            array_merge(
                $this->getScriptAssetDependencies(GIVE_PLUGIN_DIR . 'build/donationFormApp.asset.php'),
                ['givewp-donation-form-registrars']
            ),
            GIVE_VERSION,
            true
        );

        Language::setScriptTranslations($handle);

        /**
         * Load iframeResizer.contentWindow.min.js inside iframe
         *
         * @see https://github.com/davidjbradshaw/iframe-resizer
         */
        $handle = 'givewp-donation-form-embed-inside';
        wp_enqueue_script(
            $handle,
            GIVE_PLUGIN_URL . 'build/donationFormEmbedInside.js',
            [],
            GIVE_VERSION,
            true
        );

        Language::setScriptTranslations($handle);
    }

    /**
     * @since 3.4.0
     */
    private function updateDesignSettingsClassNames(array &$classNames)
    {
        if ($this->formSettings->designSettingsImageUrl) {
            $classNames[] = 'givewp-design-settings--image';
            $classNames[] = 'givewp-design-settings--image-style__' . $this->formSettings->designSettingsImageStyle;
        }

        if ($this->formSettings->designSettingsLogoUrl) {
            $classNames[] = 'givewp-design-settings--logo';
            $classNames[] = 'givewp-design-settings--logo-position__' . $this->formSettings->designSettingsLogoPosition;
        }

        $classNames[] = 'givewp-design-settings--section-style__' . $this->formSettings->designSettingsSectionStyle;

        $classNames[] = 'givewp-design-settings--textField-style__' . $this->formSettings->designSettingsTextFieldStyle;
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit