├── test ├── __mocks__ │ ├── styleMock.js │ └── fileMock.js ├── screenshot.png ├── index │ └── index.html ├── dev_css │ └── demo.js ├── ReactPhoneInput.test.js └── dev_js │ └── demo.js ├── .babelrc ├── .gitignore ├── .travis.yml ├── src ├── style │ ├── common │ │ ├── flags.png │ │ ├── high-res.png │ │ ├── high-res-flags.less │ │ └── flags.less │ ├── plain.less │ ├── high-res.less │ ├── style.less │ ├── material.less │ ├── bootstrap.less │ └── semantic-ui.less ├── utils │ └── prototypes.js ├── rawTerritories.js ├── CountryData.js └── rawCountries.js ├── .editorconfig ├── LICENSE ├── lang ├── cn.json ├── ko.json ├── jp.json ├── pl.json ├── ir.json ├── tr.json ├── ar.json ├── es.json ├── ru.json ├── it.json ├── id.json ├── pt.json ├── fr.json ├── de.json └── hu.json ├── package.json ├── index.d.ts ├── webpack.config.js ├── CHANGELOG.md └── README.md /test/__mocks__/styleMock.js: -------------------------------------------------------------------------------- 1 | module.exports = {}; 2 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["babel-preset-react-app"] 3 | } 4 | -------------------------------------------------------------------------------- /test/__mocks__/fileMock.js: -------------------------------------------------------------------------------- 1 | module.exports = 'test-file-stub'; 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | lib 2 | .idea 3 | node_modules 4 | package-lock.json 5 | animation.gif 6 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 'node' 4 | install: 5 | - npm install 6 | -------------------------------------------------------------------------------- /test/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bl00mber/react-phone-input-2/HEAD/test/screenshot.png -------------------------------------------------------------------------------- /src/style/common/flags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bl00mber/react-phone-input-2/HEAD/src/style/common/flags.png -------------------------------------------------------------------------------- /src/style/common/high-res.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bl00mber/react-phone-input-2/HEAD/src/style/common/high-res.png -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.js,*.jsx] 2 | indent_style = tab 3 | indent_size = 2 4 | end_of_line = LF 5 | charset = utf-8 6 | trim_trailing_whitespace = true 7 | insert_final_newline = true 8 | 9 | [*] 10 | charset = utf-8 11 | end_of_line = LF 12 | trim_trailing_whitespace = true 13 | insert_final_newline = true 14 | -------------------------------------------------------------------------------- /test/index/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | react-phone-input-2 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/utils/prototypes.js: -------------------------------------------------------------------------------- 1 | /** 2 | * String.prototype.padStart() polyfill 3 | * https://github.com/uxitten/polyfill/blob/master/string.polyfill.js 4 | * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padEnd 5 | */ 6 | if (!String.prototype.padEnd) { 7 | String.prototype.padEnd = function padEnd(targetLength, padString) { 8 | targetLength = targetLength >> 0; //floor if number or convert non-number to 0; 9 | padString = String((typeof padString !== 'undefined' ? padString : ' ')); 10 | if (this.length > targetLength) { 11 | return String(this); 12 | } 13 | else { 14 | targetLength = targetLength - this.length; 15 | if (targetLength > padString.length) { 16 | padString += padString.repeat(targetLength / padString.length); //append to original to ensure we are longer than needed 17 | } 18 | return String(this) + padString.slice(0, targetLength); 19 | } 20 | }; 21 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017-2020 Nick Reiley (https://github.com/bl00mber) 4 | Copyright (c) 2015-2017 Raza Gill (https://github.com/razagill) 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /lang/cn.json: -------------------------------------------------------------------------------- 1 | {"al":"阿尔巴尼亚","dz":"阿尔及利亚","af":"阿富汗","ar":"阿根廷","ae":"阿拉伯联合酋长国","aw":"阿鲁巴","om":"阿曼","az":"阿塞拜疆","ac":"阿森松岛","eg":"埃及","et":"埃塞俄比亚","ie":"爱尔兰","ee":"爱沙尼亚","ad":"安道尔","ao":"安哥拉","ai":"安圭拉","ag":"安提瓜和巴布达","at":"奥地利","ax":"奥兰群岛","au":"澳大利亚","bb":"巴巴多斯","pg":"巴布亚新几内亚","bs":"巴哈马","pk":"巴基斯坦","py":"巴拉圭","ps":"巴勒斯坦领土","bh":"巴林","pa":"巴拿马","br":"巴西","by":"白俄罗斯","bm":"百慕大","bg":"保加利亚","mp":"北马里亚纳群岛","mk":"北马其顿","bj":"贝宁","be":"比利时","is":"冰岛","pr":"波多黎各","pl":"波兰","ba":"波斯尼亚和黑塞哥维那","bo":"玻利维亚","bz":"伯利兹","bw":"博茨瓦纳","bt":"不丹","bf":"布基纳法索","bi":"布隆迪","kp":"朝鲜","gq":"赤道几内亚","dk":"丹麦","de":"德国","dg":"迪戈加西亚岛","tl":"东帝汶","tg":"多哥","do":"多米尼加共和国","dm":"多米尼克","ru":"俄罗斯","ec":"厄瓜多尔","er":"厄立特里亚","fr":"法国","fo":"法罗群岛","pf":"法属波利尼西亚","gf":"法属圭亚那","tf":"法属南部领地","mf":"法属圣马丁","va":"梵蒂冈","ph":"菲律宾","fj":"斐济","fi":"芬兰","cv":"佛得角","fk":"福克兰群岛","gm":"冈比亚","cg":"刚果(布)","cd":"刚果(金)","co":"哥伦比亚","cr":"哥斯达黎加","gd":"格林纳达","gl":"格陵兰","ge":"格鲁吉亚","gg":"根西岛","cu":"古巴","gp":"瓜德罗普","gu":"关岛","gy":"圭亚那","kz":"哈萨克斯坦","ht":"海地","kr":"韩国","nl":"荷兰","bq":"荷属加勒比区","sx":"荷属圣马丁","me":"黑山","hn":"洪都拉斯","ki":"基里巴斯","dj":"吉布提","kg":"吉尔吉斯斯坦","gn":"几内亚","gw":"几内亚比绍","ca":"加拿大","gh":"加纳","ic":"加纳利群岛","ga":"加蓬","kh":"柬埔寨","cz":"捷克","zw":"津巴布韦","cm":"喀麦隆","qa":"卡塔尔","ky":"开曼群岛","cc":"科科斯(基林)群岛","km":"科摩罗","xk":"科索沃","ci":"科特迪瓦","kw":"科威特","hr":"克罗地亚","ke":"肯尼亚","ck":"库克群岛","cw":"库拉索","lv":"拉脱维亚","ls":"莱索托","la":"老挝","lb":"黎巴嫩","lt":"立陶宛","lr":"利比里亚","ly":"利比亚","li":"列支敦士登","re":"留尼汪","lu":"卢森堡","rw":"卢旺达","ro":"罗马尼亚","mg":"马达加斯加","im":"马恩岛","mv":"马尔代夫","mt":"马耳他","mw":"马拉维","my":"马来西亚","ml":"马里","mh":"马绍尔群岛","mq":"马提尼克","yt":"马约特","mu":"毛里求斯","mr":"毛里塔尼亚","us":"美国","um":"美国本土外小岛屿","as":"美属萨摩亚","vi":"美属维尔京群岛","mn":"蒙古","ms":"蒙特塞拉特","bd":"孟加拉国","pe":"秘鲁","fm":"密克罗尼西亚","mm":"缅甸","md":"摩尔多瓦","ma":"摩洛哥","mc":"摩纳哥","mz":"莫桑比克","mx":"墨西哥","na":"纳米比亚","za":"南非","aq":"南极洲","gs":"南乔治亚和南桑威奇群岛","ss":"南苏丹","nr":"瑙鲁","ni":"尼加拉瓜","np":"尼泊尔","ne":"尼日尔","ng":"尼日利亚","nu":"纽埃","no":"挪威","nf":"诺福克岛","pw":"帕劳","pn":"皮特凯恩群岛","pt":"葡萄牙","jp":"日本","se":"瑞典","ch":"瑞士","sv":"萨尔瓦多","ws":"萨摩亚","rs":"塞尔维亚","sl":"塞拉利昂","sn":"塞内加尔","cy":"塞浦路斯","sc":"塞舌尔","sa":"沙特阿拉伯","bl":"圣巴泰勒米","cx":"圣诞岛","st":"圣多美和普林西比","sh":"圣赫勒拿","kn":"圣基茨和尼维斯","lc":"圣卢西亚","sm":"圣马力诺","pm":"圣皮埃尔和密克隆群岛","vc":"圣文森特和格林纳丁斯","lk":"斯里兰卡","sk":"斯洛伐克","si":"斯洛文尼亚","sj":"斯瓦尔巴和扬马延","sz":"斯威士兰","sd":"苏丹","sr":"苏里南","sb":"所罗门群岛","so":"索马里","tj":"塔吉克斯坦","tw":"台湾","th":"泰国","tz":"坦桑尼亚","to":"汤加","tc":"特克斯和凯科斯群岛","ta":"特里斯坦-达库尼亚群岛","tt":"特立尼达和多巴哥","tn":"突尼斯","tv":"图瓦卢","tr":"土耳其","tm":"土库曼斯坦","tk":"托克劳","wf":"瓦利斯和富图纳","vu":"瓦努阿图","gt":"危地马拉","ve":"委内瑞拉","bn":"文莱","ug":"乌干达","ua":"乌克兰","uy":"乌拉圭","uz":"乌兹别克斯坦","gr":"希腊","es":"西班牙","eh":"西撒哈拉","sg":"新加坡","nc":"新喀里多尼亚","nz":"新西兰","hu":"匈牙利","ea":"休达及梅利利亚","sy":"叙利亚","jm":"牙买加","am":"亚美尼亚","ye":"也门","iq":"伊拉克","ir":"伊朗","il":"以色列","it":"意大利","in":"印度","id":"印度尼西亚","gb":"英国","vg":"英属维尔京群岛","io":"英属印度洋领地","jo":"约旦","vn":"越南","zm":"赞比亚","je":"泽西岛","td":"乍得","gi":"直布罗陀","cl":"智利","cf":"中非共和国","cn":"中国","mo":"中国澳门特别行政区","hk":"中国香港特别行政区"} -------------------------------------------------------------------------------- /lang/ko.json: -------------------------------------------------------------------------------- 1 | {"is":"아이슬란드","ie":"아일랜드","az":"아제르바이잔","ac":"어센션 섬","af":"아프가니스탄","us":"미국","ae":"아랍에미리트","dz":"알제리","ar":"아르헨티나","aw":"아루바","al":"알바니아","am":"아르메니아","ai":"앵귈라","ao":"앙골라","ag":"앤티가 바부다","ad":"안도라","ye":"예멘","gb":"영국","il":"이스라엘","it":"이탈리아","iq":"이라크","ir":"이란","in":"인도","id":"인도네시아","wf":"왈리스 퓌튀나","ug":"우간다","ua":"우크라이나","uz":"우즈베키스탄","uy":"우루과이","ec":"에콰도 르","eg":"이집트","ee":"에스토니아","sz":"스와질란드","et":"에티오피아","er":"에리트레아","sv":"엘살바도르","au":"오스트레일리아","at":"오스트리아","ax":"올란드 제도","om":"오만","nl":"네덜란드","bq":"네덜란드령 안틸레스","gh":"가나","cv":"카보베르데","gg":"건지 섬","gy":"가이아나","kz":"카자흐스탄","qa":"카타르","ca":"캐나다","ic":"카나리 제도","ga":"가봉","cm":"카메룬","gm":"감비아","kh":"캄보디아","gn":"기니","gw":"기니비사우","cy":"키프로스","cu":"쿠바","cw":"퀴라소","gr":"그리스","ki":"키리바시","kg":"키르기스스탄","gt":"과테말라","gp":"과들루프","gu":"괌","kw":"쿠웨이트","ck":"쿡 제도","gl":"그린란드","cx":"크리스마스 섬","gd":"그레나다","hr":"크로아티아","ky":"케이맨 제도","ke":"케냐","ci":"코트디부아르","cc":"코코스 제도","cr":"코스타리카","xk":"코소보","km":"코모로","co":"콜롬비아","cg":"콩고 공 화국","cd":"콩고 민주 공화국","sa":"사우디아라비아","gs":"사우스조지아 사우스샌드위치 제도","ws":"사모아","bl":"생바르텔레미","mf":"세인트마틴 섬","st":"상투메 프린시페","zm":"잠비아","pm":"생피에르 미클롱","sm":"산마리노","sl":"시에라리온","dj":"지부티","gi":"지브롤터","je":"저지 섬","jm":"자메이카","ge":"조지아","sy":"시리아","sg":"싱가포르","sx":"신트마르턴","zw":"짐바브웨","ch":"스위스","se":"스웨덴","sd":"수단","sj":"스발바르 얀마옌","es":"스페인","sr":"수리남","lk":"스리랑카","sk":"슬로바키아","si":"슬로베니아","ea":"멜리야","sc":"세이셸","sn":"세네갈","rs":"세르비아","kn":"세인트키츠 네비스","vc":"세인트빈센트 그레나딘","sh":"세인트헬레나","lc":"세인트루시아","so":"소말리아","sb":"솔로몬 제도","tc":"터크스 케 이커스 제도","th":"타이","tj":"타지키스탄","tz":"탄자니아","cz":"체코","td":"차드","tn":"튀니지","cl":"칠레","tv":"투발루","dg":"디에고가르시아 섬","dk":"덴마크","de":"독일","tg":"토고","tk":"토켈라우","do":"도미니카 공화국","dm":"도미니카 연방","ta":"트리스탄다쿠냐","tt":"트리니다드 토바고","tm":"투르크메니스탄","tr":"터키","to":"통가","ng":"나이지리아","nr":"나우루","na":"나미비아","nu":"니우에","ni":"니카라 과","ne":"니제르","nc":"누벨칼레도니","nz":"뉴질랜드","np":"네팔","nf":"노퍽 섬","no":"노르웨이","bh":"바레인","ht":"아이티","pk":"파키스탄","va":"바티칸 시국","pa":"파나마","vu":"바누아투","bs":"바하마","pg":"파푸아뉴기니","bm":"버뮤다","pw":"팔라우","py":"파라과이","bb":"바베이도스","ps":"팔레스타인","hu":"헝가리","bd":"방글라데시","pn":"핏케언 제도","fj":"피지","ph":"필리핀","fi":" 핀란드","bt":"부탄","pr":"푸에르토리코","fo":"페로 제도","fk":"포클랜드 제도","br":"브라질","fr":"프랑스","bg":"불가리아","bf":"부르키나파소","bn":"브루나이","bi":"부룬디","vn":"베트남","bj":"베냉","ve":"베네수엘라","by":"벨라루스","bz":"벨리즈","pe":"페루","be":"벨기에","pl":"폴란드","ba":"보스니아 헤르체고비나","bw":"보츠와나","bo":"볼리비아","pt":"포르투갈","hn":"온두라스","mh":"마셜 제도","mg":"마다가스카르","yt":"마요트","mw":"말라위","ml":"말리","mt":"몰타","mq":"마르티니크","my":"말레이시 아","im":"맨 섬","fm":"미크로네시아 연방","mm":"미얀마","mx":"멕시코","mu":"모리셔스","mr":"모리타니","mz":"모잠비크","mc":"모나코","mv":"몰디브","md":"몰도바","ma":"모로코","mn":"몽골","me":"몬테네그로","ms":"몬트세랫","jo":"요르단","la":"라오스","lv":"라트비아","lt":"리투아니아","ly":"리비아","li":"리히텐슈타인","lr":"라이베리아","ro":"루마니 아","lu":"룩셈부르크","rw":"르완다","ls":"레소토","lb":"레바논","re":"레위니옹","ru":"러시아","io":"영국령 인도양 지역","vg":"영국령 버진아일랜드","kr":"대한민국","um":"미 국령 군소 제도","eh":"서사하라","gq":"적도 기니","tw":"중화민국","cf":"중앙아프리카 공화국","mo":"마카오","hk":"홍콩","cn":"중화인민공화국","tl":"동티모르","za":"남아프리카 공화국","ss":"남수단","aq":"남극","jp":"일본","gf":"프랑스령 기아나","pf":"프랑스령 폴리네시아","tf":"프랑스령 남방 및 남극","vi":"미국령 버진아일랜드","as":"아메리칸사모아","mk":"마케도니아 공화국","mp":"북마리아나 제도","kp":"조선민주주의인민공화국"} -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-phone-input-2", 3 | "version": "2.15.1", 4 | "description": "A react component to format phone numbers", 5 | "main": "lib/lib.js", 6 | "typings": "index.d.ts", 7 | "scripts": { 8 | "test": "jest", 9 | "start": "TARGET=dev_js NODE_ENV=development webpack-dev-server --progress", 10 | "start:css": "TARGET=dev_css NODE_ENV=development webpack-dev-server --progress", 11 | "build": "export SET NODE_OPTIONS=--openssl-legacy-provider && npm run build:js && npm run build:css", 12 | "build:js": "TARGET=build_js NODE_ENV=production webpack -p --progress", 13 | "build:css": "TARGET=build_css NODE_ENV=production webpack -p --progress && rm ./main.js", 14 | "prepublishOnly": "npm run build", 15 | "analyze": "TARGET=analyze NODE_ENV=production webpack -p --progress" 16 | }, 17 | "repository": { 18 | "type": "git", 19 | "url": "git+https://github.com/bl00mber/react-phone-input-2.git" 20 | }, 21 | "keywords": [ 22 | "react", 23 | "phone", 24 | "format", 25 | "number", 26 | "input", 27 | "telephone", 28 | "javascript", 29 | "international", 30 | "tel", 31 | "localized", 32 | "material", 33 | "bootstrap", 34 | "i18n" 35 | ], 36 | "files": [ 37 | "lang", 38 | "lib", 39 | "LICENSE", 40 | "README.md", 41 | "index.d.ts" 42 | ], 43 | "author": "Nick Reiley (https://github.com/bl00mber)", 44 | "contributors": [ 45 | "Raza Gill (https://github.com/razagill)" 46 | ], 47 | "license": "MIT", 48 | "bugs": { 49 | "url": "https://github.com/bl00mber/react-phone-input-2/issues" 50 | }, 51 | "homepage": "https://github.com/bl00mber/react-phone-input-2", 52 | "jest": { 53 | "moduleNameMapper": { 54 | "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2)$": "/test/__mocks__/fileMock.js", 55 | "\\.(css|less|stylus|scss)$": "/test/__mocks__/styleMock.js" 56 | }, 57 | "globals": { 58 | "__DEV__": false 59 | } 60 | }, 61 | "devDependencies": { 62 | "@babel/core": "^7.3.3", 63 | "babel-loader": "^8.0.5", 64 | "babel-preset-react-app": "^7.0.1", 65 | "css-loader": "^2.1.0", 66 | "extract-loader": "^3.1.0", 67 | "file-loader": "^5.0.2", 68 | "jest": "^24.7.0", 69 | "less": "^3.9.0", 70 | "less-loader": "^4.1.0", 71 | "react": "^17.0.2", 72 | "react-dom": "^17.0.2", 73 | "react-hot-loader": "^4.6.5", 74 | "react-testing-library": "^6.0.4", 75 | "style-loader": "^0.23.1", 76 | "url-loader": "^1.1.2", 77 | "webpack": "^4.29.5", 78 | "webpack-bundle-analyzer": "^3.0.4", 79 | "webpack-cli": "^3.2.3", 80 | "webpack-dev-server": "^3.1.14", 81 | "webpack-merge": "^4.2.1" 82 | }, 83 | "peerDependencies": { 84 | "react": "^16.12.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0", 85 | "react-dom": "^16.12.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0" 86 | }, 87 | "dependencies": { 88 | "classnames": "^2.2.6", 89 | "lodash.debounce": "^4.0.8", 90 | "lodash.memoize": "^4.1.2", 91 | "lodash.reduce": "^4.6.0", 92 | "lodash.startswith": "^4.2.1", 93 | "prop-types": "^15.7.2" 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /lang/jp.json: -------------------------------------------------------------------------------- 1 | {"is":"アイスランド","ie":"アイルランド","az":"アゼルバイジャン","ac":"アセンション島","af":"アフガニスタン","us":"アメリカ合衆国","ae":"アラブ首長国連邦","dz":"アルジェリア","ar":"アルゼンチン","aw":"アルバ","al":"アルバニア","am":"アルメニア","ai":"アンギラ","ao":"アンゴラ","ag":"アンティグア・バーブーダ","ad":"アンドラ","ye":"イエメン","gb":"イギリス","il":"イスラエル","it":"イタリア","iq":"イラク","ir":"イラン","in":"インド","id":"インドネシア","wf":"ウォリス・フツナ","ug":"ウガンダ","ua":"ウクライナ","uz":"ウズベキスタン","uy":"ウルグアイ","ec":"エクアドル","eg":"エジプト","ee":"エストニア","sz":"エスワティニ","et":"エチオピア","er":"エリトリア","sv":"エルサルバドル","au":"オーストラリア","at":"オーストリア","ax":"オーランド諸島","om":"オマーン","nl":"オランダ","bq":"オランダ領カリブ","gh":"ガーナ","cv":"カーボベルデ","gg":"ガーンジー","gy":"ガイアナ","kz":"カザフスタン","qa":"カタール","ca":"カナダ","ic":"カナリア諸島","ga":"ガボン","cm":"カメルーン","gm":"ガンビア","kh":"カンボジア","gn":"ギニア","gw":"ギニアビサウ","cy":"キプロス","cu":"キューバ","cw":"キュラソー","gr":"ギリシャ","ki":"キリバス","kg":"キルギス","gt":"グアテマラ","gp":"グアドループ","gu":"グアム","kw":"クウェート","ck":"クック諸島","gl":"グリーンランド","cx":"クリスマス島","gd":"グレナダ","hr":"クロアチア","ky":"ケイマン諸島","ke":"ケニア","ci":"コートジボワール","cc":"ココ","cr":"コスタリカ","xk":"コソボ","km":"コモロ","co":"コロンビア","cg":"コンゴ共和","cd":"コンゴ民主共和","sa":"サウジアラビア","gs":"サウスジョージア・サウスサンドウィッチ諸島","ws":"サモア","bl":"サン・バルテルミー","mf":"サン・マルタン","st":"サントメ・プリンシペ","zm":"ザンビア","pm":"サンピエール島・ミクロン島","sm":"サンマリノ","sl":"シエラレオネ","dj":"ジブチ","gi":"ジブラルタル","je":"ジャージー","jm":"ジャマイカ","ge":"ジョージア","sy":"シリア","sg":"シンガポール","sx":"シント・マールテン","zw":"ジンバブエ","ch":"スイス","se":"スウェーデン","sd":"スーダン","sj":"スバールバル諸島・ヤンマイエン島","es":"スペイン","sr":"スリナム","lk":"スリランカ","sk":"スロバキア","si":"スロベニア","ea":"セウタ・メリリャ","sc":"セーシェル","sn":"セネガル","rs":"セルビア","kn":"セントクリストファー・ネーヴィス","vc":"セントビンセント及びグレナディーン諸島","sh":"セントヘレナ","lc":"セントルシア","so":"ソマリア","sb":"ソロモン諸島","tc":"タークス・カイコス諸島","th":"タイ","tj":"タジキスタン","tz":"タンザニア","cz":"チェコ","td":"チャド","tn":"チュニジア","cl":"チリ","tv":"ツバル","dg":"ディエゴガルシア島","dk":"デンマーク","de":"ドイツ","tg":"トーゴ","tk":"トケラウ","do":"ドミニカ共和国","dm":"ドミニカ国","ta":"トリスタン・ダ・クーニャ","tt":"トリニダード・トバゴ","tm":"トルクメニスタン","tr":"トルコ","to":"トンガ","ng":"ナイジェリア","nr":"ナウル","na":"ナミビア","nu":"ニウエ","ni":"ニカラグア","ne":"ニジェール","nc":"ニューカレドニア","nz":"ニュージーランド","np":"ネパール","nf":"ノーフォーク島","no":"ノルウェー","bh":"バーレーン","ht":"ハイチ","pk":"パキスタン","va":"バチカン市国","pa":"パナマ","vu":"バヌアツ","bs":"バハマ","pg":"パプアニューギニア","bm":"バミューダ","pw":"パラオ","py":"パラグアイ","bb":"バルバドス","ps":"パレスチナ自治区","hu":"ハンガリー","bd":"バングラデシュ","pn":"ピトケアン諸島","fj":"フィジー","ph":"フィリピン","fi":"フィンランド","bt":"ブータン","pr":"プエルトリコ","fo":"フェロー諸島","fk":"フォークランド諸島","br":"ブラジル","fr":"フランス","bg":"ブルガリア","bf":"ブルキナファソ","bn":"ブルネイ","bi":"ブルンジ","vn":"ベトナム","bj":"ベナン","ve":"ベネズエラ","by":"ベラルーシ","bz":"ベリーズ","pe":"ペルー","be":"ベルギー","pl":"ポーランド","ba":"ボスニア・ヘルツェゴビナ","bw":"ボツワナ","bo":"ボリビア","pt":"ポルトガル","hn":"ホンジュラス","mh":"マーシャル諸島","mg":"マダガスカル","yt":"マヨット","mw":"マラウイ","ml":"マリ","mt":"マルタ","mq":"マルティニーク","my":"マレーシア","im":"マン島","fm":"ミクロネシア連邦","mm":"ミャンマー","mx":"メキシコ","mu":"モーリシャス","mr":"モーリタニア","mz":"モザンビーク","mc":"モナコ","mv":"モルディブ","md":"モルドバ","ma":"モロッコ","mn":"モンゴル","me":"モンテネグロ","ms":"モントセラト","jo":"ヨルダン","la":"ラオス","lv":"ラトビア","lt":"リトアニア","ly":"リビア","li":"リヒテンシュタイン","lr":"リベリア","ro":"ルーマニア","lu":"ルクセンブルク","rw":"ルワンダ","ls":"レソト","lb":"レバノン","re":"レユニオン","ru":"ロシア","io":"英領インド洋地域","vg":"英領ヴァージン諸島","kr":"韓国","um":"合衆国領有小離島","eh":"西サハラ","gq":"赤道ギニア","tw":"台湾","cf":"中央アフリカ共和国","mo":"中華人民共和国マカオ特別行政区","hk":"中華人民共和国香港特別行政区","cn":"中国","tl":"東ティモール","za":"南アフリカ","ss":"南スーダン","aq":"南極","jp":"日本","gf":"仏領ギアナ","pf":"仏領ポリネシア","tf":"仏領極南諸島","vi":"米領ヴァージン諸島","as":"米領サモア","mk":"北マケドニア","mp":"北マリアナ諸島","kp":"北朝鮮"} -------------------------------------------------------------------------------- /src/rawTerritories.js: -------------------------------------------------------------------------------- 1 | // Country model: 2 | // [ 3 | // Country name, 4 | // Regions, 5 | // iso2 code, 6 | // International dial code, 7 | // Format (if available), 8 | // Order priority (if >1 country with same dial code), 9 | // Area codes (if >1 country with same dial code) 10 | // ] 11 | // 12 | // Regions: 13 | // ['america', 'europe', 'asia', 'oceania', 'africa'] 14 | // 15 | // Sub-regions: 16 | // ['north-america', 'south-america', 'central-america', 'carribean', 17 | // 'eu-union', 'ex-ussr', 'ex-yugos', 'baltic', 'middle-east', 'north-africa'] 18 | 19 | const rawTerritories = [ 20 | [ 21 | 'American Samoa', 22 | ['oceania'], 23 | 'as', 24 | '1684' 25 | ], 26 | [ 27 | 'Anguilla', 28 | ['america', 'carribean'], 29 | 'ai', 30 | '1264' 31 | ], 32 | [ 33 | 'Bermuda', 34 | ['america', 'north-america'], 35 | 'bm', 36 | '1441' 37 | ], 38 | [ 39 | 'British Virgin Islands', 40 | ['america', 'carribean'], 41 | 'vg', 42 | '1284' 43 | ], 44 | [ 45 | 'Cayman Islands', 46 | ['america', 'carribean'], 47 | 'ky', 48 | '1345' 49 | ], 50 | [ 51 | 'Cook Islands', 52 | ['oceania'], 53 | 'ck', 54 | '682' 55 | ], 56 | [ 57 | 'Falkland Islands', 58 | ['america', 'south-america'], 59 | 'fk', 60 | '500' 61 | ], 62 | [ 63 | 'Faroe Islands', 64 | ['europe'], 65 | 'fo', 66 | '298' 67 | ], 68 | [ 69 | 'Gibraltar', 70 | ['europe'], 71 | 'gi', 72 | '350' 73 | ], 74 | [ 75 | 'Greenland', 76 | ['america'], 77 | 'gl', 78 | '299' 79 | ], 80 | [ 81 | 'Jersey', 82 | ['europe', 'eu-union'], 83 | 'je', 84 | '44', 85 | '.... ......' 86 | ], 87 | [ 88 | 'Montserrat', 89 | ['america', 'carribean'], 90 | 'ms', 91 | '1664' 92 | ], 93 | [ 94 | 'Niue', 95 | ['asia'], 96 | 'nu', 97 | '683' 98 | ], 99 | [ 100 | 'Norfolk Island', 101 | ['oceania'], 102 | 'nf', 103 | '672' 104 | ], 105 | [ 106 | 'Northern Mariana Islands', 107 | ['oceania'], 108 | 'mp', 109 | '1670' 110 | ], 111 | [ 112 | 'Saint Barthélemy', 113 | ['america', 'carribean'], 114 | 'bl', 115 | '590', 116 | '', 117 | 1 118 | ], 119 | [ 120 | 'Saint Helena', 121 | ['africa'], 122 | 'sh', 123 | '290' 124 | ], 125 | [ 126 | 'Saint Martin', 127 | ['america', 'carribean'], 128 | 'mf', 129 | '590', 130 | '', 131 | 2 132 | ], 133 | [ 134 | 'Saint Pierre and Miquelon', 135 | ['america', 'north-america'], 136 | 'pm', 137 | '508' 138 | ], 139 | [ 140 | 'Sint Maarten', 141 | ['america', 'carribean'], 142 | 'sx', 143 | '1721' 144 | ], 145 | [ 146 | 'Tokelau', 147 | ['oceania'], 148 | 'tk', 149 | '690' 150 | ], 151 | [ 152 | 'Turks and Caicos Islands', 153 | ['america', 'carribean'], 154 | 'tc', 155 | '1649' 156 | ], 157 | [ 158 | 'U.S. Virgin Islands', 159 | ['america', 'carribean'], 160 | 'vi', 161 | '1340' 162 | ], 163 | [ 164 | 'Wallis and Futuna', 165 | ['oceania'], 166 | 'wf', 167 | '681' 168 | ], 169 | ] 170 | 171 | export default rawTerritories 172 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | declare module "react-phone-input-2" { 2 | import React from "react"; 3 | 4 | export interface CountryData { 5 | name: string; 6 | dialCode: string; 7 | countryCode: string; 8 | format: string; 9 | } 10 | 11 | interface Style { 12 | containerClass?: string; 13 | inputClass?: string; 14 | buttonClass?: string; 15 | dropdownClass?: string; 16 | searchClass?: string; 17 | 18 | containerStyle?: React.CSSProperties; 19 | inputStyle?: React.CSSProperties; 20 | buttonStyle?: React.CSSProperties; 21 | dropdownStyle?: React.CSSProperties; 22 | searchStyle?: React.CSSProperties; 23 | } 24 | 25 | interface PhoneInputEventsProps { 26 | onChange?( 27 | value: string, 28 | data: CountryData | {}, 29 | event: React.ChangeEvent, 30 | formattedValue: string 31 | ): void; 32 | onFocus?( 33 | event: React.FocusEvent, 34 | data: CountryData | {} 35 | ): void; 36 | onBlur?( 37 | event: React.FocusEvent, 38 | data: CountryData | {} 39 | ): void; 40 | onClick?( 41 | event: React.MouseEvent, 42 | data: CountryData | {} 43 | ): void; 44 | onKeyDown?(event: React.KeyboardEvent): void; 45 | onEnterKeyPress?(event: React.KeyboardEvent): void; 46 | isValid?: (( 47 | value: string, 48 | country: object, 49 | countries: object[], 50 | hiddenAreaCodes: object[], 51 | ) => boolean | string) | boolean; 52 | onMount?( 53 | value: string, 54 | data: CountryData | {}, 55 | formattedValue: string 56 | ): void; 57 | } 58 | 59 | export interface PhoneInputProps extends PhoneInputEventsProps, Style { 60 | country?: string | number; 61 | value?: string | null; 62 | 63 | onlyCountries?: string[]; 64 | preferredCountries?: string[]; 65 | excludeCountries?: string[]; 66 | 67 | placeholder?: string; 68 | searchPlaceholder?: string; 69 | searchNotFound?: string; 70 | disabled?: boolean; 71 | 72 | autoFormat?: boolean; 73 | enableAreaCodes?: boolean; 74 | enableTerritories?: boolean; 75 | 76 | disableCountryCode?: boolean; 77 | disableDropdown?: boolean; 78 | enableLongNumbers?: boolean | number; 79 | countryCodeEditable?: boolean; 80 | enableSearch?: boolean; 81 | disableSearchIcon?: boolean; 82 | 83 | regions?: string | string[]; 84 | 85 | inputProps?: object; 86 | localization?: object; 87 | masks?: object; 88 | areaCodes?: object; 89 | 90 | preserveOrder?: string[]; 91 | 92 | defaultMask?: string; 93 | 94 | alwaysDefaultMask?: boolean; 95 | prefix?: string; 96 | copyNumbersOnly?: boolean; 97 | renderStringAsFlag?: string; 98 | autocompleteSearch?: boolean; 99 | jumpCursorToEnd?: boolean; 100 | priority?: object; 101 | enableAreaCodeStretch?: boolean; 102 | enableClickOutside?: boolean; 103 | showDropdown?: boolean; 104 | 105 | defaultErrorMessage?: string; 106 | specialLabel?: string; 107 | disableInitialCountryGuess?: boolean; 108 | disableCountryGuess?: boolean; 109 | } 110 | const PhoneInput: React.FC; 111 | export default PhoneInput; 112 | } 113 | -------------------------------------------------------------------------------- /lang/pl.json: -------------------------------------------------------------------------------- 1 | {"af":"Afganistan","al":"Albania","dz":"Algeria","ad":"Andora","ao":"Angola","ag":"Antigua i Barbuda","ar":"Argentyna","am":"Armenia","aw":"Aruba","au":"Australia","at":"Austria","az":"Azerbejdżan","bs":"Bahamy","bh":"Bahrajn","bd":"Bangladesz","bb":"Barbados","by":"Białoruś","be":"Belgia","bz":"Belize","bj":"Benin","bt":"Bhutan","bo":"Boliwia","ba":"Bośnia i Hercegowina","bw":"Botswana","br":"Brazylia","io":"Brytyjskie Terytorium Oceanu Indyjskiego","bn":"Brunei Darussalam","bg":"Bułgaria","bf":"Burkina Faso","bi":"Burundi","kh":"Kambodża","cm":"Kamerun","ca":"Kanada","cv":"Zielony Przylądek","bq":"Holandia Karaibska","cf":"Republika Środkowoafrykańska","td":"Czad","cl":"Chile","cn":"Chiny","co":"Kolombia","km":"Komory","cd":"Kongo, Republika Demokratyczna","cg":"Kongo","cr":"Kostaryka","ci":"Wybrzeże Kości Słoniowej","hr":"Chorwacja","cu":"Kuba","cw":"Curaçao","cy":"Cypr","cz":"Republika Czeska","dk":"Dania","dj":"Dżibuti","dm":"Dominika","do":"Dominikana","ec":"Ekwador","eg":"Egipt","sv":"Salwador","gq":"Gwinea Równikowa","er":"Erytrea","ee":"Estonia","et":"Etiopia","fj":"Fidżi Republika","fi":"Finlandia","fr":"Francja","gf":"Gujana Francuska","pf":"Polinezja Francuska","ga":"Gabon","gm":"Gambia","ge":"Gruzja","de":"Niemcy","gh":"Ghana","gr":"Grecja","gd":"Grenada","gp":"Gwadelupa","gu":"Guam","gt":"Gwatemala","gn":"Gwinea","gw":"Guinea-Bissau","gy":"Gujana","ht":"Haiti","hn":"Honduras","hk":"Hongkong","hu":"Węgry","is":"Islandia","in":"Indie","id":"Indonezja","ir":"Iran","iq":"Irak","ie":"Irlandia","il":"Izrael","it":"Włochy","jm":"Jamaika","jp":"Japonia","jo":"Jordania","kz":"Kazachstan","ke":"Kenia","ki":"Kiribati","xk":"Kosowo","kw":"Kuwejt","kg":"Kirgistan","la":"Laos","lv":"Łotwa","lb":"Liban","ls":"Lesotho","lr":"Liberia","ly":"Libia","li":"Liechtenstein","lt":"Litwa","lu":"Luksemburg","mo":"Makau","mk":"Macedonia","mg":"Madagaskar","mw":"Malawi","my":"Malezja","mv":"Malediwy","ml":"Mali","mt":"Malta","mh":"Wyspy Marshalla","mq":"Martynika","mr":"Mauretania","mu":"Mauritius","mx":"Meksyk","fm":"Mikronezja","md":"Mołdowa","mc":"Monako","mn":"Mongolia","me":"Czarnogóra","ma":"Maroko","mz":"Mozambik","mm":"Myanmar","na":"Namibia","nr":"Nauru","np":"Nepal","nl":"Niderlandy","nc":"Nowa Kaledonia","nz":"Nowa Zelandia","ni":"Nikaragua","ne":"Niger","ng":"Nigeria","kp":"Północna Korea","no":"Norwegia","om":"Oman","pk":"Pakistan","pw":"Palau","ps":"Palestyna","pa":"Panama","pg":"Papua Nowa Gwinea","py":"Paragwaj","pe":"Peru","ph":"Filipiny","pl":"Polska","pt":"Portugalia","pr":"Portoryko","qa":"Katar","re":"Reunion","ro":"Rumunia","ru":"Rosja","rw":"Rwanda","kn":"Saint Kitts i Nevis","lc":"Saint Lucia","vc":"Saint Vincent i Grenadyny","ws":"Samoa","sm":"San Marino","st":"Wyspy Św.Tomasza i Książęca","sa":"Arabia Saudyjska","sn":"Senegal","rs":"Serbia","sc":"Seszele","sl":"Sierra Leone","sg":"Singapur","sk":"Słowacja","si":"Słowenia","sb":"Wyspy Salomona","so":"Somalia","za":"Republika Południowej Afryki","kr":"Południowa Korei","ss":"Sudan","es":"Hiszpania","lk":"Sri Lanka","sd":"Sudan","sr":"Surinam","sz":"Suazi","se":"Szwecja","ch":"Szwajcaria","sy":"Syria","tw":"Tajwan","tj":"Tadżykistan","tz":"Tanzania","th":"Tajlandia","tl":"Timor Wschodni","tg":"Togo","to":"Tonga","tt":"Trynidad i Tobago","tn":"Tunezja","tr":"Turcja","tm":"Turkmenistan","tv":"Tuvalu","ug":"Uganda","ua":"Ukraina","ae":"Zjednoczone Emiraty Arabskie","gb":"Wielka Brytania","us":"Stany Zjednoczone Ameryki","uy":"Urugwaj","uz":"Uzbekistan","vu":"Vanuatu","va":"Watykan","ve":"Wenezuela","vn":"Wietnam","ye":"Jemen","zm":"Zambia","zw":"Zimbabwe"} -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const webpack = require('webpack'); 3 | const merge = require('webpack-merge'); 4 | const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; 5 | 6 | const TARGET = process.env.TARGET; 7 | const ROOT_PATH = path.resolve(__dirname); 8 | const nodeModulesDir = path.join(ROOT_PATH, 'node_modules'); 9 | 10 | const common = { 11 | entry: { 12 | 'lib/lib': path.resolve(ROOT_PATH, 'src/index.js') 13 | }, 14 | output: { 15 | path: ROOT_PATH, 16 | filename: '[name].js' 17 | }, 18 | resolve: { 19 | extensions: ['.js', '.jsx'], 20 | modules: ['node_modules'] 21 | }, 22 | module: { 23 | rules: [ 24 | { 25 | test: /\.(js|jsx)$/, 26 | loader: 'babel-loader', 27 | include: [ 28 | path.resolve(ROOT_PATH, 'src'), 29 | path.resolve(ROOT_PATH, 'test') 30 | ] 31 | }, 32 | { 33 | test: /\.png.*$/, 34 | loaders: ['url-loader?limit=100000&mimetype=image/png'], 35 | exclude: /node_modules/ 36 | } 37 | ] 38 | } 39 | }; 40 | 41 | if (TARGET === 'dev_js' || TARGET === 'dev_css') { 42 | module.exports = merge(common, { 43 | mode: 'development', 44 | entry: { 45 | 'demo': path.resolve(ROOT_PATH, 'test/' + TARGET + '/demo.js') 46 | }, 47 | devtool: 'inline-source-map', 48 | devServer: { 49 | publicPath: 'http://localhost:3000/', 50 | port: '3000', 51 | host: '0.0.0.0', 52 | historyApiFallback: true, 53 | hot: true, 54 | inline: true, 55 | progress: true, 56 | contentBase: ['lib', 'test/index'] 57 | }, 58 | module: { 59 | rules: [ 60 | { 61 | test: /\.less$/, 62 | loader: 'style-loader!css-loader!less-loader' 63 | } 64 | ] 65 | }, 66 | plugins: [ 67 | new webpack.HotModuleReplacementPlugin(), 68 | new webpack.DefinePlugin({ 69 | 'process.env': { 70 | NODE_ENV: JSON.stringify('development') 71 | }, 72 | __DEV__: true 73 | }) 74 | ] 75 | }); 76 | } 77 | 78 | if (TARGET === 'build_js' || TARGET === 'analyze') { 79 | module.exports = merge(common, { 80 | mode: 'production', 81 | optimization: {}, 82 | output: { 83 | library: 'ReactPhoneInput', 84 | libraryTarget: 'commonjs2', 85 | globalObject: 'this' 86 | }, 87 | externals: [ 88 | { 89 | react: { 90 | root: 'React', 91 | commonjs2: 'react', 92 | commonjs: 'react', 93 | amd: 'react' 94 | } 95 | } 96 | ], 97 | plugins: [ 98 | new webpack.DefinePlugin({ 99 | 'process.env': { 100 | NODE_ENV: JSON.stringify('production') 101 | }, 102 | __DEV__: false 103 | }), 104 | ...(TARGET === 'analyze' ? [new BundleAnalyzerPlugin()] : []) 105 | ] 106 | }); 107 | } 108 | 109 | if (TARGET === 'build_css') { 110 | module.exports = merge(common, { 111 | entry: [ 112 | './src/style/style.less', 113 | './src/style/high-res.less', 114 | './src/style/material.less', 115 | './src/style/bootstrap.less', 116 | './src/style/semantic-ui.less', 117 | './src/style/plain.less' 118 | ], 119 | mode: 'production', 120 | module: { 121 | rules: [ 122 | { 123 | test: /\.less$/, 124 | use: [ 125 | { 126 | loader: 'file-loader', 127 | options: { 128 | name: 'lib/[name].css', 129 | } 130 | }, 131 | 'extract-loader', 132 | 'css-loader', 133 | 'less-loader' 134 | ] 135 | } 136 | ] 137 | } 138 | }); 139 | } 140 | -------------------------------------------------------------------------------- /test/dev_css/demo.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { render } from 'react-dom'; 3 | import PhoneInput from '../../src/index'; 4 | // import '../../src/style/material.less'; // enable on dev 5 | 6 | 7 | class Demo extends React.Component { 8 | state = { currentStyle: '', fetch: true } 9 | 10 | componentDidMount () { 11 | this.loadCSS('material') // disable on dev 12 | // this.setState({ fetch: false }) // enable on dev 13 | } 14 | 15 | updateStyle = (e) => { 16 | const text = e.target.textContent 17 | this.setState({ fetch: true }, () => 18 | this.toggleCSS(this.state.currentStyle, text)) 19 | } 20 | 21 | toggleCSS = (unloadFilename, loadFilename) => { 22 | // unload 23 | var links=document.getElementsByTagName("link") 24 | for (var i=links.length; i>=0; i--){ //search backwards within nodelist for matching elements to remove 25 | if (links[i] && links[i].getAttribute("href")!=null && links[i].getAttribute("href").indexOf(unloadFilename+'.css')!=-1) 26 | links[i].parentNode.removeChild(links[i]) //remove element by calling parentNode.removeChild() 27 | } 28 | 29 | this.loadCSS(loadFilename) 30 | } 31 | 32 | loadCSS = (loadFilename) => { 33 | // load 34 | const link=document.createElement("link") 35 | link.setAttribute("rel", "stylesheet") 36 | link.setAttribute("type", "text/css") 37 | link.setAttribute("href", loadFilename+'.css') 38 | if (typeof link!="undefined") document.getElementsByTagName("head")[0].appendChild(link) 39 | 40 | link.onload = () => this.setState({currentStyle: loadFilename, fetch: false}) 41 | } 42 | 43 | render() { 44 | const { currentStyle, fetch } = this.state 45 | return ( 46 |
47 |