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