5
5
namespace Symfony \UX \LiveComponent \EventListener ;
6
6
7
7
use Symfony \Component \EventDispatcher \EventSubscriberInterface ;
8
- use Symfony \UX \LiveComponent \Util \LiveControllerAttributesCreator ;
9
- use Symfony \UX \TwigComponent \ComponentStack ;
8
+ use Symfony \UX \TwigComponent \Event \PostMountEvent ;
10
9
use Symfony \UX \TwigComponent \Event \PreRenderEvent ;
11
10
12
11
final class DeferLiveComponentSubscriber implements EventSubscriberInterface
@@ -17,50 +16,58 @@ final class DeferLiveComponentSubscriber implements EventSubscriberInterface
17
16
18
17
private const DEFAULT_LOADING_TEMPLATE = null ;
19
18
20
- public function __construct (
21
- private ComponentStack $ componentStack ,
22
- private LiveControllerAttributesCreator $ attributesCreator ,
23
- ) {
19
+ public function onPostMount (PostMountEvent $ event ): void
20
+ {
21
+ $ data = $ event ->getData ();
22
+ if (\array_key_exists ('defer ' , $ data )) {
23
+ $ event ->addExtraMetadata ('defer ' , true );
24
+ unset($ event ->getData ()['defer ' ]);
25
+ }
26
+
27
+ if (\array_key_exists ('loading-template ' , $ data )) {
28
+ $ event ->addExtraMetadata ('loading-template ' , $ data ['loading-template ' ]);
29
+ unset($ event ->getData ()['loading-template ' ]);
30
+ }
31
+
32
+ if (\array_key_exists ('loading-tag ' , $ data )) {
33
+ $ event ->addExtraMetadata ('loading-tag ' , $ data ['loading-tag ' ]);
34
+ unset($ event ->getData ()['loading-tag ' ]);
35
+ }
36
+
37
+ $ event ->setData ($ data );
24
38
}
25
39
26
40
public function onPreRender (PreRenderEvent $ event ): void
27
41
{
28
42
$ mountedComponent = $ event ->getMountedComponent ();
29
- $ inputProps = $ mountedComponent ->getInputProps ();
30
- $ isDeferred = $ inputProps ['defer ' ] ?? false ;
43
+ $ isDeferred = $ mountedComponent ->hasExtraMetadata ('defer ' );
31
44
32
45
if (!$ isDeferred ) {
33
46
return ;
34
47
}
35
48
36
- $ metadata = $ event ->getMetadata ();
37
- $ variables = $ event ->getVariables ();
38
- $ attributesKey = $ metadata ->getAttributesVar ();
39
-
40
49
$ event ->setTemplate ('@LiveComponent/deferred.html.twig ' );
41
50
42
- $ originalAttributes = $ variables [$ attributesKey ]->all ();
43
-
44
- $ attributes = $ originalAttributes ;
45
- $ attributes = array_filter (
46
- $ attributes ,
47
- fn ($ key ) => !\in_array ($ key , ['defer ' , 'loading-template ' , 'loading-tag ' ], true ),
48
- \ARRAY_FILTER_USE_KEY ,
49
- );
51
+ $ variables = $ event ->getVariables ();
52
+ $ variables ['loadingTemplate ' ] = self ::DEFAULT_LOADING_TEMPLATE ;
53
+ $ variables ['loadingTag ' ] = self ::DEFAULT_LOADING_TAG ;
50
54
51
- $ variables [ $ attributesKey ] = $ attributes ;
52
- $ variables ['loadingTag ' ] = $ originalAttributes [ 'loading-tag ' ] ?? self :: DEFAULT_LOADING_TAG ;
53
- $ variables [ ' loadingTemplate ' ] = $ originalAttributes [ ' loading-template ' ] ?? self :: DEFAULT_LOADING_TEMPLATE ;
55
+ if ( $ mountedComponent -> hasExtraMetadata ( ' loading-template ' )) {
56
+ $ variables ['loadingTemplate ' ] = $ mountedComponent -> getExtraMetadata ( 'loading-template ' ) ;
57
+ }
54
58
55
- $ mountedComponent ->setAttributes (
56
- $ mountedComponent ->getAttributes ()-> without ( ' defer ' , ' loading-template ' , ' loading- tag ' ),
57
- );
59
+ if ( $ mountedComponent ->hasExtraMetadata ( ' loading-tag ' )) {
60
+ $ variables [ ' loadingTag ' ] = $ mountedComponent ->getExtraMetadata ( ' loading-tag ' );
61
+ }
58
62
59
63
$ event ->setVariables ($ variables );
60
64
}
61
65
62
66
public static function getSubscribedEvents (): array
63
67
{
64
- return [PreRenderEvent::class => ['onPreRender ' , self ::PRIORITY ]];
68
+ return [
69
+ PostMountEvent::class => ['onPostMount ' , self ::PRIORITY ],
70
+ PreRenderEvent::class => ['onPreRender ' , self ::PRIORITY ],
71
+ ];
65
72
}
66
73
}
0 commit comments