Skip to content

chore: arreglar SonarCloud MAJOR (a11y, readonly, cleanup, ternarios)#47

Merged
DevOtter97 merged 8 commits into
mainfrom
chore/sonar-major
May 2, 2026
Merged

chore: arreglar SonarCloud MAJOR (a11y, readonly, cleanup, ternarios)#47
DevOtter97 merged 8 commits into
mainfrom
chore/sonar-major

Conversation

@DevOtter97

Copy link
Copy Markdown
Owner

Summary

Segunda tanda de SonarCloud, basada encima de la PR #46. Cubre los hallazgos de severidad MAJOR (~70 issues) divididos en cuatro categorias, una sub-rama por categoria.

Base: chore/sonar-bugs-critical (PR #46). Cuando se mergee aquella, GitHub redirigira esta PR a main.

Cambios

  • chore: limpieza de imports/asignaciones muertas y micro-fixes (S1128 + S1854 + S125 + S2486 + S6772 + S6582 + S7762)

    • Imports sin usar: OAuthProvider, Timestamp, increment, setDoc, orderBy.
    • handleLogout/authService muertos en ListManager y ReadingList (Header tiene su propio dropdown desde hace tiempo).
    • normalizedQuery muerto en searchUsers. Comentario en ingles desfasado eliminado.
    • console.error comentado en ImageCropperModal.
    • catch sin handle en CustomListModal ahora loguea.
    • Optional chain en FirebaseAuthService (firebaseUser?.email) y ListCommentSection.
    • removeChild -> .remove() en useDropdown.test.
    • Spacing JSX ambiguo en UsernameSetupModal y CustomListModal.
  • chore: marcar props y miembros como readonly (S6759 + S2933)

    • 40 componentes Preact con Readonly<...Props> en su firma.
    • collectionRef readonly en los 3 FirestoreXRepository.
    • map readonly en MemoryStorage de tests/setup.
  • fix(a11y): form labels asociados con htmlFor y fieldset/legend (S6853 + S6847)

    • Cambia for= por htmlFor= en formularios (SonarQube no detectaba la asociacion con el atributo HTML 'for' en JSX).
    • Anade htmlFor + id a labels que no tenian asociacion explicita en UserProfile, CustomListModal, UsernameSetupModal, AccountSecurityForm, UsernameChangeForm.
    • Convierte labels de grupos de radios a <fieldset><legend> en CustomListModal (Visibilidad), StartReadingModal y ReadingForm (Unidad de Progreso).
  • refactor: aplanar ternarios anidados (S3358)

    • 'loading ? Loading : empty ? Empty : Content' en tabs/pickers split a conditional renders separados con &&.
    • Mappers de string en JSX extraidos a helpers (composerPlaceholder, charCountModifier, currentProgressLabel, formatChapterProgress, computeProgressWidth, submitButtonLabel).
    • UserProfile loading/profile/empty: split a 3 conditionals con &&.

Test plan

  • npx tsc --noEmit — solo el error pre-existente de ReadingMeasureUnit
  • npm run test:run — 60/60
  • npm run build — OK
  • Verificar en navegador que los formularios siguen funcionando (focus al hacer click en label)
  • Esperar al SonarCloud check del PR

DevOtter97 added 8 commits May 2, 2026 10:18
- Imports sin usar: OAuthProvider en FirebaseAuthService, Timestamp en
  FirestoreFriendRepository, increment+setDoc en
  FirestoreCustomListRepository, orderBy en FirestoreReadingRepository.
- Asignaciones muertas: handleLogout/authService inutilizados en
  ListManager y ReadingList (Header tiene su propio dropdown logout
  desde hace tiempo); normalizedQuery muerto en searchUsers.
- console.error y comentario en ingles desfasado eliminado en
  ImageCropperModal.
- catch sin handle en CustomListModal: ahora loguea el error.
- Optional chain en FirebaseAuthService (firebaseUser?.email) y
  ListCommentSection (comment.userId === currentUser?.id).
- removeChild -> .remove() en useDropdown.test.
- Spacing JSX ambiguo en UsernameSetupModal y CustomListModal.
- Props de los 40 componentes Preact ahora son Readonly<...>. SonarQube
  recomienda esto para componentes funcionales: deja claro que no se
  van a mutar y deja al type-checker pillar mutaciones accidentales.
- collectionRef en los 3 FirestoreXRepository marcado readonly.
- map en MemoryStorage de tests/setup marcado readonly.
- Cambia for= por htmlFor= en LoginForm, RegisterForm, ReadingForm,
  AccountSecurityForm, UsernameChangeForm, DeleteAccountSection. SonarQube
  no detectaba la asociacion con el atributo HTML 'for' en JSX.
- Anade htmlFor + id a labels que no tenian asociacion explicita en
  UserProfile (5 campos), CustomListModal (nombre/descripcion/buscador
  de lecturas), UsernameSetupModal, AccountSecurityForm (email actual),
  UsernameChangeForm (username actual).
- Convierte labels de grupos de radios a fieldset/legend en
  CustomListModal (Visibilidad), StartReadingModal y ReadingForm
  (Unidad de Progreso). Es la forma a11y correcta para etiquetar un
  grupo en vez de un control unico.
SonarQube S3358 marca ternarios nested-in-ternaries como dificiles de
leer. Las ramas mas comunes en este codebase eran:

- 'loading ? <Loading /> : empty ? <Empty /> : <Content />' en tabs y
  pickers (ProfileCommentsTab, ProfileListsTab, ProfilePostsTab,
  HomeFeed, NotificationBell, ListPickerModal, ReadingPickerModal,
  ExternalSearchModal, CommentList, CustomListModal). Se split en
  conditional-renders separados con && (sin else implicito anidado).

- Mappers de string en JSX (placeholder de PostComposer, label de
  ReadingForm/ReadingCard/ReadingDetailsModal, action button de
  UserSearch). Extraidos a helpers (composerPlaceholder,
  charCountModifier, currentProgressLabel, formatChapterProgress,
  computeProgressWidth, submitButtonLabel).

- UserProfile loading/profile/empty: split a 3 conditionals con &&.

Comportamiento identico, solo mejora la legibilidad.
# Conflicts:
#	src/components/home/PostComposer.tsx
#	src/components/lists/CustomListModal.tsx
#	src/components/profile/ProfileCommentsTab.tsx
#	src/components/profile/ProfileListsTab.tsx
#	src/components/profile/ProfilePostsTab.tsx
#	src/components/readings/ReadingCard.tsx
#	src/components/readings/ReadingDetailsModal.tsx
#	src/components/readings/ReadingForm.tsx
@vercel

vercel Bot commented May 2, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
gororeads Ignored Ignored May 2, 2026 8:48am

@sonarqubecloud

sonarqubecloud Bot commented May 2, 2026

Copy link
Copy Markdown

Base automatically changed from chore/sonar-bugs-critical to main May 2, 2026 09:00
@DevOtter97 DevOtter97 merged commit f94f19d into main May 2, 2026
6 checks passed
@DevOtter97 DevOtter97 deleted the chore/sonar-major branch May 2, 2026 09:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant