From 4d16cf737104b92990a4b34591b3d814a7449968 Mon Sep 17 00:00:00 2001 From: RamiDzPower Date: Mon, 30 Jan 2017 22:26:52 +0700 Subject: [PATCH] first commit --- .DS_Store | Bin 0 -> 12292 bytes ._.DS_Store | Bin 0 -> 4096 bytes ._.gitignore | Bin 0 -> 4096 bytes ._README.md | Bin 0 -> 4096 bytes ._app | Bin 0 -> 4096 bytes ._built | Bin 0 -> 4096 bytes ._gulp | Bin 0 -> 4096 bytes ._gulpfile.js | Bin 0 -> 4096 bytes ._index.html | Bin 0 -> 4096 bytes ._package.json | Bin 0 -> 4096 bytes .gitignore | 1 + README.md | 17 + app/.DS_Store | Bin 0 -> 8196 bytes app/._.DS_Store | Bin 0 -> 4096 bytes app/._react | Bin 0 -> 4096 bytes app/._suit | Bin 0 -> 4096 bytes app/npm-debug.log | 23 + app/react/.DS_Store | Bin 0 -> 12292 bytes app/react/._.DS_Store | Bin 0 -> 4096 bytes app/react/._actions | Bin 0 -> 4096 bytes app/react/._api | Bin 0 -> 4096 bytes app/react/._components | Bin 0 -> 4096 bytes app/react/._mixins | Bin 0 -> 4096 bytes app/react/._stores | Bin 0 -> 4096 bytes app/react/._utils | Bin 0 -> 4096 bytes app/react/actions/._user.js | Bin 0 -> 4096 bytes app/react/actions/user.js | 35 + app/react/api/._github.js | Bin 0 -> 4096 bytes app/react/api/github.js | 25 + app/react/components/._app.jsx | Bin 0 -> 4096 bytes app/react/components/._layout.jsx | Bin 0 -> 4096 bytes app/react/components/._pagination.jsx | Bin 0 -> 4096 bytes app/react/components/._profile-card.jsx | Bin 0 -> 4096 bytes app/react/components/._profile-stat-group.jsx | Bin 0 -> 4096 bytes app/react/components/._profile.jsx | Bin 0 -> 4096 bytes app/react/components/._repo-list.jsx | Bin 0 -> 4096 bytes app/react/components/._repo.jsx | Bin 0 -> 4096 bytes app/react/components/._results-message.jsx | Bin 0 -> 4096 bytes app/react/components/._results.jsx | Bin 0 -> 4096 bytes app/react/components/._search-form.jsx | Bin 0 -> 4096 bytes app/react/components/._search.jsx | Bin 0 -> 4096 bytes app/react/components/._stat.jsx | Bin 0 -> 4096 bytes app/react/components/._user-detail.jsx | Bin 0 -> 4096 bytes app/react/components/app.jsx | 19 + app/react/components/layout.jsx | 12 + app/react/components/pagination.jsx | 63 + app/react/components/profile-card.jsx | 17 + app/react/components/profile-stat-group.jsx | 26 + app/react/components/profile.jsx | 37 + app/react/components/repo-list.jsx | 23 + app/react/components/repo.jsx | 30 + app/react/components/results-message.jsx | 48 + app/react/components/results.jsx | 27 + app/react/components/search-form.jsx | 33 + app/react/components/search.jsx | 73 + app/react/components/stat.jsx | 16 + app/react/components/user-detail.jsx | 57 + app/react/mixins/._cache.js | Bin 0 -> 4096 bytes app/react/mixins/cache.js | 29 + app/react/stores/._profile.js | Bin 0 -> 4096 bytes app/react/stores/._repos.js | Bin 0 -> 4096 bytes app/react/stores/._search.js | Bin 0 -> 4096 bytes app/react/stores/._starred.js | Bin 0 -> 4096 bytes app/react/stores/profile.js | 38 + app/react/stores/repos.js | 56 + app/react/stores/search.js | 57 + app/react/stores/starred.js | 36 + app/react/utils/._joinClasses.js | Bin 0 -> 4096 bytes app/react/utils/._parseLinkHeader.js | Bin 0 -> 4096 bytes app/react/utils/joinClasses.js | 39 + app/react/utils/parseLinkHeader.js | 19 + app/suit/._app.css | Bin 0 -> 4096 bytes app/suit/._base.css | Bin 0 -> 4096 bytes app/suit/._components | Bin 0 -> 4096 bytes app/suit/._forms.css | Bin 0 -> 4096 bytes app/suit/._utils | Bin 0 -> 4096 bytes app/suit/app.css | 9 + app/suit/base.css | 29 + app/suit/components/._button.css | Bin 0 -> 4096 bytes app/suit/components/._container.css | Bin 0 -> 4096 bytes app/suit/components/._pagination.css | Bin 0 -> 4096 bytes app/suit/components/._profile-card.css | Bin 0 -> 4096 bytes app/suit/components/._profile-stat-group.css | Bin 0 -> 4096 bytes app/suit/components/._profile.css | Bin 0 -> 4096 bytes app/suit/components/._repo-list.css | Bin 0 -> 4096 bytes app/suit/components/._repo.css | Bin 0 -> 4096 bytes app/suit/components/._results-message.css | Bin 0 -> 4096 bytes app/suit/components/._results.css | Bin 0 -> 4096 bytes app/suit/components/._search.css | Bin 0 -> 4096 bytes app/suit/components/._searchform.css | Bin 0 -> 4096 bytes app/suit/components/._stat.css | Bin 0 -> 4096 bytes app/suit/components/._user-detail.css | Bin 0 -> 4096 bytes app/suit/components/button.css | 28 + app/suit/components/container.css | 7 + app/suit/components/pagination.css | 23 + app/suit/components/profile-card.css | 47 + app/suit/components/profile-stat-group.css | 6 + app/suit/components/profile.css | 58 + app/suit/components/repo-list.css | 13 + app/suit/components/repo.css | 35 + app/suit/components/results-message.css | 6 + app/suit/components/results.css | 51 + app/suit/components/search.css | 24 + app/suit/components/searchform.css | 29 + app/suit/components/stat.css | 18 + app/suit/components/user-detail.css | 30 + app/suit/forms.css | 49 + app/suit/utils/._img.css | Bin 0 -> 4096 bytes app/suit/utils/._space.css | Bin 0 -> 4096 bytes app/suit/utils/img.css | 5 + app/suit/utils/space.css | 44 + built/._app.built.css | Bin 0 -> 4096 bytes built/._app.built.js | Bin 0 -> 4096 bytes built/._app.built.js.map | Bin 0 -> 4096 bytes built/._app.js.map | Bin 0 -> 4096 bytes built/app.built.css | 2154 + built/app.built.js | 32981 ++++++++++++++++ built/app.built.js.map | 1 + built/app.js.map | 1 + gulp/.DS_Store | Bin 0 -> 12292 bytes gulp/._.DS_Store | Bin 0 -> 4096 bytes gulp/._config | Bin 0 -> 4096 bytes gulp/._index.js | Bin 0 -> 4096 bytes gulp/._tasks | Bin 0 -> 4096 bytes gulp/._util | Bin 0 -> 4096 bytes gulp/config/._webpack.config.js | Bin 0 -> 4096 bytes gulp/config/webpack.config.js | 24 + gulp/index.js | 7 + gulp/tasks/._css.js | Bin 0 -> 4096 bytes gulp/tasks/._default.js | Bin 0 -> 4096 bytes gulp/tasks/._js.js | Bin 0 -> 4096 bytes gulp/tasks/._watch.js | Bin 0 -> 4096 bytes gulp/tasks/css.js | 19 + gulp/tasks/default.js | 3 + gulp/tasks/js.js | 10 + gulp/tasks/watch.js | 8 + gulp/util/._handleError.js | Bin 0 -> 4096 bytes gulp/util/._paths.js | Bin 0 -> 4096 bytes gulp/util/._scriptFilter.js | Bin 0 -> 4096 bytes gulp/util/handleError.js | 12 + gulp/util/paths.js | 20 + gulp/util/scriptFilter.js | 7 + gulpfile.js | 1 + index.html | 12 + package.json | 37 + 145 files changed, 36664 insertions(+) create mode 100644 .DS_Store create mode 100644 ._.DS_Store create mode 100644 ._.gitignore create mode 100644 ._README.md create mode 100644 ._app create mode 100644 ._built create mode 100644 ._gulp create mode 100644 ._gulpfile.js create mode 100644 ._index.html create mode 100644 ._package.json create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app/.DS_Store create mode 100644 app/._.DS_Store create mode 100644 app/._react create mode 100644 app/._suit create mode 100644 app/npm-debug.log create mode 100644 app/react/.DS_Store create mode 100644 app/react/._.DS_Store create mode 100644 app/react/._actions create mode 100644 app/react/._api create mode 100644 app/react/._components create mode 100644 app/react/._mixins create mode 100644 app/react/._stores create mode 100644 app/react/._utils create mode 100644 app/react/actions/._user.js create mode 100644 app/react/actions/user.js create mode 100644 app/react/api/._github.js create mode 100644 app/react/api/github.js create mode 100644 app/react/components/._app.jsx create mode 100644 app/react/components/._layout.jsx create mode 100644 app/react/components/._pagination.jsx create mode 100644 app/react/components/._profile-card.jsx create mode 100644 app/react/components/._profile-stat-group.jsx create mode 100644 app/react/components/._profile.jsx create mode 100644 app/react/components/._repo-list.jsx create mode 100644 app/react/components/._repo.jsx create mode 100644 app/react/components/._results-message.jsx create mode 100644 app/react/components/._results.jsx create mode 100644 app/react/components/._search-form.jsx create mode 100644 app/react/components/._search.jsx create mode 100644 app/react/components/._stat.jsx create mode 100644 app/react/components/._user-detail.jsx create mode 100644 app/react/components/app.jsx create mode 100644 app/react/components/layout.jsx create mode 100644 app/react/components/pagination.jsx create mode 100644 app/react/components/profile-card.jsx create mode 100644 app/react/components/profile-stat-group.jsx create mode 100644 app/react/components/profile.jsx create mode 100644 app/react/components/repo-list.jsx create mode 100644 app/react/components/repo.jsx create mode 100644 app/react/components/results-message.jsx create mode 100644 app/react/components/results.jsx create mode 100644 app/react/components/search-form.jsx create mode 100644 app/react/components/search.jsx create mode 100644 app/react/components/stat.jsx create mode 100644 app/react/components/user-detail.jsx create mode 100644 app/react/mixins/._cache.js create mode 100644 app/react/mixins/cache.js create mode 100644 app/react/stores/._profile.js create mode 100644 app/react/stores/._repos.js create mode 100644 app/react/stores/._search.js create mode 100644 app/react/stores/._starred.js create mode 100644 app/react/stores/profile.js create mode 100644 app/react/stores/repos.js create mode 100644 app/react/stores/search.js create mode 100644 app/react/stores/starred.js create mode 100644 app/react/utils/._joinClasses.js create mode 100644 app/react/utils/._parseLinkHeader.js create mode 100644 app/react/utils/joinClasses.js create mode 100644 app/react/utils/parseLinkHeader.js create mode 100644 app/suit/._app.css create mode 100644 app/suit/._base.css create mode 100644 app/suit/._components create mode 100644 app/suit/._forms.css create mode 100644 app/suit/._utils create mode 100644 app/suit/app.css create mode 100644 app/suit/base.css create mode 100644 app/suit/components/._button.css create mode 100644 app/suit/components/._container.css create mode 100644 app/suit/components/._pagination.css create mode 100644 app/suit/components/._profile-card.css create mode 100644 app/suit/components/._profile-stat-group.css create mode 100644 app/suit/components/._profile.css create mode 100644 app/suit/components/._repo-list.css create mode 100644 app/suit/components/._repo.css create mode 100644 app/suit/components/._results-message.css create mode 100644 app/suit/components/._results.css create mode 100644 app/suit/components/._search.css create mode 100644 app/suit/components/._searchform.css create mode 100644 app/suit/components/._stat.css create mode 100644 app/suit/components/._user-detail.css create mode 100644 app/suit/components/button.css create mode 100644 app/suit/components/container.css create mode 100644 app/suit/components/pagination.css create mode 100644 app/suit/components/profile-card.css create mode 100644 app/suit/components/profile-stat-group.css create mode 100644 app/suit/components/profile.css create mode 100644 app/suit/components/repo-list.css create mode 100644 app/suit/components/repo.css create mode 100644 app/suit/components/results-message.css create mode 100644 app/suit/components/results.css create mode 100644 app/suit/components/search.css create mode 100644 app/suit/components/searchform.css create mode 100644 app/suit/components/stat.css create mode 100644 app/suit/components/user-detail.css create mode 100644 app/suit/forms.css create mode 100644 app/suit/utils/._img.css create mode 100644 app/suit/utils/._space.css create mode 100644 app/suit/utils/img.css create mode 100644 app/suit/utils/space.css create mode 100644 built/._app.built.css create mode 100644 built/._app.built.js create mode 100644 built/._app.built.js.map create mode 100644 built/._app.js.map create mode 100644 built/app.built.css create mode 100644 built/app.built.js create mode 100644 built/app.built.js.map create mode 100644 built/app.js.map create mode 100644 gulp/.DS_Store create mode 100644 gulp/._.DS_Store create mode 100644 gulp/._config create mode 100644 gulp/._index.js create mode 100644 gulp/._tasks create mode 100644 gulp/._util create mode 100644 gulp/config/._webpack.config.js create mode 100644 gulp/config/webpack.config.js create mode 100644 gulp/index.js create mode 100644 gulp/tasks/._css.js create mode 100644 gulp/tasks/._default.js create mode 100644 gulp/tasks/._js.js create mode 100644 gulp/tasks/._watch.js create mode 100644 gulp/tasks/css.js create mode 100644 gulp/tasks/default.js create mode 100644 gulp/tasks/js.js create mode 100644 gulp/tasks/watch.js create mode 100644 gulp/util/._handleError.js create mode 100644 gulp/util/._paths.js create mode 100644 gulp/util/._scriptFilter.js create mode 100644 gulp/util/handleError.js create mode 100644 gulp/util/paths.js create mode 100644 gulp/util/scriptFilter.js create mode 100644 gulpfile.js create mode 100644 index.html create mode 100644 package.json diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d616fc4f067f042f25700177de1222431c7619bf GIT binary patch literal 12292 zcmeI2eNY`&6~NCSB-vdSSkeR@n+JJ?QbB0wih4``Csx%X|3t zJxD@H@nigKGNWUojkcP0Y>hbnp>3UNtvZfQ8=dMXnvWTEbgIr|{HPx@>gcHF-re`u z_a0=@)=6u-JF|Ot@5k=lyXV|{e&;LzU}rMo2dD!8fp(TEGC;lr;47dD$HvOpp0h2Z z9HgDv0i7!VIv9{J%*n2hkyG2va7Vx$fj80!TfIrkasRLVd!R} zvGFqIEz4iNVx=HT1#+R<+t*uqhdipRn$)$a-4h8t7B%;2ag)+frPv&cP4$Ii(f+u` z%7?-+BRL*5N0pLr&ebXP3GT1Awn1d*3iRjTR%R?-#M=oqmZ++3^5gC@O_60|GcQZLJcNAze! zF-5CsqhD6{8o`ieC=tJCv+yK54PSw8!}nnxF2hUkM|c_j0)K^nU>+7=Ar@gVdawp-u@2W`6L#Qs3}7F= z4g2x!xCam5Aq-&{BRGyGCUFv{a27v+AHomg1Nb05f@kqjd9$&!o zIFCQUpW|=wWvhF6OkCNv%Suv5{L>UX01v`xcogQStIxuB;YIi{{1h(0MffFLf#1RJ z;ScaP%*PeD5(O;53arF+)ZJUL0UObeTd2!BuoJs*7j<|L_u@Vr#lxuMJMai5aE3bk zE_^q2_zZpuAEqupfuF;3_+@;Ob=m4lx`TbGu30I5lhS1ngbA3S^>HF(aQzxe>DNVv zeyKgHrCNu8zY={)YmY-$MwJ{DAY8mK2SiZ)`P)tvHutU9FuJDs&st2v<6 z9MFC;+Ju7q>D120s{;nC)IGW*;Eq7<2&|y2Oxr(Yo19A7CYiRscW3X;(!Mva?SH9= z8ND~GUQ=4;t66_*)8^ZDqz&dQ6FI|*cN*^8TDQz`ZlocMc|imt+zlVYOu;`z4d~in&no3fIwMp zmA1=UMM4H8-zx2p0|JqOvSNO1x$5ccl4S)L!HBQk#6M3~^RLLf|0e=j$_01>ne{i4 zN#B6&+@$ZqZtTI`WY+J&0kVb;8)4qe-^)kFX9DDG}HF;otdJF7c=E_av&ZxV$s8t%NB%uI85|v zz(i=uwB;9GNXhSolx;20Rw&#(KzKTk2quzdXE1(%Ul9R@?DN4`%t)UHL;DC|N0rrG zv1lTwN42=4`oSUk&atV^STY(h`F;9>i7{#`vTaoHOi%m$o9lf|{>?M>zUlUsP4&Lk z*2b9`Q7EhNZ|gfWe(d=4eKRK>vR)PKl?{rm>-6!A^93#E8i$8?>IE0zK`ij}loz+>=5 zV(#Y%W4}ir`vdqPTq3o634RT~A?5rR{2Ts53M%3nEX6YPImml6De4y7N@{usf$UvG z;6t{GhDk+}TtScHd+?+9G2-si_-XtMvG*L2_fyvdv1wJiI>w3xgt0qoUl&QdB(u-M z*MQ3Ex_W=>)(=-5OTdcOA6ds z_&hvA!uBKbm;8(b?FtFm-}wrlZ~;?sE%{4sCil*I+<^7ig00v_g2u$`c3Ka5xs!+a zOoqtO6XcGbducV8z&LmJoWT3J@8rFB5>MerY~g#vn&Q%Pes6lp<0trpbK=XI@iVKs zSMCV7BjApJI|A+qxFhgNMqoKrw&M~Gb~>Lzi`R>t%BQEBT3U#mTACO;`TcEl(c09K z15XT&Xj>AVK1qcOaToe8VJUQy7&=M44$670z_h6Cy9hch1m6}xC`r0zgvuMESR%80 z$q-x|p`;9R_ZkpN%0?(j%0?(D7onuZ5K8*rA(UvNQx!DBZO{)R5aHH$i+3P4HO03|sAN@|lb0ZMWLl+-B^K#?jr0g6S%%V9BbI|pBaZxNwi zhF=hyUx7bUh#4rnTtsd&7GAExYGU(^|em zqd!PQ@p_5x|2O|LzdzsVSp5I?rT_o4YPm;u1l$pLQ;q=UcMo)T(yOH+5ZQ0ZV(mWK z57EvxR&Ulyc@sL=;doxgL-CYn|5L{E0#u!~o3&EjjIOO_*X<_&<|1|1f9p3-cm1cI MBr|~ME#?3JFZGrQpa1{> literal 0 HcmV?d00001 diff --git a/._.DS_Store b/._.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..94a48a812627614c9579e93cab21891dfaffa307 GIT binary patch literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIk*Y|peR=07!nc$ zlwgGDV5q>VXjE`C1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E1%90I_OD5x_E z0dgT3nZ*i4sm1xFMaiiOY57Ij3YmE&sd*)t`FV*sIh6`Isc9t&NjZsm*}$$YOxsYV OQT-41i423>|Nj8>HyoD$ literal 0 HcmV?d00001 diff --git a/._.gitignore b/._.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..0cd760f6e13e6a0639152d9147887d73287f8b3e GIT binary patch literal 4096 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 OQT-41i423>|Nj8>HyoD$ literal 0 HcmV?d00001 diff --git a/app/._react b/app/._react new file mode 100644 index 0000000000000000000000000000000000000000..5e98053ad1ce9156d107314596550d5ca0c4e1a2 GIT binary patch literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v0xDsI z=wO%uWZR-?0m{L|MU(S$^%4sTa#HmQOB0I{^GY)FQW*>kER3xUpujpfF)gtu6Qs)8 z)xg}`!qwSH*VNV3P}juK)KJ&L$=pcS&Dqk)$;`~m*wx4p&9YJMXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQP=O0Z?ZXguy^ABqOs}p(wRDzqBYhRUs|EC|e;juOt=N o?aa?h%*m-#$Vp8rQAo;3%*zJ$g`v8JG==JaxL0Ht$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v0xDsI z=wO%uWZR-?0m{L|MU(S$^%4sTa#HmQOB0I{^GY)FQW*>kER3xUpujpfF)gtu6Qs)8 z)xg}`!qwSH*VNV3P}juK)KJ&L$=pcS&Dqk)$;`~m*wx4p&9YJMXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQP=O0Z?ZXguy^ABqOs}p(wRDzqBYhRUs|EC|e;juOt=N o?aa?h%*m-#$Vp8rQAo;3%*zJ$g`v8JG==JaxL0Ht +12 verbose exit [ 1, true ] diff --git a/app/react/.DS_Store b/app/react/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a2d245f52a439c08e09e2a08ee66ce4fad339949 GIT binary patch literal 12292 zcmeHNYiu0V6+WNiBs1fLj6)Kyck)=pHE|Lru?=?KVeL3h0!fo%2b&OZ_Aw+Q);sRb ztewP!n$i}2KoFGn2lNG0s??-ZLPVk!Li_>*h!TX#L#3+v;0LYLsuB`ad7XRj?0R=? zr%@lYHFKpq=gxi1%sq4OobNklhzMQzbSqI45ow%-H0Kdj8$_`hJ}F6}UF1n=7T18Y z$(hS6oQyZJGnsLdllq1gp$0+?{BLQXiXTVp-)hdYC_%%e`?o5W9L_kN-_r6Xs%BNs zo-+DRzcSh{)gl~I;<^u1yJGwXJW)J4<5yu|wPq~@=P?lS2 zQ;AF}&z~^|SL9 zM^`j7t!vx3t@HKymn|@B7wY<9Cv9ha=N8A#9U67g{_z_UUdqmo@3;LzzU<&X{Rk-RH`y^hp1Rnv!{K zP`PQd9vMivLqj|juNKWg_4XZ+$j#!;`x2giVA#&`Q@y~qH!oW-Ke9B^t!X!i*3NXA zpQ<4)zTli1;w`FRf#JBKmd>=o+BRGq5IFD!4lU0c|C(>Re3P(I!t^_gBc&BAerG#BQyG?6_ zbxq+dSHAtJl_S@JUR04((0Yo~9y&rcFaJAPL1*YbdYFDl=jaJ~nx3Z@SVb?>1$vu) zL+{aF>F@NBRFB5WsY3+ySc&!6fEHHF4#d%kE?kR)xDLJO!%eIf8@J#XhFLYIFoxUk zb)3Qdte|h=JFJ+W;BovEPvKcShgWd{ui;mC2k+vK_>)phQC$ZMic%8qvz*J@Hbp); z)A@ zS5kgD_#hyJXcrJdCN2v)AnIa)j0bXDNp9f;HI$_qDy)^Nm&3U}7M#ZeIj*D{PLOxz z>jZa3z)+xu6JoMEA+BV23^fpHV6q07@0Vcz0(j`33?B5FXwRbEtNtt4|E+ln@L#@Y z@$!bI=GKm_@giWZK!;^0z7)7iw65T|gy{tsE-~TjObhCxmcDE{Jb8$Ly?sIx=-iyE zddH$GH3sCSCQtRo=qjCAg9+8z7+tGrW|eANA8pZ@D44TU+m(8|#+1OEty(wfTXZH3 zX0>YFu3xP&H!$a@)-JtU7xcxXDM0?T5dRVSG5w6;{cH3Fy~EJ{J%;rkFr=RYQ$qSE zEG)wn4C_~84Vux84s2osD}enj^k5IZ#0a(zhZx=;Wq6-Lno+FFC^iR=VgBv-3huyH z@ip8VpjiR;zo*t$5wY$mUvK!)#9|xi&1Exg_88ZQFS@}f)}BYi=e4{`{HBR%jn|hgb_WB7w?{y_|H_9{Sgvp@X=en61UeP^k zLbzg=t-NAwOZ%3qyXBYKSZFMo4mp*$XeEwOc*|6P%c|T`g{zdiXoV+m`3lP@19#Fz zD_R;>SXL?03w)%jnk-|&MJqZsuQQAZ7pBv!?4pFCY^5q(ZyEnQ zyNEKo&;+|sgu+-8Wgap?C^i_aC4|Db%IGL16q}8$0imd`i!9l`!!S%z0THnYjmD_1 zYZKh!Qhnr)(pmbs3?N*fU(&DXck~zf8-Tf}m40yxOR-#r4c1^S)-k_Op@VG!zu3!O za>XwOa5&%>$KV9~VuZcrcW@Zt8@LO12j21r@m)NM#}tw-uDi-0!Z~g)S$7piL=6s) zMGeg6QbiD9#?r2ed4?8tA_yw1S!iKDPw~Id%Cg6=+=mxhS&m6xx|OZ?oK{%c;D?f# zX-w2FCja03U%(`pnne76*YyAYsb1kR)Ig|#8L0tOclUO8@ze@2i^^GwSbL1~QO+WX ze&b5YA$$nJ@v=>Z;<>JcyU4`lxG1n3SCUJdKJ%XdE*`@R?SE+hFD-^Q1ML5&mZ6JF literal 0 HcmV?d00001 diff --git a/app/react/._.DS_Store b/app/react/._.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..94a48a812627614c9579e93cab21891dfaffa307 GIT binary patch literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIk*Y|peR=07!nc$ zlwgGDV5q>VXjE`C1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E1%90I_OD5x_E z0dgT3nZ*i4sm1xFMaiiOY57Ij3YmE&sd*)t`FV*sIh6`Isc9t&NjZsm*}$$YOxsYV OQT-41i423>|Nj8>HyoD$ literal 0 HcmV?d00001 diff --git a/app/react/._actions b/app/react/._actions new file mode 100644 index 0000000000000000000000000000000000000000..5e98053ad1ce9156d107314596550d5ca0c4e1a2 GIT binary patch literal 4096 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 { + return { + results: apiData, + url, + pagination: parseLinkHeader(req.request.getResponseHeader('Link')) + }; + }); + + return req; +} \ No newline at end of file diff --git a/app/react/components/._app.jsx b/app/react/components/._app.jsx new file mode 100644 index 0000000000000000000000000000000000000000..0cd760f6e13e6a0639152d9147887d73287f8b3e GIT binary patch literal 4096 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 + + + + + +); + +Router.run(routes, function(Handler) { + React.render(, document.body); +}); diff --git a/app/react/components/layout.jsx b/app/react/components/layout.jsx new file mode 100644 index 0000000..5e8bf0f --- /dev/null +++ b/app/react/components/layout.jsx @@ -0,0 +1,12 @@ +import React from 'react'; +import Router, { RouteHandler } from 'react-router' + +var Layout = React.createClass({ + render: function() { + return ( + + ) + } +}); + +export default Layout; diff --git a/app/react/components/pagination.jsx b/app/react/components/pagination.jsx new file mode 100644 index 0000000..a26d27c --- /dev/null +++ b/app/react/components/pagination.jsx @@ -0,0 +1,63 @@ +import React from 'react'; +import Router, { State, Link } from 'react-router' + +var Pagination = React.createClass({ + mixins: [State], + + renderNextLink() { + if (this.props.pagination.next) { + let url = new URL(this.props.pagination.next); + return ( + + Next + + ) + } + }, + + renderPrevLink() { + if (this.props.pagination.prev) { + let url = new URL(this.props.pagination.prev); + return ( + + Previous + + ) + } + }, + + renderFirstLink() { + if (this.props.pagination.first) { + let url = new URL(this.props.pagination.first); + return ( + + First + + ) + } + }, + + renderLastLink() { + if (this.props.pagination.last) { + let url = new URL(this.props.pagination.last); + return ( + + Last + + ) + } + }, + + render() { + return ( +
+ {this.renderFirstLink()} + {this.renderPrevLink()} + {this.renderNextLink()} + {this.renderLastLink()} +
+ ); + } +}); + +export default Pagination; diff --git a/app/react/components/profile-card.jsx b/app/react/components/profile-card.jsx new file mode 100644 index 0000000..88d91eb --- /dev/null +++ b/app/react/components/profile-card.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { Link } from 'react-router'; + +var ProfileCard = React.createClass({ + render: function() { + return ( +
+ + +

{this.props.username}

+ +
+ ) + } +}); + +export default ProfileCard; diff --git a/app/react/components/profile-stat-group.jsx b/app/react/components/profile-stat-group.jsx new file mode 100644 index 0000000..a1ae963 --- /dev/null +++ b/app/react/components/profile-stat-group.jsx @@ -0,0 +1,26 @@ +import React from 'react'; +import Stat from './stat.jsx'; +import map from 'lodash-node/modern/collection/map'; +import uniqueId from 'lodash-node/modern/utility/uniqueId'; + +var ProfileStatGroup = React.createClass({ + renderStatItems: function() { + return map(this.props.stats, function(value, key) { + return ( +
  • + +
  • + ); + }); + }, + + render: function() { + return ( +
      + {this.renderStatItems()} +
    + ) + } +}); + +export default ProfileStatGroup; diff --git a/app/react/components/profile.jsx b/app/react/components/profile.jsx new file mode 100644 index 0000000..f5d3341 --- /dev/null +++ b/app/react/components/profile.jsx @@ -0,0 +1,37 @@ +import React from 'react'; +import ProfileStatGroup from './profile-stat-group.jsx'; + +var Profile = React.createClass({ + render: function() { + var stats = { + 'Followers': this.props.user.followers, + 'Following': this.props.user.following, + 'Repos': this.props.user.public_repos + }; + + return ( +
    +
    + +
    +
    +

    + + {this.props.user.name} + +

    +
    +

    {this.props.user.login}

    +

    {this.props.user.location}

    +

    {this.props.user.blog}

    +
    +
    + +
    +
    +
    + ) + } +}); + +export default Profile; diff --git a/app/react/components/repo-list.jsx b/app/react/components/repo-list.jsx new file mode 100644 index 0000000..93e1813 --- /dev/null +++ b/app/react/components/repo-list.jsx @@ -0,0 +1,23 @@ +import React from 'react'; +import Repo from './repo.jsx'; +import map from 'lodash-node/modern/collection/map'; + +var RepoList = React.createClass({ + render: function() { + var repos = map(this.props.repos, function(repo) { + return ( +
  • + +
  • + ); + }); + + return ( +
      + {repos} +
    + ) + } +}); + +export default RepoList; diff --git a/app/react/components/repo.jsx b/app/react/components/repo.jsx new file mode 100644 index 0000000..144142a --- /dev/null +++ b/app/react/components/repo.jsx @@ -0,0 +1,30 @@ +import React from 'react'; +import Stat from './stat.jsx'; + +var Repo = React.createClass({ + renderStat: function() { + if (this.props.data.stargazers_count) { + return ( +
    + +
    + ) + } else { + return null; + } + }, + + render: function() { + return ( + + ) + } +}); + +export default Repo; \ No newline at end of file diff --git a/app/react/components/results-message.jsx b/app/react/components/results-message.jsx new file mode 100644 index 0000000..8a2d306 --- /dev/null +++ b/app/react/components/results-message.jsx @@ -0,0 +1,48 @@ +import React from 'react'; +import pluralize from 'pluralize'; + +var ResultsMessage = React.createClass({ + render: function() { + var results = this.props.results; + var total = results.total_count; + var resultsMessage; + + // Found some results + if (total > 0) { + resultsMessage = ( + + {total} {pluralize('results', total)} for {this.props.query} + + ); + } + + // Found zero results + if (total == 0) { + resultsMessage = ( + No results for {this.props.query} + ); + } + + // Found results, but no more pages + if (total > 0 && !results.items.length) { + resultsMessage = ( + No more results for {this.props.query} + ); + } + + // No results because error + if (results.error) { + resultsMessage = ( + Error: {results.error.message} + ) + } + + return ( +

    + {resultsMessage} +

    + ) + } +}); + +export default ResultsMessage; \ No newline at end of file diff --git a/app/react/components/results.jsx b/app/react/components/results.jsx new file mode 100644 index 0000000..aca55bc --- /dev/null +++ b/app/react/components/results.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import ProfileCard from './profile-card.jsx'; +import map from 'lodash-node/modern/collection/map'; + +var Results = React.createClass({ + renderResultsItem: function(user) { + return ( +
  • + +
  • + ) + }, + + render: function() { + var resultsItems = this.props.results && map(this.props.results.items, this.renderResultsItem); + + return ( +
    +
      + {resultsItems} +
    +
    + ) + } +}); + +export default Results; diff --git a/app/react/components/search-form.jsx b/app/react/components/search-form.jsx new file mode 100644 index 0000000..3f34492 --- /dev/null +++ b/app/react/components/search-form.jsx @@ -0,0 +1,33 @@ +import React from 'react/addons'; +import Router, { State } from 'react-router'; +var LinkedStateMixin = React.addons.LinkedStateMixin; + +var SearchForm = React.createClass({ + mixins: [State, LinkedStateMixin], + + getInitialState: function() { + return { value: '' }; + }, + + componentWillReceiveProps: function() { + this.setState({ value: this.getQuery().q }); + }, + + getSearchTerm: function () { + return this.refs.input.getDOMNode().value + }, + + render: function() { + return ( +
    +

    Search for a GitHub user

    +
    + + +
    +
    + ) + } +}); + +export default SearchForm; diff --git a/app/react/components/search.jsx b/app/react/components/search.jsx new file mode 100644 index 0000000..203ff96 --- /dev/null +++ b/app/react/components/search.jsx @@ -0,0 +1,73 @@ +import React from 'react'; +import Router, { Navigation, State } from 'react-router' +import Reflux from 'reflux'; + +import isEmpty from 'lodash-node/modern/lang/isEmpty'; +import isString from 'lodash-node/modern/lang/isString'; + +import SearchForm from './search-form.jsx'; +import Pagination from './pagination.jsx'; +import Results from './results.jsx'; +import ResultsMessage from './results-message.jsx'; + +import User from 'actions/user'; +import SearchStore from 'stores/search'; + +var Search = React.createClass({ + mixins: [ + Navigation, + Reflux.connect(SearchStore), + Reflux.ListenerMixin, + State + ], + + handleSearchFormSubmit(event) { + event.preventDefault(); + + this.transitionTo('users', {}, { + q: this.refs.searchForm.getSearchTerm() + }); + }, + + search(url) { + // Clear results before loading new set + this.setState(SearchStore.getInitialState()); + + if (isString(url) && !isEmpty(this.getQuery())) { + User.search(url); + } + }, + + componentWillReceiveProps() { + // Search if route param changes + this.search(this.getPath()); + }, + + componentDidMount() { + // Search if URL params are present on page render + this.search(this.getPath()); + }, + + render() { + return ( +
    +
    +
    + + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + ) + } +}); + +export default Search; diff --git a/app/react/components/stat.jsx b/app/react/components/stat.jsx new file mode 100644 index 0000000..cdcc1e8 --- /dev/null +++ b/app/react/components/stat.jsx @@ -0,0 +1,16 @@ +import React from 'react'; +import joinClasses from 'utils/joinClasses'; +import pluralize from 'pluralize'; + +var Stat = React.createClass({ + render: function() { + return ( +
    + {this.props.value} + {pluralize(this.props.title, this.props.value)} +
    + ) + } +}); + +export default Stat; diff --git a/app/react/components/user-detail.jsx b/app/react/components/user-detail.jsx new file mode 100644 index 0000000..b560129 --- /dev/null +++ b/app/react/components/user-detail.jsx @@ -0,0 +1,57 @@ +import React from 'react'; +import Router, { Navigation, State } from 'react-router' +import Reflux from 'reflux'; + +import User from 'actions/user'; +import ProfileStore from 'stores/profile'; +import RepoStore from 'stores/repos'; +import StarredStore from 'stores/starred'; + +import Profile from './profile.jsx'; +import RepoList from './repo-list.jsx'; + +var UserDetail = React.createClass({ + mixins: [ + Navigation, + Reflux.connect(ProfileStore), + Reflux.connect(RepoStore), + Reflux.connect(StarredStore), + Reflux.ListenerMixin, + State + ], + + componentWillReceiveProps: function() { + User.profile(this.getPath(), this.getParams().username); + }, + + componentDidMount: function() { + User.profile(this.getPath(), this.getParams().username); + }, + + render: function() { + return ( +
    +
    +

    Github user detail

    +
    + +
    +
    +
    +
    +
    +

    Popular Repositories

    + +
    +
    +

    Recently Starred

    + +
    +
    +
    +
    + ) + } +}); + +export default UserDetail; diff --git a/app/react/mixins/._cache.js b/app/react/mixins/._cache.js new file mode 100644 index 0000000000000000000000000000000000000000..0cd760f6e13e6a0639152d9147887d73287f8b3e GIT binary patch literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v0xDsI z=wO%uWZR-?0m{L|MU(S$^%4sTa#HmQOB0I{^GY)FQW*>kER3y9Eldqf6O&S{gA>yd zi!wo~tX&Pv%`IG=opeoIT@7_j98C>%Eu74ablsdSot(_f%#2-)9MLQr<&K8HXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1Jj1T~IHbEE+$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v0xDsI z=wO%uWZR-?0m{L|MU(S$^%4sTa#HmQOB0I{^GY)FQW*>kER3y9Eldqf6O&S{gA>yd zi!wo~tX&Pv%`IG=opeoIT@7_j98C>%Eu74ablsdSot(_f%#2-)9MLQr<&K8HXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1Jj1T~IHbEE+$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v0xDsI z=wO%uWZR-?0m{L|MU(S$^%4sTa#HmQOB0I{^GY)FQW*>kER3y9Eldqf6O&S{gA>yd zi!wo~tX&Pv%`IG=opeoIT@7_j98C>%Eu74ablsdSot(_f%#2-)9MLQr<&K8HXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1Jj1T~IHbEE+$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v0xDsI z=wO%uWZR-?0m{L|MU(S$^%4sTa#HmQOB0I{^GY)FQW*>kER3y9Eldqf6O&S{gA>yd zi!wo~tX&Pv%`IG=opeoIT@7_j98C>%Eu74ablsdSot(_f%#2-)9MLQr<&K8HXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1Jj1T~IHbEE+$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v0xDsI z=wO%uWZR-?0m{L|MU(S$^%4sTa#HmQOB0I{^GY)FQW*>kER3y9Eldqf6O&S{gA>yd zi!wo~tX&Pv%`IG=opeoIT@7_j98C>%Eu74ablsdSot(_f%#2-)9MLQr<&K8HXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1Jj1T~IHbEE+ pick(item, 'avatar_url', 'id', 'login')); + + // Don't mutate the data param + let newData = { + results, + url: data.url, + pagination: data.pagination + }; + + // Cache it + setItem(newData.url, newData); + + // Notify the views + this.trigger(newData); + } else { + // Response came from cache, so send straight to views + this.trigger(data); + } + }, + + onSearchFailed(query, xhr) { + this.trigger({ + results: { + items: [], + error: JSON.parse(xhr.responseText) + }, + query + }); + } +}); diff --git a/app/react/stores/starred.js b/app/react/stores/starred.js new file mode 100644 index 0000000..a3490b3 --- /dev/null +++ b/app/react/stores/starred.js @@ -0,0 +1,36 @@ +import Reflux from 'reflux'; +import User from 'actions/user'; +import ProfileStore from 'stores/profile'; +import pick from 'lodash-node/modern/object/pick'; +import { setItem } from 'mixins/cache'; + +export default Reflux.createStore({ + init() { + this.listenTo(User.starred.completed, this.onStarredCompleted); + this.listenTo(ProfileStore, this.onProfileCompleted); + }, + + getInitialState() { + return { + starred: {} + }; + }, + + onProfileCompleted(data) { + this.username = data.user.login; + User.starred(data.user.starred_url.replace(/\{\/[a-z]+}/g, ''), data.user.login); + }, + + onStarredCompleted(data, fromCache) { + if (!fromCache) { + let results = data.results + .map((repo) => pick(repo, 'id', 'name', 'html_url', 'description')) + .slice(0, 5); + + setItem(`${this.username}:starred`, results); + this.trigger({ starred: results }); + } else { + this.trigger({ starred: data }); + } + } +}); \ No newline at end of file diff --git a/app/react/utils/._joinClasses.js b/app/react/utils/._joinClasses.js new file mode 100644 index 0000000000000000000000000000000000000000..0cd760f6e13e6a0639152d9147887d73287f8b3e GIT binary patch literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v0xDsI z=wO%uWZR-?0m{L|MU(S$^%4sTa#HmQOB0I{^GY)FQW*>kER3y9Eldqf6O&S{gA>yd zi!wo~tX&Pv%`IG=opeoIT@7_j98C>%Eu74ablsdSot(_f%#2-)9MLQr<&K8HXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1Jj1T~IHbEE+$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v0xDsI z=wO%uWZR-?0m{L|MU(S$^%4sTa#HmQOB0I{^GY)FQW*>kER3y9Eldqf6O&S{gA>yd zi!wo~tX&Pv%`IG=opeoIT@7_j98C>%Eu74ablsdSot(_f%#2-)9MLQr<&K8HXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1Jj1T~IHbEE+ 1) { + for (var ii = 1; ii < argLength; ii++) { + nextClass = arguments[ii]; + if (nextClass) { + className = (className ? className + ' ' : '') + nextClass; + } + } + } + return className; +} + +module.exports = joinClasses; \ No newline at end of file diff --git a/app/react/utils/parseLinkHeader.js b/app/react/utils/parseLinkHeader.js new file mode 100644 index 0000000..83d5641 --- /dev/null +++ b/app/react/utils/parseLinkHeader.js @@ -0,0 +1,19 @@ +/** + * Extract pagination links from Link header in GitHub API + * */ + +export default function parseLinkHeader(link) { + if (!link) { + return {}; + } + + let parsed = {}; + let reg = /<(.*?)>; rel="(.*)"/; + + link.split(',').forEach(function(part) { + var r = reg.exec(part); + parsed[r[2]] = r[1]; + }); + + return parsed; +} \ No newline at end of file diff --git a/app/suit/._app.css b/app/suit/._app.css new file mode 100644 index 0000000000000000000000000000000000000000..0cd760f6e13e6a0639152d9147887d73287f8b3e GIT binary patch literal 4096 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