singular-labs / react-native-sdk

MIT License
5 stars 6 forks source link

`expo-config-plugin` ? #56

Closed xseignard closed 1 year ago

xseignard commented 1 year ago

Hello, Regarding he installation docs: https://support.singular.net/hc/en-us/articles/360038415852 There's extra few steps that prevent the lib to be used on a expo managed workflow

One great addition to this lib would be to provide an expo-config-plugin see the common mods here

xseignard commented 1 year ago

should look like something like (on andorid) this according to https://support.singular.net/hc/en-us/articles/360038415852

import { AndroidConfig, ConfigPlugin, withProjectBuildGradle } from '@expo/config-plugins';

// see: https://support.singular.net/hc/en-us/articles/360038415852

const withSingularPermissions: ConfigPlugin = (config) => {
  return AndroidConfig.Permissions.withPermissions(config, [
    'android.permission.INTERNET',
    'android.permission.ACCESS_NETWORK_STATE',
    'com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE',
    'com.android.vending.CHECK_LICENSE',
    'com.google.android.gms.permission.AD_ID',
  ]);
};

const withSingularProjectBuildGradle: ConfigPlugin = (config) => {
  return withProjectBuildGradle(config, async (config) => {
    const singularMaven = "maven { url 'https://maven.singular.net/' }";
    if (!config.modResults.contents.includes(singularMaven)) {
      const anchor = `allprojects {\n    repositories {`;
      config.modResults.contents = config.modResults.contents.replace(
        `${anchor}`,
        `${anchor}\n        ${singularMaven}`,
      );
    }
    return config;
  });
};

const withSingularSetup: ConfigPlugin = (config) => {
  config = withSingularPermissions(config);
  config = withSingularProjectBuildGradle(config);

  return config;
};

export default withSingularSetup;
billinghamj commented 1 year ago

We also need something like this, as we do not have direct access to the iOS/Android projects

porter77 commented 1 year ago

We had to slightly tweak this to use a regex to match the repositories block in the gradle file:

const { AndroidConfig, withProjectBuildGradle } = require('@expo/config-plugins');

const withSingularPermissions = (config) => {
  return AndroidConfig.Permissions.withPermissions(config, [
    'android.permission.INTERNET',
    'android.permission.ACCESS_NETWORK_STATE',
    'com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE',
    'com.android.vending.CHECK_LICENSE',
    'com.google.android.gms.permission.AD_ID',
  ]);
};

const withSingularProjectBuildGradle = (config) => {
  return withProjectBuildGradle(config, async (config) => {
    config.modResults.contents = config.modResults.contents.replace(
      /allprojects {(?:.|\n)*repositories {/m,
      str => `${str}\n        maven { url 'https://maven.singular.net/' }`
    )

    return config;
  });
};

module.exports = (config) => {
  config = withSingularPermissions(config);
  config = withSingularProjectBuildGradle(config);

  return config;
};
xseignard commented 1 year ago

hello @shefdanny @jzviaginSingular (as last committers on this repo)

any ETA? any thoughts? 🤷

shefdanny commented 1 year ago

@xseignard added support in latest release 3.1.18 Thank you for your input.

xseignard commented 1 year ago

Thanks @shefdanny, eager to test and drop my custom plugin!