npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

react-headless-phone-input

v3.0.0

Published

A headless phone number input component

Downloads

872

Readme

React Headless Phone Input

A headless phone number input component built for usability.

Phone numbers are hard. Users expect to be able to enter phone numbers in the format they're used to. Here's the problem: most people are used to national - or even local phone number formats. If you offload phone number validation to your backend (or an API), resolving the ambiguity becomes difficult or even impossible.

This component helps you build a UI that gracefully guides your users towards unambiguous phone number formats. And you get the result in standard e164 format: ready for use with any telephony service.

Other libraries are generally heavy (phone number rulesets can be big - 99.1% of this library's footprint is due to libphonenumber-js), force you to use their UI, and can't handle copy & paste or edit-in-place. react-headless-phone-input is designed for usability-first, and lets you bring your own input components. In fact, your existing input fields will almost certainly work with no modifications. Plus, it supports optional lazy-loading with progressive enhancement powered by React Suspense.

Built with React Hooks.

Demo

Install

Install both react-headless-input and libphonenumber-js:

npm i --save react-headless-phone-input libphonenumber-js

or

yarn add react-headless-phone-input libphonenumber-js

Features

  • 100% headless: Bring your own UI. You can use almost any input component you already have
  • Lets users copy & paste phone numbers of any format
  • Typescript support
  • Built-in lazy-loading with progressive enhancement (clocks in at 40KB without lazy-loading)
  • Detects the associated country, enabling international phone input.
  • Lets users copy & paste phone numbers of any format
  • Acts like a normal input: Doesn’t glitch if a user edits in-place or deletes template characters
  • Validates number plausibility
  • External state is standard e164 format

Example

This library is headless: you bring your own UI, but it's almost as easy as using regular inputs.

Here's an example using tiny-flag-react to show the flag associated with the number's country:

import TinyFlagReact from "tiny-flag-react";
import PhoneFormatter from "react-headless-phone-input";
// import PhoneFormatter from "react-headless-phone-input/lazy"; RECOMMENDED

const [e164, setE164] = useState("");

<PhoneFormatter defaultCountry="US" value={e164} onChange={setE164}>
  {({ country, impossible, onBlur, onInputChange, inputValue }) => {
    return (
      <>
        <div style={{ display: "flex", alignItems: "center" }}>
          <span
            style={{
              fontSize: "24px",
            }}>
            {country ? (
              <TinyFlagReact
                country={country}
                alt={country + " flag"}
                fallbackImageURL={`https://cdn.jsdelivr.net/npm/[email protected]/img/SVG/${country}.svg`}
              />
            ) : (
              <>✆</>
            )}
          </span>
          <input
            type="tel"
            value={inputValue}
            onBlur={onBlur}
            onChange={(e) => onInputChange(e.target.value)}
          />
        </div>
        {impossible && (
          <div style={{ color: "red" }}>Impossible phone number</div>
        )}
      </>
    );
  }}
</PhoneFormatter>;

Demo

Performance

Due to this library's dependence on libphonenumber-js, it clocks in at 38.7KB minified + gzipped. To improve your user's experience, react-headless-phone-component supports lazy loading with React Suspense with progressive auto-enachement. If your bundler supports dynamic imports and are using a compatible version of React, just swap react-headless-phone-input for react-headless-phone-input/lazy.

Your UI will render and can be used immediately. Once react-headless-phone-input loads, the component will be automatically upgraded. No other changes are required.

import PhoneFormatter from "react-headless-phone-input/lazy";

License

MIT