From 98f682fdcec595487c24e6745b3ca606d25b5bbf Mon Sep 17 00:00:00 2001 From: Mitchell Gerber Date: Sun, 7 Jan 2018 15:54:22 -0600 Subject: [PATCH] realm list page done --- client/app/app.tsx | 2 +- client/app/assets/header-realmforums.gif | Bin 0 -> 3106 bytes client/app/assets/realms-large.gif | Bin 0 -> 1913 bytes client/app/axios/axios.ts | 30 ++++++ client/app/pages/realms/realms.scss | 4 + client/app/pages/realms/realms.tsx | 74 +++++++++++++- client/app/scss/style.scss | 10 +- client/package.json | 4 + client/yarn.lock | 29 ++++++ priv/repo/seeds.exs | 122 ++++++++++++++++++++++- 10 files changed, 267 insertions(+), 8 deletions(-) create mode 100644 client/app/assets/header-realmforums.gif create mode 100644 client/app/assets/realms-large.gif create mode 100644 client/app/axios/axios.ts create mode 100644 client/app/pages/realms/realms.scss diff --git a/client/app/app.tsx b/client/app/app.tsx index 5bdcc4d..56edf03 100644 --- a/client/app/app.tsx +++ b/client/app/app.tsx @@ -1,6 +1,6 @@ import React from 'react'; import ReactDOM from 'react-dom'; - import Wrapper from './Wrapper'; +import 'babel-polyfill'; ReactDOM.render(, document.getElementById('app')); diff --git a/client/app/assets/header-realmforums.gif b/client/app/assets/header-realmforums.gif new file mode 100644 index 0000000000000000000000000000000000000000..0418fe1b6d9ac51d94ec03a77c309a7191237232 GIT binary patch literal 3106 zcmWmDeLT~N1Hkd`_q*qr?K^uyvwi2GJd8%el85hRm7aujsidL0{qA~Dsr2Z(4Jp!G zuIoYf8$F!L2}whBn-M)-)1~xq-AF}rjgTIW-~Imk{QrJ^=FXcVo0-}KAi&27AS%)+ z^BelUyfj>kcE@G!?HR24Oa8le2p%^0?%d{Dum=8a9j~Fl?bGP&dq-TJS^QtzoW5rlav(<} za3g6`8Kdu`?%oco+{pPjq^S6g^JRSA=-*MdT0^>Sh+D7toZHDB{42Qq3}V>A`Y;$? zzKw0WEveG5pFcwz>H_Pu{HA@pn^HUoyi?8l?>%JFIq-NIb;1(S4sy*-1ZV49qkgycSsSMWrOQL6w!jEUL-gM8p zS%wVSLeHG^8u(LMy_-{W%I(A3u)J(RV=k|1GiUcs4Zi;t2Qh@xjo!wC@YBdNio%XtOS#;;TsP(tNyBDX84auM03A}s7yZW4W z-9GNUCih>rbAR2*8UGM%sYJ3f*=^>){51H*A5zm%fj*b_d2DWFg=AkcV|}dS<7*!4 zzngMlFS~Xxx3xle>4e+k4p~ta?^a9jzzb>rv%upATv}_9l0xT<1bWRW4@-l8dleEp zk6~@{y|j87#WH@Ix=i$BJ0lntfao7YGaVf;flaWt}>_e)u-(VO)}$$y=AN&x$h1yOm&FeO$gHG&_y_TVlez z>E3wm1JcYcqr2SyGq^Ag%`s^wUcBH0pr|?}dPw$D`>{oSf4rWsORnFp-aV zWkP#VRtf7}%wblB0lmG)gJ3W8V$m~ouECiusH3`0Pbr(QLN>&KtOe4R1ut(uaq$y{z7Qs@TLt04+iD{Gs z=A%UHCB)noqjYd8utn;@#pCG~TFkK}jZw7HSmoan)&~vFxOZ9y=3?5g@>$5;t&Sfb zurxW|dzz-Vq1B0ky!WYvFY3`Eqp2n0RF)Pb7GKkf|W-I%Fji!~@91F87XjYAm4X6-Oso9BKt96UfBB#1+R6-iTH!gJ_qqv1mE>q~b z(y58n3i;#5>Yyzli-#}(hBj#7&D<7@}eoBn@Jj@pFuHjb)M zDj0?1o?{zR@yo`UK!xlTN4N7u1CwrMiP|hymny$ABR)NLH$F1n+zpF<=g!y%5gZj2HOmsZtY|!8QSg`FgRf z1c78Ycd}MPC#&4uPyiy@mudkMNX`J35Yn`DKgSWM$bkF|6=d;yE4N%Prw>1U2##P# zL>z(dWmv2USAm=i6gSm6|GYZ@t?cw!yth%4Psdj|8sv(+6%gut2Ipm!2cMn4G$7V? z0oQ@yCc@k19VtEA02YpE!msFFOYSp35P+8bXZ=fY z?_(T2AH$W@02H!`G$*14%0EG1sGi`cMjvPGXJFC4mM5y+6F3r0Z6rdii`eX&(2apo zqljQI1MUWl__fYDVZ?B38^BOL#Ia#*fTQiLlMKC@ES2MaUkMfkm`IyrTI(Zb!4f3` z!^(C%BVLcDo-fcqqcgYB2}4L{9oal&(=>#MQ?Df>y)eCK~|J zFM!(~1k9e>{mR$gOkoACrg`cd0IpWT1VCZC%U2d%rP8Y*I3@6))0BL0mJtnsgX%kJ+g zX4@dPv#I|0A{-5A8a3X(9!*66*M%zc=Cdfn{_B^XDXT?96UtDd8gZu0Cbnxxc%=K~ X%D=|@@c^-ck!4*y`NfGs24?*aX$tgz literal 0 HcmV?d00001 diff --git a/client/app/assets/realms-large.gif b/client/app/assets/realms-large.gif new file mode 100644 index 0000000000000000000000000000000000000000..32f1527ace0487f24c1788d97bc6c1a35b87821f GIT binary patch literal 1913 zcmV-<2Zs1ZNk%w1VLAXd0M!5hjEjn4jw)#z8_LSb0W4N+Y->$UN-{_omLDRxxVJSf zBLHu0=W8Gy89r7X87K?@KzX8yH@CTbMh+0$ zL_xQPL;(pB5)u#s5+x-SIj*g(3l;{zz`qFz2(z-WU0qeUo?`=Nmw$eJdSxg-KR%(L zpO=@GA^8LV00000EC2ui06G9R000L6K!==IMvB81~YD7H9Jr}jNAh|&eLf-l^g2o>n6--0Mar%?xqgqL{ESz(+LzjR2T<5re=7g$o*fSeY^* zhYu+>?5J1c$2?axOhvI_fRPpdXohy!D7n%hgoj5DLSU(*7n@MfEU@vk69#|*GYU8h z0m8tG7Z?meBtW(-*%Su}{IGCwj)7hSZs^>J!+=zeJq~C%VdHC941h7j7##SlOq7(7J41_zvg zf(;Bv@E!xyRd)di0`y1!fd&CKQx`KE=v2mBNWj3@I2)w!5&;oPSephRz`%eA7vva$ z3i|cOLkJ8wqreLed=&!*nZYm+ibjCLm;nT&1i^DBoN&Npv!U=FZW2VmpMC;>Ai-Wl z7C9JMF}O337mWPS;!80d@E(2+GccQRC04nr{fCo8hpp#!m>OcSt3RrR;5v(y* z00vSLaA62Q)>)gJCfIO-0S|oX0gVa}ab#FJeDK0DCNMdK0zR_R}+dvbbvKmgh1c$oqW7;u0B!LndNCFveX z074KbnJN>91QaO-&&8If1oTBvLJ1WFt3ZST{3$>K83-_hUkf*M>Y7F<5KjUO#tK+$ za@O_$t{RuXp9cbP%Yp|jv_QfNB%BOZ$_u=ZDxyYMwO9`^Fa%Lp5T0PIZLwVt!398j zkV6C{^anHo5}Z_0WhHH1r_)hz`!gx@Fxo=5MkuPC%pgz zf<@Tyj2KZbFf{=bYx!OXD4;-t2o)eeLICigpa8k#9&p~-2{~{$;zKCjKoe0r1bKTe z(4eK3KoY$FIpq%opn(U#_J>01$0D>q9b_bmg90#299RsdD}X|TwVe>a1F~T&feS7C z>4DXzaF_B2rXP3&A1FIj;l>HGm9$T_`iCnz9&0KDtRL$+hQkTL|Q50YpPFmTbd zmM4QmS*v~fickm?00I(lD_A4D%m^AF1fp<&0LNKW>i%Z}Si$6VX-X8paK%0#QI7;6 zz(EH(uq_Q-Km#Kf0TyDgE)K+?e~BB2CCs+~dkIDc4MA*d1q6flAbkN^h{_*H*g5P=Y+3M>f0p!kyD zFiXV$KuQWAK@fvzg6GBNX0;(f2}Y2E`?)}D6ez(38bAUVlmr5qnIjn-RwA_ZK#z<> zo&#t=GtRM(kn+1g30y!f0c`F83SguO1cL<}<`7Yiyksi%*h-5{&sz8i0lxx30{#3c zjU+IED$PSoeK?E|dQ4>l&VvH0$tH~Vxs5LSq#qV&CY7^P)e_W}MyF3p>Hr>NgWDu=g+>?fg~6x=pHo*g?3^S3;J7^gFpz;%+LTsV-OAV%!AD!YH$#i z2R&%0PGN%vF~lfiLEq~zFwnE5;D)qlsW6ma0};A3b%%Qa+7wb0q@d*>Pc?|WGDFNM z$TLy!DuM`iNQ62}!Ga8FiC7h)1AEQU4rL&OC6s{GOrh1Qr>iO9Tyj%;trT%MG=pPO z=T$Sr6?l9trX=^e&AuA8uc<30VY6V^xHi_Si(TxA%s^Sn9`1CJ&8%jj5Ci}_r})~_ literal 0 HcmV?d00001 diff --git a/client/app/axios/axios.ts b/client/app/axios/axios.ts new file mode 100644 index 0000000..1837e4e --- /dev/null +++ b/client/app/axios/axios.ts @@ -0,0 +1,30 @@ +import axios, { AxiosInstance, AxiosResponse } from 'axios'; + +// create our own instance of axios so we can set request headers +const ax: AxiosInstance = axios.create(); + +// response interceptors +ax.interceptors.response.use( + (config: AxiosResponse) => { + return config; + }, + (error: any) => { + // TODO: log the user out if they get a 401 + // if code is unauthorized (401) then logout if already logged in + // if (error.response.status === 401 && store.getState().user.loggedIn) { + // store.dispatch(userActions.logout()); + // } + + return Promise.reject(error); + }, +); + +export function setAuthorizationHeader(jwt: string): void { + ax.defaults.headers.common['Authorization'] = jwt; +} + +export function resetAuthorizationHeader(): void { + ax.defaults.headers.common['Authorization'] = ''; +} + +export default ax; diff --git a/client/app/pages/realms/realms.scss b/client/app/pages/realms/realms.scss new file mode 100644 index 0000000..bd5476e --- /dev/null +++ b/client/app/pages/realms/realms.scss @@ -0,0 +1,4 @@ +.realm-column { + flex: 1; + min-width: 150px; +} diff --git a/client/app/pages/realms/realms.tsx b/client/app/pages/realms/realms.tsx index 605ee6a..9e42450 100644 --- a/client/app/pages/realms/realms.tsx +++ b/client/app/pages/realms/realms.tsx @@ -1,19 +1,87 @@ import React from 'react'; +import { filter } from 'lodash'; +import { Link } from 'react-router-dom'; +import axios from '../../axios/axios'; import { ContentContainer } from '../../components'; +import './realms.scss'; +import header_realmforums from '../../assets/header-realmforums.gif'; +import realms_large from '../../assets/realms-large.gif'; interface Props {} -interface State {} +interface State { + realms: Realm[]; +} + +interface Realm { + id: number; + category: string; + title: string; +} export class Realms extends React.Component { constructor(props: Props) { super(props); + this.state = { + realms: [], + }; + } + + async componentDidMount() { + try { + const res = await axios.get('/api/category'); + const realms = filter(res.data.data, { category: 'realm' }); + this.setState({ realms }); + } catch (e) { + console.error(e); + } + } + + private renderRealms(realms: Realm[]): any { + return realms.map((realm) => { + return ( +
  • + {realm.title} +
  • + ); + }); } render() { - return ( + const { realms } = this.state; + + // copy list so we don't modify state + const realmsCopy = realms.slice(); + // split realms into 3 lists + const list1 = realmsCopy.splice(0, realmsCopy.length / 3); + const list2 = realmsCopy.splice(0, realmsCopy.length / 2); + const list3 = realmsCopy; + + return realms.length === 0 ?
    : ( - {/* TODO: */} +
    + + +
    + +
    +
    Welcome to the World of Warcraft Realm Forums!
    +
    Use these forums to discuss topics related to World of Warcraft with player on your own Realm.
    +
    + +
    +
      + {this.renderRealms(list1)} +
    + +
      + {this.renderRealms(list2)} +
    + +
      + {this.renderRealms(list3)} +
    +
    ); } diff --git a/client/app/scss/style.scss b/client/app/scss/style.scss index b7fa0b7..5f48848 100644 --- a/client/app/scss/style.scss +++ b/client/app/scss/style.scss @@ -44,10 +44,14 @@ hr { .flex { display: flex; -} -.flex--center { - align-items: center; + &--center { + align-items: center; + } + + &--wrap { + flex-wrap: wrap; + } } span.grey { diff --git a/client/package.json b/client/package.json index 80b81bd..4f89112 100644 --- a/client/package.json +++ b/client/package.json @@ -12,13 +12,16 @@ "author": "Mitchell Gerber", "license": "MIT", "dependencies": { + "@types/lodash": "^4.14.92", "@types/react": "^16.0.34", "@types/react-dom": "^16.0.3", "@types/react-router-dom": "^4.2.3", "autoprefixer": "^7.2.4", + "axios": "^0.17.1", "babel-core": "^6.26.0", "babel-loader": "^7.1.2", "babel-plugin-add-module-exports": "^0.2.1", + "babel-polyfill": "^6.26.0", "babel-preset-env": "^1.6.1", "babel-preset-react": "^6.24.1", "babel-preset-stage-0": "^6.24.1", @@ -29,6 +32,7 @@ "file-loader": "^1.1.6", "font-awesome": "^4.7.0", "html-webpack-plugin": "^2.30.1", + "lodash": "^4.17.4", "node-sass": "^4.7.2", "normalize.css": "^7.0.0", "postcss-loader": "^2.0.9", diff --git a/client/yarn.lock b/client/yarn.lock index 61a087a..f95a57b 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -6,6 +6,10 @@ version "4.6.2" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.6.2.tgz#12cfaba693ba20f114ed5765467ff25fdf67ddb0" +"@types/lodash@^4.14.92": + version "4.14.92" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.92.tgz#6e3cb0b71a1e12180a47a42a744e856c3ae99a57" + "@types/node@*": version "8.5.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-8.5.5.tgz#6f9e8164ae1a55a9beb1d2571cfb7acf9d720c61" @@ -304,6 +308,13 @@ aws4@^1.2.1, aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" +axios@^0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.17.1.tgz#2d8e3e5d0bdbd7327f91bc814f5c57660f81824d" + dependencies: + follow-redirects "^1.2.5" + is-buffer "^1.1.5" + babel-code-frame@^6.11.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -850,6 +861,14 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" +babel-polyfill@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + babel-preset-env@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" @@ -2436,6 +2455,12 @@ flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" +follow-redirects@^1.2.5: + version "1.3.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.3.0.tgz#f684871fc116d2e329fda55ef67687f4fabc905c" + dependencies: + debug "^3.1.0" + font-awesome@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" @@ -4957,6 +4982,10 @@ regenerate@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" diff --git a/priv/repo/seeds.exs b/priv/repo/seeds.exs index 4b0736b..6a8434b 100644 --- a/priv/repo/seeds.exs +++ b/priv/repo/seeds.exs @@ -40,10 +40,130 @@ defmodule Category do ] end - # TODO: add all realms defp get_realms() do [ + "Aegwynn", + "Agamaggan", + "Aggramar", + "Akama", + "Alleria", + "Archimonde", + "Argent Dawn", + "Arthas", + "Azgalor", + "Azjol-Nerub", + "Azshara", + "Blackhand", + "Blackrock", + "Bleeding Hollow", + "Bloodhoof", + "Bloodscalp", + "Bonechewer", + "Boulderfist", + "Bronzebeard", + "Burning Blade", + "Burning Legion", + "Cenarion Circle", + "Cenarius", + "Cho'gall", + "Chromaggus", + "Crushridge", + "Daggerspine", + "Dalaran", + "Dark Iron", + "Darkspear", + "Deathwing", + "Destromath", + "Dethecus", + "Detheroc", + "Doomhammer", + "Draenor", + "Dragonblight", + "Dragonmaw", + "Draka", + "Dunemaul", + "Durotan", + "Earthen Ring", + "Eldre'Thalas", + "Elune", + "Emerald Dream", + "Eonar", + "Eredar", + "Feathermoon", + "Firetree", + "Frostmane", + "Frostmourne", + "Frostwolf", + "Garona", + "Gilneas", + "Greymane", + "Gorefiend", + "Gorgonnash", + "Gurubashi", + "Hellscream", + "Hyjal", + "Icecrown", + "Illidan", + "Kargath", + "Kalecgos", + "Kael'thas", + "Kel'Thuzad", + "Khadgar", + "Khaz'goroth", + "Kil'Jaeden", + "Kilrogg", + "Kirin Tor", + "Laughing Skull", + "Lightbringer", + "Lightning's Blade", + "Lightninghoof", + "Llane", + "Lothar", + "Magtheridon", + "Maelstrom", + "Mal'Ganis", + "Malfurion", + "Malygos", + "Mannoroth", + "Medivh", + "Moonrunner", + "Nathrezim", + "Ner'zhul", + "Perenolde", + "Proudmoore", + "Sargeras", + "Scarlet Crusade", + "Shadow Council", + "Shadow Moon", + "Shadowsong", + "Shattered Hand", + "Silver Hand", + "Silvermoon", + "Skullcrusher", + "Skywall", + "Smolderthorn", + "Spinebreaker", + "Spirestone", + "Staghelm", "Stonemaul", + "Stormrage", + "Stormreaver", + "Stormscale", + "Suramar", + "Terenas", + "Test", + "Thunderhorn", + "Thunderlord", + "Tichondrius", + "Twisting Nether", + "Uldum", + "Uther", + "Ursin", + "Warsong", + "Whisperwind", + "Wildhammer", + "Windrunner", + "Zul'jin", ] end