---
# System prepended metadata

title: Architecture création d'annonce App

---

# Architecture création d'annonce App

## Redux

```json=
const createAdd = createSlice({
  name: 'CREATE_ADD',
  initialState: fromJS({
    isUpdating: false,
    statusType: void 0,
    statusText: '',
    step1: [],
    step2: [],
    step3: [],
    ...
  }),
  ...
)]
```
Les listes step1,2..etc contiennent des élément de type `FormItem`. Chaque liste va sérvir à décrire les champs qui composent les steps de base. Tous les champs d'une étape (même ceux conditinnels) sont présant dans ces listes.

## FormItem object

Chaque item qui compose le formulaire a la forme suivante:

```json=
{
    id: 'Title',
    component: 'mon composant',
    isDisplayed: false,
}
```

## setInputVisibility

Ce reducer va nous sérvir à changer la visibilité d'un élément `FormItem` contenu dans une des liste `step` de notre store redux.

```javascript=

const setInputVisibility = (state, step, formItemId, bool) => {
    //trouve l'objet et update son attribut isDisplayed
}
```

A chaque fois qu'un input est changé il faudra passer par ce reducer pour update les champs visibles ou non. Pour l'instant je vois pas de façon plus "générique" de faire . Pour plus de visibilité, les régles de validation propre à chaque input peuvent être stockés au sein de ces mêmes composant input. (avec un R.cond par exemple).

## Initialisation du state redux CreateAdd

Ici il faudrait ajouter la gestion des étapes et faire en sorte que la fonction getCategoryInput return une liste de `FormInput` pour chaque étape.

```javascript=
const categoryInputs = [
  {
    category: 'REALESTATE_BUY',
    extraInputs: ['rooms', 'surface'],
    conditionalInputs: {
      type: {
        offer: ['charges', 'beds'],
        looking_for: ['sharingAllowed', 'capacity'],
      },
    },
  },
  {
    category: 'REALESTATE_RENT',
    extraInputs: ['rooms'],
  },
];
​
const getCategoryInputs = (categoryInputs, category, type) => {
  const categoryObject = categoryInputs.find(c => c.category === category);
  const categoryExtraInput = categoryObject?.extraInputs ?? [];
  const conditionalTypeInputs = categoryObject?.conditionalInputs?.type[type] ?? [];
  return [...categoryExtraInput, ...conditionalTypeInputs];
}
​
getCategoryInputs(categoryInputs, 'REALESTATE_BUY', 'looking_for');
// => ['rooms', 'surface', 'sharingAllowed', 'capacity']

```

## Screen

Dans chaque screen il suffirat de .map() sur la liste `step` qui correspond à l'écran et d'afficher l'élément seulement si l'attribut `isDisplayed`est égal à `true`