/*
 * 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, PropsWithChildren } from 'react';
import { Socket } from 'socket.io-client';

type ISocketContext = Socket;
export const SocketContext = createContext<ISocketContext | undefined>(undefined);

type SocketProviderProps = PropsWithChildren<{
  socket: Socket;
}>;
export const SocketProvider = ({ socket, children }: SocketProviderProps) => (
  <SocketContext.Provider value={socket}>{children}</SocketContext.Provider>
);
