- Node.js 18+
- npm ou yarn
- Android Studio (pour Android)
- Xcode (pour iOS - macOS uniquement)
git clone <repository-url>
cd yourcap
npm install# Développement avec Expo
npx expo start
# Sur Android
npx expo run:android
# Sur iOS
npx expo run:iosyourcap/
├── app/ # Pages et navigation (Expo Router)
│ ├── (tabs)/ # Pages avec navigation par onglets
│ ├── auth/ # Pages d'authentification
│ └── debt/ # Pages de gestion des dettes
├── components/ # Composants réutilisables
│ ├── ui/ # Composants UI de base
│ └── feature/ # Composants métier
├── i18n/ # Système d'internationalisation
├── services/ # Services et APIs
├── stores/ # State management (Zustand)
├── types/ # Types TypeScript
├── hooks/ # Hooks React personnalisés
├── lib/ # Utilitaires et helpers
└── docs/ # Documentation
- Framework : React Native + Expo
- Navigation : Expo Router
- UI : NativeWind (Tailwind CSS)
- Base de données : SQLite + Drizzle ORM
- State Management : Zustand
- Internationalisation : Système custom i18n
- Notifications : Expo Notifications
- Authentification : Système custom avec PIN
components/
├── ui/ # Composants de base
│ ├── text-input.tsx # Input avec validation
│ ├── date-input.tsx # Sélecteur de date
│ ├── select-input.tsx # Dropdown/Select
│ ├── pin-input.tsx # Input PIN sécurisé
│ └── ...
└── feature/ # Composants métier
├── debt/ # Composants liés aux dettes
├── dashboard/ # Composants du dashboard
└── ...
- Composants : PascalCase (
TextInput.tsx) - Hooks : camelCase avec préfixe
use(useSettings.ts) - Services : camelCase (
debtServices.ts) - Types : PascalCase (
DebtType.ts)
// lib/tw-colors.ts
const colors = {
primary: "#562d8f", // Violet principal
"primary-foreground": "#ffffff",
background: "#ffffff", // Mode clair
foreground: "#000000",
// ... autres couleurs
}import { useTwColors } from '@/lib/tw-colors'
function MonComposant() {
const { twColor } = useTwColors()
return (
<View style={{ backgroundColor: twColor("primary") }}>
<Text style={{ color: twColor("primary-foreground") }}>
Texte
</Text>
</View>
)
}// db/db.ts
export const users = sqliteTable("users", {
user_id: text("user_id").primaryKey(),
full_name: text("full_name").notNull(),
email: text("email"),
phone_number: text("phone_number").notNull(),
// ...
})
export const debts = sqliteTable("debts", {
debt_id: text("debt_id").primaryKey(),
user_id: text("user_id").references(() => users.user_id),
contact_name: text("contact_name").notNull(),
amount: real("amount").notNull(),
// ...
})// services/debtServices.ts
export const createDebt = async (debtData: CreateDebtData) => {
// Logique de création
}
export const getUserDebts = async (userId: string) => {
// Récupération des dettes
}- PIN à 6 chiffres
- Stockage sécurisé (hachage)
- Biométrie optionnelle
- Verrouillage automatique
const { user, login, logout } = useAuthStore()
const { settings } = useSettings()// i18n/locales/fr.ts
export const fr = {
newFeature: {
title: "Nouvelle fonctionnalité",
description: "Description en français"
}
}
// i18n/locales/en.ts
export const en = {
newFeature: {
title: "New feature",
description: "English description"
}
}const { t } = useTranslation()
return <Text>{t('newFeature.title')}</Text>// services/notificationService.ts
export const scheduleDebtReminder = async (
debtId: string,
contactName: string,
// ...autres paramètres
) => {
// Logique de planification
}- Rappels de dettes : Avant échéance
- Résumés : Quotidiens/hebdomadaires
- Notifications push : Temps réel
console.log("Debug info:", data)
console.error("Error:", error)# Android
npx expo run:android
# iOS
npx expo run:iosnpx expo run:android
npx expo run:ios# Avec EAS
eas build --platform android
eas build --platform ios
# Build local Android
npm run android
cd android && ./gradlew assembleRelease// stores/authStore.ts
export const useAuthStore = create((set, get) => ({
user: null,
login: async (userData) => {
// Logique de connexion
set({ user: userData })
},
// ...
}))// hooks/useSettings.ts
export const useSettings = () => {
// Logique de gestion des paramètres
return { settings, updateSettings }
}- Code formaté et lint clean
- Types TypeScript corrects
- Traductions à jour (fr/en)
- Tests sur Android/iOS
- Pas d'erreurs console
- Build successful
- Tests complets sur devices
- Documentation mise à jour
- CHANGELOG.md mis à jour
- Version bumped
npx expo start --clearcd android
./gradlew clean
./gradlew assembleDebugnpm install
npx expo install --fix- Fork le projet
- Créez une branche feature (
git checkout -b feature/amazing-feature) - Committez vos changements (
git commit -m 'Add amazing feature') - Push vers la branche (
git push origin feature/amazing-feature) - Ouvrez une Pull Request
Pour toute question technique, contactez l'équipe de développement.