expo-splash-screen
Version:
Provides a module to allow keeping the native Splash Screen visible until you choose to hide it.
124 lines (110 loc) • 3.04 kB
text/typescript
import { ConfigPlugin, IOSConfig, withDangerousMod } from 'expo/config-plugins';
import fs from 'fs';
import path from 'path';
import { parseColor } from './InterfaceBuilder';
import { IOSSplashConfig } from './types';
export const SPLASHSCREEN_COLORSET_PATH = 'Images.xcassets/SplashScreenBackground.colorset';
const darkAppearances = [{ appearance: 'luminosity', value: 'dark' }] as const;
interface ContentsJsonColor {
appearances?: typeof darkAppearances;
idiom: 'universal';
color: {
'color-space': 'srgb';
components: {
alpha: string;
blue: string;
green: string;
red: string;
};
};
}
export const withIosSplashColors: ConfigPlugin<IOSSplashConfig> = (config, splash) => {
return withDangerousMod(config, [
'ios',
async (config) => {
const iosNamedProjectRoot = IOSConfig.Paths.getSourceRoot(config.modRequest.projectRoot);
await configureColorAssets({
iosNamedProjectRoot,
backgroundColor: splash.backgroundColor,
darkBackgroundColor: splash.dark?.backgroundColor,
});
return config;
},
]);
};
async function configureColorAssets({
iosNamedProjectRoot,
backgroundColor = '#ffffff',
darkBackgroundColor,
}: {
iosNamedProjectRoot: string;
backgroundColor: string;
darkBackgroundColor: string | undefined;
}) {
const colorsetPath = path.resolve(iosNamedProjectRoot, SPLASHSCREEN_COLORSET_PATH);
// ensure old SplashScreen colorSet is removed
await fs.promises.rm(colorsetPath, { force: true, recursive: true });
await writeColorsContentsJsonFileAsync({
assetPath: colorsetPath,
backgroundColor,
darkBackgroundColor,
});
}
async function writeColorsContentsJsonFileAsync({
assetPath,
backgroundColor,
darkBackgroundColor,
}: {
assetPath: string;
backgroundColor: string;
darkBackgroundColor: string | undefined;
}) {
const color = parseColor(backgroundColor);
const darkColor = darkBackgroundColor ? parseColor(darkBackgroundColor) : undefined;
const colors: ContentsJsonColor[] = [
{
color: {
components: {
alpha: '1.000',
blue: color.rgb.blue,
green: color.rgb.green,
red: color.rgb.red,
},
'color-space': 'srgb',
},
idiom: 'universal',
},
];
if (darkColor) {
colors.push({
color: {
components: {
alpha: '1.000',
blue: darkColor.rgb.blue,
green: darkColor.rgb.green,
red: darkColor.rgb.red,
},
'color-space': 'srgb',
},
idiom: 'universal',
appearances: darkAppearances,
});
}
await fs.promises.mkdir(assetPath, { recursive: true });
await fs.promises.writeFile(
path.join(assetPath, 'Contents.json'),
JSON.stringify(
{
colors,
info: {
version: 1,
// common practice is for the tool that generated the icons to be the "author"
author: 'expo',
},
},
null,
2
),
'utf8'
);
}