@config-plugins/react-native-siri-shortcut
Version:
Config plugin for react-native-siri-shortcut package
112 lines (100 loc) • 3.24 kB
text/typescript
import {
mergeContents,
MergeResults,
} from "@expo/config-plugins/build/utils/generateCode";
import {
type ConfigPlugin,
createRunOncePlugin,
withAppDelegate,
withInfoPlist,
withEntitlementsPlist,
} from "expo/config-plugins";
/**
* Apply react-native-siri-shortcut configuration for Expo SDK 44 projects.
*/
const withReactNativeSiriShortcut: ConfigPlugin<void | string[]> = (
config,
activityTypes,
) => {
withSiriShortcutAppDelegate(config);
withSiriEntitlements(config);
const items = activityTypes || [];
if (!Array.isArray(items) || !items.length) {
return config;
}
withInfoPlist(config, (config) => {
config.modResults.NSUserActivityTypes = items;
return config;
});
return config;
};
export function addSiriShortcutAppDelegateImport(src: string): MergeResults {
return mergeContents({
tag: "react-native-siri-shortcut",
src,
newSrc: "#import <RNSiriShortcuts/RNSiriShortcuts.h>",
anchor: /#import "AppDelegate\.h"/,
offset: 1,
comment: "//",
});
}
export function addSiriShortcutAppDelegateInit(src: string): MergeResults {
return mergeContents({
tag: "react-native-siri-shortcut-delegate",
src,
newSrc:
" [RNSSSiriShortcuts application:application continueUserActivity:userActivity restorationHandler:restorationHandler];",
anchor:
/ return \[super application:application continueUserActivity:userActivity restorationHandler:restorationHandler\] \|\| result;/,
offset: -1,
comment: "//",
});
}
/** Append the siri entitlement on iOS */
const withSiriEntitlements: ConfigPlugin = (config) => {
return withEntitlementsPlist(config, (config) => {
config.modResults["com.apple.developer.siri"] = true;
return config;
});
};
const withSiriShortcutAppDelegate: ConfigPlugin = (config) => {
return withAppDelegate(config, (config) => {
if (["objc", "objcpp"].includes(config.modResults.language)) {
try {
config.modResults.contents = addSiriShortcutAppDelegateImport(
config.modResults.contents,
).contents;
config.modResults.contents = addSiriShortcutAppDelegateInit(
config.modResults.contents,
).contents;
} catch (error: any) {
if (error.code === "ERR_NO_MATCH") {
throw new Error(
`Cannot add Siri Shortcut to the project's AppDelegate because it's malformed. Please report this with a copy of your project AppDelegate.`,
);
}
throw error;
}
} else {
throw new Error(
"Cannot setup Siri Shortcut because the AppDelegate is not Objective C",
);
}
return config;
});
};
const pkg = {
// Prevent this plugin from being run more than once.
// This pattern enables users to safely migrate off of this
// out-of-tree `@config-plugins/react-native-siri-shortcut` to a future
// upstream plugin in `react-native-siri-shortcut`
name: "react-native-siri-shortcut",
// Indicates that this plugin is dangerously linked to a module,
// and might not work with the latest version of that module.
version: "UNVERSIONED",
};
export default createRunOncePlugin(
withReactNativeSiriShortcut,
pkg.name,
pkg.version,
);