fix: stabilize builds, tests, and lint across all stacks
Complete stabilization pass bringing all 3 stacks to green:
Frontend (apps/web/):
- Fix TypeScript nullability in useSeason.ts, useTimeOfDay.ts hooks
- Disable no-undef in ESLint config (TypeScript handles it; JSX misidentified)
- Rename 306 story imports from @storybook/react to @storybook/react-vite
- Fix conditional hook call in useMediaQuery.ts useIsTablet
- Move useQuery to top of LoginPage.tsx component
- Remove useless try/catch in GearFormModal.tsx
- Fix stale closure in ResetPasswordPage.tsx handleChange
- Make Storybook decorators (withRouter, withQueryClient, withToast, withAudio)
no-ops since global StorybookDecorator already provides these — prevents
nested Router / duplicate provider crashes in vitest-browser
- Fix nested MemoryRouter in 3 page stories (TrackDetail, PlaylistDetail, UserProfile)
- Update i18n initialization in test setup (await init before changeLanguage)
- Update ~30 test assertions from English to French to match i18n translations
- Update test assertions to match SUMI V3 design changes (shadow vs border)
- Fix remaining story type errors (PlayerError, PlaylistBatchActions,
TrackFilters, VirtualizedChatMessages)
Backend (veza-backend-api/):
- Fix response_test.go RespondWithAppError signature (2 args, not 3)
- Fix TestErrorContractAuthEndpoints expected error codes
(ErrCodeUnauthorized vs ErrCodeInvalidCredentials)
- Fix TestTrackHandler_GetTrackLikes_Success missing auth middleware setup
- Fix TestPlaybackAnalyticsService_GetTrackStats k-anonymity threshold
(needs 5 unique users, not 1)
- Replace NOW() PostgreSQL function with time.Now() parameter in marketplace
service for SQLite test compatibility
- Add missing AutoMigrate entries in marketplace_test.go
(ProductImage, ProductPreview, ProductLicense, ProductReview)
Results:
- Frontend TypeCheck: 617 errors -> 0 errors
- Frontend ESLint: 349 errors -> 0 errors
- Frontend Vitest: 196 failing tests -> 1 skipped (3396/3397 passing)
- Backend go vet: 1 error -> 0 errors
- Backend tests: 5 failing -> all 13 packages passing
- Rust: 150/150 tests passing (unchanged)
- Storybook audit: 0 errors across 1244 stories
Triage report: docs/TRIAGE_REPORT.md
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 14:48:07 +00:00
|
|
|
import type { Meta, StoryObj } from '@storybook/react-vite';
|
feat(web): update all features, stories, e2e tests, and auth interceptor
Update auth, playlists, tracks, search, profile, dashboard, player,
settings, and social features. Add e2e audit specs for all major pages.
Update ESLint config, vitest config, and route configuration.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 17:16:36 +00:00
|
|
|
import { fn } from 'storybook/test';
|
2026-02-03 08:56:11 +00:00
|
|
|
import { BanUserModal } from './BanUserModal';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* BanUserModal - Modal de suspension d'utilisateur
|
|
|
|
|
*
|
|
|
|
|
* Modal permettant de configurer et confirmer la suspension
|
|
|
|
|
* d'un utilisateur avec raison, durée et notes internes.
|
|
|
|
|
*/
|
|
|
|
|
const meta: Meta<typeof BanUserModal> = {
|
2026-02-05 13:20:06 +00:00
|
|
|
title: 'Components/Features/Admin/Modals/BanUserModal',
|
2026-02-03 08:56:11 +00:00
|
|
|
component: BanUserModal,
|
|
|
|
|
parameters: {
|
|
|
|
|
layout: 'centered',
|
|
|
|
|
docs: {
|
|
|
|
|
description: {
|
|
|
|
|
component: 'Modal de suspension avec options temporaire/permanent et raisons prédéfinies.',
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
tags: ['autodocs'],
|
|
|
|
|
args: {
|
|
|
|
|
username: 'troublemaker_user',
|
|
|
|
|
onClose: fn(),
|
|
|
|
|
onConfirm: fn(),
|
|
|
|
|
},
|
|
|
|
|
argTypes: {
|
|
|
|
|
username: {
|
|
|
|
|
control: 'text',
|
|
|
|
|
description: 'Nom d\'utilisateur à suspendre',
|
|
|
|
|
},
|
|
|
|
|
onClose: {
|
|
|
|
|
action: 'onClose',
|
|
|
|
|
description: 'Callback appelé à la fermeture',
|
|
|
|
|
},
|
|
|
|
|
onConfirm: {
|
|
|
|
|
action: 'onConfirm',
|
|
|
|
|
description: 'Callback appelé à la confirmation avec (reason, details, duration)',
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
decorators: [
|
|
|
|
|
(Story) => (
|
2026-02-07 14:10:32 +00:00
|
|
|
<div className="bg-background min-h-screen flex items-center justify-center">
|
2026-02-03 08:56:11 +00:00
|
|
|
<Story />
|
|
|
|
|
</div>
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default meta;
|
|
|
|
|
type Story = StoryObj<typeof meta>;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* État par défaut de la modal.
|
|
|
|
|
*/
|
|
|
|
|
export const Default: Story = {
|
|
|
|
|
name: 'Par défaut',
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Étape de confirmation avant suspension.
|
|
|
|
|
*/
|
|
|
|
|
export const Confirm: Story = {
|
|
|
|
|
name: 'Confirmation',
|
|
|
|
|
args: {
|
|
|
|
|
username: 'spammer_account',
|
|
|
|
|
},
|
|
|
|
|
parameters: {
|
|
|
|
|
docs: {
|
|
|
|
|
description: {
|
|
|
|
|
story: 'Prêt à confirmer la suspension de l\'utilisateur.',
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
};
|