Test Failed
Push — develop ( baed09...43d041 )
by Paul
08:56
created

Controller::filterSettingsCallback()   B

Complexity

Conditions 9
Paths 12

Size

Total Lines 44
Code Lines 33

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 33
c 1
b 0
f 1
dl 0
loc 44
rs 8.0555
cc 9
nc 12
nop 2
1
<?php
2
3
namespace GeminiLabs\SiteReviews\Integrations\UltimateMember\Controllers;
4
5
use GeminiLabs\SiteReviews\Controllers\AbstractController;
6
use GeminiLabs\SiteReviews\Gatekeeper;
7
use GeminiLabs\SiteReviews\Helpers\Arr;
8
use GeminiLabs\SiteReviews\Modules\Html\Template;
9
use GeminiLabs\SiteReviews\Review;
10
11
class Controller extends AbstractController
12
{
13
    /**
14
     * @filter site-reviews/avatar/generate
15
     */
16
    public function filterAvatarUrl(string $url, Review $review): string
17
    {
18
        $type = glsr_get_option('reviews.avatars_fallback');
19
        $defaultUrl = um_get_default_avatar_uri();
20
        if ('none' === $type && !$review->author_id) {
21
            return $defaultUrl;
22
        }
23
        if ('none' !== $type && $url === $defaultUrl) {
24
            return '';
25
        }
26
        return $url;
27
    }
28
29
    /**
30
     * @filter site-reviews/enqueue/public/inline-styles
31
     */
32
    public function filterInlineStyles(string $css): string
33
    {
34
        if (glsr_get_option('integrations.ultimatemember.display_directory_ratings', false, 'bool')) {
35
            $css .= '.um-directory .um-members-grid .um-member-rating:has(.glsr-star-rating) {display:flex; justify-content:center;}';
36
            $css .= '.um-directory .um-members-list .um-member-rating:has(.glsr-star-rating) {display:flex;}';
37
            $css .= '.um-directory .glsr-star-rating {margin:3px 0;}';
38
        }
39
        if (glsr_get_option('integrations.ultimatemember.display_reviews_tab', false, 'bool')) {
40
            $css .= '.um-reviews-summary .glsr-summary-text {--glsr-summary-text: var(--glsr-text-base);}';
41
            $css .= '.um-reviews-summary {padding-top:var(--glsr-gap-lg); padding-bottom:var(--glsr-gap-xl);}';
42
            $css .= '.um-reviews-form:has(div) {border-top: 3px solid #eee; padding:var(--glsr-gap-xl) 0;}';
43
            $css .= '.um-reviews-reviews:has(.glsr-reviews) {border-top: 3px solid #eee; padding-top:var(--glsr-gap-xl);}';
44
        }
45
        if (glsr_get_option('integrations.ultimatemember.display_account_tab', false, 'bool')) {
46
            $css .= '.um-form:has(#_um_account_tab[value="reviews"]) .um-account-main {max-width:none;}';
47
        }
48
        return $css;
49
    }
50
51
    /**
52
     * @filter site-reviews/assigned_users/profile_id
53
     */
54
    public function filterProfileId(int $profileId): int
55
    {
56
        if (empty($profileId)) {
57
            return (int) um_get_requested_user();
58
        }
59
        return $profileId;
60
    }
61
62
    /**
63
     * @filter site-reviews/settings
64
     */
65
    public function filterSettings(array $settings): array
66
    {
67
        return array_merge(glsr()->config('integrations/ultimatemember'), $settings);
68
    }
69
70
    /**
71
     * @filter site-reviews/settings/sanitize
72
     */
73
    public function filterSettingsCallback(array $settings, array $input): array
74
    {
75
        $enabled = Arr::get($input, 'settings.integrations.ultimatemember.enabled');
76
        if ('yes' === $enabled && !$this->gatekeeper()->allows()) { // this renders any error notices
77
            $settings = Arr::set($settings, 'settings.integrations.ultimatemember.enabled', 'no');
78
        }
79
        $shortcodes = [
80
            'account_tab_reviews' => 'site_reviews',
81
            'form' => 'site_reviews_form',
82
            'reviews' => 'site_reviews',
83
            'summary' => 'site_reviews_summary',
84
        ];
85
        foreach ($shortcodes as $settingKey => $shortcode) {
86
            $path = "settings.integrations.ultimatemember.{$settingKey}";
87
            $value = Arr::get($input, $path);
88
            $pattern = get_shortcode_regex([$shortcode]);
89
            $normalizedValue = preg_replace_callback("/$pattern/", function ($match) use ($settingKey) {
90
                $atts = shortcode_parse_atts($match[3]);
91
                if (str_starts_with($settingKey, 'account')) {
92
                    $atts['author'] = 'user_id';
93
                } elseif (str_starts_with($settingKey, 'profile')) {
94
                    $atts['assigned_users'] = 'profile_id';
95
                }
96
                ksort($atts);
97
                $attributes = [];
98
                foreach ($atts as $key => $val) {
99
                    $attributes[] = sprintf('%s="%s"', $key, esc_attr($val));
100
                }
101
                $attributes = implode(' ', $attributes);
102
                return "[{$match[2]} {$attributes}]";
103
            }, $value);
104
            $settings = Arr::set($settings, $path, $normalizedValue);
105
        }
106
        foreach (['display_account_tab', 'enabled'] as $key) {
107
            $old = glsr_get_option("settings.integrations.ultimatemember.{$key}");
108
            $new = Arr::get($settings, "settings.integrations.ultimatemember.{$key}");
109
            if ($new !== $old) {
110
                // This is a simpler way to force rewrite rules to be recreated
111
                // instead of using flush_rewrite_rules().
112
                delete_option('rewrite_rules');
113
                break;
114
            }
115
        }
116
        return $settings;
117
    }
118
119
    /**
120
     * @filter site-reviews/integration/subsubsub
121
     */
122
    public function filterSubsubsub(array $subsubsub): array
123
    {
124
        $subsubsub['ultimatemember'] = 'Ultimate Member';
125
        return $subsubsub;
126
    }
127
128
    /**
129
     * @action admin_init
130
     */
131
    public function renderNotice(): void
132
    {
133
        if (glsr_get_option('integrations.ultimatemember.enabled', false, 'bool')) {
134
            $this->gatekeeper()->allows(); // this renders any error notices
135
        }
136
    }
137
138
    /**
139
     * @action site-reviews/settings/ultimatemember
140
     */
141
    public function renderSettings(string $rows): void
142
    {
143
        glsr(Template::class)->render('integrations/ultimatemember/settings', [
144
            'context' => [
145
                'rows' => $rows,
146
            ],
147
        ]);
148
    }
149
150
    protected function gatekeeper(): Gatekeeper
151
    {
152
        return new Gatekeeper([
153
            'ultimate-member/ultimate-member.php' => [
154
                'minimum_version' => '2.5',
155
                'name' => 'Ultimate Member',
156
                'plugin_uri' => 'https://wordpress.org/plugins/ultimate-member/',
157
                'untested_version' => '3.0',
158
            ],
159
        ]);
160
    }
161
}
162