feat: Stripe subscriptions, tier-based permissions, dark mode, and UX improvements

- Fix Stripe SDK v14 compatibility (bracket notation for subscription items)
- Fix subscription period dates from subscription items instead of subscription object
- Add tier-based permissions (can_accept_payments, etc.) on tenant signup
- Add stripe_customer_id field to Tenant model
- Add clickable logo on login page (navigates to /)
- Add database setup message during signup wizard
- Add dark mode support for payment settings and Connect onboarding
- Add subscription management endpoints (cancel, reactivate)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-02 20:50:18 -05:00
parent 08b51d1a5f
commit ef58e9fc94
12 changed files with 1337 additions and 167 deletions

View File

@@ -914,24 +914,31 @@ const SignupPage: React.FC = () => {
<ArrowRight className="w-4 h-4" />
</button>
) : (
<button
type="button"
onClick={handleSubmit}
disabled={isSubmitting}
className="flex items-center gap-2 px-6 py-3 bg-brand-600 text-white rounded-xl hover:bg-brand-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors font-medium"
>
{isSubmitting ? (
<>
<Loader2 className="w-4 h-4 animate-spin" />
{t('marketing.signup.creating')}
</>
) : (
<>
<CheckCircle className="w-4 h-4" />
{t('marketing.signup.createAccount')}
</>
<div className="flex flex-col items-end gap-2">
<button
type="button"
onClick={handleSubmit}
disabled={isSubmitting}
className="flex items-center gap-2 px-6 py-3 bg-brand-600 text-white rounded-xl hover:bg-brand-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors font-medium"
>
{isSubmitting ? (
<>
<Loader2 className="w-4 h-4 animate-spin" />
{t('marketing.signup.creating')}
</>
) : (
<>
<CheckCircle className="w-4 h-4" />
{t('marketing.signup.createAccount')}
</>
)}
</button>
{isSubmitting && (
<p className="text-sm text-gray-500 dark:text-gray-400 text-right">
{t('marketing.signup.creatingNote')}
</p>
)}
</button>
</div>
)}
</div>
</div>