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