validateScreenOptions.js 1.6 KB


const deprecatedKeys = ['tabBar'];

/**
 * Make sure screen options returned by the `getScreenOption`
 * are valid
 */


export default ((screenOptions, route) => {
  const keys = Object.keys(screenOptions);

  const deprecatedKey = keys.find(key => deprecatedKeys.includes(key));

  if (typeof screenOptions.title === 'function') {
    throw new Error([`\`title\` cannot be defined as a function in navigation options for \`${route.routeName}\` screen. \n`, 'Try replacing the following:', '{', '    title: ({ state }) => state...', '}', '', 'with:', '({ navigation }) => ({', '    title: navigation.state...', '})'].join('\n'));
  }

  if (deprecatedKey && typeof screenOptions[deprecatedKey] === 'function') {
    throw new Error([`\`${deprecatedKey}\` cannot be defined as a function in navigation options for \`${route.routeName}\` screen. \n`, 'Try replacing the following:', '{', `    ${deprecatedKey}: ({ state }) => ({`, '         key: state...', '    })', '}', '', 'with:', '({ navigation }) => ({', `    ${deprecatedKey}Key: navigation.state...`, '})'].join('\n'));
  }

  if (deprecatedKey && typeof screenOptions[deprecatedKey] === 'object') {
    throw new Error([`Invalid key \`${deprecatedKey}\` defined in navigation options for \`${route.routeName}\` screen.`, '\n', 'Try replacing the following navigation options:', '{', `    ${deprecatedKey}: {`, ...Object.keys(screenOptions[deprecatedKey]).map(key => `        ${key}: ...,`), '    },', '}', '\n', 'with:', '{', ...Object.keys(screenOptions[deprecatedKey]).map(key => `    ${deprecatedKey + key[0].toUpperCase() + key.slice(1)}: ...,`), '}'].join('\n'));
  }
});