Change conversation during call

- Add `CallManagerProvider` to manage calls when the user navigates away from the call interface.
- Delete `NotificationManager`. Move its logic to `CallManagerProvider`.
- Rework routing
- Rework `ConversationProvider` and `useConversationQuery` to remove
  unecessary states

GitLab: #172
Change-Id: I4a786a3dd52159680e5712e598d9b831525fb63f
diff --git a/client/src/services/conversationQueries.ts b/client/src/services/conversationQueries.ts
index 44c0aae..94946ad 100644
--- a/client/src/services/conversationQueries.ts
+++ b/client/src/services/conversationQueries.ts
@@ -17,12 +17,14 @@
  */
 import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
 import { IConversation, Message } from 'jami-web-common';
+import { useMemo } from 'react';
 
 import { useAuthContext } from '../contexts/AuthProvider';
+import { Conversation } from '../models/conversation';
 
-export const useConversationQuery = (conversationId: string) => {
+export const useConversationQuery = (conversationId?: string) => {
   const { axiosInstance } = useAuthContext();
-  return useQuery(
+  const conversationQuery = useQuery(
     ['conversation', conversationId],
     async () => {
       const { data } = await axiosInstance.get<IConversation>(`/conversations/${conversationId}`);
@@ -32,6 +34,17 @@
       enabled: !!conversationId,
     }
   );
+
+  const conversation = useMemo(() => {
+    if (conversationQuery.isSuccess) {
+      return Conversation.fromInterface(conversationQuery.data);
+    }
+  }, [conversationQuery.isSuccess, conversationQuery.data]);
+
+  return {
+    conversation,
+    ...conversationQuery,
+  };
 };
 
 export const useMessagesQuery = (conversationId: string) => {