refactor: professional code quality audit
- Fix all TypeScript compilation errors (0 errors in src/) - Add try/catch error handling to ALL API routes (38 handlers) - Fix empty catch blocks (api-auth.ts now logs warnings) - Add aria-labels to all icon-only buttons (WCAG 2.1 AA) - Fix Prisma type mismatches (OR filter, Person.companyId, Estimate.projectId, Ticket.createdAt) - Fix webhook PATCH route (moved to [id]/route.ts) - Fix mobile-bottom-nav type safety - Fix KB route where-clause type - Fix test-mail banner null vs undefined - Fix task comment fetch: add cancellation + error toast - ESLint: 0 errors, 0 warnings - 175 files, 24.741 lines of code
This commit is contained in:
1 parent
969202764a
commit
fa8dd46571
175 files changed
+24741
-2
No files matched your search
Executable
+85
@@ -0,0 +1,85 @@
|
||||
'use client'
|
||||
|
||||
import { create } from 'zustand'
|
||||
import { persist } from 'zustand/middleware'
|
||||
import type { Locale } from '@/lib/i18n'
|
||||
|
||||
export type ViewId =
|
||||
| 'dashboard'
|
||||
| 'crm'
|
||||
| 'leads'
|
||||
| 'estimates'
|
||||
| 'projects'
|
||||
| 'timesheet'
|
||||
| 'support'
|
||||
| 'licenses'
|
||||
| 'contracts'
|
||||
| 'expenses'
|
||||
| 'finance'
|
||||
| 'accounting'
|
||||
| 'audit'
|
||||
| 'api'
|
||||
| 'kb'
|
||||
| 'calendar'
|
||||
| 'reporting'
|
||||
| 'settings'
|
||||
| 'settings_global'
|
||||
| 'setup'
|
||||
|
||||
interface AosState {
|
||||
view: ViewId
|
||||
setView: (v: ViewId) => void
|
||||
selectedCompanyId: string | null
|
||||
setSelectedCompany: (id: string | null) => void
|
||||
selectedLeadId: string | null
|
||||
setSelectedLead: (id: string | null) => void
|
||||
sidebarOpen: boolean
|
||||
setSidebarOpen: (open: boolean) => void
|
||||
commandOpen: boolean
|
||||
setCommandOpen: (open: boolean) => void
|
||||
// portal mode (PRD §6.3 client portal)
|
||||
portalMode: boolean
|
||||
portalCompanyId: string | null
|
||||
setPortalMode: (mode: boolean) => void
|
||||
setPortalCompany: (id: string | null) => void
|
||||
// i18n (PRD §5.5: de default, en, tr)
|
||||
locale: Locale
|
||||
setLocale: (l: Locale) => void
|
||||
// onboarding (PRD §9: onboarding checklists, no dead ends)
|
||||
onboardingSeen: boolean
|
||||
onboardingStep: number
|
||||
setOnboardingSeen: (seen: boolean) => void
|
||||
setOnboardingStep: (step: number) => void
|
||||
checklist: Record<string, boolean>
|
||||
toggleChecklist: (key: string) => void
|
||||
}
|
||||
|
||||
export const useAos = create<AosState>()(
|
||||
persist(
|
||||
(set) => ({
|
||||
view: 'dashboard',
|
||||
setView: (view) => set({ view }),
|
||||
selectedCompanyId: null,
|
||||
setSelectedCompany: (selectedCompanyId) => set({ selectedCompanyId }),
|
||||
selectedLeadId: null,
|
||||
setSelectedLead: (selectedLeadId) => set({ selectedLeadId }),
|
||||
sidebarOpen: false,
|
||||
setSidebarOpen: (sidebarOpen) => set({ sidebarOpen }),
|
||||
commandOpen: false,
|
||||
setCommandOpen: (commandOpen) => set({ commandOpen }),
|
||||
portalMode: false,
|
||||
portalCompanyId: null,
|
||||
setPortalMode: (portalMode) => set({ portalMode }),
|
||||
setPortalCompany: (portalCompanyId) => set({ portalCompanyId }),
|
||||
locale: 'de',
|
||||
setLocale: (locale) => set({ locale }),
|
||||
onboardingSeen: false,
|
||||
onboardingStep: 0,
|
||||
setOnboardingSeen: (onboardingSeen) => set({ onboardingSeen }),
|
||||
setOnboardingStep: (onboardingStep) => set({ onboardingStep }),
|
||||
checklist: {},
|
||||
toggleChecklist: (key) => set((s) => ({ checklist: { ...s.checklist, [key]: !s.checklist[key] } })),
|
||||
}),
|
||||
{ name: 'aos-ui', partialize: (s) => ({ view: s.view, portalMode: s.portalMode, portalCompanyId: s.portalCompanyId, locale: s.locale, onboardingSeen: s.onboardingSeen, checklist: s.checklist }) }
|
||||
)
|
||||
)
|
||||
Reference in new issue
Block a user