Coder Social home page Coder Social logo

react-native-paypal's Introduction

react-native-paypal

A Cross platform React Native interface for the PayPal Payment UI. Supports both iOS and Android currently, but can be used seperately.

Demo of a Payment using PayPal

Usage

--

Initiating a payment is as simple as creating a single promise

let PayPal = require('react-native-paypal');
PayPal.paymentRequest({
  clientId: 'AbyfNDFV53djg6w4yYgiug_JaDfBSUiYI7o6NM9HE1CQ_qk9XxbUX0nwcPXXQHaNAWYtDfphQtWB3q4R',
  environment: PayPalAndroid.SANDBOX,
  price: '42.00',
  currency: 'USD',
  description: 'PayPal Test'
}).then((confirm, payment) => console.log('Paid'); /* At this point you should verify payment independently */)
.catch((error_code) => console.error('Failed to pay through PayPal'));

Callback parameters:

If all goes OK with the payment than the paymentRequest promise is resolved with the following arguments as JSON strings:

  • A confirm:
{
  "client": {
    "environment": "mock",
    "paypal_sdk_version": "2.12.4",
    "platform": "Android",
    "product_name": "PayPal-Android-SDK"
  },
  "response": {
    "create_time": "2014-02-12T22:29:49Z",
    "id": "PAY-6RV70583SB702805EKEYSZ6Y",
    "intent": "sale",
    "state": "approved"
  },
  "response_type": "payment"
}
  • A payment:
{
  "amount": "1.00",
  "currency_code": "USD",
  "short_description": "PayPal Test",
  "intent": "sale"
}

Handling callbacks:

PayPal.paymentRequest(...).then(function (payment, confirm) {
  sendPaymentToConfirmInServer(payment, confirm);
})

If anything fails the promise will be notify an error with a code which will be one of:

  • USER_CANCELLED
  • INVALID_CONFIG

Handling failures:

PayPal.paymentRequest(...).catch(function (error_code) {
    if (error_code == PayPal.USER_CANCELLED) {
        // User didn't complete the payment
    } else if (error_code == PayPal.INVALID_CONFIG) {
        // Invalid config was sent to PayPal
    }
})

Setup

Android

  1. Add react-navive-paypal to your project
npm install --save react-native-paypal
  1. Add the following to android/app/build.gradle
dependencies {
    // ...
    compile project(':react-native-paypal')
}
  1. Add the following to android/settings.gradle
include ':react-native-paypal'
project(':react-native-paypal').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-paypal/android')
  1. Edit android/src/.../MainActivity.java
// ...
import br.com.vizir.rn.paypal.PayPalPackage; // <--
import br.com.vizir.rn.paypal.PayPal; // <--
import android.content.Intent; // <--

public class MainActivity extends Activity implements DefaultHardwareBackBtnHandler {
    // ...
    private static final int PAY_PAL_REQUEST_ID = 9; // <-- Can be any unique number
    private PayPalPackage payPalPackage; // <--

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...
        payPalPackage = new PayPalPackage(this, PAY_PAL_REQUEST_ID); // <--

        mReactInstanceManager = ReactInstanceManager.builder()
                .setApplication(getApplication())
                .setBundleAssetName("index.android.bundle")
                .setJSMainModuleName("index.android")
                .addPackage(new MainReactPackage())
                // ...
                .addPackage(payPalPackage) // <--
                .setUseDeveloperSupport(BuildConfig.DEBUG)
                .setInitialLifecycleState(LifecycleState.RESUMED)
                .build();
        // ...
    }

    // ...

    @Override
    public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
       super.onActivityResult(requestCode, resultCode, data);
       if (requestCode == PAY_PAL_REQUEST_ID) {
           payPalPackage.handleActivityResult(requestCode, resultCode, data); // <--
       } else {
           otherModulesHandlers(requestCode, resultCode, data);
       }
    }
}

iOS

Sample App

You'll find an iOS example in <root>/ios/Example/. You will need to run npm install in that directory in order to download the dependencies required by the sample application. Note this sample still uses manual NativeModule usage, and you'll likely find the above Javascript simpler than the JS used in this sample.

Installation

Currently you have to install via npm from GitHub (or change the version specifier in package.json to MattFoley/react-native-paypal):

npm install --save MattFoley/react-native-paypal

There will be an updated npm release shortly, which will allow

Install the PayPal-iOS-SDK

You then have to install the PayPal-iOS-SDK into node_modules/react-native-paypal/ios/lib/Paypal

Here's a one-liner to download and unpack version 2.13.0:

mkdir -p node_modules/react-native-paypal/ios/lib/Paypal && curl -L --progress https://github.com/paypal/PayPal-iOS-SDK/archive/2.13.0.tar.gz | tar -xz - -C node_modules/react-native-paypal/ios/lib/Paypal --strip-components=1

Include PayPal as normally, following their directions. Their integration steps and iOS SDK can be found here. After doing that, also drag MFLReactNativePayPal.h and MFLReactNativePayPal.m into your project.

Add MFLReactNativePayPal.xcodeproj

Add node_modules/react-native-paypal/ios/MFLReactNativePayPal.xcodeproj to the Libraries group in iOS and link libMFLReactNativePayPal.a as described in Step 2 of the React Native Manual Linking docs.

Follow steps 4 and 5 of the PayPal instalation instructions, as well as the additional steps here. This has to be done for the main app, not for the library you included.

Manual Usage (iOS Only)

You can access the NativeModule directly on iOS using the following instructions, if you'd like to modify the functionality.

###Initialization:

 import {
   NativeModules
 } from 'react-native';
 let MFLReactNativePayPal = NativeModules.MFLReactNativePayPal;
 MFLReactNativePayPal.initializePaypalEnvironment(<environment>, "<Your client id>");

#####Environment Values that should be used here are declared in MFLReactNativePayPal.h

 • Sandbox = 0
 • Production = 1
 • No Network = 2

###Prepare a Payment:

 MFLReactNativePayPal.preparePaymentOfAmount(<Amount as a Float>, <Currency Code>, <Short description>);
 ie: MFLReactNativePayPal.preparePaymentOfAmount(100.00, "USD", "Bacon");

###Prepare Configuration:

 MFLReactNativePayPal.prepareConfigurationForMerchant(<Merchant Name>, <BOOL should accept credit cards>, <User email>);
 MFLReactNativePayPal.prepareConfigurationForMerchant("Bacon Truck", true, "[email protected]");

###Present the payment flow with a completion handler:

 MFLReactNativePayPal.presentPaymentViewControllerForPreparedPurchase((error, payload) => {
    if (error) {
      //Handle Error
      return;
    } else {

     console.log("payload: " + payload);
     if (payload.status == 1) {
        console.log(payload.confirmation);
     } else {
        console.log("User cancelled payment");
     }
    }
 });

TODO:

 * [ ] Android Sample App
 * [ ] Refactor & cleanup
 * [ ] Automated tests
 * [ ] Future payment (subscriptions)
 * [ ] Invoice and optional fields - https://github.com/MattFoley/react-native-paypal/issues/6

Thanks

The Android portion of this library was originally built by https://github.com/Vizir for https://github.com/Vizir/react-native-paypal. The merging of the API in order to provide cross platform support was done almost entirely by https://github.com/amiuhle.

react-native-paypal's People

Contributors

amiuhle avatar cartolari avatar erenn16 avatar greghe avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

react-native-paypal's Issues

Adding invoice number and other optional Fields

i needed to add invoice number which is an optional field according
https://github.com/paypal/PayPal-iOS-SDK/blob/master/docs/single_payment.md
section 5 and its also found here in the PayPalPayment.h
https://github.com/paypal/PayPal-iOS-SDK/blob/master/PayPalMobile/PayPalPayment.h

currently under this implementation optional fields are not supported but i was able to add invoice number by doing the following to our MFLReactNativePayPal.m; i basically added a parameter of invoiceNumber of type string and set it to the payment object; here goes the code ;
on another note i also made the amount double because of error with digits with CGFloat Type

`RCT_EXPORT_METHOD(preparePaymentOfAmount:(double)amount
ofCurrency:(NSString *)currencyCode
withDescription:(NSString *)description
withInvoiceNumber:(NSString *) invoicenumber)
{
self.payment = [[PayPalPayment alloc] init];
[self.payment setAmount:[[NSDecimalNumber alloc] initWithDouble:amount]];
[self.payment setCurrencyCode:currencyCode];
[self.payment setShortDescription:description];
[self.payment setInvoiceNumber:invoicenumber];

}`

iOs installation instructions

Hi,
I tried installing on iOs using the instructions but I got lots of duplicate symbols and couldn't build. what I did:

  • npm install --save MattFoley/react-native-paypal
  • mkdir -p node_modules/react-native-paypal/ios/lib/Paypal && curl -L --progress https://github.com/paypal/PayPal-iOS-SDK/archive/2.13.0.tar.gz | tar -xz - -C node_modules/react-native-paypal/ios/lib/Paypal --strip-components=1
  • added PayPalMobile folder like they explain in the PayPal iOs SDK (This is what I found problematic, as it also exists in the MFLReactNativePayPal.xcodeproj which is added next
  • added MFLReactNativePayPal.h and MFLReactNativePayPal.m to project
  • build settings fit the ones in the above page..
  • added libs to build phases
  • add MFLReactNativePayPal.xcodeproj and add link the .a file
  • updated info.plist like in the PalPal iOs SDK readme

To fix this I've done it differently:

  • Downloaded this repo.
  • added PayPalMobile folder and CardIO folder (not the entire MFLReactNativePayPal.xcodeproj)
  • added MFLReactNativePayPal.h and MFLReactNativePayPal.m to project
  • added $(SRCROOT)/../node_modules/react-native-paypal recursive to header search paths
  • added $(SRCROOT)/../node_modules/react-native-paypal and $(SRCROOT)/Libraries/ recursive to library search paths

Now it actually works. The only problem is that the app works only when launching it from Xcode.
When trying to launch using react-native run-ios it opens and exits the app immediately.
Am I the only one?
Did I follow the instructions right?

Thanks!

Update to React Native 0.29, Null pointer exception (Android)

I have recently updated the react native 0.27 to 0.29. Then moved package initialization to the application class from activity class , as we have to do this to support 0.29 (Android) that was the only change i did. After updating the RN, it will give null point exception

                                                                  java.lang.NullPointerException
                                                                      at android.content.ComponentName.<init>(ComponentName.java:77)
                                                                      at android.content.Intent.<init>(Intent.java:3957)
                                                                      at br.com.vizir.rn.paypal.PayPal.startPayPalService(PayPal.java:93)
                                                                      at br.com.vizir.rn.paypal.PayPal.paymentRequest(PayPal.java:78)
                                                                      at java.lang.reflect.Method.invokeNative(Native Method)
                                                                      at java.lang.reflect.Method.invoke(Method.java:515)
                                                                      at com.facebook.react.bridge.BaseJavaModule$JavaMethod.invoke(BaseJavaModule.java:319)
                                                                      at com.facebook.react.bridge.NativeModuleRegistry$ModuleDefinition.call(NativeModuleRegistry.java:187)
                                                                      at com.facebook.react.bridge.NativeModuleRegistry.call(NativeModuleRegistry.java:62)
                                                                      at com.facebook.react.bridge.CatalystInstanceImpl$NativeModulesReactCallback.call(CatalystInstanceImpl.java:432)
                                                                      at com.facebook.react.bridge.queue.NativeRunnableDeprecated.run(Native Method)
                                                                      at android.os.Handler.handleCallback(Handler.java:733)
                                                                      at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                      at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:31)
                                                                      at android.os.Looper.loop(Looper.java:136)
                                                                      at com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run(MessageQueueThreadImpl.java:193)
                                                                      at java.lang.Thread.run(Thread.java:841)

Is this not supporting the 0.29 or i am doing something wrong?

Unable to install the repository

I am trying to install using this command
npm install --save MattFoley/react-native-paypal
screen shot 2017-05-09 at 6 21 05 pm

Hope someone can help me in this. Thanks

Publish version to 0.0.4

Can you please publish 0.0.4 ?
I need the change made in bcc078b but I can't get it because the version remained he same.
Thanks.

I have developed code for PayPalPre-approval(Future Payment), but giving error

var PayPalFuture =require('react-native').NativeModules.PayPalFuture;

PayPalFuture.futurePaymentRequest({
clientId: 'valid client id',
environment: PayPalFuture.SANDBOX,
merchantName:"Customer1",
merchantPrivacyPolicyUri:"https://www.google.com/",
merchantUserAgreementUri:"https://www.google.com/"

},{null},{null}).then(function (authcode)

Could you please help me to resolve this issue, please find the attached screenshot.

image
image

Is the library still valid?

Hi,

I'm testing this library since I think it's the only one for both Android and iOS.

I was wondering if it is fully operational because I see that the last commit goes back to last year.

On Android it seems to works well.
On iOS i can't get it right, build it in xcode returns a error (RCTBridge.h not found)

I probably missed something in integration.

Problem with PayPal, not credit cards

It accepts pays via credit cards like a charm, but payments via PayPal aways result in this error message; "There was a problem setting up this payment. Please visit the PayPal website to check your account."

The account is fine. We verified the error several times with other PayPal accounts. Any ideas on the cause?

Thanks for your component.

integration throws error in android

hai when i am using react-native-papal, While integrating it in android it throws some errors like this in android. Below is the screen Shot for it
screen shot 2016-11-24 at 4 16 39 pm
please give me suggestions that how to resolve it

undefined is not an object

simulator screen shot jan 17 2560 be 12 12 01 am

node -v
v7.4.0

react-native -v
react-native-cli: 1.0.0
react-native: 0.35.0

Please help !
I stuck with this, I have spend almost two days to solve this

paypal crashes in ios 10.0.2

when i check the paypal in ios version:9.3.4 it works fine but when i check it in ios 10.0.2 paypal is getting crash please give me suggestion that how to resolve it

ClientId is being hijacked

@MattFoley

dispatch_async(dispatch_get_main_queue(),^{ 
    NSString *envString = [self  stringFromEnvironmentEnum:environment];

    [PayPalMobile initializeWithClientIdsForEnvironments:@{envString : clientId}];
    [PayPalMobile preconnectWithEnvironment:envString];
  });

the above code is hijacking clientId and setting it to another cleint id; its being run when the application is started but couldnt find where it is getting this value .

The suggested method is rather than hooking it up here
inside AppDelegete.m the link is below as well the code snippet
https://github.com/paypal/PayPal-iOS-SDK/blob/master/docs/single_payment.md

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  // ...
  [PayPalMobile initializeWithClientIdsForEnvironments:@{PayPalEnvironmentProduction : @"YOUR_CLIENT_ID_FOR_PRODUCTION",
                                                         PayPalEnvironmentSandbox : @"YOUR_CLIENT_ID_FOR_SANDBOX"}];
  // ...
  return YES;
}

PayerId not coming in Payment Response

Hello

I could not find "PayerId" in payment response

{
"client": {
"environment": "mock",
"paypal_sdk_version": "2.12.4",
"platform": "Android",
"product_name": "PayPal-Android-SDK"
},
"response": {
"create_time": "2014-02-12T22:29:49Z",
"id": "PAY-6RV70583SB702805EKEYSZ6Y",
"intent": "sale",
"state": "approved"
},
"response_type": "payment"
}

For Server side it is mandatory attribute.
Can someone tell me if I am missing out something.

iOS: duplicate symbol error on build

I have followed all the steps, I have changed import in MFLReactNativePayPal.m from:
#import "RCTBridge.h" #import "RCTConvert.h"
to
#import "React/RCTBridge.h" #import "React/RCTConvert.h"

in order to work with React Native 0.54, but when I try to build the app I get the following type of errors:

duplicate symbol _OBJC_IVAR_$_PPRiskDeviceData._adId in:
    /Users/alexandrumic/Documents/Alex/Projects/Culticks_App/ios/Pods/PayPal-iOS-SDK/PayPalMobile/libPayPalMobile.a(PPRiskDeviceData.o)
    /Users/alexandrumic/Library/Developer/Xcode/DerivedData/Culticks_App-fwbfzjapamdvldanrafbzvhbqces/Build/Products/Debug-iphoneos/libMFLReactNativePayPal.a(PPRiskDeviceData.o)
duplicate symbol _OBJC_IVAR_$_PPRiskDeviceData._currentLocation in:
    /Users/alexandrumic/Documents/Alex/Projects/Culticks_App/ios/Pods/PayPal-iOS-SDK/PayPalMobile/libPayPalMobile.a(PPRiskDeviceData.o)
    /Users/alexandrumic/Library/Developer/Xcode/DerivedData/Culticks_App-fwbfzjapamdvldanrafbzvhbqces/Build/Products/Debug-iphoneos/libMFLReactNativePayPal.a(PPRiskDeviceData.o)
duplicate symbol _OBJC_METACLASS_$_PPRiskDeviceData in:
    /Users/alexandrumic/Documents/Alex/Projects/Culticks_App/ios/Pods/PayPal-iOS-SDK/PayPalMobile/libPayPalMobile.a(PPRiskDeviceData.o)
    /Users/alexandrumic/Library/Developer/Xcode/DerivedData/Culticks_App-fwbfzjapamdvldanrafbzvhbqces/Build/Products/Debug-iphoneos/libMFLReactNativePayPal.a(PPRiskDeviceData.o)
ld: 1253 duplicate symbols for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Can you please tell us if the library is still maintained and working?

Thank you!

3rd-Party Payment

Hello,

How can I use this react-native-braintree module to use 3rd-party Payments?

I am developing an E-Commerce Shop and I need the user payment directly to the shop who offers the product. As we have many different shops, the 'payee' difference depended on the product. How can I achieve this?

Thanks
Alexander Niebuhr

Android "Cannot convert undefined or null to object"

Hi,
I installed android following the instructions here.
When I try to do

let PayPal = require('react-native-paypal');

or

import PayPal from 'react-native-paypal';

I get this error:

Cannot convert undefined or null to object
<unknown>
    index.js:9
loadModuleImplementation
    require.js:122
guardedLoadModule
    require.js:65
_require
    require.js:49
<unknown>
    app.js:3
loadModuleImplementation
    require.js:122
guardedLoadModule
    require.js:65
_require
    require.js:49
<unknown>
    index.android.js:11
loadModuleImplementation
    require.js:122

My initial thought is that the code added to MainActivity contradicts the one in MainApplication.

The code added to main activity (followed the android setup):

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...
        payPalPackage = new PayPalPackage(this, PAY_PAL_REQUEST_ID); // <--

        ReactInstanceManager.builder()
                .setApplication(getApplication())
                .setBundleAssetName("index.android.bundle")
                .setJSMainModuleName("index.android")
                .addPackage(new MainReactPackage())
                // ...
                .addPackage(payPalPackage) // <--
                .setUseDeveloperSupport(BuildConfig.DEBUG)
                .setInitialLifecycleState(LifecycleState.RESUMED)
                .build();
        // ...
    }

    // ...

    @Override
    public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == PAY_PAL_REQUEST_ID) {
            payPalPackage.handleActivityResult(requestCode, resultCode, data); // <--
        } else {
//            otherModulesHandlers(requestCode, resultCode, data);
        }
    }

while the code which is in the MainApplication:

public class MainApplication extends Application implements ReactApplication {

  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
    @Override
    protected boolean getUseDeveloperSupport() {
      return BuildConfig.DEBUG;
    }

    @Override
    protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
              new MainReactPackage(),
              new ReactMaterialKitPackage(),
              new ReactNativePushNotificationPackage()
      );
    }
  };

  @Override
  public ReactNativeHost getReactNativeHost() {
    return mReactNativeHost;
  }
}

Seems to me like MainReactPackage is added twice. Am I right? What am I missing?

Thanks!
IY

getting Error: contains too many fractional digits.

hey @MattFoley need help;

when i am passing more than one digit like shown below i get an exception from Xcode.
MFLReactNativePayPal.preparePaymentOfAmount(5.8, "USD", "something");

PayPal SDK: PayPalPayment not processable: '5.80000019073486336' contains too many fractional digits. (For USD, can be no more than 2.)

package.json can't load paypal ios SDK

When adding 'react-native-paypal' to my package.json I get this error:

npm ERR! git submodule -q update --init --recursive: Permission denied (publickey).
npm ERR! git submodule -q update --init --recursive: fatal: Could not read from remote repository.
npm ERR! git submodule -q update --init --recursive: 
npm ERR! git submodule -q update --init --recursive: Please make sure you have the correct access rights
npm ERR! git submodule -q update --init --recursive: and the repository exists.
npm ERR! git submodule -q update --init --recursive: Clone of '[email protected]:paypal/PayPal-iOS-SDK.git' into submodule path 'ios/lib/Paypal' failed
npm ERR! git submodule -q update --init --recursive: 
npm ERR! Darwin 15.0.0
npm ERR! argv "/usr/local/Cellar/node/6.1.0/bin/node" "/usr/local/lib/node_modules/npm/bin/npm-cli.js" "update"
npm ERR! node v6.1.0
npm ERR! npm  v3.8.6
npm ERR! code 1

npm ERR! Command failed: git submodule -q update --init --recursive
npm ERR! Permission denied (publickey).
npm ERR! fatal: Could not read from remote repository.
npm ERR! 
npm ERR! Please make sure you have the correct access rights
npm ERR! and the repository exists.
npm ERR! Clone of '[email protected]:paypal/PayPal-iOS-SDK.git' into submodule path 'ios/lib/Paypal' failed
npm ERR! 
npm ERR! 
npm ERR! If you need help, you may report this error at:
npm ERR!     <https://github.com/npm/npm/issues>

my package.json line looks like this:
"react-native-paypal": "https://github.com/MattFoley/react-native-paypal.git",

is the git address changed?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.