diff --git a/AGENTS.md b/AGENTS.md index 5b9c91d..25e2955 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,6 +1,7 @@ # Repository Guidelines ## Project Structure & Module Organization + - Entry points: `App.js`, `index.js`, `index.web.js`. - Source code: `src/` (key folders: `actions/`, `components/`, `hooks/`, `screens/`, `providers/`, `navigation/`, `utils/`, `styles/`, `assets/`). - Native projects: `android/`, `ios/`. @@ -9,6 +10,7 @@ - Backend: `functions/` (Firebase Cloud Functions, Node 20). ## Build, Test, and Development Commands + - Install deps: `yarn` (preferred; lockfile is `yarn.lock`). - Run app: `yarn start` (Expo dev client), `yarn android`, `yarn ios`, `yarn web`. - Clean native builds: `yarn clean` (runs `expo prebuild --clean`). @@ -17,26 +19,28 @@ - Firebase functions: `cd functions && npm run serve` (emulators), `npm run deploy`. ## Coding Style & Naming Conventions + - Languages: React Native (JS/TS). Indentation: 2 spaces. -- Lint/format: ESLint (`expo`, `prettier`) + Prettier. Keep code formatted; fix all lint errors. - - Example: `npx eslint src`. +- dont do eslint checks - Components and screens: PascalCase filenames, e.g., `MusicDetails.js`, `CreateLyricsWithAi.js`. - Hooks: prefix with `use` (e.g., `src/hooks/useFirestorePagination.js`). - Utilities: lowerCamelCase modules in `src/utils/` or `helpers/`; prefer named exports. - Avoid duplicating inline styles; share via `src/styles/`. ## Testing Guidelines + - No unit tests configured yet. If adding tests, prefer Jest + `@testing-library/react-native`. - Place tests under `src/**/__tests__/` or as `*.test.[jt]sx` near sources. - Until tests exist, include manual test steps in PRs (platform, device, steps, expected results). ## Commit & Pull Request Guidelines + - Commits: concise, imperative subject (≤72 chars). Optional scope, e.g., `feat(login): add Google button`. - PRs must include: clear description, screenshots/video for UI changes, reproduction and verification steps, linked issues, and notes on breaking changes. - Verify the app launches on Android, iOS, and Web locally; fix lint and type warnings before requesting review. ## Security & Configuration Tips + - Never commit secrets (e.g., `functions/serviceAccountKey.json`, API keys). Use Firebase/Expo secrets and environment config. - Manage runtime config via `app.json`/`eas.json` or remote config; avoid hardcoding credentials. - Before EAS builds, run `yarn clean` to resync native projects. - diff --git a/src/assets/UI/EyeSVG.js b/src/assets/UI/EyeSVG.js new file mode 100644 index 0000000..82c77ad --- /dev/null +++ b/src/assets/UI/EyeSVG.js @@ -0,0 +1,25 @@ +import * as React from "react"; +import Svg, { Circle, Path } from "react-native-svg"; + +function EyeSVG(props) { + return ( + + ); +} + +export default EyeSVG; diff --git a/src/assets/UI/EyeSlashSVG.js b/src/assets/UI/EyeSlashSVG.js new file mode 100644 index 0000000..bf5cc87 --- /dev/null +++ b/src/assets/UI/EyeSlashSVG.js @@ -0,0 +1,27 @@ +import * as React from "react"; +import Svg, { Path } from "react-native-svg"; + +function EyeSlashSVG(props) { + return ( + + ); +} + +export default EyeSlashSVG; diff --git a/src/components/Input.js b/src/components/Input.js index 3a9d478..02982e4 100644 --- a/src/components/Input.js +++ b/src/components/Input.js @@ -1,24 +1,25 @@ -import { - Pressable, - TextInput, - InputAccessoryView, - Text, - View, - Image, - Keyboard, - Platform, -} from "react-native"; import { useState } from "react"; +import { + Image, + InputAccessoryView, + Keyboard, + Pressable, + Text, + TextInput, + View, +} from "react-native"; // import CountryPicker, { DARK_THEME } from "react-native-country-picker-modal"; import usePlaceApi from "react-native-minuit/src/hooks/usePlacesApi"; import { art, icons } from "../assets"; import { Fonts, Palette, Style, gutters } from "../styles"; -import { FONT_FAMILY, fontTypeList } from "../styles/Fonts"; +import { FONT_FAMILY } from "../styles/Fonts"; -import { isWeb } from "../hooks/useLayoutType"; -import { GOOGLE_API_KEY } from "../data/keys"; import { BlurView } from "expo-blur"; +import EyeSlashSVG from "../assets/UI/EyeSlashSVG"; +import EyeSVG from "../assets/UI/EyeSVG"; +import { GOOGLE_API_KEY } from "../data/keys"; +import { isWeb } from "../hooks/useLayoutType"; const Input = ({ inputRef = null, @@ -189,11 +190,7 @@ const Input = ({ )} {type === "password" ? ( setShowPassword(!showPassword)}> - + {showPassword ? : } ) : type === "coinAmount" ? ( { const providers = [ diff --git a/src/screens/Login.js b/src/screens/Login.js index 6cc6760..b14fcda 100644 --- a/src/screens/Login.js +++ b/src/screens/Login.js @@ -1,4 +1,4 @@ -import { GoogleSigninButton } from "@react-native-google-signin/google-signin"; +/* eslint-disable react/display-name */ import * as AuthSession from "expo-auth-session"; import * as GoogleAuth from "expo-auth-session/providers/google"; import * as WebBrowser from "expo-web-browser"; @@ -8,6 +8,7 @@ import { useGlobal } from "reactn"; import { background } from "../assets"; import GradientButton from "../components/GradientButton.js"; import { Input } from "../components/Input.js"; +import ItemContainer from "../components/ItemContainer/ItemContainer"; import firebase, { usersRef } from "../config/firebase"; import { GOOGLE_ANDROID_CLIENT_ID, @@ -20,7 +21,6 @@ import { Routes } from "../navigation"; import { navigate } from "../navigation/NavigationService.js"; import { FONT_FAMILY } from "../styles/Fonts.js"; import Palette from "../styles/Palette.js"; -import ItemContainer from "../components/ItemContainer/ItemContainer"; export default ({ navigation }) => { WebBrowser.maybeCompleteAuthSession(); @@ -133,7 +133,7 @@ export default ({ navigation }) => { redirectUri: request?.redirectUri, extraParams: { code_verifier: request?.codeVerifier }, }, - discovery, + discovery ); idToken = tokenResponse?.id_token; } @@ -168,10 +168,16 @@ export default ({ navigation }) => { width={isWeb ? 600 : null} backgroundImg={isWeb ? background.loginBgWeb : background.homeBG} headerType="NAVIGATION" - title="Connexion" + title={isWeb ? "" : "Connexion"} hideBackButton > - + diff --git a/src/screens/Playback/RecordPlayback.web.js b/src/screens/Playback/RecordPlayback.web.js index dcdd74a..99437be 100644 --- a/src/screens/Playback/RecordPlayback.web.js +++ b/src/screens/Playback/RecordPlayback.web.js @@ -193,9 +193,7 @@ const RecordPlayback = ({ route }) => { "mediaRecorder:error", String(err?.message || err || "") ); - setMediaError( - err instanceof Error ? err : new Error(String(err || "")) - ); + setMediaError(err instanceof Error ? err : new Error(String(err || ""))); }; recorder.onstop = () => { @@ -475,14 +473,10 @@ const RecordPlayback = ({ route }) => { } setIsRecording(false); - console.log( - LOG_PREFIX, - "stopAndNavigate:navigate", - { - route: Routes.RecordedPlayback, - hasVideo: !!videoUrl, - } - ); + console.log(LOG_PREFIX, "stopAndNavigate:navigate", { + route: Routes.RecordedPlayback, + hasVideo: !!videoUrl, + }); navigate(Routes.RecordedPlayback, { project, videoUri: videoUrl || null }); }, [dur, player, pos, project, stopRecorderAndGetUrl]); diff --git a/src/screens/Register.js b/src/screens/Register.js index e50ca65..14917f2 100644 --- a/src/screens/Register.js +++ b/src/screens/Register.js @@ -1,15 +1,15 @@ -import { View, Text, Pressable } from "react-native"; import React, { useState } from "react"; -import Page from "../layouts/Page"; +import { Pressable, Text, View } from "react-native"; import { background } from "../assets"; -import { Palette } from "../styles"; -import { FONT_FAMILY } from "../styles/Fonts"; -import { Input } from "../components/Input"; import BorderGradientButton from "../components/BorderGradientButton"; -import { navigate } from "../navigation/NavigationService"; -import { Routes } from "../navigation"; +import { Input } from "../components/Input"; import ItemContainer from "../components/ItemContainer/ItemContainer"; import { isWeb } from "../hooks/useLayoutType"; +import Page from "../layouts/Page"; +import { Routes } from "../navigation"; +import { navigate } from "../navigation/NavigationService"; +import { Palette } from "../styles"; +import { FONT_FAMILY } from "../styles/Fonts"; const Register = () => { const [email, setEmail] = useState(""); @@ -21,7 +21,13 @@ const Register = () => { headerType="NAVIGATION" title="Inscription" > - +