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