From 4ad8f01179a4646152973a0b599f4316fcd72b8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E7=91=9E=E4=B8=9C?= Date: Fri, 1 Jul 2016 13:52:15 +0800 Subject: [PATCH 1/7] chore(info): change package info --- package.json | 8 ++++++-- sample/package.json | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 51a0138..c463950 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,12 @@ "react-native", "toast" ], - "author": "lrdcq", - "license": "ISC", + "repository": { + "type": "git", + "url": "git+https://github.com/xgfe/react-native-simple-toast.git" + }, + "author": "xgfe", + "license": "MIT", "dependencies": { "react": "15.1.0", "react-native": "^0.28.0" diff --git a/sample/package.json b/sample/package.json index 6a9f61d..363b237 100644 --- a/sample/package.json +++ b/sample/package.json @@ -7,6 +7,7 @@ }, "dependencies": { "react": "15.1.0", - "react-native": "^0.28.0" + "react-native": "^0.28.0", + "react-native-simple-toast": "latest" } } From a14182fab289414df903f0df6bbd79e294181bfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E7=91=9E=E4=B8=9C?= Date: Fri, 1 Jul 2016 15:11:25 +0800 Subject: [PATCH 2/7] fix(index):iimprove something --- index.android.js | 11 ----------- index.ios.js => index.js | 4 ++-- package.json | 4 ++-- sample/index.android.js | 2 +- sample/index.ios.js | 2 +- sample/package.json | 2 +- 6 files changed, 7 insertions(+), 18 deletions(-) delete mode 100644 index.android.js rename index.ios.js => index.js (61%) diff --git a/index.android.js b/index.android.js deleted file mode 100644 index 114bcc3..0000000 --- a/index.android.js +++ /dev/null @@ -1,11 +0,0 @@ -import {ToastAndroid} from 'react-native'; - -var SimpleToast = { - SHORT: ToastAndroid.SHORT, - LONG: ToastAndroid.LONG, - show: function (message:string, duration:number):void { - ToastAndroid.show(message, duration === undefined ? this.SHORT : duration); - } -}; - -export default SimpleToast; diff --git a/index.ios.js b/index.js similarity index 61% rename from index.ios.js rename to index.js index c913ebb..c0111e4 100644 --- a/index.ios.js +++ b/index.js @@ -1,6 +1,6 @@ -import {NativeModules} from 'react-native'; +import {NativeModules,ToastAndroid,Platform} from 'react-native'; -var RCTToastModule = NativeModules.LRDRCTSimpleToast; +var RCTToastModule = Platform.OS === 'android' ? ToastAndroid : NativeModules.LRDRCTSimpleToast; var SimpleToast = { SHORT: RCTToastModule.SHORT, diff --git a/package.json b/package.json index c463950..8230670 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "react-native-simple-toast", - "version": "0.0.1", - "description": "simple toast for react-native. In Android it's just native toast, in iOS it's https://github.com/scalessec/Toast", + "version": "0.0.2", + "description": "Simple Toast for react-native. In Android it's just native toast, in iOS it's https://github.com/scalessec/Toast", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" diff --git a/sample/index.android.js b/sample/index.android.js index cb77ad9..eccce01 100644 --- a/sample/index.android.js +++ b/sample/index.android.js @@ -12,7 +12,7 @@ import { Text, View } from 'react-native'; -import Toast from './node_modules/react-native-simple-toast/index.android'; +import Toast from 'react-native-simple-toast'; class samples extends Component { render() { return ( diff --git a/sample/index.ios.js b/sample/index.ios.js index c91822e..eccce01 100644 --- a/sample/index.ios.js +++ b/sample/index.ios.js @@ -12,7 +12,7 @@ import { Text, View } from 'react-native'; -import Toast from './node_modules/react-native-simple-toast/index.ios'; +import Toast from 'react-native-simple-toast'; class samples extends Component { render() { return ( diff --git a/sample/package.json b/sample/package.json index 363b237..e044c4f 100644 --- a/sample/package.json +++ b/sample/package.json @@ -8,6 +8,6 @@ "dependencies": { "react": "15.1.0", "react-native": "^0.28.0", - "react-native-simple-toast": "latest" + "react-native-simple-toast": "0.0.2" } } From 47762bff9e01f764bb2ad56e707b038ae8ee0e38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E7=91=9E=E4=B8=9C?= Date: Fri, 1 Jul 2016 16:43:01 +0800 Subject: [PATCH 3/7] chore(readme): upload README.md --- README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..d35bb02 --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +# react-native-simple-toast +React Native Toast component for both Android and iOS. It just let iOS have the same toast performance with Android. Using [scalessec/Toast](https://github.com/scalessec/Toast) for iOS; + +## Install +You can use [rnpm](https://github.com/rnpm/rnpm) to install native component easily; + +```bash +npm install react-native-simple-toast --save +rnpm link +``` + +## Usage + +It's just the same as [ToastAndroid](http://facebook.github.io/react-native/docs/toastandroid.html) + +```javascript +import Toast from 'react-native-simple-toast'; + +Toast.show('This is a toast.'); +Toast.show('This is a long toast.',Toast.LONG); +``` \ No newline at end of file From add67adc52b538f9033efbc0ad5ff8fda8efee37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E7=91=9E=E4=B8=9C?= Date: Tue, 5 Jul 2016 15:15:01 +0800 Subject: [PATCH 4/7] chore(readme): update package info --- .npmignore | 44 ++++++++++++++++++ .../UserInterfaceState.xcuserstate | Bin 25424 -> 44694 bytes package.json | 8 +--- sample/package.json | 2 +- 4 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 .npmignore diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..8d73aad --- /dev/null +++ b/.npmignore @@ -0,0 +1,44 @@ +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +project.xcworkspace + +# Android/IJ +# +*.iml +.idea +.gradle +local.properties + +# node.js +# +node_modules/ +npm-debug.log + +# BUCK +buck-out/ +\.buckd/ +android/app/libs +android/keystores/debug.keystore + +# npmignore +sample diff --git a/ios/LRDRCTSimpleToast.xcodeproj/project.xcworkspace/xcuserdata/luoruidong.xcuserdatad/UserInterfaceState.xcuserstate b/ios/LRDRCTSimpleToast.xcodeproj/project.xcworkspace/xcuserdata/luoruidong.xcuserdatad/UserInterfaceState.xcuserstate index 1964936895fd504a28216b29317f483907e8d8ea..70cccd4f9d845abc4050063b5bd94c54872bb0cc 100644 GIT binary patch literal 44694 zcmd3P2YeI9^6>3mk#ugdjVlHWt{C?U#!Z%FNyZIHt`x=C0vwDDE|dV_Ha&rmgd`-S zf+2)d(tGc{K`QCJlitfWx2KaOY*Ui=fA4$w@oY;ov$M0av(s*G!LshI{(D)JacBaXh$f+UG#O1nsc0(7 zLfNPo%|s=r6d8~MIZ-2OLd~cJwW2mO2Q5O2Q5QNEEkWIADe6J1&}y_Eos3RFXP`}J zGddTYk1j@+plxU;x&mE;u17bao6-H~0rVhx2tACRM=zik(MxDAdIi0S-a>Dq57B4n zTl5|J4gHS(#yl2r7!Jqda2%e1C*owBjSF!JuD~X2#Wq}v?YIfI;rZBwJMc=p3a`e; z;Wc+z}hG<-U~3SWn>$2Z}d@$L8yd=I`CKZqZ~kKxDh)A$+u0)7#{j9tq|*CbpUFU^`hiyPWM~``H0@kX^y9WLL2# zu_v>qu$$R)+4I=**)8k^?1k)3_6l|vdnLP@y^6h>y^Xz{y@P#(eUyESeTm)6?qgqO zUtwQmUt`~AKW0B+zhJ*)zhS@S5QjOI<2arZI1Q)eg1HcG92dt;;3jgDxOgs=o64ne zxm+HX&lPYpxN@$7GjOxG8m^YB;Jd$^mpTe&;9ySe+g2f0VM$GNAtXSo-+z1%C@>)hMihulZp$J{5} z@7y2UpWI*E-#o)39`h{E@p1eFej-1KkLM@zQ}_fvkx$~2`7}P0&*cmF8GI>k;LW^^ zujOa+&3p?#k9YG6`9=I*H=P%_i<1gp06vrt7*_UG)X1^k|lA1~e-*$7$ASB+ZGMQ#7Y*Hfqk&Y}TBwxlnVl<}%H8%}&jgnyWR} zX>QQmthr5dr{*5b{hEg~k7}OKJgs?7^P*;-=2gubnzuCXYCh0>tocmyrRIRDE`K<(RJt+>bi8@x?WwMZcw*Mw?=ooj_6L( zovJ%Scc$)a-MP9gx~;lPbeHRfbXVwh>#osVue(uqi|%&aUAlX959l7&J*In7_l)j& z-AlTcb+766>)zJAr~6R%iSBdVSGsR>-|K$T{i^#z_qT{eUet;KVz3x0juWHASaE_F zFD8h|;#4tR%o20OLa{_F70X1s=n$P^qu3-ii!EZS*e1>q=Zf>h`Jzj7i%Z2Gu~%Fs zE*IB`YsGcq@!~1s+2T3kX7OC{Jn?*Si?~hPE)I!1#OuWC#XaJk;$7n1;{D>o;$Cr| z__Fwl_^P;Hd|P}+d{_KX{961@{9gQ7{6+jj{4)Rr-~gd9v1hQmdoQD7L?(aL%*XH;cWnoQF(OhrZ0%>|WJ1;%`%OFzzLGB@}3E$Ls@-r+X&b__0c_Y9~5M=}$c z-u;iA<6dC|xaG1HAB3lvE@o zx%6ee^quVsjJ-VreZAe??mm~fpfIP%kdvKZG~^pI@+*x68Ph8b=8W8;9Al0le@0Pu zW!`)ly{o6QcV$&y`%C=73RIrDKZS3h7=Y7zbc!y0jF$^%Z*TX4_C8yGQ&)f2f^J|adicBc1(iNusY1+RW-!TD zG1*KGlgs2W`Ah**$P_Wtr64I-3X$|us1zoJOXH-7tC(UCVhK~qlriP-n}Mm6B0-SR zQjC-=Rlsjn$tDXm($L=zu1R~(fVs14ptrBTrhRqq;DAf72WA|Ldso)AujpFT4&Tgy z4?sLM?F-!9E`5f~tGd{JQfnOO>h2m?ZRm5iJHYK3XzFsWRLFTr$=@9$TR##ecYoKS zo>3^s3@P-x-2L)`0$Np9x4WTzVDUWoQ<;N|sAqI8eRz%CWH&k;T}zjByPdu5{R5dx zRawqv98B_d#xBKfXPnY_Sr(zDCa0HW+kks%|4Ve!v@mmqm{z7uij$^Di7J74%rQ*Z z5Hp`~NfV@rLrgofK$;}QOOxjT8DFK)!{4$HYTFm}bPWu4x*HNIq#GFde=jjz%(2W8 zrn^nqe?6d>Ey}O%{<(DyQx_;xZ%=#Q>LGwy+EVAJr(UAULod^J5Dx>uLxMCpp`th5 zXM|PE>iKn!+QET#P&7kdU;FAE%qr$MW+|8g`lrIkT4o&x%?mg@`VMBTJia>YdgcTs zd5Do1BBe;FLkwX~l2WCqRE7?BH@LCxPVZv7^zkhny`An%Sf5#41DW10G93ebgB=5d zeQuTR>CD+o@-F5KW&^X4Ig{DMoF%16)1-7ML&}u0b}{ELNzA$M?|f#9lnq8c#BS$j{XyOS=Rv(F7%O5WpkcL(fH)gXbo47mHcdKQ^`WMOnFdgx`!k4B|? zVQ-(?i=mK=1CkD7tz)2lV6fl&orjvNlb-zy!@@QSk)b^zk@3~3Ue0W1!nQNpq@3-{ zkd!N%SsApcy?fBzZ|L_0-No#dHT6mRsP}?seC(S z9#;2I8~IJ4l%#Ch_nA36m=Bl_nUADO$s|<`Z`@CrFZ?!5KJyhAPNTeO zmQ~PAqq6ud^MfDcbmk{1LNd#c8zeu--%u_ zG)RkdNJIfB5Cuuq(k!V)s+H=bdZ|I0E!nSPl8_$GiDIT0jYAPA63K_I1I~#^_)n6~ zlg^hem6bp*n_!cB!Qi4r?mlHUk)XGV;jM*j?t+cc)7jqFDcfTiSosQeXp<7@Dt|i$ z7c2$nHXlTNIAECE3)=^~2j~b2`FPJq4KjNF0BmKuds&~mAASKD_4dFi9jY?qwcc&r z^ceHmMkoO#fu5j5$+;aROO5hml9bUsN8VTic(ehfp>&zRG^uGj%8;6+Bxh}VSC9H_ z4k}>6cA#98hw`Nssa0y*feJyI)1^5e!Q*93nCds2Y(U%&I9+=d(OK^D@O;sM1p^ELOT$(GbP?@Sk)!=m@BQhZ~szMfIMK)=kG+%N_$4Kqc z0;%IlGz-lr444{8p4Recj8b7cFA~&~ns=`q2OyL@StL*mWw4 zHN72F>E{m%NcMdw#8S}4;g4lk6Ar^w^$S(p;qRoCQm=HJ)FVZ@^jY4+*>7P?y)wB> zuZ!nBs})r{4prPFg1QO9P;CNJ0c6j91W!=%lvcu^K5Cpij%CK0T&>209g; z=F-dO=&%X_eb@*TwxPYNZwQ^vEIka2I^rJKWhY66u*>>9AEC48M}zW5qaAySw{sji zZ%Fom_M$By@e9y}Xe+vCPNyeu0d;E~P!&R2C9Reimww?w*bc>6S^vlOTanVG=rTC@ zz`P+j~Xbh#{?(Y{hJx1%AKJ{9Eax1__u_TR5VXopPhh~ZuOWUtQ14xM5ZR33^+64Xc^zs-q$7DMhNfRE9G;r-`>7baqnFE zSpRQ5*4@$3yUY#lvfq~!y|)ie#Qu)Hu4QtF22q2psK)6N6)=i=|6c zmt6HNWN##)V(tSJcORaF|;Y18l4eRUe9Z+;hc01~1Uq~Od$lcR5*sqK% zXAaz}29$52mnnzOh_9qwuq`f=u6hNh;8Yl3Do(@GV2~*|6TOAAnA#R74|I3-xqF(H zwZs1p%;}Kn_6*1x0NSG(u(7uLoZh}J)pvrCc1gRX%YBX=oP%?fV@J9|+NPWmRIhLm z*nB)4&%njfc4;N-?6G3Jxs42nCxW%PUfd%)TUVhmH|1}!It+MqyQgCI2Ie4y1pKt^t4B>e) z^&8?KP8ghQi~5{9f2oLpcF zAy!t88zmdJuN*eJukf|?Y$mfgfGUI;7jpk_;S1rZ^uJ;2i}RV zz`O93(#z6Y(nr!)(l^o%((lq=1PKJ`2+|W2MNlk36ClJMK9TXY^z^;UrJp^fQ)B8~ z+0)(I-r4UTl+tK4V<{|}yN?E?kYl6SwJbHq<}=KVbeMboTfWm`-znZk$G*>{?-_H7 z|1R#9L-ji9%J}CPedd2R<>3LB9#X{r0pD@d5wjX?vYRkX5x<`Z9-zZN^xqOcIMZIA z4?jxBe#E73|Bp=FFOhqQDL+Mreaxj_@gEs>bcxG(m{Grh?2C^Go~OJ#;nI_T#Y;Z~ zrQk|t^~g>I9;9AprgI;e>a++v_GYzz4X78wjW1dQI7Wg7Yu`1vcTWqA0c$Z z-{SA^_xK0t73o#!HR<)8_$T}`lZ1bj-jMb~`1Ypk4E)d1LP^2t$9(p(k_^hvDO%S8 zUSOV_arbx+EX!(P5-i8^tiWodx21Qaccu4svN~2|lGs4$edz<3#E1XeNrbHYpyZeq zIk%OYJAGY~QZrCz5Xp|0XAs3kvoUO}^s)4b^r`gOPBxC605g~*eJ*_gGx+jg>ybvX!xfKRk2pFvt*7etd+H~)zXjBPtwoQFFV;9 zww7}AtMuFdTrtw-J-K$xUn3>a!p<92n)6u~<^2!oPakQXI&XV|XKAJvc%`|JT_V$1 z#4cvL*kh%?31SFB1mT@*H@g(b^b*7p#7RX2@&8-piXXZ^VX2D^bEk)QyA06SM}OYO$5QOrF6-?8WRQ?4<;S5)?*II6>ofvX`^llo>=26!|}&LE_Kh z^;_QaENOn8cMYy#p%gpD3~pp^Qf3fMP>gpqfzqGf3JRqe`NQgcCwt$Rt9d{BfI?|J zL2+J6Nt0e~KfP$AUOdh|BU5^UeUg2OeVU+&1Wh6+o}kG)*=O136iQPFO8B2kH7QU0 z^sFaG&fsH>Yx`Tb2eTRLQplJjR5_GL!q|1IJyBh>0yYwr^ z^zM!%4m?^fJad)Y_pl7I1U?}F`?lEug5Ay~ zD372rf+`7GPSAjCtTX&lDN2T?q0hadt9P*9lY{YOQRN;ssAP-+pQ%&{YoLOh*)J#f zSJ1X3NT$LPshJ#wic9$n8l&6;&h|x~qP%rkuD zAS8Jm?g2=nd07~hyebK2d*33rr;E#|2qMal8(Yu9US)=!_2G0}0HoGAI2`h~b8t97 zn}}RYAGHgL(?i0Y3+2EF7ZNnnn{wwOI5~aJMRJg3g5!1i5EsKiwrK`I#YfN!1uZ(m zE90%a$YtZ<5@JGyyMkujRlX;4i3bgt#3d6{LQttR8M>=ZN%aGt#(}>!#HDkfc;y6D z454SZZ0QVwpjiZJjEazGUUQavwGlcB+m}Jgk#-S5OP}(!stt+&OugbKNs{*^q895UN+*t^+5@g%KSvV_aBdD67Sp?NcNll6XniOqw>8B{- z8AV%t)I4TPpwX+dkksd9%hI$HRO?N6bB)|wFeh9S*UYtWty~*7hoCxw>IrHfXf{Cr z?bwCx;pWS2EKD)CKsu8kC)69@KZ2lP!=GI+9n0K(1FPl!1fKoBP0aM4J#Xmo&2|iH%TV1I}CU}+6pOe+`Mo7&sk_$OXiz2s#nX{eiCa6(L zdNFbdI{*8t??p{Wq2=rGN)*Vj8$iEN=z zNk~~$uYLlY)nGT9Tn%=!vA(v!;WF9mD$Z7lQ{lm>Uq(BQ)~@w}+UkrojV7~8k*32{ zWv{PwRW{mcoItML)CfnUFS$!7x!i-vIgExnm!YP{<*0A88_ljNTa6iL)!SVj`mi+0 zs$NbBOhHz6J9I9?9F6r2t=`e?jdiZZI$M>=T%{rmQG~=X5In%Hsv3jEJH{0hWdf?{ z>RAG(&)T(4bBoheX>fpy3=KBQol1T;g-t*W?Hx7e~pWjEBCo9pefR7B4fQ`Ye= z&wTtx8g)-92=`KixPt}(W<2u&IjB>AVANSqz7H|L!xXF1unaQI@ijF~wedxnIq@0s zHPGrb*uKcUcCE!|l=abW22D^m3rO7L;lL$tBU_zCW#chQu;?%ZJv#~LjIJ(EQYz_( zr!rF0o}s9vhe4G^=x`e9Oa{A2-EN*G^O?-^lvdlAv_Mc`v*o-zY{?o!okiZx_06uj z`Z^a?RKxIIhEc#ysM?{Zu~(U1q65u1ih;~^hDwm$L3CcGbY_pB1McFozTOTuwEfFl zTV7LG0)f2TX^p&gQh$*ExWBrwha*i$z^;FQ2bb`osz2D@ybX4Ta<%Onk!S_4poCV1`*Za-9tl>-q@Ou4Xnu*1BAdy{)hE~g(F zZ1m13)z5i{lN($(h!y*`bMF(>f3RENe-KyEc5(0vn-)`x3*Nz)hqgMzr`)$tnCCv@ zKIgvRzU02*zUB^a-w?Edpp^uzB4{;1#}TxKptS_8+s%E)eb4>C{mA{q{mlKs{YudB z1g$6NJc78ekb@Nq`j9KP$sWort z@$n-!EFq6N@I0?)lCS0kUc+m79WU|$d>|jh2lF8WNdyssP9W$+f=(jnWP(m1=v0DE zBk1(2*+4#w59i165qu;c#Ygioe5~{#K@hoYAZQ~&;NF5Wbv8lg5VV<~b7c)lUZSu= zogClgb#%xNOEt*d9iYxo=E%z}D$L8v&&jE*G8jxn=IrczlVSRFv-hh!^C(~C6y#>l zs5DpRm~soUs|xe7v$IXvRr&cYReMGZ3@&d+cP~U#vZLJ(W9MdO!x$byrjdlyugs%- z_LUd;7$@%h^b+C)tkU&t51 zvpSxqYd|-5z$eq0rO?g@f2ahC`I-I{%lLBt4=Q=1{|8mP#s7n99@6~2T-EXQ{vX(R zCs;S$LC}`%d?P^@$SN^LM9;TEM9;VJ;DcXC&?Vl8o}bS{3-u81;*TK+{NIa)_yuxA zfAN1VqF05|#drIU#Q6mB-kmiFn7B7)8Cy1EM%4T!Sv+7bc6%dgelvfrzy56Dp+9MezkmmgxSF7A{-dc9RSets zT}<*7{C0kb-@)(XVcypf1P=Zlf^Hz_#w++M`Q7|g{M9^!3O5mSGeLI}bQi&|{*x2% zD3XDr9V3T0rA7lk#Hn+%huUHN4E`4WHrVX+$tNCSkXt;hvHV@~zP_8khoD;tx_x+G z-_Jh;yUqK=BLA?wt8b&b`bg4n>he9oKkZ9~Y3HAnCJ|`6hPK}mchk%pJg1_ZLI<6v z%07KbR>Zvo-R-+iU*TV656Jrz0v+Hy4fZK5eJ;QHGp`YTlYbZX5C0bbHvbMm_YrhI zK@aTU-{arsKOpEqf*vC1VJWHELVyq`1PQ@Hh@cljg)kvp7$-ys zkwTOZEyM`1!gwK0m>^6PCJFJvWMPVsAS4P&Lb8w|qzY4oG+~;ME@TLqLY9y%=AAdZWL}3ZWeA4ZWV45ZWrzl?iB74?iTJ5?iKD6 z?iU^q9uyuD9u^)E9u*!F9v7Yvo)n%Eo)(@Fo)w-Go)=yaUKCyu_6qximxWh^SB2Mv z*M&EP{lc5VTf*DIJHordd&2v|2f~NKN5aR#C&H(~XTs;g7s8jqSHjoA0pT0rTj4w5 zd*KJ+N8u;oXW0YfF@8AqzTr5 zCk(;*vjjay(DMYnK+uZ>K_m=DVjn>-6Z8r}uM+ecL9Y|^20{A?dXu2H2zr|!umtZC z^d3PF%z+gE|M(+j`ckcs9Xy zf*k}q32r2~iQr~}TL^9?xQ*aB1kWXS9>Mbob`g9G!R-VuAh?6zPJ-P8FC=&o!HWs* zBKTN>mk``d@KS<%2<|0#8Ntg5?jyLL-~oaM30^_)N`hAryqe(S2wp?*T7uURd_2MH z36=;Z(6>$Si3FcS@W}+9Lhz{spGNTM1fN0h27)&dd?vx02tJG8vk5+j;LQY|OYnIF zpHJ`>f-fNWLV~vvd=bGH6MPB5mlAv#!Iu-fjo|GB4-veB;GG0tLGUhuuOxUk!B-J{ zHNn>qd@aG(5qv$tdkDUP;2R0PiQtygiQv5i z?<4qSZ=zchPO~nP4o-9%OeUJLF+c{{G)v9VXd)?e#0Y3e_4HZ9MThYRV>B6RY>-9vZ)#YRs!m3(@WOze z1R7-OOps2lGr8<$B@geN%ruIT;~i`iP#6xD02aVj2iZhOY7Z7KkbnCa@z1h9-Y3xcbU!U$`O)cT_bHO)cNmEb7i9iq$q2XLC!rHA6L1Ux9Q$`G>BwU@Kn1)JQ zjm_Dr@>W9;QVvG2nCr}TxxfKwR;W=xS{b+-9;TjR{ikY78apMIc`y@(1}MrH6^TMU z$6P0`1+C}Q*VTAu&`6R0d4WpPLJ1@x`2o;)2VCPq)6DX8T@IV2&IL01udbW)Ur zgHT{8n{2WO<<(Ty)vGs)C`J@AxtDeKu9mMsf*PaKZfo$Pdn|>D^Mf+fIL-DtSye3d z`bM>)qgi@LP{^eZ8;oTXbo>}pp-AB6vY$exjse+Vw%6Jm@&us}DVHNv9bZAw;{DJ} z=7yU3R(VZbHT8;)so<+Ac=A}_4fPJEr}!{jZPBcyNU?rMs$KOH%=$wB`ibQP3OI38 zin35>1ytqvWC}da57-0?I9yBCK)wc4HpUM`<=v`vMs1=v8GbmbN;}|Okzv8m!EG@%BQS2LwGHoI$OMnz%Q4H=pdL%=6rs2Pa1;E- zprzynt6bfq+N#1{Kw%U8U@3q~R6hTeVz-KN5k-j}1;ycP9X^RKrCi3gaq@;jiG$1~|wMg>)@NI`T5U zW)DR;nlioyQfIKlY)CpuGXy-GHwh=IOXhK-Mr(FL>jT_TA-fdv=_MQR1|K8!6opM0rVI!BEI39?HV1ga z&@ceLq(v@|%cAz0PY7~hg!Ex7@cW>npveq6sSYK(k`9;biNa|x>{3Hm45&U+0ryLh zfNFVs7ZqY>fSx=&&`40))1e9%LTrEP<`$1{?`W;9tglgy0TmkJaDWaUrVhN+)w>#O zUZsKn9UvlyA>>)P;8b(k>byV@yaQ13Fpw-mSF_D&9j?j465GMa92VjG6e(gD2@EQ@ z%`RtagO~6}6lUBo4E3sgTURuY9e}apd_brd0K+-!>udauYRDe|sE>Lo4nvK}4+@eC z02O;MK_~5*@oBKpK=J_qee~GtAVN7DmfQtSyV>aU;}-H1fa4=h&>Jc&;Mc2Mki!6= ziNhSsGMk6nV`Q(-UgrgdJO=<54Fkgx&Tgy+-@~KGaL_bTKaF-G$-4~v0MKvfwi(`& zkR$;riNjRvX0PH5H#zuj0WCvOri_ZBEOx8kp3$;LfZ*F*qZKHEkM6_Npf^f}8Lb;f ztE2EfavMHUsP4PW5MO&#UmHk)eUw36314Nzg1B?i(>eRK~W63>CjgUbrjG~L59UJ%$Lf^Yzpqzn<%Tc zynz6idIJuZwF=x+gVUfQIVsXn_DyP=Db|tqO={aHg5NIm`1YPGnoEhst8CsgKs%4( zO!8Gl6=$TksXc~5M~?>W^Izk<4}A1;VH5a&%KPzfIn32YUqvfJm{TdB5>VjWdmsdkX!98s$` zZ7bETq6i5Gv8JBF{>|YE#u|z-=^zZdxoy;w^>_+hauBq+g?3HLnO0*XBn83y^%=_L zXsm=5Y5%Hw=yKF zebj+G$gH1BQ6~DKctGfR>1WfnP~fDoffWw{!WLtV%F|Yg6F)YNVrEtFOAZI_Xsq%% zD=#0Lec5z6TETa&RcQ}V;K^gNLQmCU8+HYSuN%?NYUqTkw)*?y9qn*=Gu&F#=k4z` znP4>_y$m%9r>zb4y_|W5jI->&gH)@a{a0mXHzi&^f;df*THHPEK6+J>N_u1pyvE#Q z_DcDhqodX`y%54&*_ovI8aq6bAZPVd-ma(AN{*B_Po|uP#723Z28-8?ypfVBI6Nu2 z8Xy~4h;g7EWN`S{)mtcyiX)@pb$F=6z~_;*fCj7T>~5#zMs~H2ki5*2mmJ-2>g?#Q z@QUj$N-+P(_%pS_i3X1x(8$=R@^tUfOwm^7F#~qFe4sq%pagO%xd)DBigKpFPNO{LF!? z##yf-K1mVt4v#3aVK*y%{Pf^fDLg|d6doA`SR)8=YavjmgdDcFh^l>_5-}W}h|>07 z-{7>>+S-&l3y7F{E55$sOO#&L;pxfKs)Bp~;+i8U}#pEzl$=NI5 zXn2WVqhyX?)5}b#5#Z?Rx1W;AJu;3O>+JPV8?C9YZ}6(y+myf&?07}M@;Z+uWOdQs zqvS@}po9Gby-VZed*6GhE94DYr& z8ZSa{;FAZ`{z`F+4}(h+X*BDoT5QDw_VGUdpoB(lTYmv~1PDhPnAQewmxcCkiaqie z8WkH1GHg~k7_7I+6*ZdwY;_r-t3cf}I($R~kNjyZ9Zw1V%cr$;T1w?`t2|n;tqV9J z20Q|$Pgu&2Q8m{2c{93TN@e8kA63u|1_ub0dLqM#6*<-o)Q{+amFBIhs2l4O9CbFfBzhwE}0JWub;!yO{H{Zj%k2k z&Idg>sH99F@N0C|%Z5pvdOD>v@`*bil~CRe1J~lm8ZhJofMNIHj%5 z3bju;lB%K4SHj8RJthp4+{hhw2yzW(6ZCW0ybEEXBt|a8=p>vpi{Wu&X!62rx7XXf z3|T0(StE4h2p$_XTFuZB2;E$Albr0&`ZW>hsww4>0sIkAHdI17QSJ$VoD+~WjXYLr zDe;=4U|Ugc`n;>D-bf=ZB_@!A3XMmJ_IBlY&M{c4ckT5(NZt|u>bgh(-`JYL%5{k1jZ~nP0 z-CRo3_RnalQyqn_>)-Gyy9cAtTtI1>{u!^bOE_}+Zc6fKwBJXIY_)Q0Aea!^p*NEF zVoKck&-krttf`@OGH1Q~G`#%hDEu#>LpY9N2(Q|D8gFR|PJUv&3PylEVTT4{xlc+x zP2;szLbsgKwEPpU)kH6}E`c?$Le5eAN0+y`;0(uNuh z6kL7e;~iop9pY&0*%(7WhQnDei^NO%I7<3xHsTnh>&(q^>Pua}b(HSNJj~eE$4A4V zFI;IpZB!G)I_ckvfJSFvCzWU$QuSUDoJdI@jY;>4z_SCPp~>!@`6-m#Kiqx}NJ_xo zu5W~fcy*hP+~KFwA=-~pk(I+9f=o{XmVAeY9I}E?WR>uGBXSMH-woJE$D8-h##5)E z27j~!A$I`MX4Mg6okhp0J<74@i73xPaXV=6?E(`9Nw7Mndb^HpGo}5H3;b*skM8&+4ycwxWC&-!9Ld2>lFI{ft;nm4*BySwl%Q91 z@|8DDHoLPCQY*vsRQ_%_LjJtutTq$0|9dH_D&ytvW=imos_oC8a+=%flt+>3tE!;0 zroIZY>_)pF%eL59y1IMOk50HP8lUyLz0y+nja_YE!{!=`fA|dKj-u1;GK7{$&AqeSk{0b20XZly9aR-yohTf*1{3Ygkbi;4F@_t4bl*{ul}Amo)?8a}hkjug!$Pf< z%HxleV9ikzlphhRffBjrfep|%&nLsd`Y)6;eaW`}njdER2a#6NV-W7hJ=ZGRzf;=N zkD6^y@nkTaJhz| z=D9>mEElaz*lw{xG>Da=Q8bBWu}ZWM{3gL~5&Sm6?-2Yh!S50LKEWUC7Hv!-lO)!N zwPKxE&mulQp4>V>UjhJkfV6e>o4dOfb-^2m;i)m@V-vhG zp~G$KZ|;H@Fhfr(ys*>v3-vB6c$Ka4vF~l#-VYTbRqac=y5SPZ2wwv7rRCjnW95hu z;mx-leeiP6IZN9+diz)9WM}5&z_nbRD+W3#PZ{0tUi0pZ4(QDqgqKPd(?1vY_760# zg67r2{KXCPYTG+1dwZ7{y7~&!b5$uGBQAg&(Bv0^Ox-TRGaYv23{QS0R2rR-zTns`^Ln6 zaX^GSYQ7=(TY|saA+8ixiEvNN_k;~0_&52+u54I$|5ucHUS|py{yPSj$}gE$RKnq2 zBwq&rqK_Vd;_;_Jcq6`Yb`5m96{TFy%(+68L?WIbo+!d)I6n~lJHdYw787_SSfa}M zsp1Bi_0z=DMYtd5M}mJM_~#wsM)6FU^}=tEe}Kw~U5*t9YAu zJ7HPEa)gEVNhOqj<2Qwu#CyPe+$-KEzx2GbeW1NQ6d$ty-a67hke$5`VV2{CnI$cW zE8qrq(2$nI-Uae~$NjB|@&*0SzR~AQ9OzvZ#-LNSU8m88=wrvnB_>VF$uDY5>>2Ft z-m4P>0)v8E;DS+lzkgF=hy211xP;U&03R%XJ=8B@DNtgYs@kF1v2$-|m>3=zBeS!_ zy}G{*etL!+8W$mP5_Onh(0;*(*LL5if_6yH*W;vN#;WR~{oLzx_=kjbL|@|bKUo@r+WnE1K? zhZVjlhJU&GV--969=vgb34&dgsQmpAGv`V)n|)LKRQyc*T>L`(Qd$eg5@Ev#JC3lC zgpDTf#=}IPS3!y2()Tg3;s1pfVfwy*RQyR9H{!oAuJ3z4#ov{2qyCTIIUT?#}E!qpU zH)>Ne;u)LpE*RJTnxq}!>xL-(NWG2Iior*zNgUe~>? zdsp|q?i1Z-x-WEJ>3$c3#Sk%CoGhk`1>hT7#0GJmxIpX#k8X*$RO}U(i^qZMvsv6K zZigfM0kB^CV4Lq3-xA*!KNLTP4fsdEq=58*838i`N(0IR3<1UfbAUa-8PF8a63`Yf zH(-9iF##(BE)IAq;In{V0>!|nz}UdJz)69V0}}!Z0xJW}ftJAPz?#6izy*Q5fdhdn z0#^mD3tS&a0#6J)De%I;t%17&uL`^-@cO_T0&fbuKk$LT2Lm4td?WCaz|RA}3_K9{ zZQ%DoOb{Ey2Wf-EpunJ*ptzukL6d_Lf|7!Ag9?I*f{KGmg35xNLG3}EK?{Srf|dj= z4O$VjE@*ua2|6+8wkUv8H(ldIj=k(cntNs{$m%dxyqhF?9 zr{AdGq(57~S%02>i~d6WMf$7s*XXa)@6q3=zgd5){&xMH`p5Jy>Awm^p%X%9hFU^9 zLYIZE4qX$vE_8h;2|XipW9X*PvqLwBo)@|&^p(&L!ve!1!X|}H4J!+q9d=Auf7n@J z=Y*Xbc7E6eVOztV4%-*DKkTircf#Ha`ylL_u;0T`I2+D~Yr=KmVc|L9h2f3i3&K0Y z7ltnm9}Hg^zB+tO_*vl>hF=*5ycUu5#uou8g=p;+cq-BVLVoJz{^vTM-{ed>Zk2#Fr6YM|=|*962qrE^<-ivdHC; z{qQ=f6C+QKJT3B!$c>TPB8MXPMBWs6OXTg5cShbF`AFoGkxxfH8~J?Xo00EDeh~Rl zU7BwrXHmWIV zPSm_8S5$jcPgH-@VART}wNb}MNl_<6ZHziUYAEW;sH>u`iMk=`rl?z@Zi{*%>cyz{ zqkfJKjZTlwjLweEjn0p*jc$sb7u^-TG5W&ji=r=yzASoM^sUjiN8cHJcl5o{_eVbw z{e1L`(R-s`j(#=z!|0ErKaKu8`se6hqkoV7Ge(RFj0uj>$0Ww&#N@>k#1zFe#Mon; zF-u^?9$lY*yXYP zv4gQIV^_zniQO2xDfaBxb7Qx}ZjHSp_VU=F*qyO=$G#T(QS2Y%)Q;`)hX;^z~8p7`s;-zWY#seMw~*c($z^fC*7O$Skm64HOp;GbJ~{c+P4xS zq+XV~E%oly_fx-_8a;LL)M-}#xl`v)J!a~Hsq3choO;vL zH>Q3t^{c7BrLk#3nl3FcEhH^EZG76qwD`0sX^CkWX+>$KwA!?WG)G!fT5H;ZG}fNm8K*T& zYo69NZQitFrY)Lw?6jrRmQCxMwtgC!cH*>C(wX$2^pNz>^l|BH(oai2BYk7~S?LGT z|H#l~1ZIR}gk?lzL}!f8NX?j*k(rT`k)KhNQJhhd(VcNY#wVGPnN^vCnP+8Ql6iUN zQ05hxyECuOyf5?d%x5y6&wMF!U*>z6A7_4+`DNy}nLlLyocU{(CM!0pEX$JR%xcY= zo8`*t%vzLnY*u&H(ySF(CuW_NwIOR$*11{dXI+?eQP!PV`?KE3`ZVi{tgo}a$wt`$ z*}>VN+2gXKvNva6oV`1HPxejOw`SjweSh{t*^g#Fk^NNmi`lPb|Ctk$laW)HGb5)Y zrz~eyPD{?5ocTHJIh{F+a*oYenX@`)ZO-vIQqBoEC+D1+b8XHOIR|nhatm_jJ9jX5eeMalSLWW3`%vzaxi97J&kN2A%^Q~&l^2^gAum2JAul;^YF>I?R$gvi zLEiMdnR#V-hCEZAC9gWKHm@Pik=K;hlGmQsnRk5Nsd;DQ-IRBC-hKHfU(656ugss7 zUzgvXzczn;{;vEz`8Vail)pd!?ECMUPES zn4Ug8Yx95Y1Fe7x@fgTsGt38Bfjl zc*gg|T(PEDEDkEx7l#)|7RMCF6=xJ@7v~ih7SAXyDK0OrEH)QgidPn2QM|YKubCM$ z=gr(WbN|dAOK?e4No>i4lK7H@lH`)9CFvzuCAlR9CDkQ0CG{otlE#vjk~t;wOWI31 zOBR)Mm257#uH=c54@yHz(@QO-3rg3OURZiX>8{c%ORp-ut@QTNJ4){=eZ2IE(kDxw zF5Or9a_MWO@0EUC`eW(uW!f@bnOGKB7E=~mHoj~^Sz6h&vh=ddvYBNiWu;~1Wi@5B zWp!l@W%J7Bm$}N?%X-R|mkpGyEIY1jZQ0pnTgxsh+g`S_Y**RMWp|X_U3OpD!)1?^ zJz4g2+3RIrmg~zWlus#7Do-uXD9D=#RoFP~dJuY7*_G38z5-Q~UI%gawFKe_z0 z@(tyi%6}^VyCSe6ydtt9rXsEaauO9&E7B`6D`rm*OgGFllo<>Llfh!J8CDy1 z8unJ=%G}Dj$~l$uE03w{s9adNxN>>riptfMYb%eh+)#OT<>t!sDz{c%Qh9mh_R2>q zU#fhy^7YF7mG4%*U-?nxCzanAwZ>56IAfGC#+YWzFlHO`jD^N>V~x>aY%;bQ=NdbV z3yodIZex#eg>jv6$atIaCF6eM+s5~d9~i$e{%K-NtVuBGOo65lQ=Dm%X^JV)lx#{h zrJ2%Ac2ke(eAC^g{bt6jvrM)mT2d@&mJCa_CC^f5nPDlhlv^q-W{cG_%Ti~VZE;$f zEp3*0mSZd(mW7rsOSh%h(q|d8tg@`J9B(0(lPsrN&aj+mIooosWs7C2rjmi?BuE$>-Aw0vUu-13#> z8_V~WpDe#x{;>RQ#a7;`wFX#&t)bR&)+lSNb%HhCnqW<~PPL|6v#hz+0_$|^Olz6d zU^Q7S)@p056&|3pHd$M(bFD7x0;}7)*t*2pV_j|?u&%ToXI*ENtS4Gev7T<-Xg$li z*?PY9LhHrW%dFe2JFQn*ueM%iy}^33^)~CB)_bh?TOYDMYJI}`wDmdbi`ISCSFLYY z-?F}I{lNOM^)u_2)&th>tUp?RvHouT%Z6;6O=A;nK{mZD+!kqzvBlXY*{0Z%Y^k$k12t+uVT zt+$AwhL?**)Fwhv+c0$vR!4n*0#rXlkHa99k#n|_t_q_Jz{&@ z_LS{e+Y7e6wpVPg+upRjV|(BBk?m947q+i$-`ak#{cQWq_GdLy%~lK5y6V8{km|7N zi0bI-@zoQnCs!v{r&Om^XH;ib=T#S0&!{e`F0VFJS6A0o_g1f}UQ>N;^(EDpSKnFv zQ1zqLUsV54{qwAdSrcbXo;7Qhb5`@LQ)ZntYxAr-W<5CTky*dgpc<|ww`OKdSxs9_ zN6o^T6KXcpY^u4f=Kh+8YCfp>vgSZ-P;F#wOs%Q5wzi@6gxU?Yn`-ye-cfsZ?Yp&~ z)qYtQSvRR}N}ao|r*3)OP~A0k*Vlbe_hsFI`l$N&`h*56nE zVErfc-_(EK5Y!Oa5YsTd!O&o8=xBhqRyCa2u%%&Z!y^sPHoVaAeZwCOf6q>xoijUs z_Uzehv**n|ZuW_@Pnmt?>>Fm^Jo~BHduP8g`@7k{&;HAvY|pai+85ZD*n8|}*w3|Z zvEOFD-~N#OGy8Y;A02u}j3drb>6qoHb96ff9jhEej%ys(JN7x=a=h!*Im4V0&SIz0 zS>;^nT;W{pyui85xx@L8^J(XE&M%!mI)7=5X`IrS)L7nVZJgEE-?+AMedG4Vs~fLt ze75nG#@CzJrog6mv2{C4vv&7ZeuTJ$a9Ei+q8EtZyJTDn@gTh46R z(z3N>Z_Ar4@3ac7A+2GpMXeRB#@5BH%UcIpFKpf3y0i7s*5_JZZ2hA3ht{9l#jod&7q93B^Xf~RI zeu1JWi7HVJ-G%N(8_`y@4Sk07!TMv6Spp}bfAS}|9#M6pa^Q}`4?#Yx3! z#aTtKa)2^PnX6o^%v0)>cBM;sO4*=1r+lI6ry8hQrP`?4qAFAERqa<@SKU?JQ;$(k zQcqFiYNcAE-lzUa{j<7D-J`y%nWmYo$<-J&E{#X?i>6jnuX#fyQz=v)wVGN>{YX_& z$EZitOX`hwp*CN;QVX;t+A?jIwnuwcm!+Gdo2#?xyt;s{Ue~B=)=$u9>1XJ5dYj&< zuhQ4(>k9i7rWAfyxZ~|rkSsh=SYLR?kZBle7;hj9Dg$Ns)o{*m!I)%BGY&IuH;Roi z;}K)EvDTDiN;3^JZ8H%jsp*)h&UD&5$~@6L+3YX}%wcnjx!ru#GTAcIGRqRN6kB-9 zP0KyY1M33oa_b6f+{#-^tUcBT)KYJaW&k^iOtO&}+* zD6lk86o>@kfv!ML;BIhQaCR^^=nMvfkzjMME!Yv78k!Z#2?at-2!<|({t8_Qr-ny{ zM~AVnJgf>=g=@lfk&MXb$hZg@(M1fAQ;~+qxoAdobaY%)8l|H8XifBN^nC22*o4@m zm@a0EIb&C1*JC&1^W)3n`SH^Dp7_4_llW`8FTIi8L8J6x`UHKFuBOk^7wAU1iSD2~ z>2CT4eT%+LKV^n6BbX^n7BhqSoSDPSW#%&rnI+76W)ri8DPXoU2qR*|jFcf6J>z5q z<`7fQv@!QVGROq;z*3M0z5+V|1_&Spa-akj-~>g$2f`o*7{CGn>;mPW0#t+3;4C-~ zE`mS7WzY_;f-W|l&1RRgYuT;r4i;r`R>G33f;F=)*2DVQ5X-QT<=6yU%GR?F;21aw zX2Tqq2Uo&1a2?zLx56C|g*X&LHKd>sdSL{{A%MlO6n+E0gL~j!cnBVbHLwAmgBM^E zY=v#G19rk|@HV^;pBMMx#GH)NaxN~w#ko?hoIAiB| zNMV#PM)+9p39L{oa6&@pO(Z9VB!(tZ6GTFr&?gKDbK+9sTH<=*M&ee<(vpoO1trM4 SG}N!(JEo+(Pet!hg8dIe%V&xJ literal 25424 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 diff --git a/package.json b/package.json index 8230670..164dc04 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-simple-toast", - "version": "0.0.2", + "version": "0.0.3", "description": "Simple Toast for react-native. In Android it's just native toast, in iOS it's https://github.com/scalessec/Toast", "main": "index.js", "scripts": { @@ -15,9 +15,5 @@ "url": "git+https://github.com/xgfe/react-native-simple-toast.git" }, "author": "xgfe", - "license": "MIT", - "dependencies": { - "react": "15.1.0", - "react-native": "^0.28.0" - } + "license": "MIT" } diff --git a/sample/package.json b/sample/package.json index e044c4f..5294ea9 100644 --- a/sample/package.json +++ b/sample/package.json @@ -8,6 +8,6 @@ "dependencies": { "react": "15.1.0", "react-native": "^0.28.0", - "react-native-simple-toast": "0.0.2" + "react-native-simple-toast": "0.0.3" } } From 8d951627aac159ae5886a79f27df06e40c90ba92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E7=91=9E=E4=B8=9C?= Date: Tue, 11 Oct 2016 15:01:51 +0800 Subject: [PATCH 5/7] feat(toast): add position --- index.js | 30 ++++++++++--- ios/LRDRCTSimpleToast/LRDRCTSimpleToast.m | 33 +++++++++++---- package.json | 2 +- .../android/app/src/main/AndroidManifest.xml | 42 ++++++++++--------- .../main/java/com/samples/MainActivity.java | 20 --------- .../java/com/samples/MainApplication.java | 34 +++++++++++++++ sample/android/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- sample/index.android.js | 5 ++- sample/index.ios.js | 5 ++- sample/package.json | 6 +-- 11 files changed, 121 insertions(+), 61 deletions(-) create mode 100644 sample/android/app/src/main/java/com/samples/MainApplication.java diff --git a/index.js b/index.js index c0111e4..ec70f07 100644 --- a/index.js +++ b/index.js @@ -1,13 +1,31 @@ import {NativeModules,ToastAndroid,Platform} from 'react-native'; -var RCTToastModule = Platform.OS === 'android' ? ToastAndroid : NativeModules.LRDRCTSimpleToast; +var RCTToastAndroid = Platform.OS === 'android' ? ToastAndroid : NativeModules.LRDRCTSimpleToast; var SimpleToast = { - SHORT: RCTToastModule.SHORT, - LONG: RCTToastModule.LONG, - show: function (message:string, duration:number):void { - RCTToastModule.show(message, duration === undefined ? this.SHORT : duration); - } + // Toast duration constants + SHORT: RCTToastAndroid.SHORT, + LONG: RCTToastAndroid.LONG, + + // Toast gravity constants + TOP: RCTToastAndroid.TOP, + BOTTOM: RCTToastAndroid.BOTTOM, + CENTER: RCTToastAndroid.CENTER, + + show: function ( + message, + duration + ) { + RCTToastAndroid.show(message, duration === undefined ? this.SHORT : duration); + }, + + showWithGravity: function ( + message, + duration, + gravity, + ) { + RCTToastAndroid.showWithGravity(message, duration === undefined ? this.SHORT : duration, gravity); + }, }; export default SimpleToast; diff --git a/ios/LRDRCTSimpleToast/LRDRCTSimpleToast.m b/ios/LRDRCTSimpleToast/LRDRCTSimpleToast.m index d848a93..33e5dd5 100644 --- a/ios/LRDRCTSimpleToast/LRDRCTSimpleToast.m +++ b/ios/LRDRCTSimpleToast/LRDRCTSimpleToast.m @@ -9,9 +9,12 @@ #import "RCTBridgeModule.h" #import "UIView+Toast.h" -NSInteger const LRDRCTSimpleToastBottomOffset = 28; +NSInteger const LRDRCTSimpleToastBottomOffset = 40; double const LRDRCTSimpleToastShortDuration = 3.0; double const LRDRCTSimpleToastLongDuration = 5.0; +NSInteger const LRDRCTSimpleToastGravityBottom = 1; +NSInteger const LRDRCTSimpleToastGravityCenter = 2; +NSInteger const LRDRCTSimpleToastGravityTop = 3; @interface LRDRCTSimpleToast : NSObject @end @@ -23,28 +26,44 @@ @implementation LRDRCTSimpleToast - (NSDictionary *)constantsToExport { return @{ @"SHORT": [NSNumber numberWithDouble:LRDRCTSimpleToastShortDuration], - @"LONG": [NSNumber numberWithDouble:LRDRCTSimpleToastLongDuration] + @"LONG": [NSNumber numberWithDouble:LRDRCTSimpleToastLongDuration], + @"BOTTOM": [NSNumber numberWithInteger:LRDRCTSimpleToastGravityBottom], + @"CENTER": [NSNumber numberWithInteger:LRDRCTSimpleToastGravityCenter], + @"TOP": [NSNumber numberWithInteger:LRDRCTSimpleToastGravityTop] }; } RCT_EXPORT_METHOD(show:(NSString *)msg duration:(double)duration { - [self _show:msg duration:duration]; + [self _show:msg duration:duration gravity:LRDRCTSimpleToastGravityBottom]; }); -- (void)_show:(NSString *)msg duration:(NSTimeInterval)duration { +RCT_EXPORT_METHOD(showWithGravity:(NSString *)msg duration:(double)duration gravity:(nonnull NSNumber *)gravity{ + [self _show:msg duration:duration gravity:gravity.intValue]; +}); + +- (void)_show:(NSString *)msg duration:(NSTimeInterval)duration gravity:(NSInteger)gravity { dispatch_async(dispatch_get_main_queue(), ^{ UIView *root = [[[[[UIApplication sharedApplication] delegate] window] rootViewController] view]; CGRect bound = root.bounds; - if (bound.size.height > LRDRCTSimpleToastBottomOffset) { - bound.size.height -= LRDRCTSimpleToastBottomOffset; + if (bound.size.height > LRDRCTSimpleToastBottomOffset*2) { + bound.origin.y += LRDRCTSimpleToastBottomOffset; + bound.size.height -= LRDRCTSimpleToastBottomOffset*2; } UIView *view = [[UIView alloc] initWithFrame:bound]; view.userInteractionEnabled = NO; [root addSubview:view]; UIView __weak *blockView = view; + id position; + if (gravity == LRDRCTSimpleToastGravityTop) { + position = CSToastPositionTop; + } else if (gravity == LRDRCTSimpleToastGravityCenter) { + position = CSToastPositionCenter; + } else { + position = CSToastPositionBottom; + } [view makeToast:msg duration:duration - position:[CSToastManager defaultPosition] + position:position title:nil image:nil style:nil diff --git a/package.json b/package.json index 164dc04..05cba55 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-simple-toast", - "version": "0.0.3", + "version": "0.0.4", "description": "Simple Toast for react-native. In Android it's just native toast, in iOS it's https://github.com/scalessec/Toast", "main": "index.js", "scripts": { diff --git a/sample/android/app/src/main/AndroidManifest.xml b/sample/android/app/src/main/AndroidManifest.xml index 564892c..59f2b3d 100644 --- a/sample/android/app/src/main/AndroidManifest.xml +++ b/sample/android/app/src/main/AndroidManifest.xml @@ -1,30 +1,32 @@ + package="com.samples" + android:versionCode="1" + android:versionName="1.0"> - + + android:minSdkVersion="16" + android:targetSdkVersion="22"/> - - - - - - - + android:name=".MainApplication" + android:allowBackup="true" + android:label="@string/app_name" + android:icon="@mipmap/ic_launcher" + android:theme="@style/AppTheme"> + + + + + + + + diff --git a/sample/android/app/src/main/java/com/samples/MainActivity.java b/sample/android/app/src/main/java/com/samples/MainActivity.java index fa870ea..eddff3e 100644 --- a/sample/android/app/src/main/java/com/samples/MainActivity.java +++ b/sample/android/app/src/main/java/com/samples/MainActivity.java @@ -17,24 +17,4 @@ public class MainActivity extends ReactActivity { protected String getMainComponentName() { return "samples"; } - - /** - * Returns whether dev mode should be enabled. - * This enables e.g. the dev menu. - */ - @Override - protected boolean getUseDeveloperSupport() { - return BuildConfig.DEBUG; - } - - /** - * A list of packages used by the app. If the app uses additional views - * or modules besides the default ones, add more packages here. - */ - @Override - protected List getPackages() { - return Arrays.asList( - new MainReactPackage() - ); - } } diff --git a/sample/android/app/src/main/java/com/samples/MainApplication.java b/sample/android/app/src/main/java/com/samples/MainApplication.java new file mode 100644 index 0000000..9d03373 --- /dev/null +++ b/sample/android/app/src/main/java/com/samples/MainApplication.java @@ -0,0 +1,34 @@ +package com.samples; + +import com.facebook.react.ReactApplication; +import com.facebook.react.ReactNativeHost; +import com.facebook.react.ReactPackage; +import com.facebook.react.shell.MainReactPackage; + +import android.app.Application; + +import java.util.Arrays; +import java.util.List; + + +public class MainApplication extends Application implements ReactApplication { + + private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { + @Override + protected boolean getUseDeveloperSupport() { + return BuildConfig.DEBUG; + } + + @Override + protected List getPackages() { + return Arrays.asList(new MainReactPackage()); + } + }; + + @Override + public ReactNativeHost getReactNativeHost() { + return mReactNativeHost; + } + + +} diff --git a/sample/android/build.gradle b/sample/android/build.gradle index fcba4c5..dea8311 100644 --- a/sample/android/build.gradle +++ b/sample/android/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.3.1' + classpath 'com.android.tools.build:gradle:2.1.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/sample/android/gradle/wrapper/gradle-wrapper.properties b/sample/android/gradle/wrapper/gradle-wrapper.properties index b9fbfab..b01a7bd 100644 --- a/sample/android/gradle/wrapper/gradle-wrapper.properties +++ b/sample/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Tue Oct 11 11:35:38 CST 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip diff --git a/sample/index.android.js b/sample/index.android.js index eccce01..4d53930 100644 --- a/sample/index.android.js +++ b/sample/index.android.js @@ -26,7 +26,10 @@ class samples extends Component { {Toast.show("This is a Toast",Toast.LONG)}}> Tap to show Toast! - + + {Toast.showWithGravity("This is a Toast Center",Toast.LONG,Toast.CENTER)}}> + Tap to show Toast Center! + ); } diff --git a/sample/index.ios.js b/sample/index.ios.js index eccce01..4d53930 100644 --- a/sample/index.ios.js +++ b/sample/index.ios.js @@ -26,7 +26,10 @@ class samples extends Component { {Toast.show("This is a Toast",Toast.LONG)}}> Tap to show Toast! - + + {Toast.showWithGravity("This is a Toast Center",Toast.LONG,Toast.CENTER)}}> + Tap to show Toast Center! + ); } diff --git a/sample/package.json b/sample/package.json index 5294ea9..b588833 100644 --- a/sample/package.json +++ b/sample/package.json @@ -6,8 +6,8 @@ "start": "react-native start" }, "dependencies": { - "react": "15.1.0", - "react-native": "^0.28.0", - "react-native-simple-toast": "0.0.3" + "react": "15.3.0", + "react-native": "^0.34.1", + "react-native-simple-toast": "0.0.4" } } From 90cf52979cbeff18b84cfb6a39579f4fd450d25c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E7=91=9E=E4=B8=9C?= Date: Thu, 27 Oct 2016 16:30:10 +0800 Subject: [PATCH 6/7] fix(toast) : position error when keyboard show in iOS --- ios/LRDRCTSimpleToast/LRDRCTSimpleToast.m | 35 ++++++++++++++++++++++- package.json | 2 +- sample/package.json | 2 +- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/ios/LRDRCTSimpleToast/LRDRCTSimpleToast.m b/ios/LRDRCTSimpleToast/LRDRCTSimpleToast.m index 33e5dd5..f78bcc5 100644 --- a/ios/LRDRCTSimpleToast/LRDRCTSimpleToast.m +++ b/ios/LRDRCTSimpleToast/LRDRCTSimpleToast.m @@ -19,7 +19,39 @@ @interface LRDRCTSimpleToast : NSObject @end -@implementation LRDRCTSimpleToast +@implementation LRDRCTSimpleToast { + CGFloat _keyOffset; +} + +- (instancetype)init { + if (self = [super init]) { + _keyOffset = 0; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(keyboardWasShown:) + name:UIKeyboardDidShowNotification + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(keyboardWillHiden:) + name:UIKeyboardWillHideNotification + object:nil]; + } + return self; +} + +- (void)keyboardWasShown:(NSNotification *)notification { + + CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; + + int height = MIN(keyboardSize.height,keyboardSize.width); + int width = MAX(keyboardSize.height,keyboardSize.width); + + _keyOffset = height; +} + +- (void)keyboardWillHiden:(NSNotification *)notification { + _keyOffset = 0; +} + RCT_EXPORT_MODULE() @@ -45,6 +77,7 @@ - (void)_show:(NSString *)msg duration:(NSTimeInterval)duration gravity:(NSInteg dispatch_async(dispatch_get_main_queue(), ^{ UIView *root = [[[[[UIApplication sharedApplication] delegate] window] rootViewController] view]; CGRect bound = root.bounds; + bound.size.height -= _keyOffset; if (bound.size.height > LRDRCTSimpleToastBottomOffset*2) { bound.origin.y += LRDRCTSimpleToastBottomOffset; bound.size.height -= LRDRCTSimpleToastBottomOffset*2; diff --git a/package.json b/package.json index 05cba55..d19ffbc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-simple-toast", - "version": "0.0.4", + "version": "0.0.5", "description": "Simple Toast for react-native. In Android it's just native toast, in iOS it's https://github.com/scalessec/Toast", "main": "index.js", "scripts": { diff --git a/sample/package.json b/sample/package.json index b588833..c4d1df5 100644 --- a/sample/package.json +++ b/sample/package.json @@ -8,6 +8,6 @@ "dependencies": { "react": "15.3.0", "react-native": "^0.34.1", - "react-native-simple-toast": "0.0.4" + "react-native-simple-toast": "0.0.5" } } From b6e3fc7c5f88b1ba5ceebf5e86b68c54693fa349 Mon Sep 17 00:00:00 2001 From: Yuanzhong Xia Date: Sat, 13 Oct 2018 21:59:50 +1030 Subject: [PATCH 7/7] Foxed wrong command in README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d35bb02..b5c6488 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ You can use [rnpm](https://github.com/rnpm/rnpm) to install native component eas ```bash npm install react-native-simple-toast --save -rnpm link +npm link ``` ## Usage @@ -18,4 +18,4 @@ import Toast from 'react-native-simple-toast'; Toast.show('This is a toast.'); Toast.show('This is a long toast.',Toast.LONG); -``` \ No newline at end of file +```