-
Notifications
You must be signed in to change notification settings - Fork 37
Expand file tree
/
Copy pathGenerateCheckInCodeAction.php
More file actions
127 lines (109 loc) · 4.68 KB
/
Copy pathGenerateCheckInCodeAction.php
File metadata and controls
127 lines (109 loc) · 4.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<?php
declare(strict_types=1);
namespace He4rt\PanelAdmin\Filament\Resources\Events\RelationManagers\Actions;
use Filament\Actions\Action;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Resources\RelationManagers\RelationManager;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Components\Utilities\Set;
use Filament\Support\Icons\Heroicon;
use He4rt\Events\CheckIn\Models\CheckInCode;
use He4rt\Events\Event\Models\Event;
final class GenerateCheckInCodeAction extends Action
{
protected function setUp(): void
{
parent::setUp();
$this->label(__('panel-admin::events.check_in_codes.actions.generate_code'))
->icon(Heroicon::OutlinedPlusCircle)
->color('success')
->schema($this->generateFormSchema(...))
->action($this->persistCheckInCode(...));
}
public static function getDefaultName(): string
{
return 'generateCode';
}
/**
* @param array{digits?: string, code_preview: string, event_date: string, starts_at: string, expires_at: string, max_uses?: string|int|null} $data
*/
public function persistCheckInCode(array $data, RelationManager $livewire): CheckInCode
{
/** @var Event $event */
$event = $livewire->getOwnerRecord();
$code = (string) $data['code_preview'];
if (!preg_match('/^\d{4}$|^\d{6}$/', $code)) {
$code = $this->generateNumericCode((int) ($data['digits'] ?? 6));
}
return CheckInCode::query()->create([
'event_id' => $event->id,
'event_date' => $data['event_date'],
'code' => $code,
'starts_at' => $data['starts_at'],
'expires_at' => $data['expires_at'],
'max_uses' => filled($data['max_uses'] ?? null) ? (int) $data['max_uses'] : null,
]);
}
/**
* @return array<int, mixed>
*/
private function generateFormSchema(RelationManager $livewire): array
{
/** @var Event $event */
$event = $livewire->getOwnerRecord();
return [
Section::make()
->columns(2)
->schema([
Select::make('digits')
->label(__('panel-admin::events.check_in_codes.fields.code_length'))
->options([
'4' => __('panel-admin::events.check_in_codes.digits.four'),
'6' => __('panel-admin::events.check_in_codes.digits.six'),
])
->default('6')
->live()
->afterStateUpdated(function (Set $set, ?string $state): void {
$set('code_preview', $this->generateNumericCode((int) ($state ?: 6)));
})
->selectablePlaceholder(false)
->required(),
TextInput::make('code_preview')
->label(__('panel-admin::events.check_in_codes.fields.generated_code'))
->readOnly()
->default(fn (): string => $this->generateNumericCode(6))
->dehydrated()
->required(),
DatePicker::make('event_date')
->label(__('panel-admin::events.columns.event_date'))
->default($event->starts_at->toDateString())
->minDate($event->starts_at->toDateString())
->maxDate($event->ends_at->toDateString())
->required(),
DateTimePicker::make('starts_at')
->label(__('panel-admin::events.columns.valid_from'))
->default(now())
->required(),
DateTimePicker::make('expires_at')
->label(__('panel-admin::events.columns.expires_at'))
->afterOrEqual('starts_at')
->default(now()->addHours(2))
->required(),
TextInput::make('max_uses')
->label(__('panel-admin::events.check_in_codes.fields.max_uses'))
->numeric()
->minValue(1)
->placeholder(__('panel-admin::events.check_in_codes.unlimited')),
]),
];
}
private function generateNumericCode(int $digits): string
{
$min = 10 ** ($digits - 1);
$max = 10 ** $digits - 1;
return (string) random_int($min, $max);
}
}