Public URLs, encoded payloads, slug preview, payment callbacks, and asset paths now use ladl.link instead of ladill.com/q/*.
Co-authored-by: Cursor <cursoragent@cursor.com>
Public landing pages, asset paths, payment callbacks, and redirects now go through QrCode::publicPath() / LadillLink instead of ladill.com/q/* routes.
Co-authored-by: Cursor <cursoragent@cursor.com>
Creating a transfer that the wallet can't cover used to flash a bare error.
Detect the insufficient-balance case and open an in-app two-step modal (billing
explainer -> amount -> Paystack) on the create page instead, with an 'Add funds'
button to top up on demand.
- BillingClient::topup -> POST /api/billing/topup (Transfer already holds its key)
- WalletTopupController + route POST /wallet/topup (user.wallet.topup)
- store() flashes open_topup_modal on TransferWalletErrors::isInsufficientBalance
- service-topup-modal made two-step (uses <x-modal>, plain POST -> checkout)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
InjectBootSplash middleware shows a self-branded loading splash once per session
while the app boots, then fades out.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Wallet balance peek rendered as a menu row directly under Billing, backed by
a /wallet/balance endpoint (BillingClient) and guarded by Route::has. Also
opens Afia via a direct window event for reliability.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a service API for the Ladill SMS platform to store voice recordings in Transfer and charge monthly storage from the customer wallet.
Co-authored-by: Cursor <cursoragent@cursor.com>
Remove interactive OAuth fallback on silent SSO failure and add ladill.marketing_url config so app subdomains open the dashboard when signed in locally.
Co-authored-by: Cursor <cursoragent@cursor.com>
context() selected/used download_count on the transfers table, but the
column is downloads_total (see model + migration) — every Afia chat 500'd
with 'could not respond' before reaching the LLM. Use downloads_total.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Local-only sign-out: end this app's session but leave the auth.ladill.com
session intact, so the signed-out page's Sign in again re-auths silently via
prompt=none. Full sign-out of all Ladill apps remains on account.ladill.com.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add shared btn-primary components and plus icons on create/new actions; limit overview recent transfers to three.
Co-authored-by: Cursor <cursoragent@cursor.com>
Transfers lists only intentional shares while Files shows all storage, and New transfer accepts folder picks with flattened file uploads.
Co-authored-by: Cursor <cursoragent@cursor.com>
Folder rows match the file table layout, support zip download, and participate in bulk selection, share, and copy-link actions.
Co-authored-by: Cursor <cursoragent@cursor.com>
Folder upload now names and creates the destination folder from the picked directory, uploads all files into it, and redirects to the new folder view.
Co-authored-by: Cursor <cursoragent@cursor.com>
Users can create folders, upload files or folders, and choose replace or keep both on name conflicts instead of auto-grouping by transfer.
Co-authored-by: Cursor <cursoragent@cursor.com>
Transfers now lists all shares with filters and pagination; Files becomes a selectable cloud view with download, share, delete, move, and open-in-email actions.
Co-authored-by: Cursor <cursoragent@cursor.com>
Expose a stable error_code on chunked upload finalize so webmail can prompt wallet top-up instead of a generic upload failure.
Co-authored-by: Cursor <cursoragent@cursor.com>
Share URLs and API public_url values again use the platform domain so
ladill.com/q/* forwards to transfer.ladill.com like other Ladill apps.
Co-authored-by: Cursor <cursoragent@cursor.com>
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 <cursoragent@cursor.com>
Recipients always get the download link immediately when an email is set.
Large files upload in the background with per-file and overall progress bars.
Co-authored-by: Cursor <cursoragent@cursor.com>
Recipients can be emailed the download link immediately and at optional
reminders (7/3/1 days before unavailable, or when grace period starts).
Co-authored-by: Cursor <cursoragent@cursor.com>
Files stay available while wallet renewals succeed each month. Failed renewals
keep files for TRANSFER_GRACE_PERIOD_DAYS (default 15) before automatic cleanup.
Co-authored-by: Cursor <cursoragent@cursor.com>
Large files upload in 5 MB chunks (hosting file manager pattern) for the
transfer UI and Ladill Mail S2S API, with no app-level file size cap when
TRANSFER_MAX_FILE_BYTES=0.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace Mini/QR Plus copy and system prompt with Transfer file-sharing context, suggestions, and dashboard metrics.
Co-authored-by: Cursor <cursoragent@cursor.com>