Skip to content

Commit 93f8d30

Browse files
authored
Merge pull request #23 from klmhyeonwoo/refactor/createContext
refactor(create-context): createContext 사용 시 디버깅에 용이하도록 매개변수 추가
2 parents 334e556 + 90ae354 commit 93f8d30

File tree

4 files changed

+15
-12
lines changed

4 files changed

+15
-12
lines changed

demo/tsconfig.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,5 @@
2020
"noUnusedLocals": true,
2121
"noUnusedParameters": true,
2222
"noFallthroughCasesInSwitch": true
23-
},
24-
"include": ["src", "../packages/ui"]
23+
}
2524
}

demo/vite.config.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ export default defineConfig({
88
plugins: [react(), vanillaExtractPlugin()],
99
resolve: {
1010
alias: {
11+
"@layer-ui": path.resolve(__dirname, "../packages/ui"),
12+
"@layer-lib": path.resolve(__dirname, "../packages/lib"),
1113
"@layer-ui/button": path.resolve(__dirname, "../packages/ui/button/src"),
1214
"@layer-ui/tabs": path.resolve(__dirname, "../packages/ui/tabs/src"),
1315
"@layer-lib/react-context": path.resolve(__dirname, "../packages/lib/react-context/src"),

packages/lib/react-context/src/create-context.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as React from "react";
22

3-
function createContext<ContextType extends object | null>(defaultValue?: ContextType) {
3+
function createContext<ContextType extends object | null>(contextName: string, defaultValue?: ContextType) {
44
const Context = React.createContext<ContextType | undefined>(defaultValue);
55

66
function Provider(props: ContextType & { children: React.ReactNode }) {
@@ -10,11 +10,13 @@ function createContext<ContextType extends object | null>(defaultValue?: Context
1010
return <Context.Provider value={values}> {children} </Context.Provider>;
1111
}
1212

13-
function useContext() {
13+
function useContext(componentName: string) {
1414
const context = React.useContext(Context);
1515
if (context) return context;
1616
if (defaultValue) return defaultValue;
17-
throw new Error(`Context 값을 찾을 수 없습니다. useContext는 반드시 해당하는 Provider 내부에서 사용되어야 합니다.`);
17+
throw new Error(
18+
`${contextName}Context 값을 찾을 수 없습니다. <${componentName} />에서 사용된 ${contextName}context는 반드시 해당하는 ${contextName}Provider 내부에서 사용되어야 합니다.`,
19+
);
1820
}
1921

2022
return [Provider, useContext] as const;

packages/ui/modal/src/Modal.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ interface ModalContextType {
2525
trapFocus: boolean;
2626
}
2727

28-
const [ModalProvider, useModalContext] = createContext<ModalContextType>();
28+
const [ModalProvider, useModalContext] = createContext<ModalContextType>("Modal");
2929

3030
const getState = (open: boolean) => {
3131
return open ? "open" : "closed";
@@ -80,7 +80,7 @@ interface ModalTriggerProps extends React.ComponentPropsWithoutRef<"button"> {
8080

8181
const ModalTrigger = React.forwardRef<HTMLButtonElement, ModalTriggerProps>((props, forwardedRef) => {
8282
const { asChild, ...triggerProps } = props;
83-
const context = useModalContext();
83+
const context = useModalContext("ModalTrigger");
8484
const triggerRef = useComposedRef(forwardedRef, context.triggerRef);
8585
const Component = asChild ? Slot : "button";
8686

@@ -104,7 +104,7 @@ interface ModalContentProps extends React.ComponentPropsWithoutRef<"div"> {}
104104

105105
const ModalContentInner = React.forwardRef<HTMLDivElement, ModalContentProps>((props, forwardedRef) => {
106106
const { autoFocus = true, ...contentProps } = props;
107-
const context = useModalContext();
107+
const context = useModalContext("ModalContentInner");
108108

109109
const [focusContainer, setFocusContainer] = React.useState<HTMLElement | null>();
110110
const previousFocus = React.useRef<HTMLElement | null>(null);
@@ -155,7 +155,7 @@ const ModalContentInner = React.forwardRef<HTMLDivElement, ModalContentProps>((p
155155
ModalContentInner.displayName = "ModalContentInner";
156156

157157
const ModalContent = React.forwardRef<HTMLDivElement, ModalContentProps>(({ ...contentProps }, forwardedRef) => {
158-
const context = useModalContext();
158+
const context = useModalContext("ModalContent");
159159

160160
return context.modal ? (
161161
<ModalPortal>
@@ -173,7 +173,7 @@ ModalContent.displayName = "ModalContent";
173173
interface ModalPortalProps extends React.ComponentPropsWithoutRef<"div"> {}
174174

175175
const ModalPortal = ({ children, ...portalProps }: ModalPortalProps) => {
176-
const context = useModalContext();
176+
const context = useModalContext("ModalPortal");
177177

178178
return React.Children.map(children, (child) => (
179179
<Presence present={context.open}>
@@ -187,7 +187,7 @@ ModalPortal.displayName = "ModalPortal";
187187
interface ModalOverlayInnerProps extends React.ComponentPropsWithoutRef<"div"> {}
188188

189189
const ModalOverlayInner = React.forwardRef<HTMLDivElement, ModalOverlayInnerProps>(({ ...overlayProps }, forwardedRef) => {
190-
const context = useModalContext();
190+
const context = useModalContext("ModalOverlayInner");
191191

192192
return (
193193
<RemoveScroll as={Slot} allowPinchZoom shards={[context.contentRef]}>
@@ -208,7 +208,7 @@ ModalOverlayInner.displayName = "ModalOverlayInner";
208208
interface ModalOverlayProps extends React.ComponentPropsWithoutRef<"div"> {}
209209

210210
const ModalOverlay = React.forwardRef<HTMLDivElement, ModalOverlayProps>(({ ...overlayProps }, forwardedRef) => {
211-
const context = useModalContext();
211+
const context = useModalContext("ModalOverlay");
212212
return context.modal ? (
213213
<Presence present={context.open}>
214214
<ModalOverlayInner {...overlayProps} ref={forwardedRef} />

0 commit comments

Comments
 (0)