%PDF- %PDF-
Direktori : /www/loslex/demo/vendor/livewire/livewire/src/Features/SupportLazyLoading/ |
Current File : /www/loslex/demo/vendor/livewire/livewire/src/Features/SupportLazyLoading/SupportLazyLoading.php |
<?php namespace Livewire\Features\SupportLazyLoading; use Livewire\Features\SupportLifecycleHooks\SupportLifecycleHooks; use Livewire\Mechanisms\HandleComponents\ViewContext; use function Livewire\{ store, trigger, wrap }; use Illuminate\Routing\Route; use Livewire\ComponentHook; use Livewire\Drawer\Utils; use Livewire\Component; class SupportLazyLoading extends ComponentHook { static function provide() { static::registerRouteMacro(); } static function registerRouteMacro() { Route::macro('lazy', function ($enabled = true) { $this->defaults['lazy'] = $enabled; return $this; }); } public function mount($params) { $hasLazyParam = isset($params['lazy']); $lazyProperty = $params['lazy'] ?? false; $isolate = true; $reflectionClass = new \ReflectionClass($this->component); $lazyAttribute = $reflectionClass->getAttributes(\Livewire\Attributes\Lazy::class)[0] ?? null; // If `:lazy="false"` disable lazy loading... if ($hasLazyParam && ! $lazyProperty) return; // If no lazy loading is included at all... if (! $hasLazyParam && ! $lazyAttribute) return; if ($lazyAttribute) { $attribute = $lazyAttribute->newInstance(); $isolate = $attribute->isolate; } $this->component->skipMount(); store($this->component)->set('isLazyLoadMounting', true); store($this->component)->set('isLazyIsolated', $isolate); $this->component->skipRender( $this->generatePlaceholderHtml($params) ); } public function hydrate($memo) { if (! isset($memo['lazyLoaded'])) return; if ($memo['lazyLoaded'] === true) return; $this->component->skipHydrate(); store($this->component)->set('isLazyLoadHydrating', true); } function dehydrate($context) { if (store($this->component)->get('isLazyLoadMounting') === true) { $context->addMemo('lazyLoaded', false); $context->addMemo('lazyIsolated', store($this->component)->get('isLazyIsolated')); } elseif (store($this->component)->get('isLazyLoadHydrating') === true) { $context->addMemo('lazyLoaded', true); } } function call($method, $params, $returnEarly) { if ($method !== '__lazyLoad') return; [ $encoded ] = $params; $mountParams = $this->resurrectMountParams($encoded); $this->callMountLifecycleMethod($mountParams); $returnEarly(); } public function generatePlaceholderHtml($params) { $this->registerContainerComponent(); $container = app('livewire')->new('__mountParamsContainer'); $container->forMount = array_diff_key($params, array_flip(['lazy'])); $snapshot = app('livewire')->snapshot($container); $encoded = base64_encode(json_encode($snapshot)); $placeholder = $this->getPlaceholderView($this->component, $params); $finish = trigger('render.placeholder', $this->component, $placeholder, $params); $viewContext = new ViewContext; $html = $placeholder->render(function ($view) use ($viewContext) { // Extract leftover slots, sections, and pushes before they get flushed... $viewContext->extractFromEnvironment($view->getFactory()); }); $html = Utils::insertAttributesIntoHtmlRoot($html, [ ((isset($params['lazy']) and $params['lazy'] === 'on-load') ? 'x-init' : 'x-intersect') => '$wire.__lazyLoad(\''.$encoded.'\')', ]); $replaceHtml = function ($newHtml) use (&$html) { $html = $newHtml; }; $html = $finish($html, $replaceHtml, $viewContext); return $html; } protected function getPlaceholderView($component, $params) { $globalPlaceholder = config('livewire.lazy_placeholder'); $placeholderHtml = $globalPlaceholder ? view($globalPlaceholder)->render() : '<div></div>'; $viewOrString = wrap($component)->withFallback($placeholderHtml)->placeholder($params); $properties = Utils::getPublicPropertiesDefinedOnSubclass($component); $view = Utils::generateBladeView($viewOrString, $properties); return $view; } function resurrectMountParams($encoded) { $snapshot = json_decode(base64_decode($encoded), associative: true); $this->registerContainerComponent(); [ $container ] = app('livewire')->fromSnapshot($snapshot); return $container->forMount; } function callMountLifecycleMethod($params) { $hook = new SupportLifecycleHooks; $hook->setComponent($this->component); $hook->mount($params); } public function registerContainerComponent() { app('livewire')->component('__mountParamsContainer', new class extends Component { public $forMount; }); } }