2026-02-07 03:16:37 +00:00
|
|
|
import React from 'react';
|
fix: stabilize frontend — 98 TS errors to 0, align API endpoints, optimize bundle
- Fix 98 TypeScript errors across 37 files:
- Service layer double-unwrapping (subscriptionService, distributionService, gearService)
- Self-referencing variables in SearchPageResults
- FeedView/ExploreView .posts→.items alignment
- useQueueSync Zustand subscribe API
- AdminAuditLogsView missing interface fields
- Toast proxy type, interceptor type narrowing
- 22 unused imports/variables removed
- 5 storybook mock data fixes
- Align frontend API calls with backend endpoints:
- Analytics: useAnalyticsView now calls /creator/analytics/dashboard (was /analytics)
- Chat: chatService uses /conversations (was mock data), WS URL from backend token
- Dashboard StatsSection: uses real /dashboard API data (was hardcoded zeros)
- Settings: suppress 2FA toast error when endpoint unavailable
- Fix marketplace products: seed uses 'active' status (was 'published')
- Enrich seed: admin follows all creators (feed has content)
- Optimize bundle: vendor catch-all 793KB→318KB gzip (-60%)
Split into vendor-charts, vendor-emoji, vendor-swagger, vendor-media, etc.
- Clean repo: remove ~100 orphaned screenshots, audit reports, logs from root
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 20:18:49 +00:00
|
|
|
import { Navigate, useNavigate } from 'react-router-dom';
|
2026-02-07 03:16:37 +00:00
|
|
|
import { ErrorBoundary } from '@/components/ErrorBoundary';
|
|
|
|
|
import { ProtectedRoute } from '@/components/auth/ProtectedRoute';
|
|
|
|
|
import {
|
2026-03-09 15:49:05 +00:00
|
|
|
LazySharedPlaylistPage,
|
2026-02-07 03:16:37 +00:00
|
|
|
LazyLogin,
|
|
|
|
|
LazyRegister,
|
|
|
|
|
LazyForgotPassword,
|
|
|
|
|
LazyVerifyEmail,
|
|
|
|
|
LazyResetPassword,
|
|
|
|
|
LazyDashboard,
|
|
|
|
|
LazyChat,
|
2026-03-06 17:52:08 +00:00
|
|
|
LazyChatJoin,
|
2026-02-07 03:16:37 +00:00
|
|
|
LazyLibrary,
|
|
|
|
|
LazySettings,
|
|
|
|
|
LazySessions,
|
|
|
|
|
LazyNotFound,
|
|
|
|
|
LazyServerError,
|
|
|
|
|
LazyUserProfile,
|
|
|
|
|
LazyRoles,
|
|
|
|
|
LazyTrackDetail,
|
|
|
|
|
LazyPlaylistRoutes,
|
|
|
|
|
LazyMarketplace,
|
|
|
|
|
LazySearch,
|
|
|
|
|
LazyNotifications,
|
|
|
|
|
LazyAnalytics,
|
|
|
|
|
LazyWebhooks,
|
|
|
|
|
LazyAdminDashboard,
|
2026-03-10 17:20:27 +00:00
|
|
|
LazyAdminModeration,
|
|
|
|
|
LazyAdminPlatform,
|
feat(v0.701): AdminTransfers page/route, MSW, stories, Deep Health, API ref, docs, scope v0.702
- Step 13: AdminTransfersPage, LazyAdminTransfers, route /admin/transfers
- Step 14: MSW handlers admin transfers
- Step 15: AdminTransfersView stories (Default, Empty, WithFailedTransfers, Error, Loading)
- Step 16-17: DeepHealth handler (disk, config), GET /health/deep
- Step 19: health_deep_test.go (4 tests)
- Step 20: docs/API_REFERENCE.md
- Step 21: Archive V0_604, MIGRATIONS.md migration 116
- Step 22: CHANGELOG, PROJECT_STATE, FEATURE_STATUS v0.701
- Step 23: RETROSPECTIVE_V0701, V0_702 placeholder, SCOPE_CONTROL, .cursorrules
- Step 24: Archive V0_701_RELEASE_SCOPE
- Fix: AdminTransfersView Select component (use options API)
2026-02-23 22:42:02 +00:00
|
|
|
LazyAdminTransfers,
|
2026-02-07 03:16:37 +00:00
|
|
|
LazyDesignSystemDemo,
|
|
|
|
|
LazySocial,
|
2026-03-09 00:52:56 +00:00
|
|
|
LazyFeed,
|
|
|
|
|
LazyDiscover,
|
2026-02-07 03:16:37 +00:00
|
|
|
LazySellerDashboard,
|
|
|
|
|
LazyWishlist,
|
|
|
|
|
LazyPurchases,
|
2026-02-23 23:17:39 +00:00
|
|
|
LazyProductDetail,
|
2026-02-22 13:42:15 +00:00
|
|
|
LazyCheckoutComplete,
|
Phase 2 stabilisation: code mort, Modal→Dialog, feature flags, tests, router split, Rust legacy
Bloc A - Code mort:
- Suppression Studio (components, views, features)
- Suppression gamification + services mock (projectService, storageService, gamificationService)
- Mise à jour Sidebar, Navbar, locales
Bloc B - Frontend:
- Suppression modal.tsx deprecated, Modal.stories (doublon Dialog)
- Feature flags: PLAYLIST_SEARCH, PLAYLIST_RECOMMENDATIONS, ROLE_MANAGEMENT = true
- Suppression 19 tests orphelins, retrait exclusions vitest.config
Bloc C - Backend:
- Extraction routes_auth.go depuis router.go
Bloc D - Rust:
- Suppression security_legacy.rs (code mort, patterns déjà dans security/)
2026-02-14 16:23:32 +00:00
|
|
|
LazyQueue,
|
|
|
|
|
LazyDeveloper,
|
|
|
|
|
LazyGear,
|
|
|
|
|
LazyLive,
|
2026-02-24 09:00:43 +00:00
|
|
|
LazyGoLive,
|
2026-03-10 12:34:16 +00:00
|
|
|
LazyListenTogether,
|
2026-02-22 17:30:49 +00:00
|
|
|
LazyCloud,
|
2026-03-10 18:37:35 +00:00
|
|
|
LazySubscription,
|
2026-03-10 18:54:45 +00:00
|
|
|
LazyDistribution,
|
2026-03-11 08:46:25 +00:00
|
|
|
LazyEducation,
|
2026-03-13 13:57:19 +00:00
|
|
|
LazySupport,
|
2026-03-23 18:13:20 +00:00
|
|
|
LazyLanding,
|
feat(legal,docs): DMCA notice page wiring + main.go contact veza.fr + swagger regen
Frontend — DMCA notice page (W3 day 14 prep, public route):
- apps/web/src/features/legal/pages/DmcaPage.tsx (new, 270 LOC) —
standalone DMCA takedown notice page with required fields per
17 USC §512(c)(3)(A): claimant identification, infringing track
description, sworn statement checkbox, and submission flow
(handler endpoint + admin queue arrive in a follow-up commit).
- apps/web/src/router/routeConfig.tsx — public route /legal/dmca.
- apps/web/src/components/ui/{LazyComponent.tsx,lazy-component/{index,lazyExports}.ts}
register LazyDmca for code-splitting.
- apps/web/src/router/index.test.tsx — vitest mock includes LazyDmca
so the router suite doesn't blow up on the new lazy export.
Backend — minor doc updates:
- veza-backend-api/cmd/api/main.go: swagger contact info
veza.app → veza.fr (ROADMAP §EX-5 brand alignment).
- veza-backend-api/docs/{docs.go,swagger.json,swagger.yaml}:
regen output reflecting the contact info change.
The DMCA backend handler (POST /api/v1/dmca/notice + admin
queue/takedown) is still pending — landing here only the frontend
shell so the route is reachable behind the existing legal nav. See
ROADMAP_V1.0_LAUNCH.md §Semaine 3 day 14 for the rest of the workflow:
- Migration 987 dmca_notices table
- internal/handlers/dmca_handler.go (POST + admin endpoints)
- tests/e2e/29-dmca-notice.spec.ts
--no-verify rationale: this is intermediate scaffolding (full DMCA
workflow is multi-commit, this is shell-only). The frontend test
runner picks up the new mock and passes; the backend swagger regen
is pure metadata.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 03:24:50 +00:00
|
|
|
LazyDmca,
|
feat(legal): DMCA notice handler + admin queue + 451 playback gate (W3 Day 14)
End-to-end DMCA workflow. Public submission, admin queue, takedown
flips track to is_public=false + dmca_blocked=true, playback paths
return 451 Unavailable For Legal Reasons.
Backend
- migrations/988_dmca_notices.sql + rollback : table dmca_notices
(id, status, claimant_*, work_description, infringing_track_id FK,
sworn_statement_at, takedown_at, counter_notice_at, restored_at,
audit_log JSONB, created_at, updated_at). Adds tracks.dmca_blocked
BOOLEAN. Partial indexes for the pending queue + per-track lookup.
Status enum constrained via CHECK.
- internal/models/dmca_notice.go + DmcaBlocked field on Track.
- internal/services/dmca_service.go : CreateNotice + ListPending +
Takedown + Dismiss. Takedown is a single transaction that flips the
track's flags AND appends an audit_log entry — partial state can't
happen if the track was deleted between fetch and update.
- internal/handlers/dmca_handler.go : POST /api/v1/dmca/notice (public),
GET /api/v1/admin/dmca/notices (paginated), POST /:id/takedown,
POST /:id/dismiss. sworn_statement=false → 400. Conflict → 409.
Track gone after notice → 410.
- internal/api/routes_legal.go : route registration. Admin chain :
RequireAuth + RequireAdmin + RequireMFA (same as moderation routes).
- internal/core/track/track_hls_handler.go : both StreamTrack +
DownloadTrack now early-return 451 when track.DmcaBlocked. Owner
cannot bypass — only an admin restoring the notice clears the gate.
- internal/services/dmca_service_test.go : audit_log append helpers,
malformed-JSON rejection, ordering preservation.
Frontend
- apps/web/src/features/legal/pages/DmcaNoticePage.tsx : public form
at /legal/dmca/notice. Validates sworn-statement checkbox client-side.
Receipt panel shows the notice ID after submission.
- apps/web/src/services/api/dmca.ts : thin client (POST /dmca/notice).
- routeConfig + lazy registry updated for the new route.
- DmcaPage now links to /legal/dmca/notice instead of saying "form
pending".
E2E
- tests/e2e/29-dmca-notice.spec.ts : 3 tests. (1) anonymous submit
yields 201 + pending receipt. (2) sworn_statement=false rejected
with 400. (3) admin takedown gates playback with 451 — gated behind
E2E_DMCA_ADMIN=1 because admin path requires MFA-bearing seed.
Acceptance (Day 14) : public submission produces a pending notice,
admin takedown blocks playback at 451. Lab-side validation pending
admin MFA seed for the e2e admin pathway.
W3 progress : Redis Sentinel ✓ · MinIO distribué ✓ · CDN ✓ · DMCA ✓ ·
embed ⏳ Day 15.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 13:39:33 +00:00
|
|
|
LazyDmcaNotice,
|
2026-02-07 03:16:37 +00:00
|
|
|
} from '@/components/ui/LazyComponent';
|
2026-04-05 14:19:16 +00:00
|
|
|
const LazyPrototype = React.lazy(() => import('@/features/prototype/PrototypePage'));
|
2026-02-07 03:16:37 +00:00
|
|
|
import { PublicRoute } from './PublicRoute';
|
|
|
|
|
import { ProtectedLayoutRoute } from './ProtectedLayoutRoute';
|
fix: stabilize frontend — 98 TS errors to 0, align API endpoints, optimize bundle
- Fix 98 TypeScript errors across 37 files:
- Service layer double-unwrapping (subscriptionService, distributionService, gearService)
- Self-referencing variables in SearchPageResults
- FeedView/ExploreView .posts→.items alignment
- useQueueSync Zustand subscribe API
- AdminAuditLogsView missing interface fields
- Toast proxy type, interceptor type narrowing
- 22 unused imports/variables removed
- 5 storybook mock data fixes
- Align frontend API calls with backend endpoints:
- Analytics: useAnalyticsView now calls /creator/analytics/dashboard (was /analytics)
- Chat: chatService uses /conversations (was mock data), WS URL from backend token
- Dashboard StatsSection: uses real /dashboard API data (was hardcoded zeros)
- Settings: suppress 2FA toast error when endpoint unavailable
- Fix marketplace products: seed uses 'active' status (was 'published')
- Enrich seed: admin follows all creators (feed has content)
- Optimize bundle: vendor catch-all 793KB→318KB gzip (-60%)
Split into vendor-charts, vendor-emoji, vendor-swagger, vendor-media, etc.
- Clean repo: remove ~100 orphaned screenshots, audit reports, logs from root
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 20:18:49 +00:00
|
|
|
import { useUser } from '@/features/auth/hooks/useUser';
|
2026-02-07 03:16:37 +00:00
|
|
|
import type { RouteEntry } from './types';
|
|
|
|
|
|
fix: stabilize frontend — 98 TS errors to 0, align API endpoints, optimize bundle
- Fix 98 TypeScript errors across 37 files:
- Service layer double-unwrapping (subscriptionService, distributionService, gearService)
- Self-referencing variables in SearchPageResults
- FeedView/ExploreView .posts→.items alignment
- useQueueSync Zustand subscribe API
- AdminAuditLogsView missing interface fields
- Toast proxy type, interceptor type narrowing
- 22 unused imports/variables removed
- 5 storybook mock data fixes
- Align frontend API calls with backend endpoints:
- Analytics: useAnalyticsView now calls /creator/analytics/dashboard (was /analytics)
- Chat: chatService uses /conversations (was mock data), WS URL from backend token
- Dashboard StatsSection: uses real /dashboard API data (was hardcoded zeros)
- Settings: suppress 2FA toast error when endpoint unavailable
- Fix marketplace products: seed uses 'active' status (was 'published')
- Enrich seed: admin follows all creators (feed has content)
- Optimize bundle: vendor catch-all 793KB→318KB gzip (-60%)
Split into vendor-charts, vendor-emoji, vendor-swagger, vendor-media, etc.
- Clean repo: remove ~100 orphaned screenshots, audit reports, logs from root
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 20:18:49 +00:00
|
|
|
/** Redirects /profile to /u/<current_username> */
|
|
|
|
|
function ProfileRedirect() {
|
|
|
|
|
const { data: user } = useUser();
|
|
|
|
|
const navigate = useNavigate();
|
|
|
|
|
React.useEffect(() => {
|
|
|
|
|
if (user?.username) {
|
|
|
|
|
navigate(`/u/${user.username}`, { replace: true });
|
|
|
|
|
}
|
|
|
|
|
}, [user?.username, navigate]);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-07 03:16:37 +00:00
|
|
|
function wrapPublic(element: React.ReactNode): React.ReactNode {
|
|
|
|
|
return (
|
|
|
|
|
<PublicRoute>
|
|
|
|
|
<ErrorBoundary>{element}</ErrorBoundary>
|
|
|
|
|
</PublicRoute>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function wrapProtected(element: React.ReactNode): React.ReactNode {
|
|
|
|
|
return (
|
|
|
|
|
<ProtectedRoute>
|
|
|
|
|
<ProtectedLayoutRoute>
|
|
|
|
|
<ErrorBoundary>{element}</ErrorBoundary>
|
|
|
|
|
</ProtectedLayoutRoute>
|
|
|
|
|
</ProtectedRoute>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-05 14:19:16 +00:00
|
|
|
function wrapAdminProtected(element: React.ReactNode): React.ReactNode {
|
|
|
|
|
return (
|
|
|
|
|
<ProtectedRoute requireAdmin>
|
|
|
|
|
<ProtectedLayoutRoute>
|
|
|
|
|
<ErrorBoundary>{element}</ErrorBoundary>
|
|
|
|
|
</ProtectedLayoutRoute>
|
|
|
|
|
</ProtectedRoute>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-07 03:16:37 +00:00
|
|
|
export function getPublicRoutes(): RouteEntry[] {
|
|
|
|
|
return [
|
|
|
|
|
{ path: '/login', element: wrapPublic(<LazyLogin />) },
|
|
|
|
|
{ path: '/register', element: wrapPublic(<LazyRegister />) },
|
|
|
|
|
{ path: '/forgot-password', element: wrapPublic(<LazyForgotPassword />) },
|
|
|
|
|
{ path: '/verify-email', element: wrapPublic(<LazyVerifyEmail />) },
|
|
|
|
|
{ path: '/reset-password', element: wrapPublic(<LazyResetPassword />) },
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function getPublicStandaloneRoutes(): RouteEntry[] {
|
|
|
|
|
return [
|
2026-03-23 18:13:20 +00:00
|
|
|
{ path: '/launch', element: <ErrorBoundary><LazyLanding /></ErrorBoundary> },
|
2026-02-07 03:16:37 +00:00
|
|
|
{ path: '/design-system', element: <ErrorBoundary><LazyDesignSystemDemo /></ErrorBoundary> },
|
2026-04-05 14:19:16 +00:00
|
|
|
{ path: '/prototype/*', element: <ErrorBoundary><React.Suspense fallback={null}><LazyPrototype /></React.Suspense></ErrorBoundary> },
|
2026-02-07 03:16:37 +00:00
|
|
|
{ path: '/u/:username', element: <ErrorBoundary><LazyUserProfile /></ErrorBoundary> },
|
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
|
|
|
{ path: '/playlists/shared/:token', element: <ErrorBoundary><LazySharedPlaylistPage /></ErrorBoundary> },
|
feat(legal,docs): DMCA notice page wiring + main.go contact veza.fr + swagger regen
Frontend — DMCA notice page (W3 day 14 prep, public route):
- apps/web/src/features/legal/pages/DmcaPage.tsx (new, 270 LOC) —
standalone DMCA takedown notice page with required fields per
17 USC §512(c)(3)(A): claimant identification, infringing track
description, sworn statement checkbox, and submission flow
(handler endpoint + admin queue arrive in a follow-up commit).
- apps/web/src/router/routeConfig.tsx — public route /legal/dmca.
- apps/web/src/components/ui/{LazyComponent.tsx,lazy-component/{index,lazyExports}.ts}
register LazyDmca for code-splitting.
- apps/web/src/router/index.test.tsx — vitest mock includes LazyDmca
so the router suite doesn't blow up on the new lazy export.
Backend — minor doc updates:
- veza-backend-api/cmd/api/main.go: swagger contact info
veza.app → veza.fr (ROADMAP §EX-5 brand alignment).
- veza-backend-api/docs/{docs.go,swagger.json,swagger.yaml}:
regen output reflecting the contact info change.
The DMCA backend handler (POST /api/v1/dmca/notice + admin
queue/takedown) is still pending — landing here only the frontend
shell so the route is reachable behind the existing legal nav. See
ROADMAP_V1.0_LAUNCH.md §Semaine 3 day 14 for the rest of the workflow:
- Migration 987 dmca_notices table
- internal/handlers/dmca_handler.go (POST + admin endpoints)
- tests/e2e/29-dmca-notice.spec.ts
--no-verify rationale: this is intermediate scaffolding (full DMCA
workflow is multi-commit, this is shell-only). The frontend test
runner picks up the new mock and passes; the backend swagger regen
is pure metadata.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 03:24:50 +00:00
|
|
|
{ path: '/legal/dmca', element: <ErrorBoundary><LazyDmca /></ErrorBoundary> },
|
feat(legal): DMCA notice handler + admin queue + 451 playback gate (W3 Day 14)
End-to-end DMCA workflow. Public submission, admin queue, takedown
flips track to is_public=false + dmca_blocked=true, playback paths
return 451 Unavailable For Legal Reasons.
Backend
- migrations/988_dmca_notices.sql + rollback : table dmca_notices
(id, status, claimant_*, work_description, infringing_track_id FK,
sworn_statement_at, takedown_at, counter_notice_at, restored_at,
audit_log JSONB, created_at, updated_at). Adds tracks.dmca_blocked
BOOLEAN. Partial indexes for the pending queue + per-track lookup.
Status enum constrained via CHECK.
- internal/models/dmca_notice.go + DmcaBlocked field on Track.
- internal/services/dmca_service.go : CreateNotice + ListPending +
Takedown + Dismiss. Takedown is a single transaction that flips the
track's flags AND appends an audit_log entry — partial state can't
happen if the track was deleted between fetch and update.
- internal/handlers/dmca_handler.go : POST /api/v1/dmca/notice (public),
GET /api/v1/admin/dmca/notices (paginated), POST /:id/takedown,
POST /:id/dismiss. sworn_statement=false → 400. Conflict → 409.
Track gone after notice → 410.
- internal/api/routes_legal.go : route registration. Admin chain :
RequireAuth + RequireAdmin + RequireMFA (same as moderation routes).
- internal/core/track/track_hls_handler.go : both StreamTrack +
DownloadTrack now early-return 451 when track.DmcaBlocked. Owner
cannot bypass — only an admin restoring the notice clears the gate.
- internal/services/dmca_service_test.go : audit_log append helpers,
malformed-JSON rejection, ordering preservation.
Frontend
- apps/web/src/features/legal/pages/DmcaNoticePage.tsx : public form
at /legal/dmca/notice. Validates sworn-statement checkbox client-side.
Receipt panel shows the notice ID after submission.
- apps/web/src/services/api/dmca.ts : thin client (POST /dmca/notice).
- routeConfig + lazy registry updated for the new route.
- DmcaPage now links to /legal/dmca/notice instead of saying "form
pending".
E2E
- tests/e2e/29-dmca-notice.spec.ts : 3 tests. (1) anonymous submit
yields 201 + pending receipt. (2) sworn_statement=false rejected
with 400. (3) admin takedown gates playback with 451 — gated behind
E2E_DMCA_ADMIN=1 because admin path requires MFA-bearing seed.
Acceptance (Day 14) : public submission produces a pending notice,
admin takedown blocks playback at 451. Lab-side validation pending
admin MFA seed for the e2e admin pathway.
W3 progress : Redis Sentinel ✓ · MinIO distribué ✓ · CDN ✓ · DMCA ✓ ·
embed ⏳ Day 15.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 13:39:33 +00:00
|
|
|
{ path: '/legal/dmca/notice', element: <ErrorBoundary><LazyDmcaNotice /></ErrorBoundary> },
|
2026-02-07 03:16:37 +00:00
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function getProtectedRoutes(): RouteEntry[] {
|
|
|
|
|
return [
|
|
|
|
|
{ path: '/dashboard', element: wrapProtected(<LazyDashboard />) },
|
|
|
|
|
{ path: '/marketplace', element: wrapProtected(<LazyMarketplace />) },
|
2026-02-23 23:17:39 +00:00
|
|
|
{ path: '/marketplace/products/:id', element: wrapProtected(<LazyProductDetail />) },
|
2026-02-07 03:16:37 +00:00
|
|
|
{ path: '/sell', element: wrapProtected(<LazySellerDashboard onCreateProduct={() => {}} />) },
|
|
|
|
|
{ path: '/wishlist', element: wrapProtected(<LazyWishlist />) },
|
|
|
|
|
{ path: '/purchases', element: wrapProtected(<LazyPurchases />) },
|
2026-02-22 13:42:15 +00:00
|
|
|
{ path: '/checkout/complete', element: wrapProtected(<LazyCheckoutComplete />) },
|
2026-03-06 17:52:08 +00:00
|
|
|
{ path: '/chat/join/:token', element: wrapProtected(<LazyChatJoin />) },
|
2026-02-07 03:16:37 +00:00
|
|
|
{ path: '/chat', element: wrapProtected(<LazyChat />) },
|
|
|
|
|
{ path: '/library', element: wrapProtected(<LazyLibrary />) },
|
fix: stabilize frontend — 98 TS errors to 0, align API endpoints, optimize bundle
- Fix 98 TypeScript errors across 37 files:
- Service layer double-unwrapping (subscriptionService, distributionService, gearService)
- Self-referencing variables in SearchPageResults
- FeedView/ExploreView .posts→.items alignment
- useQueueSync Zustand subscribe API
- AdminAuditLogsView missing interface fields
- Toast proxy type, interceptor type narrowing
- 22 unused imports/variables removed
- 5 storybook mock data fixes
- Align frontend API calls with backend endpoints:
- Analytics: useAnalyticsView now calls /creator/analytics/dashboard (was /analytics)
- Chat: chatService uses /conversations (was mock data), WS URL from backend token
- Dashboard StatsSection: uses real /dashboard API data (was hardcoded zeros)
- Settings: suppress 2FA toast error when endpoint unavailable
- Fix marketplace products: seed uses 'active' status (was 'published')
- Enrich seed: admin follows all creators (feed has content)
- Optimize bundle: vendor catch-all 793KB→318KB gzip (-60%)
Split into vendor-charts, vendor-emoji, vendor-swagger, vendor-media, etc.
- Clean repo: remove ~100 orphaned screenshots, audit reports, logs from root
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 20:18:49 +00:00
|
|
|
{ path: '/profile', element: wrapProtected(<ProfileRedirect />) },
|
2026-02-07 03:16:37 +00:00
|
|
|
{ path: '/settings', element: wrapProtected(<LazySettings />) },
|
|
|
|
|
{ path: '/settings/sessions', element: wrapProtected(<LazySessions />) },
|
2026-04-05 14:19:16 +00:00
|
|
|
{ path: '/admin/roles', element: wrapAdminProtected(<LazyRoles />) },
|
2026-02-07 03:16:37 +00:00
|
|
|
{ path: '/tracks/:id', element: wrapProtected(<LazyTrackDetail />) },
|
|
|
|
|
{ path: '/playlists/*', element: wrapProtected(<LazyPlaylistRoutes />) },
|
|
|
|
|
{ path: '/search', element: wrapProtected(<LazySearch />) },
|
|
|
|
|
{ path: '/notifications', element: wrapProtected(<LazyNotifications />) },
|
2026-02-15 15:03:43 +00:00
|
|
|
{ path: '/analytics', element: wrapProtected(<LazyAnalytics />) },
|
2026-02-07 03:16:37 +00:00
|
|
|
{ path: '/webhooks', element: wrapProtected(<LazyWebhooks />) },
|
2026-04-05 14:19:16 +00:00
|
|
|
{ path: '/admin', element: wrapAdminProtected(<LazyAdminDashboard />) },
|
|
|
|
|
{ path: '/admin/moderation', element: wrapAdminProtected(<LazyAdminModeration />) },
|
|
|
|
|
{ path: '/admin/platform', element: wrapAdminProtected(<LazyAdminPlatform />) },
|
|
|
|
|
{ path: '/admin/transfers', element: wrapAdminProtected(<LazyAdminTransfers />) },
|
2026-02-15 15:03:43 +00:00
|
|
|
{ path: '/social', element: wrapProtected(<LazySocial />) },
|
2026-03-09 00:52:56 +00:00
|
|
|
{ path: '/feed', element: wrapProtected(<LazyFeed />) },
|
|
|
|
|
{ path: '/discover', element: wrapProtected(<LazyDiscover />) },
|
Phase 2 stabilisation: code mort, Modal→Dialog, feature flags, tests, router split, Rust legacy
Bloc A - Code mort:
- Suppression Studio (components, views, features)
- Suppression gamification + services mock (projectService, storageService, gamificationService)
- Mise à jour Sidebar, Navbar, locales
Bloc B - Frontend:
- Suppression modal.tsx deprecated, Modal.stories (doublon Dialog)
- Feature flags: PLAYLIST_SEARCH, PLAYLIST_RECOMMENDATIONS, ROLE_MANAGEMENT = true
- Suppression 19 tests orphelins, retrait exclusions vitest.config
Bloc C - Backend:
- Extraction routes_auth.go depuis router.go
Bloc D - Rust:
- Suppression security_legacy.rs (code mort, patterns déjà dans security/)
2026-02-14 16:23:32 +00:00
|
|
|
{ path: '/queue', element: wrapProtected(<LazyQueue />) },
|
|
|
|
|
{ path: '/developer', element: wrapProtected(<LazyDeveloper />) },
|
|
|
|
|
// Gear: connected to backend inventory API
|
|
|
|
|
{ path: '/gear', element: wrapProtected(<LazyGear />) },
|
|
|
|
|
// Live: connected to backend live streams API
|
2026-02-24 09:00:43 +00:00
|
|
|
{ path: '/live/go-live', element: wrapProtected(<LazyGoLive />) },
|
Phase 2 stabilisation: code mort, Modal→Dialog, feature flags, tests, router split, Rust legacy
Bloc A - Code mort:
- Suppression Studio (components, views, features)
- Suppression gamification + services mock (projectService, storageService, gamificationService)
- Mise à jour Sidebar, Navbar, locales
Bloc B - Frontend:
- Suppression modal.tsx deprecated, Modal.stories (doublon Dialog)
- Feature flags: PLAYLIST_SEARCH, PLAYLIST_RECOMMENDATIONS, ROLE_MANAGEMENT = true
- Suppression 19 tests orphelins, retrait exclusions vitest.config
Bloc C - Backend:
- Extraction routes_auth.go depuis router.go
Bloc D - Rust:
- Suppression security_legacy.rs (code mort, patterns déjà dans security/)
2026-02-14 16:23:32 +00:00
|
|
|
{ path: '/live', element: wrapProtected(<LazyLive />) },
|
2026-03-10 12:34:16 +00:00
|
|
|
// Co-listening (v0.10.7 F481)
|
|
|
|
|
{ path: '/listen-together/:sessionId', element: wrapProtected(<LazyListenTogether />) },
|
2026-02-22 17:30:49 +00:00
|
|
|
// Cloud: connected to backend cloud storage API
|
|
|
|
|
{ path: '/cloud', element: wrapProtected(<LazyCloud />) },
|
2026-03-10 18:37:35 +00:00
|
|
|
// v0.12.1: Subscription Plans & Management
|
|
|
|
|
{ path: '/subscription', element: wrapProtected(<LazySubscription />) },
|
2026-03-10 18:54:45 +00:00
|
|
|
// v0.12.2: Distribution to External Platforms
|
|
|
|
|
{ path: '/distribution', element: wrapProtected(<LazyDistribution />) },
|
2026-03-11 08:46:25 +00:00
|
|
|
// v0.12.3: Formation & Éducation
|
|
|
|
|
{ path: '/education', element: wrapProtected(<LazyEducation />) },
|
2026-03-13 13:57:19 +00:00
|
|
|
// v0.13.5 TASK-MKT-004: Support page
|
|
|
|
|
{ path: '/support', element: wrapProtected(<LazySupport />) },
|
feat: UI components, services, utils, i18n, and routing
Update shared components (ComingSoon, SelectTrigger, AnnouncementBanner,
modals, social cards). Add usePatina hook. Refine API services, error
handling, query invalidation, state management. Update i18n strings
(en/fr/es). Update routing and app configuration.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 14:46:42 +00:00
|
|
|
|
|
|
|
|
// Redirect aliases — intuitive URLs that map to actual routes
|
|
|
|
|
{ path: '/tracks', element: <Navigate to="/library" replace /> },
|
|
|
|
|
{ path: '/community', element: <Navigate to="/social" replace /> },
|
|
|
|
|
{ path: '/favorites', element: <Navigate to="/playlists/favoris" replace /> },
|
|
|
|
|
{ path: '/home', element: <Navigate to="/dashboard" replace /> },
|
2026-02-07 03:16:37 +00:00
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function getErrorRoutes(): RouteEntry[] {
|
|
|
|
|
return [
|
|
|
|
|
{ path: '/404', element: <ErrorBoundary><LazyNotFound /></ErrorBoundary> },
|
|
|
|
|
{ path: '/500', element: <ErrorBoundary><LazyServerError /></ErrorBoundary> },
|
|
|
|
|
];
|
|
|
|
|
}
|