1import { InfoPlist } from '@expo/config-plugins'; 2import { createInfoPlistPluginWithPropertyGuard } from '@expo/config-plugins/build/plugins/ios-plugins'; 3import { ExpoConfig } from '@expo/config-types'; 4 5export const withIosUserInterfaceStyle = createInfoPlistPluginWithPropertyGuard( 6 setUserInterfaceStyle, 7 { 8 infoPlistProperty: 'UIUserInterfaceStyle', 9 expoConfigProperty: 'userInterfaceStyle | ios.userInterfaceStyle', 10 expoPropertyGetter: getUserInterfaceStyle, 11 }, 12 'withIosUserInterfaceStyle' 13); 14 15export function getUserInterfaceStyle( 16 config: Pick<ExpoConfig, 'ios' | 'userInterfaceStyle'> 17): string { 18 return config.ios?.userInterfaceStyle ?? config.userInterfaceStyle ?? 'light'; 19} 20 21export function setUserInterfaceStyle( 22 config: Pick<ExpoConfig, 'ios' | 'userInterfaceStyle'>, 23 { UIUserInterfaceStyle, ...infoPlist }: InfoPlist 24): InfoPlist { 25 const userInterfaceStyle = getUserInterfaceStyle(config); 26 const style = mapUserInterfaceStyleForInfoPlist(userInterfaceStyle); 27 28 if (!style) { 29 return infoPlist; 30 } 31 32 return { 33 ...infoPlist, 34 UIUserInterfaceStyle: style, 35 }; 36} 37 38function mapUserInterfaceStyleForInfoPlist( 39 userInterfaceStyle: string 40): NonNullable<InfoPlist['UIUserInterfaceStyle']> | null { 41 switch (userInterfaceStyle) { 42 case 'light': 43 return 'Light'; 44 case 'dark': 45 return 'Dark'; 46 case 'automatic': 47 return 'Automatic'; 48 } 49 50 return null; 51} 52