getComponents(withHidden: true) as $component) { $component->callAfterStateHydrated(); foreach ($component->getChildComponentContainers(withHidden: true) as $container) { $container->callAfterStateHydrated(); } } } public function callAfterStateUpdated(string $path): bool { foreach ($this->getComponents(withHidden: true) as $component) { if ($component->getStatePath() === $path) { $component->callAfterStateUpdated(shouldBubbleToParents: false); return true; } if (str($path)->startsWith("{$component->getStatePath()}.")) { $component->callAfterStateUpdated(shouldBubbleToParents: false); } foreach ($component->getChildComponentContainers() as $container) { if ($container->callAfterStateUpdated($path)) { return true; } } } return false; } public function callBeforeStateDehydrated(): void { foreach ($this->getComponents(withHidden: true) as $component) { if ($component->isHidden()) { continue; } $component->callBeforeStateDehydrated(); foreach ($component->getChildComponentContainers() as $container) { if ($container->isHidden()) { continue; } $container->callBeforeStateDehydrated(); } } } /** * @param array $state * @return array */ public function dehydrateState(array &$state = [], bool $isDehydrated = true): array { foreach ($this->getComponents(withHidden: true) as $component) { $component->dehydrateState($state, $isDehydrated); } return $state; } public function hasDehydratedComponent(string $statePath): bool { foreach ($this->getComponents(withHidden: true) as $component) { if (! $component->isDehydrated()) { continue; } if ($component->hasStatePath() && ($component->getStatePath() === $statePath)) { return true; } foreach ($component->getChildComponentContainers(withHidden: true) as $container) { if ($container->hasDehydratedComponent($statePath)) { return true; } } } return false; } /** * @param array $state * @return array */ public function mutateDehydratedState(array &$state = []): array { foreach ($this->getComponents(withHidden: true) as $component) { if (! $component->isDehydrated()) { continue; } foreach ($component->getChildComponentContainers() as $container) { if ($container->isHidden()) { continue; } $container->mutateDehydratedState($state); } if ($component->getStatePath(isAbsolute: false)) { if (! $component->mutatesDehydratedState()) { continue; } $componentStatePath = $component->getStatePath(); data_set( $state, $componentStatePath, $component->mutateDehydratedState( data_get($state, $componentStatePath), ), ); } } return $state; } /** * @param array $state * @return array */ public function mutateStateForValidation(array &$state = []): array { foreach ($this->getComponents(withHidden: true) as $component) { if ($component->isHiddenAndNotDehydrated()) { continue; } foreach ($component->getChildComponentContainers() as $container) { if ($container->isHidden()) { continue; } $container->mutateStateForValidation($state); } if ($component->getStatePath(isAbsolute: false)) { if (! $component->mutatesStateForValidation()) { continue; } $componentStatePath = $component->getStatePath(); data_set( $state, $componentStatePath, $component->mutateStateForValidation( data_get($state, $componentStatePath), ), ); } } return $state; } /** * @param array | null $state */ public function fill(?array $state = null, bool $andCallHydrationHooks = true, bool $andFillStateWithNull = true): static { $hydratedDefaultState = null; if ($state === null) { $hydratedDefaultState = []; } else { $livewire = $this->getLivewire(); if ($statePath = $this->getStatePath()) { data_set($livewire, $statePath, $state); } else { foreach ($state as $key => $value) { data_set($livewire, $key, $value); } } } $this->hydrateState($hydratedDefaultState, $andCallHydrationHooks); if ($andFillStateWithNull) { $this->fillStateWithNull(); } return $this; } /** * @param array | null $hydratedDefaultState */ public function hydrateState(?array &$hydratedDefaultState, bool $andCallHydrationHooks = true): void { foreach ($this->getComponents(withHidden: true) as $component) { $component->hydrateState($hydratedDefaultState, $andCallHydrationHooks); } } public function fillStateWithNull(): void { foreach ($this->getComponents(withHidden: true) as $component) { $component->fillStateWithNull(); } } public function statePath(?string $path): static { $this->statePath = $path; return $this; } /** * @return array */ public function getState(bool $shouldCallHooksBefore = true, ?Closure $afterValidate = null): array { $state = $this->validate(); if ($shouldCallHooksBefore) { $this->callBeforeStateDehydrated(); $afterValidate || $this->saveRelationships(); $afterValidate || $this->loadStateFromRelationships(andHydrate: true); } $this->dehydrateState($state); $this->mutateDehydratedState($state); if ($statePath = $this->getStatePath()) { $state = data_get($state, $statePath) ?? []; } if ($afterValidate) { value($afterValidate, $state); $shouldCallHooksBefore && $this->saveRelationships(); $shouldCallHooksBefore && $this->loadStateFromRelationships(andHydrate: true); } return $state; } /** * @return array | Arrayable */ public function getRawState(): array | Arrayable { return data_get($this->getLivewire(), $this->getStatePath()) ?? []; } /** * @param array $keys * @return array */ public function getStateOnly(array $keys, bool $shouldCallHooksBefore = true): array { return Arr::only($this->getState($shouldCallHooksBefore), $keys); } /** * @param array $keys * @return array */ public function getStateExcept(array $keys, bool $shouldCallHooksBefore = true): array { return Arr::except($this->getState($shouldCallHooksBefore), $keys); } public function getStatePath(bool $isAbsolute = true): string { if (! $isAbsolute) { return $this->statePath ?? ''; } if (isset($this->cachedAbsoluteStatePath)) { return $this->cachedAbsoluteStatePath; } $pathComponents = []; if ($parentComponentStatePath = $this->getParentComponent()?->getStatePath()) { $pathComponents[] = $parentComponentStatePath; } if (($statePath = $this->statePath) !== null) { $pathComponents[] = $statePath; } return $this->cachedAbsoluteStatePath = implode('.', $pathComponents); } protected function flushCachedAbsoluteStatePath(): void { unset($this->cachedAbsoluteStatePath); } }