Passed
Push — develop ( 7fa65f...4875bb )
by Paul
13:31
created

Block   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 80
Duplicated Lines 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
wmc 10
eloc 40
c 1
b 1
f 0
dl 0
loc 80
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A register() 0 6 1
A render() 0 16 4
A blockWrapperAttributes() 0 21 1
A blockClasses() 0 3 1
A hasVisibleFields() 0 3 1
A blockStyles() 0 3 1
A buildEmptyBlock() 0 7 1
1
<?php
2
3
namespace GeminiLabs\SiteReviews\Integrations\Gutenberg\Blocks;
4
5
use GeminiLabs\SiteReviews\Contracts\PluginContract;
6
use GeminiLabs\SiteReviews\Contracts\ShortcodeContract;
7
use GeminiLabs\SiteReviews\Helpers\Str;
8
use GeminiLabs\SiteReviews\Integrations\IntegrationShortcode;
9
use GeminiLabs\SiteReviews\Modules\Html\Builder;
10
use GeminiLabs\SiteReviews\Modules\Sanitizer;
11
12
abstract class Block
13
{
14
    use IntegrationShortcode;
15
16
    public function register(): void
17
    {
18
        $block = (new \ReflectionClass($this))->getShortName();
19
        $block = str_replace('_block', '', Str::snakeCase($block));
20
        register_block_type_from_metadata($this->app()->path("assets/blocks/{$block}"), [
21
            'render_callback' => [$this, 'render'],
22
        ]);
23
    }
24
25
    public function render(array $attributes): string
26
    {
27
        if ('edit' === filter_input(INPUT_GET, 'context')) {
28
            if (!$this->hasVisibleFields($attributes)) {
29
                return $this->buildEmptyBlock(
30
                    _x('You have hidden all of the fields for this block.', 'admin-text', 'site-reviews')
31
                );
32
            }
33
        }
34
        $rendered = $this->shortcodeInstance()->build($attributes, 'block', false); // do not wrap html
35
        if ('edit' === filter_input(INPUT_GET, 'context')) {
36
            return $rendered;
37
        }
38
        return $this->shortcodeInstance()->wrap(
39
            $rendered,
40
            $this->blockWrapperAttributes($attributes)
41
        );
42
    }
43
44
    protected function blockClasses(array $attributes): array
45
    {
46
        return [];
47
    }
48
49
    protected function blockStyles(array $attributes): array
50
    {
51
        return [];
52
    }
53
54
    protected function blockWrapperAttributes(array $attributes): array
55
    {
56
        $supports = \WP_Block_Supports::get_instance()->apply_block_supports();
57
        $blockClasses = glsr()->filterArray('block/classes',
58
            $this->blockClasses($attributes),
59
            $this
60
        );
61
        $blockStyles = glsr()->filterArray('block/styles',
62
            $this->blockStyles($attributes),
63
            $this
64
        );
65
        $extraClasses = array_diff(
66
            explode(' ', $supports['class'] ?? ''), // include
67
            explode(' ', $attributes['className'] ?? '') // exclude
68
        );
69
        $finalClasses = implode(' ', array_merge($blockClasses, $extraClasses));
70
        $finalStyles = implode('', array_merge($blockStyles, [$supports['style'] ?? '']));
71
        return array_filter([
72
            'class' => glsr(Sanitizer::class)->sanitizeAttrClass($finalClasses),
73
            'id' => glsr(Sanitizer::class)->sanitizeId($supports['id'] ?? ''),
74
            'style' => glsr(Sanitizer::class)->sanitizeAttrStyle($finalStyles),
75
        ]);
76
    }
77
78
    protected function buildEmptyBlock(string $text): string
79
    {
80
        return glsr(Builder::class)->div([
81
            'class' => 'block-editor-warning',
82
            'text' => glsr(Builder::class)->p([
83
                'class' => 'block-editor-warning__message',
84
                'text' => $text,
85
            ]),
86
        ]);
87
    }
88
89
    protected function hasVisibleFields(array $attributes): bool
90
    {
91
        return $this->shortcodeInstance()->hasVisibleFields($attributes);
92
    }
93
}
94