Remove non-null assertion in ConversationProvider

- Add `createOptionalContext` that is used by `AuthContext` and `ConversationContext` to create a context with a hook
  that can be used to retrieve its value and throw an error if it's undefined.
- In `router.tsx`, put `Messenger` inside `ConversationProvider`.
- In `ConversationListItem`, use the conversationId from the `ConversationContext ` instead of the url params.
- Fix bug in `CallInterface` with fullscreen.
- Remove unecessary useEffect dependency in `NotificationManager`.

Change-Id: Ib5f0ae6a0a34cdbdb02f871e36194376d945230d
diff --git a/client/src/hooks/createOptionalContext.ts b/client/src/hooks/createOptionalContext.ts
new file mode 100644
index 0000000..73c4258
--- /dev/null
+++ b/client/src/hooks/createOptionalContext.ts
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2022 Savoir-faire Linux Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program.  If not, see
+ * <https://www.gnu.org/licenses/>.
+ */
+import { createContext, useContext } from 'react';
+
+export const createOptionalContext = <T>(displayName: string) => {
+  const Context = createContext<T | undefined>(undefined);
+  Context.displayName = displayName;
+
+  function useOptionalContext(noThrow: true): T | undefined;
+  function useOptionalContext(noThrow?: false): T;
+  function useOptionalContext(noThrow?: boolean) {
+    const value = useContext(Context);
+    if (value === undefined && !noThrow) {
+      throw new Error(`The context ${Context.displayName} is not provided`);
+    }
+    return value;
+  }
+
+  return {
+    Context,
+    useOptionalContext,
+  };
+};