import React, { useCallback, useMemo, useState } from 'react';
import { Props as AdviserProps } from './Adviser/Adviser';

type ContextType = {
  setAdviser: (
    content: AdviserProps['children'],
    color?: AdviserProps['color']
  ) => void;
  content: AdviserProps['children'];
  color?: AdviserProps['color'];
  isOpen: boolean;
  setIsOpen: (isOpen: boolean) => void;
};

const AdviserContext = React.createContext<ContextType>({
  content: '',
  setAdviser: () => {},
  isOpen: false,
  setIsOpen: () => {},
});

export function useAdviser() {
  const context = React.useContext(AdviserContext);
  if (!context) {
    throw new Error('useAdviser must be used within a AdviserProvider');
  }
  return context;
}

function AdviserProvider({ children }: { children: React.ReactNode }) {
  const [adviserProps, setAdviserProps] = useState<{
    content: ContextType['content'];
    color?: ContextType['color'];
  }>({
    content: '',
  });
  const [isOpen, setIsOpen] = useState<ContextType['isOpen']>(false);

  const handleSetAdviser = useCallback((content, color) => {
    setAdviserProps({
      content,
      color,
    });
    setIsOpen(true);
  }, []);

  const { content, color } = adviserProps;

  const value = useMemo(() => {
    return {
      setAdviser: handleSetAdviser,
      content,
      color,
      setIsOpen,
      isOpen,
    };
  }, [content, color, isOpen, handleSetAdviser]);

  return (
    <AdviserContext.Provider value={value}>{children}</AdviserContext.Provider>
  );
}

export default AdviserProvider;

Synonyms

cyb/src/websockets/context.tsx
pussy-ts/src/websockets/context.tsx
cyb/src/features/adviser/context.tsx

Neighbours