/*
 * 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 { Route, Routes } from 'react-router-dom';

import { RouteParams } from '../utils/hooks';
import CallInterface from './CallInterface';
import Messenger from './Messenger';

export type MessengerRouteParams = RouteParams<{ conversationId?: string; contactId?: string }, Record<string, never>>;
export type CallRouteParams = RouteParams<{ conversationId: string }, { video?: 'true' }>;

export default function JamiMessenger() {
  return (
    <Routes>
      <Route path="addContact/:contactId" element={<Messenger />} />
      <Route path="conversation/:conversationId" element={<Messenger />} />
      <Route path="call/:conversationId" element={<CallInterface />} />
      <Route path="*" element={<Messenger />} />
    </Routes>
  );
}
