- 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>
170 lines
4.3 KiB
TypeScript
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;
|