]> git.digitality.be Git - pdw25-26/commitdiff
Mobile : modification icon, etc
authorThibaud Moustier <thibaudmoustier0@gmail.com>
Sun, 1 Mar 2026 17:30:36 +0000 (18:30 +0100)
committerThibaud Moustier <thibaudmoustier0@gmail.com>
Sun, 1 Mar 2026 17:30:36 +0000 (18:30 +0100)
Wallette/mobile/app.json
Wallette/mobile/assets/adaptive-icon.png
Wallette/mobile/assets/favicon.png
Wallette/mobile/assets/icon.png
Wallette/mobile/assets/splash-icon.png
Wallette/mobile/src/screens/StrategyScreen.tsx
Wallette/mobile/src/services/api/strategyApi.ts

index 106ddd5b182726ba2cb0f5bea4b4d1295da9527b..b4c5e7f87c1b28e638a525ab67903a71a6f08f22 100644 (file)
@@ -2,7 +2,7 @@
   "expo": {
     "name": "wall-e-tte",
     "slug": "wall-e-tte",
-    "version": "1.0.0",
+    "version": "1.0.1",
     "orientation": "portrait",
     "icon": "./assets/icon.png",
     "userInterfaceStyle": "light",
index 03d6f6b6c6727954aec1d8206222769afd178d8d..3d0f5be0b01abab224052f05322f8f4a1eba3d7d 100644 (file)
Binary files a/Wallette/mobile/assets/adaptive-icon.png and b/Wallette/mobile/assets/adaptive-icon.png differ
index e75f697b1801871ad8cd9309b05e8ffe8c6b6d01..e5e39663ed466bce2044979bb779ea9a197ae779 100644 (file)
Binary files a/Wallette/mobile/assets/favicon.png and b/Wallette/mobile/assets/favicon.png differ
index a0b1526fc7b78680fd8d733dbc6113e1af695487..2d2747af5c2681c0b592d0e2c4f1b381641bd43e 100644 (file)
Binary files a/Wallette/mobile/assets/icon.png and b/Wallette/mobile/assets/icon.png differ
index 03d6f6b6c6727954aec1d8206222769afd178d8d..658e38e5b80c4027e553b1c4e34ade60e57ecff2 100644 (file)
Binary files a/Wallette/mobile/assets/splash-icon.png and b/Wallette/mobile/assets/splash-icon.png differ
index 17e0af904074433676c23eae2480962c89ce3083..5c445dfd7f94bea49da884b829fe08df2a08ab0e 100644 (file)
@@ -3,24 +3,28 @@ import { useEffect, useState } from "react";
 import { SafeAreaView } from "react-native-safe-area-context";
 
 import { ui } from "../components/ui/uiStyles";
-import { loadSettings } from "../utils/settingsStorage";
+import { loadSettings, saveSettings } from "../utils/settingsStorage";
 
 import type { UserSettings } from "../models/UserSettings";
 import type { StrategyKey, StrategyOption } from "../types/Strategy";
 import { fetchStrategies } from "../services/strategyService";
 
-/**
- * ✅ API-ready (façade)
- * Aujourd'hui : update local settings
- * Demain : POST /api/strategy/select
- */
 import { selectStrategy } from "../services/api/strategyApi";
 
+/**
+ * StrategyScreen
+ * --------------
+ * Maintenant :
+ * - On garde la liste locale (fetchStrategies)
+ * - On sync vers serveur : POST /api/strategy/select
+ * - On met à jour le settings local pour affichage immédiat
+ */
 export default function StrategyScreen() {
   const [settings, setSettings] = useState<UserSettings | null>(null);
   const [strategies, setStrategies] = useState<StrategyOption[]>([]);
   const [loading, setLoading] = useState<boolean>(true);
   const [info, setInfo] = useState<string | null>(null);
+  const [busy, setBusy] = useState<boolean>(false);
 
   useEffect(() => {
     let active = true;
@@ -56,11 +60,29 @@ export default function StrategyScreen() {
   const isSelected = (key: StrategyKey) => settings.selectedStrategyKey === key;
 
   const handleSelect = async (key: StrategyKey) => {
-    // ✅ Façade : aujourd'hui local, demain API
-    const updated = await selectStrategy(key);
-
-    setSettings(updated);
-    setInfo(`Stratégie sélectionnée : ${key}`);
+    try {
+      setBusy(true);
+      setInfo(null);
+
+      // 1) Update local immédiat (UX + dashboard)
+      const next: UserSettings = { ...settings, selectedStrategyKey: key };
+      await saveSettings(next);
+      setSettings(next);
+
+      // 2) Sync serveur (contrat Stéphane)
+      // Pair cible : pour l’instant BTC/EUR (comme le dashboard). Si vous passez multi-crypto, on l’adaptera.
+      await selectStrategy({
+        pair: "BTC/EUR",
+        mode: key,
+        params: {}, // si un jour tu as des paramètres, tu les mets ici
+      });
+
+      setInfo(`Stratégie sélectionnée : ${key} ✅ (sync serveur OK)`);
+    } catch (e: any) {
+      setInfo(`Erreur serveur stratégie : ${e?.message ?? "inconnue"}`);
+    } finally {
+      setBusy(false);
+    }
   };
 
   return (
@@ -97,11 +119,13 @@ export default function StrategyScreen() {
                 ui.button,
                 styles.fullButton,
                 isSelected(item.key) && styles.btnSelected,
+                busy && styles.btnDisabled,
               ]}
               onPress={() => handleSelect(item.key)}
+              disabled={busy}
             >
               <Text style={ui.buttonText}>
-                {isSelected(item.key) ? "Sélectionnée ✅" : "Sélectionner"}
+                {isSelected(item.key) ? "Sélectionnée ✅" : busy ? "Envoi..." : "Sélectionner"}
               </Text>
             </TouchableOpacity>
           </View>
@@ -137,6 +161,10 @@ const styles = StyleSheet.create({
     opacity: 0.9,
   },
 
+  btnDisabled: {
+    opacity: 0.6,
+  },
+
   riskTag: {
     fontWeight: "900",
     opacity: 0.75,
index dccd3ff993d71710349b24b5949053643bda5fc6..60395ff69e36ae200da71d4b6b4b83ef29679013 100644 (file)
@@ -1,24 +1,37 @@
 import { apiPost } from "./http";
 import { loadSession } from "../../utils/sessionStorage";
-import type { UserSettings } from "../../models/UserSettings";
+import type { StrategyKey } from "../../types/Strategy";
 
 /**
- * strategyApi (API-only)
- * ----------------------
+ * strategyApi (API)
+ * -----------------
+ * Contrat (objectif) :
  * POST /api/strategy/select
+ * Body:
+ * {
+ *   userId: string,
+ *   pair: "BTC/EUR",
+ *   mode: "RSI_SIMPLE" | "MA_CROSS" | ...,
+ *   params: object
+ * }
+ *
+ * Réponse possible :
+ * - { ok:true, data:{ ... } } (géré par http.ts)
+ * - ou une réponse vide -> on considère que c'est OK si pas d'erreur HTTP
  */
-export async function selectStrategy(strategyKey: string): Promise<UserSettings> {
+export async function selectStrategy(params: {
+  pair: string;         // ex: "BTC/EUR"
+  mode: StrategyKey;    // ex: "RSI_SIMPLE"
+  params?: Record<string, unknown>;
+}): Promise<void> {
   const session = await loadSession();
   const userId = session?.userId;
   if (!userId) throw new Error("Session absente : impossible de sélectionner une stratégie.");
 
-  // Le backend décidera quoi renvoyer : settings mis à jour ou juste ok.
-  // On part sur "settings" pour éviter de recharger partout.
-  const data = await apiPost<{ settings: UserSettings }>(`/strategy/select`, {
+  await apiPost(`/strategy/select`, {
     userId,
-    strategyKey,
+    pair: params.pair,
+    mode: params.mode,
+    params: params.params ?? {},
   });
-
-  if (!data.settings) throw new Error("Réponse API invalide : settings manquant.");
-  return data.settings;
 }
\ No newline at end of file