Closed
Description
If final is removed, it would be easy to stream, redirect and force reload of frames in single response.
Example:
// some controller
return new TurboResponse(
redirectUrl: $this->generateUrl('basket'),
reloadFrames: ['shopping-cart-frame', 'some-other-frame'], // ids of frames
);
and some glue js:
app.js
// listen for turbo events
document.addEventListener('turbo:before-fetch-response', (event) => {
let redirectUrl = event.detail.fetchResponse.header('Turbo-Redirect');
if (redirectUrl) {
Turbo.visit(redirectUrl);
}
let framesToReload = event.detail.fetchResponse.header('Turbo-Reload-Frame');
if (framesToReload) {
framesToReload.trim().split(/\s*,\s*/).forEach((name) => {
document.getElementById(name)?.reload();
});
}
});
and custom response class:
App\Response\TurboResponse
class TurboResponse extends TurboStreamResponse
{
public function __construct(?string $redirectUrl = null, array $reloadFrames = [], ?string $content = null)
{
parent::__construct($content);
if ($redirectUrl) {
$this->headers->set('turbo-redirect', $redirectUrl);
}
foreach ($reloadFrames as $id) {
$this->headers->set('turbo-reload-frame', $id, false);
}
}
}
Metadata
Metadata
Assignees
Labels
No labels