From c396c97ce259820784e514c29637ed4cb71e6fce Mon Sep 17 00:00:00 2001 From: isaacclad Date: Mon, 8 Jun 2026 15:56:06 +0000 Subject: [PATCH] Fix transfer share links and redesign recipient download email. Use transfer.ladill.com share URLs in notifications and APIs, add the email logo, and show file details with a prominent download button. Co-authored-by: Cursor --- .../Api/ChunkedUploadController.php | 2 +- .../Controllers/Api/TransferController.php | 2 +- app/Models/QrCode.php | 8 +++ .../TransferRecipientNotification.php | 2 +- .../images/logo/ladilltransfer-logo-email.png | Bin 0 -> 4787 bytes .../views/mail/notifications/layout.blade.php | 6 +- .../transfer-recipient.blade.php | 61 +++++++++++++----- 7 files changed, 61 insertions(+), 20 deletions(-) create mode 100644 public/images/logo/ladilltransfer-logo-email.png diff --git a/app/Http/Controllers/Api/ChunkedUploadController.php b/app/Http/Controllers/Api/ChunkedUploadController.php index edc90c9..68b47db 100644 --- a/app/Http/Controllers/Api/ChunkedUploadController.php +++ b/app/Http/Controllers/Api/ChunkedUploadController.php @@ -139,7 +139,7 @@ class ChunkedUploadController extends Controller 'data' => [ 'id' => $transfer->id, 'title' => $transfer->title, - 'public_url' => $transfer->qrCode?->publicUrl(), + 'public_url' => $transfer->qrCode?->shareUrl(), 'paid_until' => $transfer->paid_until?->toIso8601String(), 'expires_at' => $transfer->paid_until?->toIso8601String(), 'files' => $transfer->files->map(fn ($file) => [ diff --git a/app/Http/Controllers/Api/TransferController.php b/app/Http/Controllers/Api/TransferController.php index 31d782e..952ed93 100644 --- a/app/Http/Controllers/Api/TransferController.php +++ b/app/Http/Controllers/Api/TransferController.php @@ -68,7 +68,7 @@ class TransferController extends Controller 'data' => [ 'id' => $transfer->id, 'title' => $transfer->title, - 'public_url' => $transfer->qrCode?->publicUrl(), + 'public_url' => $transfer->qrCode?->shareUrl(), 'paid_until' => $transfer->paid_until?->toIso8601String(), 'expires_at' => $transfer->paid_until?->toIso8601String(), 'files' => $transfer->files->map(fn ($file) => [ diff --git a/app/Models/QrCode.php b/app/Models/QrCode.php index 14e628f..a4a8676 100644 --- a/app/Models/QrCode.php +++ b/app/Models/QrCode.php @@ -86,6 +86,14 @@ class QrCode extends Model return self::publicBaseUrl() . '/q/' . $this->short_code; } + /** Direct link for emails and share UI โ€” always on the Transfer app host. */ + public function shareUrl(): string + { + $base = rtrim((string) config('app.url'), '/'); + + return $base . '/q/' . $this->short_code; + } + /** * Base URL for public QR links. Always the short platform domain * (ladill.com) โ€” never the signed-in account/product host โ€” so printed diff --git a/app/Notifications/TransferRecipientNotification.php b/app/Notifications/TransferRecipientNotification.php index 9450a19..720ab68 100644 --- a/app/Notifications/TransferRecipientNotification.php +++ b/app/Notifications/TransferRecipientNotification.php @@ -24,7 +24,7 @@ class TransferRecipientNotification extends Notification public function toMail(mixed $notifiable): MailMessage { $transfer = $this->transfer->loadMissing(['files', 'qrCode', 'user']); - $publicUrl = $transfer->qrCode?->publicUrl() ?? ''; + $publicUrl = $transfer->qrCode?->shareUrl() ?? ''; return (new MailMessage()) ->subject($this->subjectLine()) diff --git a/public/images/logo/ladilltransfer-logo-email.png b/public/images/logo/ladilltransfer-logo-email.png new file mode 100644 index 0000000000000000000000000000000000000000..131a496ca0d24913c97acdf45e2939c49e5e9a17 GIT binary patch literal 4787 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 CgR#s2 literal 0 HcmV?d00001 diff --git a/resources/views/mail/notifications/layout.blade.php b/resources/views/mail/notifications/layout.blade.php index e844145..c97b8f0 100644 --- a/resources/views/mail/notifications/layout.blade.php +++ b/resources/views/mail/notifications/layout.blade.php @@ -367,7 +367,11 @@