## What The transactions AI consent banner now lets users decline, tells them the outcome, and stops appearing once they've decided. - **Dismiss option**: an X button before "Enable AI" permanently hides the banner without granting consent. - **Show only until the first decision**: the choice is persisted on `users.ai_consent_prompt_dismissed_at` (set on both accept and dismiss). The banner shows only while the user hasn't responded and never reappears afterwards — even if they later revoke consent from settings. - **Clear feedback**: accepting or dismissing shows a toast stating whether AI was enabled and that the choice can be changed anytime in **Settings > Manage Plan**. - **Full-width layout on desktop**: the banner content spans the full available width (button pushed to the right, text on a single line). The narrow stacked layout is kept for mobile only. ## How - New `POST ai/consent/dismiss` endpoint (`AiConsentController::dismiss`). - `User::dismissAiConsentPrompt()` (idempotent) + `hasDismissedAiConsentPrompt()`; `store` now also marks the prompt dismissed on accept. - Migration adds the nullable `ai_consent_prompt_dismissed_at` timestamp. - `TransactionController` passes `aiConsentPromptDismissed` to the page. ## Tests - `AiConsentTest`: idempotent dismissal, dismissal without consent, and accept marking the prompt dismissed. - Full consent + backfill suite and the `create a transaction` browser test pass; pint / lint / format clean. |
||
|---|---|---|
| .. | ||
| factories | ||
| migrations | ||
| seeders | ||
| .gitignore | ||