diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml index 56d9af7b9..32de5a328 100644 --- a/.github/ISSUE_TEMPLATE/bug.yaml +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -1,89 +1,90 @@ name: 🐛 Signaler un bug -description: Signalez un bug pour nous aider à améliorer Papillon -title: '[Bug]: ' -labels: [bug] +description: Signaler des bugs nous permet à améliorer Papillon ! +title: "[Bug]: " + body: - type: textarea attributes: label: Description du bug - description: Une description claire et concise du bug. + description: Plus de détails nous permettent de trouver plus vite le bug ! + placeholder: La connexion à mon établissement ne fonctionne pas, j'ai un chargement infini lors de la connexion validations: required: true + - type: textarea attributes: label: Étapes à reproduire - description: 'Étapes pour reproduire le bug :' + description: Comment pouvons-nous reproduire le bug ? placeholder: | - 1. [ex: Etape 1] - 2. [ex: Etape 1] - value: | - 1. - 2. + 1. Ouvrir l'application + 2. Se connecter à l'établissement + 3. Appuyer sur "Connexion" + 4. Observer le comportement validations: required: true + - type: textarea attributes: label: Comportement attendu - description: Une description claire et concise de ce que vous attendiez. + description: Ce que Papillon doit faire + placeholder: Que la connexion à mon établissement fonctionne et qu'il n'y ait pas de chargement infini validations: required: true + - type: input attributes: label: Appareil + description: Quel appareil utilisé pour rencontrer ce bug ? placeholder: iPhone 13, Samsung Galaxy S23... validations: required: true + - type: input attributes: - label: Version du système d`exploitation - placeholder: iOS 18, Android 14... - validations: - required: true - - type: input - attributes: - label: Version - placeholder: '7.0.1-beta' - value: '7.0.1-beta' + label: Version du système d'exploitation + description: Paramètres (Téléphone) -> À propos (Android)/Général (Apple) + placeholder: iOS 18, Android 15... validations: required: true + - type: dropdown attributes: - label: Environnement + label: Papillon testé depuis + description: Tu as rencontré ce bug sur quel type de Papillon ? options: - - Application native Android - - Application native iOS - - Prébuild de développement (iOS/Android) + - Play/Apple Store (Version Stable) + - Play Store/TestFlight (Version Bêta) + - Expo Go (Version Dev) validations: required: true - - type: dropdown + + - type: input attributes: - label: Source de l'application - options: - - Stores (Play Store / App Store) - - Github + label: Version utilisée + description: Sur quelle version le bug est rencontré ? Paramètres (Papillon) -> Version affichée en bas de la page + placeholder: "7.5.0" validations: required: true + - type: dropdown attributes: - label: Service scolaire + label: Service scolaire/cantine + description: Chaque personne dans l'équipe de Papillon a un domaine pour plus d'efficacité (🎒 = Service scolaire et 🍽️ = Service de cantine) options: - - 🦋 Pronote - - 🟦 EcoleDirecte - - 🟡 Skolengo - - 🔴 Turboself - - 🟣 ARD-GEC - - ⭕ Autre + - 🎒🦋 Pronote + - 🎒🟦 ÉcoleDirecte + - 🎒🟡 Skolengo + - 🎒🏫 Universités et autres (à préciser dans la description du bug) + - 🍽️🔴 Turboself + - 🍽️🟣 ARD + - 🍽️🔵 Izly validations: required: true + - type: textarea attributes: - label: "Captures d'écran / vidéo" - description: "Si possible, ajoutez des captures d'écran pour aider à expliquer votre problème." - validations: - required: false - - type: textarea - attributes: - label: Contexte supplémentaire - description: Des liens ? Des références ? Tout ce qui peut nous donner plus de détails sur le problème que vous rencontrez ! + label: "Capture(s) d'écran / vidéo" + description: Cela permettra que le bug soit résolu encore plus vite + placeholder: Il faut cliquer sur l'icône 📎 pour pouvoir importer une/des photo(s)/vidéo(s) validations: required: false diff --git a/.github/ISSUE_TEMPLATE/config.yaml b/.github/ISSUE_TEMPLATE/config.yaml index 8ee1e2daf..ce91e81bc 100644 --- a/.github/ISSUE_TEMPLATE/config.yaml +++ b/.github/ISSUE_TEMPLATE/config.yaml @@ -1,11 +1,9 @@ blank_issues_enabled: false contact_links: - - name: Votre problème concerne une faille de sécurité ? - url: https://github.com/PapillonApp/Papillon/security/advisories/ - about: Merci de nous contacter via ce formulaire. - - name: Vous avez un problème personnel ? + - name: Une faille de sécurité ? + url: https://github.com/PapillonApp/Papillon/security/advisories/new + about: Merci de nous contacter via ce formulaire + + - name: Une question ? Un problème personnel ? url: https://discord.gg/WXntBawAk8 - about: Merci de nous contacter via notre serveur Discord. - - name: Vous avez une question ? - url: https://discord.gg/WXntBawAk8 - about: Merci de nous contacter via notre serveur Discord. \ No newline at end of file + about: L'équipe Papillon est disponible sur Discord, nous pouvons répondre aux questions diff --git a/.github/ISSUE_TEMPLATE/enhancement.yaml b/.github/ISSUE_TEMPLATE/enhancement.yaml deleted file mode 100644 index 5ac3ed2bb..000000000 --- a/.github/ISSUE_TEMPLATE/enhancement.yaml +++ /dev/null @@ -1,23 +0,0 @@ -name: 💅 Amélioration -description: Suggérez une amélioration. -title: '[Enhancement]: ' -labels: [enhancement] -body: - - type: textarea - attributes: - label: Description du problème - description: "Ce n'est pas assez intuitif ? Un contraste n'est pas assez prononcé ?" - validations: - required: true - - type: textarea - attributes: - label: "Description de l'amélioration" - description: Une description claire et concise de l'amélioration. - validations: - required: true - - type: textarea - attributes: - label: Contexte supplémentaire - description: "Ajoutez tout autre contexte ou capture d'écran permettant de clarifier votre question." - validations: - required: false \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature.yaml b/.github/ISSUE_TEMPLATE/feature.yaml index e94ae1608..3b5ce5a86 100644 --- a/.github/ISSUE_TEMPLATE/feature.yaml +++ b/.github/ISSUE_TEMPLATE/feature.yaml @@ -1,17 +1,20 @@ -name: ✨ Fonctionnalité -description: Suggérez une fonctionnalité. -title: '[Feature]: ' -labels: [feature] +name: ✨ Amélioration/Fonctionnalité +description: Comment pouvons-nous améliorer Papillon ? +title: "[Feature]: " + body: - type: textarea attributes: label: Description de la fonctionnalité - description: "Ajout d'un générateur de poneys ? D'un calcul de l'aura de l'élève ?" + description: Fait place à la créativité en bien détaillant ce qu'il faut faire + placeholder: Ça serait cool une intégration d'un simulateur permettant de savoir si on aura le bac/brevet ! validations: required: true + - type: textarea attributes: - label: Contexte supplémentaire - description: "Ajoutez tout autre contexte ou design permettant de clarifier votre idée." + label: Davantage de détails ? + description: Intégrer une/des image(s) pour nous projeter serait super, mais c'est pas grave s'il n'y en a pas + placeholder: Ah, même si j'ai des idées, je suis pas designer 🤣 validations: required: false diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index b62ba586b..f979123cb 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,29 +1,48 @@ # 🚀 Nouvelle Pull Request -Proposez vos modifications pour améliorer Papillon +Merci de contribuer à l'amélioration de Papillon ! -## Informations importantes +Des questions sur les pull requests ? Une documentation a spécialement été crée ici => https://gitbook.getpapillon.xyz/organisation/outils-internes/github -Merci de vous référer à la documentation sur la contribution si vous avez des questions à propos des pull requests (https://gitbook.getpapillon.xyz/organisation/outils-internes/github) +## Avant toute chose... -## Checklist d'avant pull request +Pour nous aider à tester la pull request, merci de cocher les cases (_en rajoutant un `x` dans les crochets_) si c'est le cas : -Veuillez cocher toutes les cases applicables en remplaçant [ ] par [x]. +Type de pull request : -- [ ] Vous avez testé de build le projet avec vos modifications et ce build **a réussi** -- [ ] Vous respectez les conventions de codage et de nommage du projet -- [ ] Vous utilisez la **tabulation** pour l'indentation afin de maintenir un code lisible -- [ ] Cette pull request **n'est pas un duplicata** d'une autre -- [ ] Cette pull request est prête à être **revue** (review) et **fusionnée** (merge) -- [ ] Il n'y a pas de **`TODO`** (aka des annotations pour du code manquant) dans vos modifications -- [ ] Il n'y a pas **d'erreurs de langue** dans votre code (grammaire, vocabulaire, conjugaison, orthographe) -- [ ] Les détails des changements ont été décrits ci-dessous -- [ ] Cette pull-request n'est pas une **"breaking-change"** (des modifications qui vont entraîner la modification du fonctionnement de certaines fonctionnalités déjà existantes) +- [] **Breaking-change** (_des modifications avec un impact sur les fonctionnalités actuelles_) +- [] **Feat** (_ajoute une amélioration/nouveauté_) +- [] **Fix** (_permet de corriger un bug_) +- [] **Styles** (_change/ajoute du style_) -## Changelogs proposés +## Résumé des changements effectués -Décrivez les modifications que vous avez effectuées. +> [!NOTE] +> +> Un bot détaillera dans la section `Autres informations` toutes les modifications que tu as effectué. +> +> Mais un bot reste un bot, ça peut bugger 😉. C'est pour ça qu'il est demandé un **résumé** des modifications effectuées -## Informations supplémentaires +_Les modifications_ -Ajoutez ici toute information supplémentaire si nécessaire. +## Capture(s) d'écran (simplifie le test de la pull request) + +_Le(s) capture(s) d'écran_ + +## Issue(s) en rapport + +> [!NOTE] +> +> Cette section permet de linker des issues à la pull request. Cela signifie qu'une fois la pull request mergée, les issues listées ci-dessous seront fermées automatiquement + +- Closed #(_le numéro de l'issue_) + +_S'il y en a plusieurs, continuer à les lister_ + +- Closed #(_le numéro de l'issue_) + +### Autres informations + +> [!WARNING] +> +> Cette section est réservé aux bots (_liste des bots_), merci de laisser la section comme elle est diff --git a/.github/workflows/expo_preview.yml b/.github/workflows/expo_preview.yml new file mode 100644 index 000000000..7634da54b --- /dev/null +++ b/.github/workflows/expo_preview.yml @@ -0,0 +1,171 @@ +name: Create QR Code Workflow for PR + +on: + workflow_dispatch: + inputs: + pr_number: + description: 'Pull Request Number' + required: true + type: string + + pull_request: + types: [opened, synchronize, reopened] + +jobs: + build: + runs-on: ubuntu-latest + permissions: + pull-requests: write + contents: write + actions: write + steps: + - name: Get PR Number + id: pr + run: | + if [ ! -z "${{ github.event.pull_request.number }}" ]; then + echo "PR_NUMBER=${{ github.event.pull_request.number }}" >> $GITHUB_ENV + else + echo "PR_NUMBER=${{ inputs.pr_number }}" >> $GITHUB_ENV + fi + + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Checkout PR + run: | + gh pr checkout ${{ env.PR_NUMBER }} + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Check if PR is closed + id: check_pr + run: | + PR_STATE=$(gh pr view ${{ env.PR_NUMBER }} --json state -q '.state') + if [ "$PR_STATE" = "CLOSED" ] || [ "$PR_STATE" = "MERGED" ]; then + current_description=$(gh pr view ${{ env.PR_NUMBER }} --json body -q '.body') + if echo "$current_description" | grep -q "PREVIEW EXPO"; then + new_description=$(echo "$current_description" | sed 's/| ⏳ Expire dans.*|/| ⏳ Expire dans | ⚠️ Preview arrêtée - PR fermée |/') + gh api --method PATCH repos/${{ github.repository }}/pulls/${{ env.PR_NUMBER }} --field body="$new_description" + fi + echo "PR is closed or merged, stopping workflow" + echo "IS_CLOSED=true" >> $GITHUB_OUTPUT + else + echo "IS_CLOSED=false" >> $GITHUB_OUTPUT + fi + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Setup java + if: steps.check_pr.outputs.IS_CLOSED != 'true' + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'zulu' + + - name: Setup Android SDK + if: steps.check_pr.outputs.IS_CLOSED != 'true' + uses: android-actions/setup-android@v3 + + - name: Setup Node.js + if: steps.check_pr.outputs.IS_CLOSED != 'true' + uses: actions/setup-node@v4 + with: + node-version: '18' + + - name: Install dependencies + if: steps.check_pr.outputs.IS_CLOSED != 'true' + run: | + npm ci + npm install -g @expo/ngrok@^4.1.0 + + - name: Start Expo server + if: steps.check_pr.outputs.IS_CLOSED != 'true' + run: | + nohup npx expo start --no-dev --clear --tunnel 2>&1 | tee expo.log & + sleep 20 + env: + EXPO_DEBUG: true + + - name: Extract and Display Expo URL + if: steps.check_pr.outputs.IS_CLOSED != 'true' + run: | + expo_url=$(grep -oP '(?<=URL: ).*' expo.log | tail -n 1) + if [ -z "$expo_url" ]; then + echo "Failed to extract Expo URL" + exit 1 + fi + echo "EXPO_URL=$expo_url" >> $GITHUB_ENV + + - name: Generate QR Code URL + if: steps.check_pr.outputs.IS_CLOSED != 'true' + run: | + QR_URL="https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=${{ env.EXPO_URL }}" + echo "QR_URL=$QR_URL" >> $GITHUB_ENV + + - name: Update PR description with QR Code link + if: steps.check_pr.outputs.IS_CLOSED != 'true' + run: | + create_message() { + local time_info="$1" + echo " + # 🚀 PREVIEW EXPO 📱 + + > ### ⚡️ Scannez & Testez ! ⚡️ + > + > 📸 Scannez le QR code → 📲 Ouvrez dans Expo Go → ✨ Testez ! + + | 📱 Preview | Info | + |-----------|------| + | 🔲 QR Code | | + | 🔗 Lien | ${{ env.EXPO_URL }} | + | ⏳ Expire dans | $time_info | + " + } + + update_pr_description() { + local message="$1" + local current_description=$(gh pr view ${{ env.PR_NUMBER }} --json body -q '.body') + local new_description + if echo "$current_description" | grep -q "PREVIEW EXPO"; then + new_description=$(echo "$current_description" | awk '/# 🚀 PREVIEW/{p=NR} p&&/Expire dans/{p="~0"} !p{print}') + else + new_description="$current_description" + fi + new_description="${new_description} + ${message}" + gh api --method PATCH repos/${{ github.repository }}/pulls/${{ env.PR_NUMBER }} --field body="$new_description" + } + + initial_message=$(create_message "4 heures") + update_pr_description "$initial_message" + + for i in {1..11}; do + sleep 1200 + remaining_hours=$((4 - i/3)) + remaining_minutes=$((60 - (i*20)%60)) + if [ $remaining_minutes -eq 60 ]; then + time_message="~$remaining_hours heures restantes" + else + time_message="~$remaining_hours heures et $remaining_minutes minutes restantes" + fi + update_message=$(create_message "$time_message") + update_pr_description "$update_message" + done + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Launch another workflow + if: steps.check_pr.outputs.IS_CLOSED != 'true' + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: 'create_qrcode.yml', + ref: 'main', + inputs: { + pr_number: '${{ env.PR_NUMBER }}' + } + }) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml deleted file mode 100644 index 31cde8b79..000000000 --- a/.github/workflows/preview.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: preview -on: pull_request - -jobs: - update: - name: EAS Update - runs-on: ubuntu-latest - permissions: - contents: read - pull-requests: write - steps: - - name: Check for EXPO_TOKEN - run: | - if [ -z "${{ secrets.EXPO_TOKEN }}" ]; then - echo "You must provide an EXPO_TOKEN secret linked to this project's Expo account in this repo's secrets. Learn more: https://docs.expo.dev/eas-update/github-actions" - exit 1 - fi - - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: 18.x - cache: yarn - - - name: Setup EAS - uses: expo/expo-github-action@v8 - with: - eas-version: latest - token: ${{ secrets.EXPO_TOKEN }} - - - name: Install dependencies - run: yarn install - - - name: Create preview - uses: expo/expo-github-action/preview@v8 - with: - command: eas update --auto diff --git a/.github/workflows/start_build.yml b/.github/workflows/start_build.yml index d9a499267..c98a98e7e 100644 --- a/.github/workflows/start_build.yml +++ b/.github/workflows/start_build.yml @@ -14,17 +14,17 @@ jobs: rm -rf ~/Library/Developer/Xcode/DerivedData rm -rf android/app/build/ rm -rf $HOME/.gradle/caches/ - + build_ios: needs: clean runs-on: macos-latest steps: - uses: actions/checkout@v3 - + - name: Setup Node.js uses: actions/setup-node@v3 with: - node-version: '18' + node-version: "18" - name: Install dependencies run: npm ci @@ -110,7 +110,7 @@ jobs: OTHER_CODE_SIGN_FLAGS="--keychain $KEYCHAIN_PATH" \ clean archive xcodebuild -exportArchive -archivePath build/Papillon.xcarchive -exportOptionsPlist ExportOptions.plist -exportPath ./build - + if [ -f "./build/Papillon.ipa" ]; then echo "IPA file generated successfully" else @@ -130,11 +130,11 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - + - name: Setup Node.js uses: actions/setup-node@v3 with: - node-version: '18' + node-version: "18" - name: Install dependencies run: npm ci @@ -142,8 +142,8 @@ jobs: - name: Setup Java uses: actions/setup-java@v3 with: - distribution: 'zulu' - java-version: '17' + distribution: "zulu" + java-version: "17" - name: Build Android app env: @@ -153,7 +153,7 @@ jobs: run: | # Decode keystore echo $KEYSTORE_BASE64 | base64 --decode > android/app/release.keystore - + # Build APK and AAB cd android ./gradlew assembleRelease @@ -201,12 +201,12 @@ jobs: APP_STORE_CONNECT_API_KEY_CONTENT: ${{ secrets.APP_STORE_CONNECT_API_KEY_CONTENT }} run: | echo "$APP_STORE_CONNECT_API_KEY_CONTENT" | base64 --decode > appstore_connect_api_key.p8 - + xcrun notarytool submit Papillon.ipa --key appstore_connect_api_key.p8 \ --key-id "$APP_STORE_CONNECT_API_KEY_ID" \ --issuer "$APP_STORE_CONNECT_API_ISSUER_ID" \ --wait - + echo "iOS build uploaded to TestFlight for beta testing" - name: Upload Android Release to Play Store Beta @@ -224,4 +224,4 @@ jobs: echo "Both iOS and Android builds have been successfully uploaded to their respective beta channels (TestFlight and Play Store Beta)." echo "To release to production:" echo "- For iOS: Go to App Store Connect, test the build in TestFlight, then submit for App Store review when ready (Vince will do this)." - echo "- For Android: Go to the Google Play Console, test the build in the beta track, then promote to production when ready (Vince will do this)." \ No newline at end of file + echo "- For Android: Go to the Google Play Console, test the build in the beta track, then promote to production when ready (Vince will do this)." diff --git a/.github/workflows/test_build.yml b/.github/workflows/test_build.yml new file mode 100644 index 000000000..efb711d35 --- /dev/null +++ b/.github/workflows/test_build.yml @@ -0,0 +1,63 @@ +name: Build Verification + +on: + workflow_dispatch: + pull_request: + types: [opened, synchronize, reopened] + +jobs: + build_ios: + runs-on: macos-latest + steps: + - uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: "18" + + - name: Install dependencies + run: npm ci + + - name: Install Cocoapods + run: sudo gem install cocoapods + + - name: Install Pods + run: | + cd ios + pod install + + - name: Build iOS app + run: | + cd ios + xcodebuild -workspace Papillon.xcworkspace \ + -scheme Papillon \ + -configuration Release \ + -destination generic/platform=iOS \ + clean build + echo "iOS build completed successfully" + + build_android: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: "18" + + - name: Install dependencies + run: npm ci + + - name: Setup Java + uses: actions/setup-java@v3 + with: + distribution: "zulu" + java-version: "17" + + - name: Build Android app + run: | + cd android + ./gradlew assembleRelease + echo "Android build completed successfully"