Dernière version : 3/12/2020 à 11h09
## Proposition d'IHM-Main
Reponse aux messages :
Salut, le comportement qui vous fait perdre vos onglets ouvert va disparaître. Ce que je pense , c'est maintenant, lors du premier affichage d'un channel, on continue d'appeler getIHMChannelWindow(channel); de votre interface afin d'initialiser votre vue et après, on garde la référence de votre root (on peut donc renommer en initIHMChannelWindow(channel);.
Puis après pour toute la suite de vie de l'application, on appelera viewChannel(channel) (c'est le openChannel de ton diagramme). Et cette méthode fera chez vous soit la creation d'une nouvelle tab, soit la selection de la tab si elle existe déjà pour le channel.
J'ai créé un petit POC (branche IHM-Main_list_channels_poc ) ou j'ai modifier de manière un peu sale mais rapide votre code car c'est plus clair que du texte explicatif.
Dit moi si cette logique vous convient ?
Et de notre côté, on s'occupe de gérer s'il faut cacher votre vue (par exemple quand il faut afficher la page d'accueil) et quand il faut le remettre. Et ou le fait grace à la référence du votre root retourner lors de l'initialisation de votre vue.
Et le dernier point, on pense avoi une méthode pour que vous nous renvoyer la liste des channels ouverts. Et se serait plus léger de l'appeler setOpenedChannelsList et aussi, ce serait bien si on peut avoir le channel actuellement visible donc une méthode genre setCurrentVisibleChannel(Channel)
Recap des nos interfaces :
> N'hésitez pas à compléter s'ils vous manquent des éléments
> on modifiera le code si ça vous convient
```plantuml
@startuml
interface IIHMChannelToIHMMain {
void redirectToHomePage();
void setOpenedChannelsList(List<Channel>);
void setCurrentVisibleChannel(Channel);
List<UserLite> getConnectedUsers();
void closeChannel(Channel);
}
interface IIHMMainToIHMChannel {
Region initIHMChannelWindow(Channel channel);
void viewChannel(UUID channelId);
}
```
> L'UUID du channel suffit normalement dans viewChannel()
> Donc aussi pour initIHMChannelWindow ?
## Nouvelle connexion d'un client distant sur un channel ouvert - Retour serveur
```plantuml
@startuml
actor User
participant IHM_Main
participant IHM_Channel
participant Data
participant Communication
Serveur -> Communication : notification_nouvelle_connexion
activate Communication
IHM_Channel <- Communication : addConnectedUser(UUID channelId, UserListe user)
activate IHM_Channel
IHM_Channel -> IHM_Main : setOpenedChannelList(List<Channel> openedChannels)
IHM_Channel --> Communication : void
actor Serveur
@enduml
```
> Pourquoi l'appel à setOpenedChannelsList ? Un nouveau client sur un channel ouvert, ne modifie pas la liste des channels ouverts.
## Nouvelle déconnexion d'un client distant sur un channel ouvert - Retour serveur
```plantuml
@startuml
actor User
participant IHM_Main
participant IHM_Channel
participant Data
participant Communication
Serveur -> Communication : notification_nouvelle_deconnexion
activate Communication
IHM_Channel <- Communication : removeConnectedUser(UUID channelId, UserListe user)
activate IHM_Channel
IHM_Channel -> IHM_Main : setOpenedChannelList(List<Channel> openedChannels)
alt L'utilisateur était sur la page du channel fermé
IHM_Channel -> IHM_Main : setCurrentVisibleChannel(newVisibleChannel)
end
IHM_Channel --> Communication : void
actor Serveur
@enduml
```
Quand un utilisateur distant se déconnecte, Channel envoie à Main une màj des channels ouverts car peut-être que l'utilisateur distant qui s'est déconnecté était le proprio d'un de nos channels ouverts. Auquel cas, ce channel se ferme puisque le propriétaire n'est plus là, la liste des channels ouverts est donc modifiée.
## Déconnexion du client d'un des channels ouvert
```plantuml
@startuml
actor User
participant IHM_Main
participant IHM_Channel
participant Data
participant Communication
IHM_Channel -> Communication : closeChannel(UUID channelId)
activate IHM_Channel
activate Communication
Communication -> Serveur : closeChannel(UUID channelId, UserLite user)
Communication --> IHM_Channel : void
deactivate Communication
IHM_Channel -> IHM_Main : setOpenedChannelList(List<Channel> openedChannels)
IHM_Channel -> IHM_Main : setCurrentVisibleChannel(channel)
deactivate IHM_Channel
actor Serveur
@enduml
```
## Connexion du client à un channel
```plantuml
@startuml
actor User
participant IHM_Main
participant IHM_Channel
participant Data
participant Communication
IHM_Main -> IHM_Channel : viewChannel(UUID channelId)
activate IHM_Main
activate IHM_Channel
IHM_Channel -> Communication : getChannelHistory(UUID channelId)
deactivate IHM_Channel
activate Communication
Communication -> Serveur : closeChannel(UUID channelId, UserLite user)
Communication -> IHM_Channel : displayChannelHistory(Channel channel, List<Message> messagesList, List<UserLite> connectedUsers)
deactivate Communication
activate IHM_Channel
IHM_Channel -> IHM_Main : setOpenedChannelList(List<Channel> openedChannels)
IHM_Channel -> IHM_Main : setCurrentVisibleChannel(channel)
deactivate IHM_Channel
deactivate IHM_Main
actor Serveur
@enduml
```
#### Inviter ou Ajouter un membre
##### Côté client
```plantuml
@startuml
title : Inviter un membre - client initiateur
actor User
participant IHM_Main as main
participant IHM_Channel as chan
participant "Data" as data
participant Communication as comm
actor "Server" as db
User -> chan : click()
activate chan
chan -> main: getConnectedUsersList()
chan -> comm: SendInvite(UserLite sender,UserLite receiver, Message message)
activate comm
comm ->> db : SendInvite(UserLite sender,UserLite receiver, Message message)
comm --> chan: void
deactivate comm
deactivate chan
@enduml
```
> voir traitement et retour serveur dans le dossier de conception
> getConnectedUsersList() synchrone, renvoie un objet de type List<UserLite>