Skip to content

Commit 4aa8c6b

Browse files
committed
wip
1 parent 663f202 commit 4aa8c6b

File tree

3 files changed

+39
-27
lines changed

3 files changed

+39
-27
lines changed

src/Tempest/View/src/Components/DynamicViewComponent.php

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@
22

33
namespace Tempest\View\Components;
44

5-
use Tempest\Container\Container;
5+
use Stringable;
66
use Tempest\Core\AppConfig;
7-
use Tempest\View\Elements\ElementFactory;
7+
use Tempest\Support\Str\ImmutableString;
8+
use Tempest\Support\Str\MutableString;
9+
use Tempest\View\Elements\CollectionElement;
810
use Tempest\View\Elements\ViewComponentElement;
9-
use Tempest\View\GenericView;
1011
use Tempest\View\Parser\TempestViewCompiler;
1112
use Tempest\View\Parser\Token;
1213
use Tempest\View\ViewComponent;
1314
use Tempest\View\ViewConfig;
14-
use Tempest\View\ViewRenderer;
15+
use function Tempest\Support\arr;
1516

1617
final class DynamicViewComponent implements ViewComponent
1718
{
@@ -36,27 +37,43 @@ public static function getName(): string
3637
public function compile(ViewComponentElement $element): string
3738
{
3839
$name = $this->token->getAttribute('is') ?? $this->token->getAttribute(':is');
40+
3941
$isExpression = $this->token->getAttribute(':is') !== null;
4042

41-
return sprintf(
42-
'<?php eval(\'?>\' . \Tempest\get(%s::class)->render(%s, %s)); ?>',
43-
self::class,
44-
$isExpression ? $name : "'{$name}'",
45-
var_export($element->getAttributes(), true), // @mago-expect best-practices/no-debug-symbols
46-
);
47-
}
43+
$collectionElement = new CollectionElement($element->getChildren());
4844

49-
public function render(string $name, array $attributes): string
50-
{
51-
$viewComponent = $this->viewConfig->viewComponents[$name] ?? null;
45+
$attributes = arr($element->getAttributes())
46+
->filter(fn (string $value, string $key) => $key !== 'is' && $key !== ':is')
47+
->map(function (string $value, string $key) {
48+
return sprintf('%s="%s"', $key, trim($value));
49+
})
50+
->implode(' ')
51+
->when(
52+
fn (Stringable $string) => (string) $string !== '',
53+
fn (Stringable $string) => new ImmutableString(" {$string}"),
54+
);
5255

53-
$element = new ViewComponentElement(
54-
environment: $this->appConfig->environment,
55-
compiler: $this->compiler,
56-
viewComponent: $viewComponent,
57-
attributes: $attributes,
56+
$compiledChildren = sprintf(
57+
<<<'HTML'
58+
<%s%s>
59+
%s
60+
</%s>
61+
HTML,
62+
'%s',
63+
$attributes,
64+
$collectionElement->compile(),
65+
'%s',
5866
);
5967

60-
return $element->compile();
68+
$compiled = sprintf(
69+
'<?php echo \Tempest\get(\Tempest\View\Renderers\TempestViewRenderer::class)->render(sprintf(<<<\'HTML\'
70+
%s
71+
HTML, %s, %s)); ?>',
72+
$compiledChildren,
73+
$isExpression ? $name : "'{$name}'",
74+
$isExpression ? $name : "'{$name}'",
75+
);
76+
lw($compiled);
77+
return $compiled;
6178
}
6279
}

src/Tempest/View/src/Renderers/TempestViewRenderer.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@
1717
use Tempest\View\ViewRenderer;
1818
use Throwable;
1919

20-
use function Tempest\Support\arr;
21-
use function Tempest\Support\str;
22-
2320
final class TempestViewRenderer implements ViewRenderer
2421
{
2522
private ?View $currentView = null;

tests/Integration/View/ViewComponentTest.php

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -830,12 +830,10 @@ public function test_dynamic_view_component_with_slot(): void
830830
$this->registerViewComponent('x-test', '<div><x-slot/></div>');
831831

832832
$html = $this->render(<<<'HTML'
833-
<x-dynamic-component :is="$name">
834-
<p>test</p>
835-
</x-dynamic-component>
833+
<x-dynamic-component :is="$name">test</x-dynamic-component>
836834
HTML, name: 'x-test');
837835

838-
$this->assertSame('<div><p>test</p></div>', $html);
836+
$this->assertSnippetsMatch('<div>test</div>', $html);
839837
}
840838

841839
public function test_nested_slots(): void

0 commit comments

Comments
 (0)