From af524ec99dc9ad81f6445047f0e823cc49101917 Mon Sep 17 00:00:00 2001 From: chihlasm Date: Mon, 30 Mar 2026 05:44:57 +0000 Subject: [PATCH] refactor: account settings page audit fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace 15+ hard-coded color utilities with semantic tokens (text-danger, bg-success-dim, bg-warning-dim, bg-info-dim, etc.) - Fix progress bar track/fill color collision (bg-accent → bg-muted track) - Fix plan badge contrast: bg-accent text-muted-foreground → bg-accent-dim text-accent-text (WCAG AA violation) - Add aria-label to role-change select, remove member button, resend invite button - Add p-1 padding to icon-only buttons for minimum touch targets - Replace inline inviteError/inviteSuccess state with toast.success/error - Add toast feedback to handleSaveName and handleRemoveMember (were silent) - Fix transition-all → transition-colors on all 7 nav link cards - Fix hover:border-border (no-op) → hover:border-border-hover on nav cards - Consolidate 5 separate isAccountOwner nav card blocks under Team Settings section label for visual hierarchy - Remove duplicate embedded BrandingSettings component (Branding nav card exists) - Fix "tree categories" → "flow categories" (user-facing terminology) - Fix Target Lists description (remove reference to hidden maintenance flows) - Fix UsageStat label "Trees" → "Flows" - Remove orphaned BrandingSettings import and unused user store selector - Fix duplicate text-xs class in SSO Enterprise badge - Remove internal (Task 11) comment noise Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/pages/AccountSettingsPage.tsx | 229 ++++++++++----------- 1 file changed, 105 insertions(+), 124 deletions(-) diff --git a/frontend/src/pages/AccountSettingsPage.tsx b/frontend/src/pages/AccountSettingsPage.tsx index 530236d7..3c47835d 100644 --- a/frontend/src/pages/AccountSettingsPage.tsx +++ b/frontend/src/pages/AccountSettingsPage.tsx @@ -2,7 +2,6 @@ import { useEffect, useState } from 'react' import { Link } from 'react-router-dom' import { Building2, Users, Mail, Crown, Loader2, AlertCircle, Check, X, Settings, FolderTree, Server, RefreshCw, MessageSquareText, UserCog, AlertTriangle, Clock, Plug, Palette, ShieldCheck } from 'lucide-react' import { PageMeta } from '@/components/common/PageMeta' -import { BrandingSettings } from '@/components/settings/BrandingSettings' import { accountsApi } from '@/api/accounts' import type { Account, AccountMember, AccountInvite } from '@/types' import { TransferOwnershipModal } from '@/components/account/TransferOwnershipModal' @@ -22,7 +21,6 @@ export function AccountSettingsPage() { const { isAccountOwner } = usePermissions() const { plan, limits, usage } = useSubscription() const { defaultExportFormat, setDefaultExportFormat } = useUserPreferencesStore() - const user = useAuthStore((s) => s.user) const subscription = useAuthStore((s) => s.subscription) const [account, setAccount] = useState(null) @@ -45,8 +43,6 @@ export function AccountSettingsPage() { const [inviteEmail, setInviteEmail] = useState('') const [inviteRole, setInviteRole] = useState('engineer') const [isInviting, setIsInviting] = useState(false) - const [inviteError, setInviteError] = useState(null) - const [inviteSuccess, setInviteSuccess] = useState(null) useEffect(() => { loadData() @@ -86,7 +82,9 @@ export function AccountSettingsPage() { const updated = await accountsApi.updateMyAccount({ name: editedName.trim() }) setAccount(updated) setIsEditingName(false) + toast.success('Account name updated') } catch (err) { + toast.error('Failed to update account name') console.error('Failed to update account name:', err) } finally { setIsSavingName(false) @@ -98,17 +96,14 @@ export function AccountSettingsPage() { if (!inviteEmail.trim()) return setIsInviting(true) - setInviteError(null) - setInviteSuccess(null) try { await accountsApi.createInvite({ email: inviteEmail.trim(), role: inviteRole }) - setInviteSuccess(`Invitation sent to ${inviteEmail}`) + toast.success(`Invitation sent to ${inviteEmail}`) setInviteEmail('') - // Refresh invites list const invitesData = await accountsApi.getInvites() setInvites(invitesData) } catch (err) { - setInviteError('Failed to send invitation') + toast.error('Failed to send invitation') console.error(err) } finally { setIsInviting(false) @@ -135,7 +130,9 @@ export function AccountSettingsPage() { try { await accountsApi.removeMember(userId) setMembers(members.filter((m) => m.id !== userId)) + toast.success('Member removed') } catch (err) { + toast.error('Failed to remove member') console.error('Failed to remove member:', err) } } @@ -150,7 +147,7 @@ export function AccountSettingsPage() { if (error) { return ( -
+
{error} @@ -230,7 +227,7 @@ export function AccountSettingsPage() { {isAccountOwner && ( @@ -261,9 +258,9 @@ export function AccountSettingsPage() { @@ -273,11 +270,11 @@ export function AccountSettingsPage() { {sub.status.charAt(0).toUpperCase() + sub.status.slice(1).replace('_', ' ')} @@ -295,7 +292,7 @@ export function AccountSettingsPage() { {limits && usage && (
@@ -350,12 +347,13 @@ export function AccountSettingsPage() {
{member.account_role === 'owner' ? ( - + owner ) : ( )} {!member.is_active && ( - + Inactive )} {member.account_role !== 'owner' && ( @@ -438,12 +436,6 @@ export function AccountSettingsPage() {
- {inviteError && ( -

{inviteError}

- )} - {inviteSuccess && ( -

{inviteSuccess}

- )} {/* Pending Invites */} @@ -467,14 +459,14 @@ export function AccountSettingsPage() {

- + {invite.role} @@ -774,7 +755,7 @@ function UsageStat({

{current} @@ -783,11 +764,11 @@ function UsageStat({

{!isUnlimited && ( -
+