diff --git a/composer.json b/composer.json index b271e2c4..3cd867f7 100644 --- a/composer.json +++ b/composer.json @@ -44,7 +44,7 @@ "friendsofphp/php-cs-fixer": "^3.17", "illuminate/routing": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0", "illuminate/support": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0", - "livewire/livewire": "^2.12.3", + "livewire/livewire": "^2.12.3 || ^3.0", "orchestra/testbench": "^2.0 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", "phpro/grumphp": "^1.16", "phpstan/phpstan": "^1.10.16", diff --git a/src/Laravel/FlasherServiceProvider.php b/src/Laravel/FlasherServiceProvider.php index 1927d85d..62981976 100644 --- a/src/Laravel/FlasherServiceProvider.php +++ b/src/Laravel/FlasherServiceProvider.php @@ -40,6 +40,7 @@ use Illuminate\Routing\Router; use Illuminate\Support\Facades\Blade; use Livewire\Component; use Livewire\LivewireManager; +use Livewire\Mechanisms\HandleComponents\ComponentContext; use Livewire\Response; /** @@ -221,6 +222,35 @@ final class FlasherServiceProvider extends ServiceProvider return; } + // Livewire v3 + if (method_exists($livewire, 'componentHook')) { + $livewire->listen('dehydrate', function (Component $component, ComponentContext $context) { + if ($context->mounting || isset($context->effects['redirect'])) { + return; + } + + /** @var FlasherInterface $flasher */ + $flasher = app('flasher'); + + /** @var array{envelopes: Envelope[]} $data */ + $data = $flasher->render(array(), 'array'); + + if (\count($data['envelopes']) > 0) { + $data['context']['livewire'] = array( + 'id' => $component->getId(), + 'name' => $component->getName(), + ); + + $context->addEffect('dispatches', array(array( + 'name' => 'flasher:render', + 'params' => $data, + ))); + } + }); + + return; + } + $livewire->listen('component.dehydrate.subsequent', function (Component $component, Response $response) { if (isset($response->effects['redirect'])) { return;