Skip to content
Snippets Groups Projects
VueApp.php 2.72 KiB
Newer Older
Jan-Hendrik Willms's avatar
wip
Jan-Hendrik Willms committed
<?php
namespace Studip;

Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
use Flexi\Template;
use Stringable;

final class VueApp implements Stringable
Jan-Hendrik Willms's avatar
wip
Jan-Hendrik Willms committed
{
    public static function create(string $base_component): VueApp
Jan-Hendrik Willms's avatar
wip
Jan-Hendrik Willms committed
    {
        return new self($base_component);
Jan-Hendrik Willms's avatar
wip
Jan-Hendrik Willms committed
    }

Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
    private array $components = [];
    private array $props = [];
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
    private array $stores = [];
    private array $storeData = [];
Jan-Hendrik Willms's avatar
wip
Jan-Hendrik Willms committed

    private function __construct(private readonly string $base_component) {
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
    }

    public function withComponents(string ...$components): VueApp
    {
        $clone = clone $this;
        foreach ($components as $component) {
            $clone = $clone->withAddedComponent($component);
        }
        return $clone;
    }

    public function withAddedComponent(string $component): VueApp
    {
        $clone = clone $this;
        if (!in_array($component, $clone->components)) {
            $clone->components[] = $component;
        }
        return $clone;
Jan-Hendrik Willms's avatar
wip
Jan-Hendrik Willms committed
    }

    public function getBaseComponent(): string
    {
        return $this->base_component;
    }

    public function withProps(array $props): VueApp
    {
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
        $clone = clone $this;
        $clone->props = $props;
        return $clone;
Jan-Hendrik Willms's avatar
wip
Jan-Hendrik Willms committed
    }

    public function getProps(): array
    {
        return $this->props;
    }

Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
    public function withStore(?string $store, ?string $index = null, ?array $data = null): VueApp
Jan-Hendrik Willms's avatar
wip
Jan-Hendrik Willms committed
    {
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
        $clone = clone $this;
Jan-Hendrik Willms's avatar
wip
Jan-Hendrik Willms committed

Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
        $clone->stores[$index ?? $store] = $store;

        if ($data !== null) {
            $clone->storeData[$index ?? $store] = $data;
        }

        return $clone;
Jan-Hendrik Willms's avatar
wip
Jan-Hendrik Willms committed
    }

Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
    public function getStores(): array
Jan-Hendrik Willms's avatar
wip
Jan-Hendrik Willms committed
    {
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
        return $this->stores;
Jan-Hendrik Willms's avatar
wip
Jan-Hendrik Willms committed
    }

    public function getStoreData(): array
    {
        return $this->storeData;
    }
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed

    public function getTemplate(): Template
    {
        $template = $GLOBALS['template_factory']->open('vue-app.php');
        $template->attributes = [
            'data-vue-app' => json_encode([
                'components' => [
                    $this->base_component,
                    ...$this->components
                ],
                'stores' => $this->stores,
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
            ]),
            'is' => basename($this->base_component),
            ...$this->getPreparedProps(),
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
        ];
        $template->storeData = $this->storeData;
        return $template;
    }

    private function getPreparedProps(): array
    {
        $result = [];
        foreach ($this->props as $name => $value) {
            $name = ltrim($name, ':');
            $result[":{$name}"] = json_encode($value);
        }
        return $result;
    }

Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
    public function render(): string
    {
        return $this->getTemplate()->render();
    }

    public function __toString(): string
    {
        return $this->render();
    }
Jan-Hendrik Willms's avatar
wip
Jan-Hendrik Willms committed
}