Git Product home page Git Product logo

react-paystack's Introduction

react-paystack

This is a react library for implementing paystack payment gateway

Demo

Demo

Get Started

This React library provides a wrapper to add Paystack Payments to your React application

Install

npm install react-paystack --save

or with yarn

yarn add react-paystack

Usage

This library can be implemented into any react application in 3 different ways:

  1. By using hooks provided by the library
  2. By using a button provided by the library
  3. By using a context consumer provided by the library

Note that all 3 implementations produce the same results.

1. Using the paystack hook

  import React from 'react';
  import logo from './logo.svg';
  import { usePaystackPayment } from 'react-paystack';
  import './App.css';
  
  const config = {
      reference: (new Date()).getTime().toString(),
      email: "[email protected]",
      amount: 20000, //Amount is in the country's lowest currency. E.g Kobo, so 20000 kobo = N200
      publicKey: 'pk_test_dsdfghuytfd2345678gvxxxxxxxxxx',
  };
  
  // you can call this function anything
  const onSuccess = (reference) => {
    // Implementation for whatever you want to do with reference and after success call.
    console.log(reference);
  };

  // you can call this function anything
  const onClose = () => {
    // implementation for  whatever you want to do when the Paystack dialog closed.
    console.log('closed')
  }

  const PaystackHookExample = () => {
      const initializePayment = usePaystackPayment(config);
      return (
        <div>
            <button onClick={() => {
                initializePayment(onSuccess, onClose)
            }}>Paystack Hooks Implementation</button>
        </div>
      );
  };
  
  function App() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <p>
            Edit <code>src/App.js</code> and save to reload.
          </p>
          <a
            className="App-link"
            href="https://reactjs.org"
            target="_blank"
            rel="noopener noreferrer"
          >
            Learn React
          </a>
        </header>
        <PaystackHookExample />
      </div>
    );
  }
  
  export default App;

2. Using the paystack button

  import React from 'react';
  import logo from './logo.svg';
  import { PaystackButton } from 'react-paystack';
  import './App.css';
  
  const config = {
    reference: (new Date()).getTime().toString(),
    email: "[email protected]",
    amount: 20000, //Amount is in the country's lowest currency. E.g Kobo, so 20000 kobo = N200
    publicKey: 'pk_test_dsdfghuytfd2345678gvxxxxxxxxxx',
  };
  
  function App() {
    // you can call this function anything
    const handlePaystackSuccessAction = (reference) => {
      // Implementation for whatever you want to do with reference and after success call.
      console.log(reference);
    };

    // you can call this function anything
    const handlePaystackCloseAction = () => {
      // implementation for  whatever you want to do when the Paystack dialog closed.
      console.log('closed')
    }

    const componentProps = {
        ...config,
        text: 'Paystack Button Implementation',
        onSuccess: (reference) => handlePaystackSuccessAction(reference),
        onClose: handlePaystackCloseAction,
    };

    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <p>
            Edit <code>src/App.js</code> and save to reload.
          </p>
          <a
            className="App-link"
            href="https://reactjs.org"
            target="_blank"
            rel="noopener noreferrer"
          >
            Learn React
          </a>
        </header>
        <PaystackButton {...componentProps} />
      </div>
    );
  }
  
  export default App;

3. using the Paystack consumer

import React from 'react';
import logo from './logo.svg';
import { PaystackConsumer } from 'react-paystack';
import './App.css';
  
  const config = {
      reference: (new Date()).getTime().toString(),
      email: "[email protected]",
      amount: 20000, //Amount is in the country's lowest currency. E.g Kobo, so 20000 kobo = N200
      publicKey: 'pk_test_dsdfghuytfd2345678gvxxxxxxxxxx',
  };
  
  // you can call this function anything
  const handleSuccess = (reference) => {
    // Implementation for whatever you want to do with reference and after success call.
    console.log(reference);
  };

  // you can call this function anything
  const handleClose = () => {
    // implementation for  whatever you want to do when the Paystack dialog closed.
    console.log('closed')
  }

  function App() {
      const componentProps = {
          ...config,
          text: 'Paystack Button Implementation',
          onSuccess: (reference) => handleSuccess(reference),
          onClose: handleClose
      };
  
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <p>
            Edit <code>src/App.js</code> and save to reload.
          </p>
          <a
            className="App-link"
            href="https://reactjs.org"
            target="_blank"
            rel="noopener noreferrer"
          >
            Learn React
          </a>
        </header>
        <PaystackConsumer {...componentProps} >
          {({initializePayment}) => <button onClick={() => initializePayment(handleSuccess, handleClose)}>Paystack Consumer Implementation</button>}
        </PaystackConsumer>
      </div>
    );
  }
  
  export default App;

Sending Metadata with Transaction

If you want to send extra metadata e.g. Transaction description, user that made the transaction. Edit your config like so:

    const config = {
       // Your required fields
          metadata: {
            custom_fields: [
                {
                    display_name: 'description',
                    variable_name: 'description',
                    value: 'Funding Wallet'
                }
                // To pass extra metadata, add an object with the same fields as above
            ]
        }
    };

Please checkout Paystack Documentation for other available options you can add to the tag

Deployment

REMEMBER TO CHANGE THE KEY WHEN DEPLOYING ON A LIVE/PRODUCTION SYSTEM

Contributing

  1. Fork it!
  2. Create your feature branch: git checkout -b feature-name
  3. Commit your changes: git commit -am 'Some commit message'
  4. Push to the branch: git push origin feature-name
  5. Submit a pull request ๐Ÿ˜‰๐Ÿ˜‰

How can I thank you?

Why not star the github repo? I'd love the attention! Why not share the link for this repository on Twitter or Any Social Media? Spread the word!

Don't forget to follow me on twitter!

Thanks! Olusegun Ayeni.

License

This project is licensed under the MIT License - see the LICENSE.md file for details

react-paystack's People

Contributors

aneesa-i-saleh avatar ascii-dev avatar ashinzekene avatar brian-mula avatar ceofred avatar danielekpa avatar david-saint avatar ebenkb avatar iamfiropo avatar iamraphson avatar johnayeni avatar kadetxx avatar kduprey avatar lukman-paystack avatar nelwhix avatar orinamio avatar sulaimon-olaniran avatar tge24 avatar zacharykapank 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  avatar  avatar  avatar  avatar  avatar  avatar

react-paystack's Issues

Programmatically call function to pay

Is there a way to call a click function on the pay button without actually clicking it?
The reason is that I'm getting the paystack key and email from an API and I want to be able to call a function to pay without clicking a different button. This is what I've tried...

<PaystackButton key="pay" text={this.state.info} ref={(payRef) => this.payRef = payRef} class="payButton" callback={this.callback} close={this.close} embed={false} reference={this.state.ref} email={this.state.email} amount={parseInt(this.state.amount)} paystackkey={this.state.p_key} tag="button" />
Then I'm calling this.payRef.payWithPaystack() but my state values are empty

onSuccess not accepting props

i am getting error
Types of property 'onSuccess' are incompatible.
Type '(reference: any) => void' is not assignable to type 'callback'.

some code snippet
onSuccess: (reference:any) => {
handleSuccess(reference)},
const handleSuccess = (reference: any) =>{
axios.put(
https://relayed-service.herokuapp.com/user/verifyTransaction,
{
UPAddress: account,
reference: reference.reference,
message: reference.message,
}
);

}

Export Currency to be accessed by users

Currently when you add currency prop, Typescript complains of type mismatch between 'currency' and 'Currency'. It is better to export Currency so that users can use it.

React ^17 dependancy issue

I am currently running react 17.0.2 and when installing the react-paystack library from npm I get a unable to resolve dependency tree

Here is the stack-trace

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR! 
npm ERR! While resolving: [email protected]
npm ERR! Found: [email protected]
npm ERR! node_modules/react
npm ERR!   react@"^17.0.2" from the root project
npm ERR! 
npm ERR! Could not resolve dependency:
npm ERR! peer react@"^15.0.0 || ^16.0.0" from [email protected]
npm ERR! node_modules/react-paystack
npm ERR!   react-paystack@"*" from the root project
npm ERR! 
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.

How to reproduce the error.

  1. create a reactjs app with version 17 (or above)
  2. install dependancies
  3. run npm i react-paystack
  4. the error happens here

Workaround
Downgrade React to version 16.14.0

Unable to load paystack inline script crashing website.

When paystack script isn't loaded, throwing inside a useEffect cannot be cause.
This mostly happens when there is a proxy on the internet connection.

Can this be return to the use as past of the hook?

  useEffect(() => {
    if (scriptError) {
      throw new Error('Unable to load paystack inline script');
    }
  }, [scriptError]);

close paystack popup

First of all, great package. Thanks!

I have a small problem and I am struggling to find a way around it. I am using the PaystackButton, after the popup opens, the background color is white and the users will not be able to see the close icon on the top right corner of the popup to CLOSE the popup if ever they choose not to continue with payment.

Could you please tell me a work around this or if possible, change it on your side.

Much appreciated,
Thanks.
close popup

Error when initialising paystack

I get this error when initialising the paystack popup.
It seems to be an issue that happens when loading the paystack inline script

Screenshot 2023-09-20 at 21 00 20

Could not resolve dependency npm install error

please update the react version, i could make pr if you'd like

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: [email protected]
npm ERR! Found: [email protected]
npm ERR! node_modules/react
npm ERR! react@"^18.2.0" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer react@"^15.0.0 || ^16.0.0 || ^17.0.0" from [email protected]
npm ERR! node_modules/react-paystack
npm ERR! react-paystack@"*" from the root project
npm ERR!
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.

This PayStackButton is not supportted on typescript

I keep getting this error when using typescript
ype '{ email: string; amount: number; currency: any; metadata: { custom_field: string[]; }; publicKey: any; text: string; onSuccess: () => void; onClose: () => void; className: string; }' is not assignable to type 'PaystackButtonProps'.
The types of 'metadata.custom_field' are incompatible between these types.
Type 'string[]' is not assignable to type 'Record<string, string>[]'.
Type 'string' is not assignable to type 'Record<string, string>

Reason for custom fields in PaystackProps

Firstly, thank you for this package @iamraphson

Is there a reason why we need to pass an array as custom fields? Was there an issue with passing an object directly to metadata?

This change will affect users making use of the reference from paystack

export interface PaystackProps {
    publicKey: string;
    email: string;
    amount: number;
    reference?: string;
    metadata?: {
        custom_field: Record<string, string>[]; // <-- here
    };
    currency?: Currency;
    channels?: PaymentChannels[];
    label?: string;
    plan?: string;
    quantity?: number;
    subaccount?: string;
    transaction_charge?: number;
    bearer?: Bearer;
    'data-custom-button'?: string;
    split_code?: string;
}

Im getting an error thats says: Uncaught TypeError: n.split is not a function

I'm new to using react-paystack, while practicing what was shown in the example, I always get this error in my console: Uncaught TypeError: n.split is not a function, and the payment was not successful.

This happened when I tried the three examples.

import React from "react";
import { PaystackConsumer } from "react-paystack";

const config = {
  reference: new Date().getTime().toString(),
  email: "[email protected]",
  amount: 500 * 100,
  publicKey: "pk_live_cf929a519a7eba12b9a87da11d8a76d790a1b884",
};

const reference = "Success";
const handleSuccess = (reference) => {
reference and after success call.
  console.log(reference);
};

const handleClose = () => {
  console.log("closed");
};

function App() {
  const componentProps = {
    ...config,
    text: "Paystack Button Implementation",
    onSuccess: (reference) => handleSuccess(reference),
    onClose: handleClose,
  };

  return (
    <div className="App">
      <PaystackConsumer {...componentProps}>
        {({ initializePayment }) => (
          <button onClick={() => initializePayment(handleSuccess, handleClose)}>
            Paystack Consumer Implementation
          </button>
        )}
      </PaystackConsumer>
    </div>
  );
}

export default App;

Pop Up payment

Hi, Thanks for this plugin. How can I use popup instead the form that just shows up instead of just a button?
Thanks

Add Support For Slots

I believe instead of passing in the text to display in a button, it would be a lot better if we could leverage the slots approach.

Hence, creating the opportunity to render any tag (including icons) inside of the button. This would save a lot of struggles.

E.g.:

<PaystackButton>
  <FontAwesome icon={faMoneyBillAlt} />
  <span className="ml-2">Pay Now</span>
</PaystackButton>

Calling initialize Payment after axios response

I have a need to first get reference from axios call, set the reference in config then make call to make payment on axios response. Is there anyway I can use this library to achieve this. Thanks

Button Styling

I have been trying to style the button to my own look, but not really successful. Is there a default props for styling the button ?

Cannot load paystack inline script when using SharedArrayBuffer

I am using SharedArrayBuffer which requires me to set the following headers on my server:

"Cross-Origin-Opener-Policy": "same-origin"
"Cross-Origin-Embedder-Policy": "require-corp"

However it seems the "Cross-Origin-Embedder-Policy" header is preventing the paystack script from loading. I get an error that says: "net::ERR_BLOCKED_BY_RESPONSE.NotSameOriginAfterDefaultedToSameOriginByCoep 200"

please is there any way I can work around this?

Callback not Accessible

const PaystackHookExample = () => {
        const initializePayment = usePaystackPayment(config);
        return (
            <div>
                <button onClick={() => {
                    initializePayment()
                }}>Paystack Hooks Implementation</button>
            </div>
        );
    };

Callback isn't accessible using this method

Here is a quick repro
https://codesandbox.io/s/gallant-cdn-9ddke

Passing payment options

I guess the pay stack hook can be better if we can pass in the payment options into whenever it called, as in initializePayment(config) as opposed to passing it into the hook directly when initializing it, as in const initializePayment = usePaystackPayment(config).

In practice you'll want to pass the payment options only when you're about to process the transaction because you don't know the email or amount to pay in advance.

export default function usePayStackPayment(): (options: PaystackProps, callback?: () => void, onClose?: () => void) => void {
    const [scriptLoaded, scriptError] = usePaystackScript();
    
    function initializePayment(options: PaystackProps, callback?: callback, onClose?: callback): void {

        const {
            publicKey,
            firstname,
            lastname,
            phone,
            email,
            amount,
            reference,
            metadata = {},
            currency = 'NGN',
            channels,
            label = '',
            plan = '',
            quantity = '',
            subaccount = '',
            transaction_charge = 0,
            bearer = 'account',
            split,
            split_code,
        } = options;

        if (scriptError) {
            throw new Error('Unable to load paystack inline script');
        }

        if (scriptLoaded) {
            const paystackArgs: Record<string, any> = {
                callback: callback ? callback : () => null,
                onClose: onClose ? onClose : () => null,
                key: publicKey,
                ref: reference,
                email,
                firstname,
                lastname,
                phone,
                amount,
                currency,
                plan,
                quantity,
                'data-custom-button': options['data-custom-button'] || '',
                channels,
                subaccount,
                transaction_charge,
                bearer,
                label,
                metadata,
                split,
                split_code,
            };
            callPaystackPop(paystackArgs);
        }
    }

    useEffect(() => {
        if (scriptError) {
            throw new Error('Unable to load paystack inline script');
        }
    }, [scriptError]);

    return initializePayment;
}

I hope this idea is considered.

The Paystack Popup never shows

Aside the pop up not showing there is error Uncaught DOMException: Failed to read the 'localStorage' property from 'Window': Access is denied for this document. that show in the browser console.

Attached is a sample screenshot
Screenshot (181)

The `invoice.update` event isn't getting called in webhook

Hi team,

For some unknown reason, the invoice.update event isn't getting called in our webhook when a subscription is renewed by Paystack.

Here's the switch case that covered the event. Are we probably doing something wrong? Other events work as expected.

case 'invoice.update':
  if (data.status === 'success' && data.paid) {
    await Subscription.findOneAndUpdate(
      { userId },
      {
        $set: {
          startDate: data.period_start,
          endDate: data.period_end,
          customerCode: data.customer.customer_code,
          subCode: data.subscription.subscription_code,
          amount: data.amount,
          currency: data.currency,
        },
      },
    )
  }
  break
  • Using Next.js

No Preview in readme

Every react lib should have some sort of screenshot or gif of what the component looks like.

๐Ÿ˜ƒ

Cannot add option to choose channel that Paystack should display

I don't know if this project is still being monitored, but I went through the codebase and I see that I can't add the channel option to tell paystack what to display to the user. Any plans for that? Should I work on it? I think its just to add it to the "paystackOptions" array

Query concerning the onSuccess callback...

I executed a transaction and got the response below. Please does the status represent that the transaction was successfully i.e. that the money has actually been paid. or it just that the process is successful
{reference: "834915094", trans: "888757614", status: "success", message: "Approved", transaction: "888757614",ย โ€ฆ}
Would appreciate a quick reply, thank you.

No Styling on Button

Hello,
I am setting up this paystack button in my react app.
Everything is working however, the pay button has no styles at all.
I confirmed the "className='payButton' is set. however still no styles applied.

Kindly assist

Issue regarding using paystack in react js

We are using react-paystack package in our react application,however it's working fine for the first time of the payment.But when we want to trigger the payment api through paystack button for the second time the popup is not coming and getting following error.

inline.js:1 Uncaught TypeError: Cannot read property 'style' of null
at Inline.resetMainIframe (inline.js:1)
at Inline.resetNewCheckout (inline.js:1)
at Inline.setTransaction (inline.js:1)
at Object.setup (inline.js:1)
at PayStack._this.payWithPaystack (paystack.min.js:56)
at HTMLUnknownElement.callCallback (react-dom.development.js:100)
at Object.invokeGuardedCallbackDev (react-dom.development.js:138)
at Object.invokeGuardedCallback (react-dom.development.js:187)
at Object.invokeGuardedCallbackAndCatchFirstError (react-dom.development.js:201)
at executeDispatch (react-dom.development.js:461)
at executeDispatchesInOrder (react-dom.development.js:480)
at executeDispatchesAndRelease (react-dom.development.js:581)
at executeDispatchesAndReleaseTopLevel (react-dom.development.js:592)
at forEachAccumulated (react-dom.development.js:562)
at runEventsInBatch (react-dom.development.js:723)
at runExtractedEventsInBatch (react-dom.development.js:732)
at handleTopLevel (react-dom.development.js:4476)
at batchedUpdates$1 (react-dom.development.js:16659)
at batchedUpdates (react-dom.development.js:2131)
at dispatchEvent (react-dom.development.js:4555)
at interactiveUpdates$1 (react-dom.development.js:16714)
at interactiveUpdates (react-dom.development.js:2150)
at dispatchInteractiveEvent (react-dom.development.js:4532)

We have also checked that if we reload the page after first payment done then second time(After reloading window) its working.So each time after payment completion we need to reload our project which is not the correct way.So please let me know what to do?

Form keep losing focus when clicked upon

I have been trying to implement payment with paystacks inline but its not working. The modal will show, but I'll be unable to write anything on the form. Its like the form state is not set. It keeps on focusing itself. Help its urgent

Invalid Hook Call

image

I keep getting this error when using the package

React version 16.2.0
React-dom version 16.2.0

Please assist.

pass in access code to either Popup or Button to retrieves the transaction details,

I know the mobile SDK already has the feature, is there a way to replicate on the web,
i want to be able to initialize a transaction at the backend, retrieve the access code from the initialized transaction,
return the access code to the client where the client can then pass it to either the popup or the paystack button, and the transaction details associated with the access code will be automatically fetched for the popup.

OnSuccess & OnClose Function not working

const config = {
  reference: (new Date()).getTime().toString(),
  email: "[email protected]",
  amount: Math.ceil(final_fees_to_pay) * 100, 
  currency: "GHS",
  channels: ["card", "bank", "mobile_money", "bank_transfer", "qr", "eft"],
  metadata: {
      "item_id": 'item-1003944'
  },
  publicKey: 'pk_test_4b43c',
};

// onSuccess, Verify Transaction in server and then redirect to Success Page
const onSuccess = (reference) => {


  // Implementation for whatever you want to do with reference and after success call.
  console.log('Transaction Success ', reference);
  alert(reference)

  router.replace('/success')
};


// Cancel transaction when user closes payment modal
const onClose = () => {

  // implementation for  whatever you want to do when the Paystack dialog closed.
  // alert('closed')
}


const PaystackHook = () => {

  const initializePayment = usePaystackPayment(config);


  return(
    <Button fullWidth color='primary' radius='full' size='lg' onClick={() => {initializePayment(onSuccess, onClose)}}> 
        <Image src='/images/default/paystack.jpg' width={30} height={30} className='rounded-full' alt='PayStack'/> Pay 
    </Button>
  )
}


return (
  <React.Fragment>


  
      <div className='mt-5'>
       <PaystackHook/>
      </div>
    


  </React.Fragment>
)
}

After payment success onSuccess does not work or throw any error and same as onClose

Fix dependency issues -- doesn't install on latest Node version v14.15.4 without command with --force, or --legacy-peer-deps

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: [email protected]
npm ERR! Found: [email protected]
npm ERR! node_modules/react
npm ERR! react@"^17.0.2" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer react@"^15.0.0 || ^16.0.0" from [email protected]
npm ERR! node_modules/react-paystack
npm ERR! react-paystack@"*" from the root project
npm ERR!
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
npm ERR!

Ok

Need to get in touch with my co workers and my app deployment

Currency not supported

Hello, I am currently facing an issue whenever the button is clicked it shows currency not supported, any idea to solve this issue

Thank you for the work.

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.