Initial commit

This commit is contained in:
Ronald Huynen
2026-03-23 21:37:59 +01:00
commit 2547717edb
2193 changed files with 972171 additions and 0 deletions

View File

@@ -0,0 +1,171 @@
<?php
namespace App\Http\Livewire;
use Livewire\Component;
use App\Mail\ContactFormMailable;
use App\Mail\ContactFormCopyMailable;
use Illuminate\Support\Facades\Mail;
use WireUi\Traits\WireUiActions;
/**
* Generic contact form component with context-aware content
*
* Usage examples:
* - @livewire('contact-form', ['context' => 'contact'])
* - @livewire('contact-form', ['context' => 'report-issue'])
* - @livewire('contact-form', ['context' => 'report-error', 'url' => request()->fullUrl()])
* - @livewire('contact-form', ['context' => 'delete-profile'])
*/
class ContactForm extends Component
{
use WireUiActions;
// Form context: 'contact', 'report-issue', 'report-error', 'delete-profile'
public $context = 'contact';
// Form fields
public $name;
public $full_name;
public $email;
public $subject;
public $message;
public $url; // For error/issue reporting - URL where issue occurred
// UI state
public $showSuccessMessage = false;
protected $rules = [
'name' => 'required|string|max:255',
'full_name' => 'nullable|string|max:255',
'email' => 'required|email|max:255',
'subject' => 'nullable|string|max:255',
'message' => 'required|string|min:10|max:2000',
'url' => 'nullable|url|max:500',
];
public function mount($context = 'contact', $url = null, $subject = null, $message = null)
{
$this->context = $context;
$this->url = $url;
// Pre-fill subject/message from params or query string
$this->subject = $subject ?? request('subject');
$this->message = $message ?? request('message');
// Pre-fill user data if authenticated
if (auth()->check()) {
$profile = getActiveProfile();
if ($profile) {
$this->name = $profile->name ?? '';
$this->full_name = $profile->full_name ?? $profile->name ?? '';
$this->email = $profile->email ?? '';
}
}
}
public function updated($propertyName)
{
$this->validateOnly($propertyName);
}
public function submitForm()
{
$data = $this->validate();
$data['context'] = $this->context;
// Ensure full_name is set, fallback to name if not
if (empty($data['full_name'])) {
$data['full_name'] = $data['name'];
}
// Add authentication and profile data
$data['is_authenticated'] = auth()->check();
if ($data['is_authenticated']) {
$profile = getActiveProfile();
if ($profile) {
$data['profile_url'] = $profile->profile_url ?? null;
$data['profile_type'] = class_basename(get_class($profile));
$data['profile_lang_preference'] = $profile->lang_preference ?? null;
}
}
// Add browser locale (current app locale) for non-authenticated users
if (!$data['is_authenticated']) {
$data['browser_locale'] = app()->getLocale();
}
try {
// Get recipient email from config or default
$recipientEmail = config('mail.from.address', 'info@timebank.cc');
\Log::info('ContactForm: Queueing emails', [
'context' => $this->context,
'recipient' => $recipientEmail,
'submitter' => $data['email'],
]);
// Queue email to the recipient on 'emails' queue
Mail::to($recipientEmail)->queue((new ContactFormMailable($data))->onQueue('emails'));
\Log::info('ContactForm: Email queued to recipient');
// Queue a copy to the submitter on 'emails' queue
Mail::to($data['email'])->queue((new ContactFormCopyMailable($data))->onQueue('emails'));
\Log::info('ContactForm: Copy queued to submitter');
// Show success notification
$this->notification()->success(
title: __('Message sent'),
description: __('We received your message successfully and will get back to you shortly!')
);
$this->showSuccessMessage = true;
$this->resetForm();
// Dispatch event for parent components
$this->dispatch('contact-form-submitted');
} catch (\Exception $e) {
$this->notification()->error(
title: __('Error'),
description: __('Sorry, there was an error sending your message. Please try again later.')
);
\Log::error('Contact form submission failed', [
'error' => $e->getMessage(),
'context' => $this->context,
'email' => $this->email
]);
}
}
private function resetForm()
{
$this->message = '';
$this->subject = '';
$this->url = '';
// Don't reset name/email if user is authenticated
if (!auth()->check()) {
$this->name = '';
$this->full_name = '';
$this->email = '';
}
}
public function getSubmitButtonTextProperty()
{
return match($this->context) {
'report-issue' => __('Submit report'),
'report-error' => __('Report error'),
'delete-profile' => __('Request deletion'),
'contact' => __('Send message'),
default => __('Submit'),
};
}
public function render()
{
return view('livewire.contact-form');
}
}