From d0f5874ccf70c29be6dedf6f800aed90abd4432b Mon Sep 17 00:00:00 2001
From: Benoit Lavenier <benoit.lavenier@e-is.pro>
Date: Wed, 29 Nov 2023 14:23:39 +0100
Subject: [PATCH] fix(doc) Add @RxStateXxx annotation in the Developer guide

---
 doc/developer_guide.md | 52 ++++++++++++++++++++++++++++--------------
 1 file changed, 35 insertions(+), 17 deletions(-)

diff --git a/doc/developer_guide.md b/doc/developer_guide.md
index b2032e6..32e614c 100644
--- a/doc/developer_guide.md
+++ b/doc/developer_guide.md
@@ -2,27 +2,45 @@
 
 ## Writing a component
 
-- Pour chaque composant Angular (v14):
+- Pour chaque composant Angular (v17):
   - Utiliser Ionic framework, et si besoin Angular Material. Utiliser la classe Moment pour les dates.
-  - Utiliser RxState avec providers: [RxState] dans la déclaration @Component.
-  - Juste au-dessus de chaque classe composant, déclarer une interface MonComponentState :
-    * En remplaçant "MonComponent" par le nom du composant.
-    * Ajouter les attributs dynamiques du composant dans cette interface.
+  - Utiliser `RxState` avec providers: `[RxState]` dans la déclaration `@Component(/*...*/, providers: [RxState])`.
+  - Juste au-dessus de chaque classe composant, déclarer une interface `MonComponentState` (en remplaçant `MonComponent` par le nom du composant) :
+    * Déclarer dans cette interface les propriétés dynamiques du composant.
   - Dans le constructeur :
     * Limiter les paramètres en utilisant injector: Injector pour faciliter l'héritage.
     * Définir tous les paramètres avec une visibilité protected.
-    * Ajouter un paramètre state: RxState<MonComposantState>.
-  - Pour chaque attribut dynamique du composant :
-    * Définir l'attribut avec son type simple dans la classe MonComposantState.
-    * Dans le composant, définir un getter et un setter avec @Input qui utilise state :
-    ```ts
-    get attribute(): string {
-      return this.state.get('attribute');
-    }
-    @Input() set attribute(value: string) {
-      this.state.set('attribute', () => value);
-    }
-    ```    
+  - Dans le composant : 
+    - Ajouter une propriété `state` avec l'annotation `@RxStateRegister()`
+      ```ts
+      @RxStateRegister() protected state: RxState<MonComposantState> = inject(RxState);
+      ```
+    - Pour chaque attribut dynamique du composant :
+      * Définir l'attribut avec son type simple dans la classe MonComposantState.
+      * Dans le composant, définir chaque propriété avec les annotations `@Input()` et `@RxStateProperty()`
+      ```ts
+      @Input() @RxStateProperty() attribute: string; 
+      ```
+      > Pour information, `@RxStateProperty()` va générer automatiquement un code équivalent à :
+      > ```ts
+      > @Input() set attribute(value: string) {
+      >   this.state.set('attribute', () => value);
+      > }
+      > get attribute(): string {
+      >   return this.state.get('attribute');
+      > }
+      > ```  
+
+      * Si besoin, pour observer une propriété, utiliser l'annotation `@RxStateSelect()`
+      ```ts
+      @RxStateSelect() attribute$: Observable<string>; 
+      ```
+      > Pour information, `@RxStateSelect()` va générer automatiquement un code équivalent à :
+      > ```ts
+      > get attribute$(): Observable<string> {
+      >   return this.state.select('attribute');
+      > }
+      > ```  
   - Pour les modales (si besoin) :
     *  Utiliser IonicModal.
     *  Ne pas définir la modale dans le template HTML (inline) mais dans un composant séparé.
-- 
GitLab