UNPKG

@modern-kit/react

Version:
1 lines 2.42 kB
{"version":3,"file":"index.cjs","sources":["../../../src/utils/createSafeContext/index.ts"],"sourcesContent":["import { createContext } from 'react';\nimport { useSafeContext as useInternalSafeContext } from '../../hooks/useSafeContext';\n\n/**\n * @description Context를 안전하게 생성하고, 사용할 수 있도록 도와주는 유틸리티 함수입니다.\n *\n * 기본값이 없다면 Provider 외부에서 useSafeContext를 사용할 때 에러를 발생시킵니다.\n * 기본값이 있다면 Provider 외부에서 useSafeContext를 사용하더라도 에러가 발생하지 않고 기본값을 반환합니다.\n *\n * Provider의 value prop은 필수이며, 기본값이 없더라도 null/undefined는 허용하지 않습니다.\n *\n * @template T 컨텍스트 값의 타입\n *\n * @param {T | null} [defaultValue=null] Context의 기본 값\n * @param {string} [displayName='SafeContext'] 컨텍스트 이름\n * @returns {[React.Provider<T>, () => NonNullable<T>]} Provider와 useSafeContext 함수를 반환합니다.\n *\n * @throws 기본값이 없는 상태에서 Provider 외부에서 useSafeContext를 사용할 때 에러를 발생시킵니다.\n *\n * @example\n * ```tsx\n * const [TestProvider, useTestContext] =\n * createSafeContext<{ value: string }>(null, 'TestContext');\n *\n * function TestComponent() {\n * const context = useTestContext();\n * // 안전하게 접근했기 때문에 context는 NonNullable 타입을 보장합니다.\n *\n * return <div>{context.value}</div>;\n * }\n *\n * <TestProvider value={{ value: 'test' }}>\n * <TestComponent />\n * </TestProvider>\n * ```\n */\nexport function createSafeContext<T>(\n defaultValue: T | null = null,\n displayName: string = 'SafeContext'\n): [React.Provider<T>, () => NonNullable<T>] {\n const Context = createContext<T | null>(defaultValue);\n Context.displayName = displayName;\n\n function useSafeContext(): NonNullable<T> {\n return useInternalSafeContext(Context);\n }\n\n return [Context.Provider as React.Provider<T>, useSafeContext];\n}\n"],"names":["createContext","useInternalSafeContext"],"mappings":";;;;;;AAoCO,SAAS,iBAAA,CACd,YAAA,GAAyB,IAAA,EACzB,WAAA,GAAsB,aAAA,EACqB;AAC3C,EAAA,MAAM,OAAA,GAAUA,oBAAwB,YAAY,CAAA;AACpD,EAAA,OAAA,CAAQ,WAAA,GAAc,WAAA;AAEtB,EAAA,SAAS,cAAA,GAAiC;AACxC,IAAA,OAAOC,mCAAuB,OAAO,CAAA;AAAA,EACvC;AAEA,EAAA,OAAO,CAAC,OAAA,CAAQ,QAAA,EAA+B,cAAc,CAAA;AAC/D;;;;"}