Skip to content

Commit e3b7fee

Browse files
committed
Make it work with multiple forms
1 parent 27c152a commit e3b7fee

File tree

2 files changed

+47
-34
lines changed

2 files changed

+47
-34
lines changed

src/BladeDirectives.php

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33
namespace Aerni\LivewireForms;
44

55
use Aerni\LivewireForms\Facades\Captcha;
6-
use Aerni\LivewireForms\Fields\Assets;
7-
use Aerni\LivewireForms\Fields\Captcha as CaptchaField;
86
use Illuminate\Support\Facades\Blade;
9-
use Livewire\Livewire;
107

118
class BladeDirectives
129
{
@@ -76,31 +73,23 @@ public static function formField(string $expression): string
7673

7774
/**
7875
* Push the Livewire Form assets into the head.
76+
* This is basically a copy of Livewire's '@endassets' directive in \Livewire\Features\SupportScriptsAndAssets\SupportScriptsAndAssets
77+
* We had to copy it as we ran into Blade caching issues when using the `@assets @endassets` directives directly.
7978
*/
8079
public static function formAssets(): string
8180
{
82-
$styles = collect();
83-
$scripts = collect(['/vendor/livewire-forms/js/form.js']);
84-
85-
$fields = Livewire::current()->fields;
86-
87-
if ($fields->contains(fn ($field) => $field instanceof Assets)) {
88-
$styles->push('/vendor/livewire-forms/css/filepond.css');
89-
$scripts->push('/vendor/livewire-forms/js/filepond.js');
90-
}
91-
92-
if ($fields->contains(fn ($field) => $field instanceof CaptchaField)) {
93-
$scripts->push('/vendor/livewire-forms/js/grecaptcha.js');
94-
}
95-
96-
$styles = $styles->map(fn ($style) => "<link href='{$style}' rel='stylesheet'/>")->implode("\n");
97-
$scripts = $scripts->map(fn ($script) => "<script src='{$script}' type='module'></script>")->implode("\n");
98-
99-
return Blade::compileString("
100-
@assets
101-
$styles
102-
$scripts
103-
@endassets
104-
");
81+
return <<<PHP
82+
<?php
83+
\$__assets = \$this->assets;
84+
\$__assetKey = md5(\$__assets);
85+
86+
if (in_array(\$__assetKey, \Livewire\Features\SupportScriptsAndAssets\SupportScriptsAndAssets::\$alreadyRunAssetKeys)) {
87+
return;
88+
}
89+
90+
\Livewire\Features\SupportScriptsAndAssets\SupportScriptsAndAssets::\$alreadyRunAssetKeys[] = \$__assetKey;
91+
\Livewire\store(\$this)->push('assets', \$__assets, \$__assetKey);
92+
?>
93+
PHP;
10594
}
10695
}

src/Livewire/BaseForm.php

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,23 @@
22

33
namespace Aerni\LivewireForms\Livewire;
44

5+
use Livewire\Component;
6+
use Livewire\Attributes\Computed;
7+
use Illuminate\Contracts\View\View;
8+
use Aerni\LivewireForms\Fields\Assets;
9+
use Aerni\LivewireForms\Fields\Captcha;
510
use Aerni\LivewireForms\Facades\ViewManager;
6-
use Aerni\LivewireForms\Livewire\Concerns\SubmitsForm;
7-
use Aerni\LivewireForms\Livewire\Concerns\WithFields;
811
use Aerni\LivewireForms\Livewire\Concerns\WithForm;
12+
use Aerni\LivewireForms\Livewire\Concerns\WithType;
13+
use Aerni\LivewireForms\Livewire\Concerns\WithView;
14+
use Aerni\LivewireForms\Livewire\Concerns\WithSteps;
15+
use Aerni\LivewireForms\Livewire\Concerns\WithTheme;
16+
use Aerni\LivewireForms\Livewire\Concerns\WithFields;
917
use Aerni\LivewireForms\Livewire\Concerns\WithHandle;
18+
use Aerni\LivewireForms\Livewire\Concerns\SubmitsForm;
1019
use Aerni\LivewireForms\Livewire\Concerns\WithMessages;
1120
use Aerni\LivewireForms\Livewire\Concerns\WithRedirect;
1221
use Aerni\LivewireForms\Livewire\Concerns\WithSections;
13-
use Aerni\LivewireForms\Livewire\Concerns\WithSteps;
14-
use Aerni\LivewireForms\Livewire\Concerns\WithTheme;
15-
use Aerni\LivewireForms\Livewire\Concerns\WithType;
16-
use Aerni\LivewireForms\Livewire\Concerns\WithView;
17-
use Illuminate\Contracts\View\View;
18-
use Livewire\Component;
1922

2023
class BaseForm extends Component
2124
{
@@ -37,4 +40,25 @@ public function render(): View
3740
'step' => $this->currentStep(),
3841
]);
3942
}
43+
44+
#[Computed]
45+
public function assets(): string
46+
{
47+
$styles = collect();
48+
$scripts = collect(['/vendor/livewire-forms/js/form.js']);
49+
50+
if ($this->fields->contains(fn ($field) => $field instanceof Assets)) {
51+
$styles->push('/vendor/livewire-forms/css/filepond.css');
52+
$scripts->push('/vendor/livewire-forms/js/filepond.js');
53+
}
54+
55+
if ($this->fields->contains(fn ($field) => $field instanceof Captcha)) {
56+
$scripts->push('/vendor/livewire-forms/js/grecaptcha.js');
57+
}
58+
59+
$styles = $styles->map(fn ($style) => "<link href='{$style}' rel='stylesheet'/>");
60+
$scripts = $scripts->map(fn ($script) => "<script src='{$script}' type='module'></script>");
61+
62+
return $styles->merge($scripts)->implode("\n");
63+
}
4064
}

0 commit comments

Comments
 (0)