zioinfo-mail/app/node_modules/react-native-safe-area-context/src/SafeAreaContext.tsx
DESKTOP-TKLFCPR\ython 11c670f2a0 refactor: 101.79.17.164 → zioinfo.co.kr 전체 도메인 변환 + Manager UI 배포
- 37개 파일 IP → zioinfo.co.kr 치환 (소스/매뉴얼/설정/하네스)
- Manager DrConsole/NetworkConsole/CsapConsole 빌드 + /var/www/manager/ 배포
- 테스트: Manager HTTP 200, ITSM 신규 API 7개 전체 200

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 10:09:17 +09:00

170 lines
4.3 KiB
TypeScript

import * as React from 'react';
import { Dimensions, StyleSheet, type ViewProps } from 'react-native';
import { NativeSafeAreaProvider } from './NativeSafeAreaProvider';
import type {
EdgeInsets,
InsetChangedEvent,
Metrics,
Rect,
} from './SafeArea.types';
const isDev = process.env.NODE_ENV !== 'production';
export const SafeAreaInsetsContext = React.createContext<EdgeInsets | null>(
null,
);
if (isDev) {
SafeAreaInsetsContext.displayName = 'SafeAreaInsetsContext';
}
export const SafeAreaFrameContext = React.createContext<Rect | null>(null);
if (isDev) {
SafeAreaFrameContext.displayName = 'SafeAreaFrameContext';
}
export interface SafeAreaProviderProps extends ViewProps {
children?: React.ReactNode;
initialMetrics?: Metrics | null;
/**
* @deprecated
*/
initialSafeAreaInsets?: EdgeInsets | null;
}
export function SafeAreaProvider({
children,
initialMetrics,
initialSafeAreaInsets,
style,
...others
}: SafeAreaProviderProps) {
const parentInsets = useParentSafeAreaInsets();
const parentFrame = useParentSafeAreaFrame();
const [insets, setInsets] = React.useState<EdgeInsets | null>(
initialMetrics?.insets ?? initialSafeAreaInsets ?? parentInsets ?? null,
);
const [frame, setFrame] = React.useState<Rect>(
initialMetrics?.frame ??
parentFrame ?? {
// Backwards compat so we render anyway if we don't have frame.
x: 0,
y: 0,
width: Dimensions.get('window').width,
height: Dimensions.get('window').height,
},
);
const onInsetsChange = React.useCallback((event: InsetChangedEvent) => {
const {
nativeEvent: { frame: nextFrame, insets: nextInsets },
} = event;
setFrame((curFrame) => {
if (
// Backwards compat with old native code that won't send frame.
nextFrame &&
(nextFrame.height !== curFrame.height ||
nextFrame.width !== curFrame.width ||
nextFrame.x !== curFrame.x ||
nextFrame.y !== curFrame.y)
) {
return nextFrame;
} else {
return curFrame;
}
});
setInsets((curInsets) => {
if (
!curInsets ||
nextInsets.bottom !== curInsets.bottom ||
nextInsets.left !== curInsets.left ||
nextInsets.right !== curInsets.right ||
nextInsets.top !== curInsets.top
) {
return nextInsets;
} else {
return curInsets;
}
});
}, []);
return (
<NativeSafeAreaProvider
style={[styles.fill, style]}
onInsetsChange={onInsetsChange}
{...others}
>
{insets != null ? (
<SafeAreaFrameContext.Provider value={frame}>
<SafeAreaInsetsContext.Provider value={insets}>
{children}
</SafeAreaInsetsContext.Provider>
</SafeAreaFrameContext.Provider>
) : null}
</NativeSafeAreaProvider>
);
}
const styles = StyleSheet.create({
fill: { flex: 1 },
});
function useParentSafeAreaInsets(): EdgeInsets | null {
return React.useContext(SafeAreaInsetsContext);
}
function useParentSafeAreaFrame(): Rect | null {
return React.useContext(SafeAreaFrameContext);
}
const NO_INSETS_ERROR =
'No safe area value available. Make sure you are rendering `<SafeAreaProvider>` at the top of your app.';
export function useSafeAreaInsets(): EdgeInsets {
const insets = React.useContext(SafeAreaInsetsContext);
if (insets == null) {
throw new Error(NO_INSETS_ERROR);
}
return insets;
}
export function useSafeAreaFrame(): Rect {
const frame = React.useContext(SafeAreaFrameContext);
if (frame == null) {
throw new Error(NO_INSETS_ERROR);
}
return frame;
}
export type WithSafeAreaInsetsProps = {
insets: EdgeInsets;
};
export function withSafeAreaInsets<T>(
WrappedComponent: React.ComponentType<T & WithSafeAreaInsetsProps>,
): React.ForwardRefExoticComponent<
React.PropsWithoutRef<T> & React.RefAttributes<unknown>
> {
return React.forwardRef((props: T, ref: React.Ref<unknown>) => {
const insets = useSafeAreaInsets();
return <WrappedComponent {...props} insets={insets} ref={ref} />;
});
}
/**
* @deprecated
*/
export function useSafeArea(): EdgeInsets {
return useSafeAreaInsets();
}
/**
* @deprecated
*/
export const SafeAreaConsumer = SafeAreaInsetsContext.Consumer;
/**
* @deprecated
*/
export const SafeAreaContext = SafeAreaInsetsContext;