diff --git a/src/Inertia.php b/src/Inertia.php index 0be8a2e1..104f03ac 100644 --- a/src/Inertia.php +++ b/src/Inertia.php @@ -18,6 +18,7 @@ * @method static \Inertia\DeferProp defer(callable $callback, string $group = 'default') * @method static \Inertia\AlwaysProp always(mixed $value) * @method static \Inertia\MergeProp merge(mixed $value) + * @method static \Inertia\MergeProp deepMerge(mixed $value) * @method static \Inertia\Response render(string $component, array|\Illuminate\Contracts\Support\Arrayable $props = []) * @method static \Symfony\Component\HttpFoundation\Response location(string|\Symfony\Component\HttpFoundation\RedirectResponse $url) * @method static void macro(string $name, object|callable $macro) diff --git a/src/MergesProps.php b/src/MergesProps.php index 3a22fb18..3bc5d787 100644 --- a/src/MergesProps.php +++ b/src/MergesProps.php @@ -6,6 +6,8 @@ trait MergesProps { protected bool $merge = false; + protected bool $deepMerge = false; + public function merge(): static { $this->merge = true; @@ -17,4 +19,16 @@ public function shouldMerge(): bool { return $this->merge; } + + public function deepMerge(): static + { + $this->deepMerge = true; + + return $this; + } + + public function shouldDeepMerge(): bool + { + return $this->deepMerge; + } } diff --git a/src/Response.php b/src/Response.php index 9c1ece36..93371e4b 100644 --- a/src/Response.php +++ b/src/Response.php @@ -293,7 +293,18 @@ public function resolveMergeProps(Request $request): array $mergeProps = collect($this->props) ->filter(function ($prop) { return $prop instanceof Mergeable; + }); + + $deepMergeProps = $mergeProps + ->filter(function ($prop) { + return $prop->shouldDeepMerge(); + }) + ->filter(function ($prop, $key) use ($resetProps) { + return ! $resetProps->contains($key); }) + ->keys(); + + $mergeProps = $mergeProps ->filter(function ($prop) { return $prop->shouldMerge(); }) @@ -302,7 +313,10 @@ public function resolveMergeProps(Request $request): array }) ->keys(); - return $mergeProps->isNotEmpty() ? ['mergeProps' => $mergeProps->toArray()] : []; + return $mergeProps->isNotEmpty() ? [ + 'mergeProps' => $mergeProps->toArray(), + 'deepMergeProps' => $deepMergeProps->toArray() + ] : []; } public function resolveDeferredProps(Request $request): array diff --git a/src/ResponseFactory.php b/src/ResponseFactory.php index 735fa713..de42ad40 100644 --- a/src/ResponseFactory.php +++ b/src/ResponseFactory.php @@ -122,6 +122,14 @@ public function merge($value): MergeProp return new MergeProp($value); } + /** + * @param mixed $value + */ + public function deepMerge($value): MergeProp + { + return (new MergeProp($value))->deepMerge(); + } + /** * @param mixed $value */