/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ import React from 'react'; /** * Replacement to React.createContext. * * Does not take any default value and avoids non-null assertions when using * the value of the context, like the following scenario. * * ```ts * const StoreDispatchContext = useContext>(null); * const dispatchStore = useContext(StoreDispatchContext); * ... * dipatchStore!({ ... }); * ``` * * Instead, it throws an error when `useContext` is not called within a * Provider with a value. */ export default function createContext(): { useContext: () => NonNullable; Provider: React.Provider; } { const context = React.createContext(null); function useContext(): NonNullable { const c = React.useContext(context); if (!c) throw new Error('useContext must be within a Provider with a value'); return c; } return {useContext, Provider: context.Provider}; }