Repository: pass-culture/pass-culture-app-native
Pull request #8126: (PC-36112) fix(app): remove unused props
Author: login: imouandjolobe-pass
Created: 2025-05-14T08:35:43Z | Merged: 2025-05-22T12:27:32Z



Diff:
diff --git a/.eslintrc.js b/.eslintrc.js
index 404becc512b2..7050307470e7 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -36,7 +36,7 @@ module.exports = {
   },
   rules: {
     'react/no-unstable-nested-components': 'off', // TODO(PC-25291): enable when its issues are fixed
-    'react/no-unused-prop-types': 'off', // has false positives
+    'react/no-unused-prop-types': 'error', // has false positives
     'local-rules/no-useless-hook': 'error',
     'react-hooks/exhaustive-deps': 'error',
     'local-rules/independent-mocks': 'error',
diff --git a/eslint-soft-rules.js b/eslint-soft-rules.js
index f6a6b7b99a89..43e0944f1a03 100644
--- a/eslint-soft-rules.js
+++ b/eslint-soft-rules.js
@@ -5,7 +5,6 @@ const softRules = {
   cleancode: {
     'react/no-unstable-nested-components': 'warn', // TODO(PC-25291): enable when its issues are fixed
     'local-rules/no-fireEvent': 'warn',
-    'react/no-unused-prop-types': 'warn', // has false positives
     'local-rules/no-spacer': 'warn',
     'local-rules/no-ts-expect-error': 'warn',
   },
diff --git a/src/App.web.tsx b/src/App.web.tsx
index bba26a64d72b..fd1993e4e09c 100644
--- a/src/App.web.tsx
+++ b/src/App.web.tsx
@@ -1,9 +1,11 @@
+// eslint-disable-next-line no-restricted-imports
+import { GoogleOAuthProvider } from '@react-oauth/google'
 // if __DEV__ import if you want to debug
 // import './why-did-you-render'
 import globalThisShim from 'globalthis/shim'
 import React, { Suspense, useEffect } from 'react'
-import 'react-app-polyfill/stable'
 import { ErrorBoundary } from 'react-error-boundary'
+import 'react-app-polyfill/stable'
 
 import { AccessibilityFiltersWrapper } from 'features/accessibility/context/AccessibilityFiltersWrapper'
 import { AuthWrapper } from 'features/auth/context/AuthWrapper'
@@ -21,7 +23,6 @@ import { AppWebHead } from 'libs/appWebHead'
 import { env } from 'libs/environment/env'
 import { LocationWrapper } from 'libs/location'
 import { eventMonitoring } from 'libs/monitoring/services'
-import { GoogleOAuthProvider } from 'libs/react-native-google-sso/GoogleOAuthProvider'
 import { SafeAreaProvider } from 'libs/react-native-save-area-provider'
 import { ReactQueryClientProvider } from 'libs/react-query/ReactQueryClientProvider'
 import { ThemeProvider } from 'libs/styled'
diff --git a/src/features/auth/components/SSOButton/SSOButtonBase.stories.tsx b/src/features/auth/components/SSOButton/SSOButtonBase.stories.tsx
index 68bc19926f12..74e7c6ea1db2 100644
--- a/src/features/auth/components/SSOButton/SSOButtonBase.stories.tsx
+++ b/src/features/auth/components/SSOButton/SSOButtonBase.stories.tsx
@@ -1,8 +1,9 @@
+// eslint-disable-next-line no-restricted-imports
+import { GoogleOAuthProvider } from '@react-oauth/google'
 import type { Meta } from '@storybook/react'
 import React from 'react'
 
 import { env } from 'libs/environment/fixtures'
-import { GoogleOAuthProvider } from 'libs/react-native-google-sso/GoogleOAuthProvider'
 import { Variants, VariantsStory, VariantsTemplate } from 'ui/storybook/VariantsTemplate'
 
 import { SSOButtonBase } from './SSOButtonBase'
diff --git a/src/features/auth/pages/login/Login.web.test.tsx b/src/features/auth/pages/login/Login.web.test.tsx
index 47cdb4d3ca4d..4ae29e3155b5 100644
--- a/src/features/auth/pages/login/Login.web.test.tsx
+++ b/src/features/auth/pages/login/Login.web.test.tsx
@@ -1,3 +1,5 @@
+// eslint-disable-next-line no-restricted-imports
+import { GoogleOAuthProvider } from '@react-oauth/google'
 import React from 'react'
 import { SafeAreaProvider } from 'react-native-safe-area-context'
 
@@ -6,7 +8,6 @@ import { OauthStateResponse } from 'api/gen'
 import { AuthContext } from 'features/auth/context/AuthContext'
 import { env } from 'libs/environment/fixtures'
 import { setFeatureFlags } from 'libs/firebase/firestore/featureFlags/tests/setFeatureFlags'
-import { GoogleOAuthProvider } from 'libs/react-native-google-sso/GoogleOAuthProvider'
 import { mockServer } from 'tests/mswServer'
 import { reactQueryProviderHOC } from 'tests/reactQueryProviderHOC'
 import { act, checkAccessibilityFor, render } from 'tests/utils/web'
diff --git a/src/features/auth/pages/signup/SignupForm.web.test.tsx b/src/features/auth/pages/signup/SignupForm.web.test.tsx
index 8a67d11dc566..b105534fa17d 100644
--- a/src/features/auth/pages/signup/SignupForm.web.test.tsx
+++ b/src/features/auth/pages/signup/SignupForm.web.test.tsx
@@ -1,3 +1,5 @@
+// eslint-disable-next-line no-restricted-imports
+import { GoogleOAuthProvider } from '@react-oauth/google'
 import React from 'react'
 import { SafeAreaProvider } from 'react-native-safe-area-context'
 
@@ -6,7 +8,6 @@ import { EmailValidationRemainingResendsResponse, OauthStateResponse } from 'api
 import { StepperOrigin } from 'features/navigation/RootNavigator/types'
 import { env } from 'libs/environment/fixtures'
 import { setFeatureFlags } from 'libs/firebase/firestore/featureFlags/tests/setFeatureFlags'
-import { GoogleOAuthProvider } from 'libs/react-native-google-sso/GoogleOAuthProvider'
 import { mockServer } from 'tests/mswServer'
 import { reactQueryProviderHOC } from 'tests/reactQueryProviderHOC'
 import { act, checkAccessibilityFor, render } from 'tests/utils/web'
diff --git a/src/features/home/components/modules/video/VideoErrorView.tsx b/src/features/home/components/modules/video/VideoErrorView.tsx
index 385b77a8743b..4762ca0a7516 100644
--- a/src/features/home/components/modules/video/VideoErrorView.tsx
+++ b/src/features/home/components/modules/video/VideoErrorView.tsx
@@ -2,8 +2,9 @@ import React from 'react'
 import { StyleProp, View, ViewStyle } from 'react-native'
 import styled from 'styled-components/native'
 
+import { ViewGap } from 'ui/components/ViewGap/ViewGap'
 import { HeaderBackground } from 'ui/svg/HeaderBackground'
-import { Spacer, Typo, getSpacing } from 'ui/theme'
+import { Typo, getSpacing } from 'ui/theme'
 
 export const VideoErrorView: React.FC<{
   style: StyleProp<ViewStyle>
@@ -14,9 +15,8 @@ export const VideoErrorView: React.FC<{
   return (
     <VideoPlayerErrorViewContainer style={style}>
       <HeaderBackground />
-      <ErrorMessageContainer>
+      <ErrorMessageContainer gap={4}>
         <StyledTitle>{errorTitle}</StyledTitle>
-        <Spacer.Column numberOfSpaces={4} />
         <StyledBody>{errorMessage}</StyledBody>
       </ErrorMessageContainer>
     </VideoPlayerErrorViewContainer>
@@ -29,7 +29,7 @@ const VideoPlayerErrorViewContainer = styled(View)({
   overflow: 'hidden',
 })
 
-const ErrorMessageContainer = styled.View({
+const ErrorMessageContainer = styled(ViewGap)({
   flex: 1,
   alignItems: 'center',
   justifyContent: 'center',
diff --git a/src/libs/react-native-google-sso/GoogleOAuthProvider.tsx b/src/libs/react-native-google-sso/GoogleOAuthProvider.tsx
deleted file mode 100644
index fdf9f473a34c..000000000000
--- a/src/libs/react-native-google-sso/GoogleOAuthProvider.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import React from 'react'
-
-type Props = {
-  clientId: string
-  children: React.ReactNode
-}
-
-export const GoogleOAuthProvider = ({ children }: Props) => (
-  <React.Fragment>{children}</React.Fragment>
-)
diff --git a/src/libs/react-native-google-sso/GoogleOAuthProvider.web.tsx b/src/libs/react-native-google-sso/GoogleOAuthProvider.web.tsx
deleted file mode 100644
index e727aa33bd58..000000000000
--- a/src/libs/react-native-google-sso/GoogleOAuthProvider.web.tsx
+++ /dev/null
@@ -1,2 +0,0 @@
-// eslint-disable-next-line no-restricted-imports
-export { GoogleOAuthProvider } from '@react-oauth/google'
diff --git a/src/ui/components/InputLabel/FlexInputLabel.tsx b/src/ui/components/InputLabel/FlexInputLabel.tsx
index 4493c0bb2f75..d92a5b4dc73e 100644
--- a/src/ui/components/InputLabel/FlexInputLabel.tsx
+++ b/src/ui/components/InputLabel/FlexInputLabel.tsx
@@ -1,3 +1,4 @@
+/* eslint-disable react/no-unused-prop-types */
 import React from 'react'
 import { View } from 'react-native'
 
diff --git a/src/ui/components/buttons/SubcategoryButton/SubcategoryButtonListWrapper.tsx b/src/ui/components/buttons/SubcategoryButton/SubcategoryButtonListWrapper.tsx
index b3c5edb8f6f6..a88b7ecbde5d 100644
--- a/src/ui/components/buttons/SubcategoryButton/SubcategoryButtonListWrapper.tsx
+++ b/src/ui/components/buttons/SubcategoryButton/SubcategoryButtonListWrapper.tsx
@@ -1,5 +1,4 @@
 import React, { useMemo } from 'react'
-import { ScrollViewProps, ViewStyle } from 'react-native'
 import { useTheme } from 'styled-components/native'
 
 import { SearchGroupNameEnumv2 } from 'api/gen'
@@ -16,13 +15,8 @@ import { getSearchParams } from 'ui/components/buttons/SubcategoryButton/helpers
 import { SubcategoryButtonItem } from 'ui/components/buttons/SubcategoryButton/SubcategoryButton'
 import { SubcategoryButtonList } from 'ui/components/buttons/SubcategoryButton/SubcategoryButtonList'
 
-type StyledScrollViewProps = ScrollViewProps & {
-  contentContainerStyle?: ViewStyle
-}
-
 type Props = {
   offerCategory: SearchGroupNameEnumv2
-  scrollViewProps?: StyledScrollViewProps
 }
 
 export const SubcategoryButtonListWrapper: React.FC<Props> = ({ offerCategory }) => {
diff --git a/src/ui/components/inputs/InputError.native.test.tsx b/src/ui/components/inputs/InputError.native.test.tsx
index c5d025503569..b5ab1e206ae3 100644
--- a/src/ui/components/inputs/InputError.native.test.tsx
+++ b/src/ui/components/inputs/InputError.native.test.tsx
@@ -34,19 +34,4 @@ describe('InputError Component', () => {
 
     expect(text).not.toBeOnTheScreen()
   })
-
-  it('should display the right top space', () => {
-    render(
-      <InputError
-        visible
-        messageId="message"
-        numberOfSpacesTop={1}
-        relatedInputId="relatedInputId"
-      />
-    )
-
-    const spacer = screen.getByTestId('input-error-top-spacer')
-
-    expect(spacer.props.numberOfSpaces).toEqual(1)
-  })
 })
diff --git a/src/ui/components/inputs/InputError.tsx b/src/ui/components/inputs/InputError.tsx
index 0ad4a96633fb..d22378e81799 100644
--- a/src/ui/components/inputs/InputError.tsx
+++ b/src/ui/components/inputs/InputError.tsx
@@ -1,7 +1,7 @@
 import React, { FC } from 'react'
+import styled from 'styled-components/native'
 
 import { Error } from 'ui/svg/icons/Error'
-import { Spacer } from 'ui/theme'
 import { ErrorMessage } from 'ui/web/errors/ErrorMessage'
 
 import { InputRule } from './rules/InputRule'
@@ -18,8 +18,7 @@ export const InputError: FC<Props> = (props) => {
   return (
     <ErrorMessage relatedInputId={props.relatedInputId}>
       {props.visible && props.messageId ? (
-        <React.Fragment>
-          <Spacer.Column testID="input-error-top-spacer" numberOfSpaces={props.numberOfSpacesTop} />
+        <Container numberOfSpacesTop={props.numberOfSpacesTop}>
           <InputRule
             title={props.messageId}
             type="Error"
@@ -28,8 +27,12 @@ export const InputError: FC<Props> = (props) => {
             iconSize={16}
             noFullWidth={props.centered}
           />
-        </React.Fragment>
+        </Container>
       ) : null}
     </ErrorMessage>
   )
 }
+
+const Container = styled.View<{ numberOfSpacesTop: number }>(({ numberOfSpacesTop }) => ({
+  marginTop: numberOfSpacesTop,
+}))
diff --git a/src/ui/svg/HeaderBackground.tsx b/src/ui/svg/HeaderBackground.tsx
index e324084f8de8..95feaa1ccb99 100644
--- a/src/ui/svg/HeaderBackground.tsx
+++ b/src/ui/svg/HeaderBackground.tsx
@@ -7,28 +7,26 @@ import { svgIdentifier } from 'ui/svg/utils'
 
 import { getSpacing } from '../theme'
 
-interface HeaderBackgroundProps {
+type HeaderBackgroundProps = {
   height?: string | number
   width?: string | number
-  position?: 'absolute' | 'relative'
 }
 
 const HEADER_BACKGROUND_DEFAULT_SIZE = getSpacing(73.5)
 
-function NotMemoizedHeaderBackground({
+const NotMemoizedHeaderBackground: React.FC<HeaderBackgroundProps> = ({
   width,
   height = HEADER_BACKGROUND_DEFAULT_SIZE,
-  position = 'absolute',
-}: HeaderBackgroundProps) {
+}) => {
   return (
-    <BackgroundContainer height={height} width={width} position={position}>
+    <BackgroundContainer height={height} width={width}>
       <HeaderBackgroundSvg height={height} width={width} />
     </BackgroundContainer>
   )
 }
 
-const BackgroundContainer = styled.View<HeaderBackgroundProps>(({ height, position, theme }) => ({
-  position,
+const BackgroundContainer = styled.View<HeaderBackgroundProps>(({ height, theme }) => ({
+  position: 'absolute',
   top: 0,
   left: 0,
   right: 0,
diff --git a/src/ui/svg/TicketFooter.tsx b/src/ui/svg/TicketFooter.tsx
index 42fd22737fa7..1ee70e624d85 100644
--- a/src/ui/svg/TicketFooter.tsx
+++ b/src/ui/svg/TicketFooter.tsx
@@ -9,12 +9,13 @@ import { ColorsEnum } from 'ui/theme/colors'
 const ratio = 309 / 50
 const viewBox = '0 0 309 50'
 
-interface Props {
+type Props = {
   width: number
+  // eslint-disable-next-line react/no-unused-prop-types
   color?: ColorsEnum
 }
 
-function TicketFooterComponent(props: Props) {
+const TicketFooterComponent: React.FC<Props> = (props) => {
   const height = props.width / ratio
   const theme = useTheme()
 
diff --git a/src/ui/svg/TicketHeader.tsx b/src/ui/svg/TicketHeader.tsx
index a6795f003ad4..088ede4e3c18 100644
--- a/src/ui/svg/TicketHeader.tsx
+++ b/src/ui/svg/TicketHeader.tsx
@@ -1,4 +1,4 @@
-import React, { memo } from 'react'
+import React from 'react'
 import { Path } from 'react-native-svg'
 import styled, { useTheme } from 'styled-components/native'
 
@@ -9,12 +9,13 @@ import { ColorsEnum } from 'ui/theme/colors'
 const ratio = 309 / 50
 const viewBox = '0 0 309 50'
 
-interface Props {
+type Props = {
   width: number
+  // eslint-disable-next-line react/no-unused-prop-types
   color?: ColorsEnum
 }
 
-function TicketHeaderComponent(props: Props) {
+const TicketHeaderComponent: React.FC<Props> = (props) => {
   const theme = useTheme()
   const height = props.width / ratio
   return (
@@ -38,8 +39,6 @@ function TicketHeaderComponent(props: Props) {
   )
 }
 
-export const TicketHeader = memo(
-  styled(TicketHeaderComponent).attrs(({ color, theme }) => ({
-    color: color ?? theme.colors.white,
-  }))``
-)
+export const TicketHeader = styled(TicketHeaderComponent).attrs(({ color, theme }) => ({
+  color: color ?? theme.colors.white,
+}))``
diff --git a/src/ui/web/errors/ErrorMessage.tsx b/src/ui/web/errors/ErrorMessage.tsx
index 154792256aca..e5643eb82ed6 100644
--- a/src/ui/web/errors/ErrorMessage.tsx
+++ b/src/ui/web/errors/ErrorMessage.tsx
@@ -1,9 +1,9 @@
 import React, { Fragment } from 'react'
 
-interface Props {
+type Props = {
   relatedInputId?: string
   children: React.ReactNode
 }
-export const ErrorMessage: React.FC<Props> = (props) => {
-  return <Fragment>{props.children}</Fragment>
+export const ErrorMessage: React.FC<Props> = ({ children, relatedInputId: _relatedInputId }) => {
+  return <Fragment>{children}</Fragment>
 }


Reviews:
user: login: xlecunff-pass
body: Je n'arrive pas à m'expliquer pourquoi l'input se rend en erreur dès les premiers changements avec ton rendu :( il faudrait corriger ça avant de merge

GG pour les bonnes pratiques au passage 🎉
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T12:04:28Z
user: login: imouandjolobe-pass
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T12:44:18Z
user: login: imouandjolobe-pass
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T12:45:06Z
user: login: imouandjolobe-pass
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T12:45:47Z
user: login: imouandjolobe-pass
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T12:46:29Z
user: login: imouandjolobe-pass
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T12:56:03Z
user: login: imouandjolobe-pass
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T12:57:10Z

Review comments:
diff_hunk: @@ -1,10 +1,11 @@
 import React from 'react'
 
 type Props = {
+  // eslint-disable-next-line react/no-unused-prop-types
   clientId: string
   children: React.ReactNode
 }
 
-export const GoogleOAuthProvider = ({ children }: Props) => (
path: src/libs/react-native-google-sso/GoogleOAuthProvider.tsx
user: login: xlecunff-pass
body: Ce fichier n'est utilisé que en web, je ne comprend pas pourquoi on utilise une interface ici:
- solution propre: supprimer ces 2 fichiers et utiliser le GoogleOAuthProvider directement dans App.web.tsx
- solution crado: `{ clientId: _clientId, children }`
created_at: 2025-05-16T11:45:43Z
author_association: CONTRIBUTOR
diff_hunk: @@ -9,12 +9,13 @@ import { ColorsEnum } from 'ui/theme/colors'
 const ratio = 309 / 50
 const viewBox = '0 0 309 50'
 
-interface Props {
+type Props = {
   width: number
+  // eslint-disable-next-line react/no-unused-prop-types
   color?: ColorsEnum
path: src/ui/svg/TicketHeader.tsx
user: login: xlecunff-pass
body: Pourquoi a t-on besoin de la props color, ça a cassé quelque chose quand tu l'as retiré? Je vois qu'elle arrive par le styled component, est passée au component via les `Props` et puis n'est plus utilisée
created_at: 2025-05-16T11:54:23Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,6 +1,7 @@
 import React, { Fragment } from 'react'
 
-interface Props {
+type Props = {
+  // eslint-disable-next-line react/no-unused-prop-types
path: src/ui/web/errors/ErrorMessage.tsx
user: login: xlecunff-pass
body: On se retrouve donc encore avec un wrapper natif qui fait rien pour que le wrapper web puisse afficher une alert, on peut destructurer en 
```ts
export const ErrorMessage: React.FC<Props> = ({ children, relatedInputId: _relatedInputId }) => {
```
created_at: 2025-05-16T12:00:45Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,6 +1,7 @@
 import React, { Fragment } from 'react'
 
-interface Props {
+type Props = {
+  // eslint-disable-next-line react/no-unused-prop-types
path: src/ui/web/errors/ErrorMessage.tsx
user: login: xlecunff-pass
body: l'underscore indique que l'on n'utilise pas la props volontairement
created_at: 2025-05-16T12:01:13Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,10 +1,11 @@
 import React from 'react'
 
 type Props = {
+  // eslint-disable-next-line react/no-unused-prop-types
   clientId: string
   children: React.ReactNode
 }
 
-export const GoogleOAuthProvider = ({ children }: Props) => (
path: src/libs/react-native-google-sso/GoogleOAuthProvider.tsx
user: login: imouandjolobe-pass
body: hmm c'est déjà utilisé dans App.web.tsx, je pense que je n'ai pas compris 
created_at: 2025-05-16T12:44:18Z
author_association: CONTRIBUTOR
diff_hunk: @@ -9,12 +9,13 @@ import { ColorsEnum } from 'ui/theme/colors'
 const ratio = 309 / 50
 const viewBox = '0 0 309 50'
 
-interface Props {
+type Props = {
   width: number
+  // eslint-disable-next-line react/no-unused-prop-types
   color?: ColorsEnum
path: src/ui/svg/TicketHeader.tsx
user: login: imouandjolobe-pass
body: oui j'ai cette erreur `Property 'color' does not exist on type 'Props & ThemeProps<DefaultTheme>'.`
created_at: 2025-05-16T12:45:06Z
author_association: CONTRIBUTOR
diff_hunk: @@ -9,12 +9,13 @@ import { ColorsEnum } from 'ui/theme/colors'
 const ratio = 309 / 50
 const viewBox = '0 0 309 50'
 
-interface Props {
+type Props = {
   width: number
+  // eslint-disable-next-line react/no-unused-prop-types
   color?: ColorsEnum
path: src/ui/svg/TicketHeader.tsx
user: login: imouandjolobe-pass
body: puisque c'est utilisé ici `export const TicketFooter = memo(
  styled(TicketFooterComponent).attrs(({ color, theme }) => ({
    color: color ?? theme.colors.white,
  }))``
)` (idem dans TicketHeader
created_at: 2025-05-16T12:45:47Z
author_association: CONTRIBUTOR
diff_hunk: @@ -9,12 +9,13 @@ import { ColorsEnum } from 'ui/theme/colors'
 const ratio = 309 / 50
 const viewBox = '0 0 309 50'
 
-interface Props {
+type Props = {
   width: number
+  // eslint-disable-next-line react/no-unused-prop-types
   color?: ColorsEnum
path: src/ui/svg/TicketHeader.tsx
user: login: imouandjolobe-pass
body: après, je peux considérer qu'on ne passe pas de color pour le moment et donc retirer mais si demain on a besoin de le faire, on aura le même warning
created_at: 2025-05-16T12:46:29Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,10 +1,11 @@
 import React from 'react'
 
 type Props = {
+  // eslint-disable-next-line react/no-unused-prop-types
   clientId: string
   children: React.ReactNode
 }
 
-export const GoogleOAuthProvider = ({ children }: Props) => (
path: src/libs/react-native-google-sso/GoogleOAuthProvider.tsx
user: login: imouandjolobe-pass
body: ah si c'est bon, je pense que j'ai compris
created_at: 2025-05-16T12:56:03Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,6 +1,7 @@
 import React, { Fragment } from 'react'
 
-interface Props {
+type Props = {
+  // eslint-disable-next-line react/no-unused-prop-types
path: src/ui/web/errors/ErrorMessage.tsx
user: login: imouandjolobe-pass
body: ah oui, merci, je vais modifier
created_at: 2025-05-16T12:57:10Z
author_association: CONTRIBUTOR

PR comments:
user: login: imouandjolobe-pass
created_at: 2025-05-16T12:48:02Z
body: > Je n'arrive pas à m'expliquer pourquoi l'input se rend en erreur dès les premiers changements avec ton rendu :( il faudrait corriger ça avant de merge
> 
> GG pour les bonnes pratiques au passage 🎉

@xlecunff-pass Quel input se rend en erreur ?
author_association: CONTRIBUTOR
user: login: sonarqubecloud[bot]
created_at: 2025-05-16T13:15:10Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=pass-culture_pass-culture-app-native-proxy&pullRequest=8126) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=pass-culture_pass-culture-app-native-proxy&pullRequest=8126&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=pass-culture_pass-culture-app-native-proxy&pullRequest=8126&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=pass-culture_pass-culture-app-native-proxy&pullRequest=8126&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=pass-culture_pass-culture-app-native-proxy&pullRequest=8126&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=pass-culture_pass-culture-app-native-proxy&pullRequest=8126&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=pass-culture_pass-culture-app-native-proxy&pullRequest=8126)


author_association: NONE
user: login: sonarqubecloud[bot]
created_at: 2025-05-16T13:22:04Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=pass-culture_pass-culture-app-native&pullRequest=8126) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=pass-culture_pass-culture-app-native&pullRequest=8126&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=pass-culture_pass-culture-app-native&pullRequest=8126&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=pass-culture_pass-culture-app-native&pullRequest=8126&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [100.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=pass-culture_pass-culture-app-native&pullRequest=8126&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=pass-culture_pass-culture-app-native&pullRequest=8126&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=pass-culture_pass-culture-app-native&pullRequest=8126)


author_association: NONE