项目文件夹

文件
wehub-resource-sync 98e40dac97
CLI Smoke Test / smoke-test-linux (20) (push) Has been cancelled
CLI Smoke Test / smoke-test-linux (24) (push) Has been cancelled
CLI Smoke Test / smoke-test-windows (20) (push) Has been cancelled
CLI Smoke Test / smoke-test-windows (24) (push) Has been cancelled
Expo App TypeScript typecheck / typecheck (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:40:49 +08:00

87 行
3.3 KiB
TypeScript

import { Dimensions, Platform } from 'react-native';
import { useWindowDimensions } from 'react-native';
import { useMemo } from 'react';
import { calculateDeviceDimensions, determineDeviceType, calculateHeaderHeight } from './deviceCalculations';
import { isRunningOnMac } from './platform';
// Re-export calculation functions for use in other components
export { calculateDeviceDimensions, determineDeviceType, calculateHeaderHeight };
// Get header height based on platform, device type, and orientation (wrapper for backward compatibility)
export function getHeaderHeight(isLandscape: boolean, deviceType: 'phone' | 'tablet'): number {
return calculateHeaderHeight({
platform: Platform.OS,
isLandscape,
// @ts-ignore - isPad is not in the type definitions but exists at runtime on iOS
isPad: Platform.OS === 'ios' ? Platform.isPad : undefined,
deviceType: Platform.OS === 'android' ? deviceType : undefined,
isMacCatalyst: isRunningOnMac()
});
}
// Device type detection based on screen size and aspect ratio
export function getDeviceType(): 'phone' | 'tablet' {
const { width, height } = Dimensions.get('screen');
const dimensions = calculateDeviceDimensions({
widthPoints: width,
heightPoints: height,
pointsPerInch: Platform.OS === 'ios' ? 163 : 160
});
return determineDeviceType({
diagonalInches: dimensions.diagonalInches,
platform: Platform.OS,
// @ts-ignore - isPad is not in the type definitions but exists at runtime on iOS
isPad: Platform.OS === 'ios' ? Platform.isPad : false
});
}
// Hook to get device type (reactive to dimension changes)
export function useDeviceType(): 'phone' | 'tablet' {
const { width, height } = useWindowDimensions();
return useMemo(() => {
const dimensions = calculateDeviceDimensions({
widthPoints: width,
heightPoints: height,
pointsPerInch: Platform.OS === 'ios' ? 163 : 160
});
return determineDeviceType({
diagonalInches: dimensions.diagonalInches,
platform: Platform.OS,
// @ts-ignore - isPad is not in the type definitions but exists at runtime on iOS
isPad: Platform.OS === 'ios' ? Platform.isPad : false
});
}, [width, height]);
}
// Hook to detect if device is tablet
export function useIsTablet(): boolean {
const deviceType = useDeviceType();
return deviceType === 'tablet';
}
// Hook to detect landscape orientation
export function useIsLandscape(): boolean {
const { width, height } = useWindowDimensions();
return width > height;
}
// Hook to get header height based on platform, device type, and orientation
export function useHeaderHeight(): number {
const isLandscape = useIsLandscape();
const deviceType = useDeviceType();
return useMemo(() => {
return calculateHeaderHeight({
platform: Platform.OS,
isLandscape,
// @ts-ignore - isPad is not in the type definitions but exists at runtime on iOS
isPad: Platform.OS === 'ios' ? Platform.isPad : undefined,
deviceType: Platform.OS === 'android' ? deviceType : undefined,
isMacCatalyst: isRunningOnMac()
});
}, [isLandscape, deviceType]);
}