feat: replace uk-icons with react-icons/go

This commit is contained in:
41666 2020-05-07 23:25:58 -04:00
parent 0c321e8b1e
commit 194cef6abc
No known key found for this signature in database
GPG key ID: BC51D07640DC10AF
13 changed files with 110 additions and 91 deletions

8
UI/package-lock.json generated
View file

@ -12688,6 +12688,14 @@
"resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.7.tgz", "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.7.tgz",
"integrity": "sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA==" "integrity": "sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA=="
}, },
"react-icons": {
"version": "3.10.0",
"resolved": "https://registry.npmjs.org/react-icons/-/react-icons-3.10.0.tgz",
"integrity": "sha512-WsQ5n1JToG9VixWilSo1bHv842Cj5aZqTGiS3Ud47myF6aK7S/IUY2+dHcBdmkQcCFRuHsJ9OMUI0kTDfjyZXQ==",
"requires": {
"camelcase": "^5.0.0"
}
},
"react-immutable-proptypes": { "react-immutable-proptypes": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/react-immutable-proptypes/-/react-immutable-proptypes-2.1.0.tgz", "resolved": "https://registry.npmjs.org/react-immutable-proptypes/-/react-immutable-proptypes-2.1.0.tgz",

View file

@ -13,6 +13,7 @@
"react-dnd": "^7.0.0", "react-dnd": "^7.0.0",
"react-dnd-html5-backend": "^7.0.0", "react-dnd-html5-backend": "^7.0.0",
"react-dom": "^16.13.1", "react-dom": "^16.13.1",
"react-icons": "^3.10.0",
"react-immutable-proptypes": "^2.1.0", "react-immutable-proptypes": "^2.1.0",
"react-redux": "^7.2.0", "react-redux": "^7.2.0",
"react-router": "^5.1.2", "react-router": "^5.1.2",

View file

@ -20,10 +20,6 @@
defer defer
src="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.4.4/js/uikit.min.js" src="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.4.4/js/uikit.min.js"
></script> ></script>
<script
defer
src="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.4.4/js/uikit-icons.min.js"
></script>
<style> <style>
body { body {
background-color: #453f3e; background-color: #453f3e;

View file

@ -2,6 +2,7 @@ import React, { Component } from 'react'
import { DropTarget } from 'react-dnd' import { DropTarget } from 'react-dnd'
import Role from '../role/draggable' import Role from '../role/draggable'
import CategoryEditor from './CategoryEditor' import CategoryEditor from './CategoryEditor'
import { GoPencil, GoEyeClosed } from 'react-icons/go'
class Category extends Component { class Category extends Component {
render() { render() {
@ -28,17 +29,21 @@ class Category extends Component {
}`} }`}
> >
<div className="role-editor__category-header"> <div className="role-editor__category-header">
<h4>{category.get('name')}</h4> <h4>
<div {category.get('name')}
uk-tooltip="" {category.get('hidden') && (
title="Edit" <span uk-tooltip="" title="Hidden" style={{ marginLeft: '0.5em' }}>
uk-icon="icon: file-edit" <GoEyeClosed />
onClick={onEditOpen} </span>
/> )}
</h4>
<div uk-tooltip="" title="Edit" onClick={onEditOpen}>
<GoPencil />
</div>
</div> </div>
{category {category
.get('roles_map') .get('roles_map')
.sortBy(r => r.get('position')) .sortBy((r) => r.get('position'))
.reverse() .reverse()
.map((r, k) => <Role key={k} role={r} categoryId={name} />) .map((r, k) => <Role key={k} role={r} categoryId={name} />)
.toArray()} .toArray()}

View file

@ -1,7 +1,8 @@
import React, { Component } from 'react' import React, { Component } from 'react'
import { GoChevronUp, GoChevronDown, GoTrashcan, GoInfo } from 'react-icons/go'
export default class CategoryEditor extends Component { export default class CategoryEditor extends Component {
onKeyPress = e => { onKeyPress = (e) => {
const { onSave } = this.props const { onSave } = this.props
switch (e.key) { switch (e.key) {
@ -37,7 +38,7 @@ export default class CategoryEditor extends Component {
uk-tooltip="delay: 1s" uk-tooltip="delay: 1s"
title="Move category up" title="Move category up"
> >
<i uk-icon="icon: chevron-up"></i> <GoChevronUp />
</div> </div>
<div <div
onClick={this.props.onBump(1)} onClick={this.props.onBump(1)}
@ -47,7 +48,7 @@ export default class CategoryEditor extends Component {
uk-tooltip="delay: 1s" uk-tooltip="delay: 1s"
title="Move category down" title="Move category down"
> >
<i uk-icon="icon: chevron-down"></i> <GoChevronDown />
</div> </div>
</div> </div>
</div> </div>
@ -70,12 +71,12 @@ export default class CategoryEditor extends Component {
</div> </div>
<div style={{ marginTop: 10 }}> <div style={{ marginTop: 10 }}>
<div className="uk-form-label"> <div className="uk-form-label">
Type{' '} <span
<i
uk-icon="icon: info; ratio: 0.7"
uk-tooltip="" uk-tooltip=""
title="Single mode only lets a user pick one role in this category." title="Single mode only lets a user pick one role in this category."
/> >
Type <GoInfo />
</span>
</div> </div>
<div className="uk-form-controls"> <div className="uk-form-controls">
<select <select
@ -93,7 +94,7 @@ export default class CategoryEditor extends Component {
className="uk-button rp-button secondary role-editor__actions_delete" className="uk-button rp-button secondary role-editor__actions_delete"
onClick={this.props.onDelete} onClick={this.props.onDelete}
> >
<i uk-icon="icon: trash" /> <GoTrashcan />
</button> </button>
<button <button
className="uk-button rp-button primary role-editor__actions_save" className="uk-button rp-button primary role-editor__actions_save"

View file

@ -4,7 +4,7 @@ import { getViewMap, setup } from '../role-picker/actions'
import uuidv4 from 'uuid/v4' import uuidv4 from 'uuid/v4'
import superagent from 'superagent' import superagent from 'superagent'
export const constructView = id => async (dispatch, getState) => { export const constructView = (id) => async (dispatch, getState) => {
await setup(id)(dispatch) await setup(id)(dispatch)
const server = getState().servers.get(id) const server = getState().servers.get(id)
@ -23,7 +23,7 @@ export const constructView = id => async (dispatch, getState) => {
dispatch(UIActions.fadeIn) dispatch(UIActions.fadeIn)
} }
export const addRoleToCategory = (id, oldId, role, flip = true) => dispatch => { export const addRoleToCategory = (id, oldId, role, flip = true) => (dispatch) => {
dispatch({ dispatch({
type: Symbol.for('re: add role to category'), type: Symbol.for('re: add role to category'),
data: { data: {
@ -37,7 +37,7 @@ export const addRoleToCategory = (id, oldId, role, flip = true) => dispatch => {
} }
} }
export const removeRoleFromCategory = (id, oldId, role, flip = true) => dispatch => { export const removeRoleFromCategory = (id, oldId, role, flip = true) => (dispatch) => {
dispatch({ dispatch({
type: Symbol.for('re: remove role from category'), type: Symbol.for('re: remove role from category'),
data: { data: {
@ -51,7 +51,7 @@ export const removeRoleFromCategory = (id, oldId, role, flip = true) => dispatch
} }
} }
export const editCategory = ({ id, key, value }) => dispatch => { export const editCategory = ({ id, key, value }) => (dispatch) => {
dispatch({ dispatch({
type: Symbol.for('re: edit category'), type: Symbol.for('re: edit category'),
data: { data: {
@ -62,7 +62,7 @@ export const editCategory = ({ id, key, value }) => dispatch => {
}) })
} }
export const saveCategory = (id, category) => dispatch => { export const saveCategory = (id, category) => (dispatch) => {
if (category.get('name') === '') { if (category.get('name') === '') {
return return
} }
@ -76,7 +76,7 @@ export const saveCategory = (id, category) => dispatch => {
}) })
} }
export const openEditor = id => ({ export const openEditor = (id) => ({
type: Symbol.for('re: switch category mode'), type: Symbol.for('re: switch category mode'),
data: { data: {
id, id,
@ -115,7 +115,7 @@ export const createCategory = (dispatch, getState) => {
let name = 'New Category' let name = 'New Category'
let idx = 1 let idx = 1
const pred = c => c.get('name') === name const pred = (c) => c.get('name') === name
while (vm.find(pred) !== undefined) { while (vm.find(pred) !== undefined) {
idx++ idx++
name = `New Category ${idx}` name = `New Category ${idx}`
@ -130,7 +130,7 @@ export const createCategory = (dispatch, getState) => {
name, name,
roles: Set([]), roles: Set([]),
roles_map: Set([]), roles_map: Set([]),
hidden: true, hidden: false,
type: 'multi', type: 'multi',
position: idx, position: idx,
mode: Symbol.for('edit'), mode: Symbol.for('edit'),
@ -138,14 +138,14 @@ export const createCategory = (dispatch, getState) => {
}) })
} }
export const bumpCategory = (category, name) => move => async (dispatch, getState) => { export const bumpCategory = (category, name) => (move) => async (dispatch, getState) => {
const { roleEditor } = getState() const { roleEditor } = getState()
const vm = roleEditor.get('viewMap') const vm = roleEditor.get('viewMap')
const position = category.get('position') const position = category.get('position')
const nextPos = position + move const nextPos = position + move
const replaceThisOne = vm.findKey(category => category.get('position') === nextPos) const replaceThisOne = vm.findKey((category) => category.get('position') === nextPos)
dispatch({ dispatch({
type: Symbol.for('re: edit category'), type: Symbol.for('re: edit category'),
@ -168,16 +168,11 @@ export const bumpCategory = (category, name) => move => async (dispatch, getStat
} }
} }
export const saveServer = id => async (dispatch, getState) => { export const saveServer = (id) => async (dispatch, getState) => {
const viewMap = getState() const viewMap = getState()
.roleEditor.get('viewMap') .roleEditor.get('viewMap')
.filterNot((_, k) => k === 'Uncategorized') .filterNot((_, k) => k === 'Uncategorized')
.map(v => .map((v) => v.delete('roles_map').delete('mode').delete('id'))
v
.delete('roles_map')
.delete('mode')
.delete('id')
)
viewMap.map((v, idx) => { viewMap.map((v, idx) => {
if (v.has('position')) { if (v.has('position')) {

View file

@ -2,6 +2,7 @@ import { Set } from 'immutable'
import React, { Component } from 'react' import React, { Component } from 'react'
import { Scrollbars } from 'react-custom-scrollbars' import { Scrollbars } from 'react-custom-scrollbars'
import { DropTarget } from 'react-dnd' import { DropTarget } from 'react-dnd'
import { GoPlus, GoInfo } from 'react-icons/go'
import { connect } from 'react-redux' import { connect } from 'react-redux'
import { Link, Prompt, Redirect } from 'react-router-dom' import { Link, Prompt, Redirect } from 'react-router-dom'
import * as UIActions from '../../actions/ui' import * as UIActions from '../../actions/ui'
@ -81,7 +82,7 @@ class RoleEditor extends Component {
dispatch(Actions.openEditor(name)) dispatch(Actions.openEditor(name))
} }
editCategory = (category, id) => (key, type) => event => { editCategory = (category, id) => (key, type) => (event) => {
const { dispatch } = this.props const { dispatch } = this.props
let value let value
@ -120,7 +121,7 @@ class RoleEditor extends Component {
dispatch(Actions.saveServer(server)) dispatch(Actions.saveServer(server))
} }
onBump = (category, name) => move => () => onBump = (category, name) => (move) => () =>
this.props.dispatch(Actions.bumpCategory(category, name)(move)) this.props.dispatch(Actions.bumpCategory(category, name)(move))
get hasChanged() { get hasChanged() {
@ -173,7 +174,7 @@ class RoleEditor extends Component {
<Scrollbars autoHeight autoHeightMax="calc(100vh - 110px)"> <Scrollbars autoHeight autoHeightMax="calc(100vh - 110px)">
{vm {vm
.filter((_, k) => k !== 'Uncategorized') .filter((_, k) => k !== 'Uncategorized')
.sortBy(c => c.get('position')) .sortBy((c) => c.get('position'))
.map((c, name, arr) => ( .map((c, name, arr) => (
<Category <Category
key={name} key={name}
@ -196,7 +197,7 @@ class RoleEditor extends Component {
title="Add new category" title="Add new category"
className="role-editor__category add-button" className="role-editor__category add-button"
> >
<i uk-icon="icon: plus" /> <GoPlus />
</div> </div>
</Scrollbars> </Scrollbars>
</div> </div>
@ -209,14 +210,14 @@ class RoleEditor extends Component {
<Scrollbars autoHeight autoHeightMax="calc(100vh - 145px)"> <Scrollbars autoHeight autoHeightMax="calc(100vh - 145px)">
<div className="role-editor__uncat-zone"> <div className="role-editor__uncat-zone">
{(vm.getIn(['Uncategorized', 'roles_map']) || Set()) {(vm.getIn(['Uncategorized', 'roles_map']) || Set())
.sortBy(r => r.get('position')) .sortBy((r) => r.get('position'))
.reverse() .reverse()
.map((r, k) => <Role key={k} categoryId="Uncategorized" role={r} />) .map((r, k) => <Role key={k} categoryId="Uncategorized" role={r} />)
.toArray()} .toArray()}
{this.props.editor.get('hasSafeRoles') !== true ? ( {this.props.editor.get('hasSafeRoles') !== true ? (
<div className="role-editor__alert"> <div className="role-editor__alert">
<Link to="/help/why-no-roles"> <Link to="/help/why-no-roles">
Why are there no roles here? <i uk-icon="icon: info" /> Why are there no roles here? <GoInfo />
</Link> </Link>
</div> </div>
) : null} ) : null}

View file

@ -6,6 +6,7 @@ import { msgToReal } from '../../utils'
import * as Actions from './actions' import * as Actions from './actions'
import Category from './Category' import Category from './Category'
import './RolePicker.sass' import './RolePicker.sass'
import { GoTrashcan, GoCheck, GoPencil } from 'react-icons/go'
const mapState = ({ rolePicker, servers }, ownProps) => { const mapState = ({ rolePicker, servers }, ownProps) => {
return { return {
@ -90,9 +91,10 @@ class RolePicker extends Component {
<div <div
uk-tooltip="" uk-tooltip=""
title="Edit Server Message" title="Edit Server Message"
uk-icon="icon: pencil"
onClick={this.openMessageEditor} onClick={this.openMessageEditor}
/> >
<GoPencil className="smol-bump" />
</div>
</div> </div>
<p <p
dangerouslySetInnerHTML={{ dangerouslySetInnerHTML={{
@ -112,16 +114,23 @@ class RolePicker extends Component {
uk-tooltip="" uk-tooltip=""
title="Save Server Message" title="Save Server Message"
onClick={this.saveServerMessage} onClick={this.saveServerMessage}
style={{ cursor: 'pointer', color: 'var(--c-green)' }} style={{ cursor: 'pointer', color: 'var(--c-green)', fontSize: '1.4rem' }}
uk-icon="icon: check; ratio: 1.4" >
/> <GoCheck className="smol-bump" />
</div>
<div <div
uk-tooltip="" uk-tooltip=""
title="Discard Edits" title="Discard Edits"
onClick={this.closeMessageEditor} onClick={this.closeMessageEditor}
style={{ cursor: 'pointer', color: 'var(--c-red)', marginLeft: 10 }} style={{
uk-icon="icon: trash; ratio: 0.9" cursor: 'pointer',
/> color: 'var(--c-red)',
marginLeft: 10,
fontSize: '0.9rem',
}}
>
<GoTrashcan className="smol-bump" />
</div>
</div> </div>
<textarea <textarea
className="uk-width-1-2 uk-textarea role-picker__msg-editor" className="uk-width-1-2 uk-textarea role-picker__msg-editor"
@ -159,8 +168,10 @@ class RolePicker extends Component {
to={`/s/${server.get('id')}/edit`} to={`/s/${server.get('id')}/edit`}
uk-tooltip="" uk-tooltip=""
title="Edit Categories" title="Edit Categories"
uk-icon="icon: file-edit" style={{ color: 'var(--c-7)' }}
></Link> >
<GoPencil className="smol-bump" />
</Link>
) : null} ) : null}
<div className="role-picker__spacer"></div> <div className="role-picker__spacer"></div>
<div <div

View file

@ -1,10 +1,11 @@
import React, { Component, Fragment } from 'react'
import ImmutablePropTypes from 'react-immutable-proptypes'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import React, { Component, Fragment } from 'react'
import { Scrollbars } from 'react-custom-scrollbars'
import { GoPlus } from 'react-icons/go'
import ImmutablePropTypes from 'react-immutable-proptypes'
import { NavLink } from 'react-router-dom'
import ServerCard from './ServerCard' import ServerCard from './ServerCard'
import UserCard from './UserCard' import UserCard from './UserCard'
import { Scrollbars } from 'react-custom-scrollbars'
import { NavLink } from 'react-router-dom'
class ServersNavigation extends Component { class ServersNavigation extends Component {
static propTypes = { static propTypes = {
@ -29,7 +30,8 @@ class ServersNavigation extends Component {
to={`/s/add`} to={`/s/add`}
> >
<div className="server-list__item__info"> <div className="server-list__item__info">
<i uk-icon="icon: plus; ratio: 0.9"></i>&nbsp; Add to your server <GoPlus className="smol-bump" />
&nbsp; Add to your server
</div> </div>
</NavLink> </NavLink>
</Scrollbars> </Scrollbars>

View file

@ -3,6 +3,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'
import { NavLink } from 'react-router-dom' import { NavLink } from 'react-router-dom'
import { colorToCSS } from '../../utils' import { colorToCSS } from '../../utils'
import './ServerCard.sass' import './ServerCard.sass'
import { GoZap, GoStar } from 'react-icons/go'
class ServerCard extends Component { class ServerCard extends Component {
static propTypes = { static propTypes = {
@ -27,8 +28,9 @@ class ServerCard extends Component {
role="img" role="img"
aria-label="Role Manager" aria-label="Role Manager"
className="server-list__item__tag" className="server-list__item__tag"
uk-icon="icon: bolt; ratio: 0.7" >
/> <GoZap />
</span>
) )
} }
@ -40,8 +42,9 @@ class ServerCard extends Component {
role="img" role="img"
aria-label="Server Admin" aria-label="Server Admin"
className="server-list__item__tag" className="server-list__item__tag"
uk-icon="icon: star; ratio: 0.7" >
/> <GoStar />
</span>
) )
} }

View file

@ -1,7 +1,8 @@
import React, { Component } from 'react' import React, { Component } from 'react'
import ImmutablePropTypes from 'react-immutable-proptypes' import ImmutablePropTypes from 'react-immutable-proptypes'
import { connect } from 'react-redux'
import { NavLink } from 'react-router-dom' import { NavLink } from 'react-router-dom'
import { GoSignOut } from 'react-icons/go'
import { connect } from 'react-redux'
import * as Actions from '../../actions' import * as Actions from '../../actions'
import './UserCard.sass' import './UserCard.sass'
@ -15,8 +16,9 @@ class UserCard extends Component {
const avatar = user.get('avatar') const avatar = user.get('avatar')
if (avatar === '' || avatar == null) { if (avatar === '' || avatar == null) {
return `https://cdn.discordapp.com/embed/avatars/${Math.ceil(Math.random() * 9999) % return `https://cdn.discordapp.com/embed/avatars/${
5}.png` Math.ceil(Math.random() * 9999) % 5
}.png`
} }
return `https://cdn.discordapp.com/avatars/${user.get('id')}/${avatar}.png` return `https://cdn.discordapp.com/avatars/${user.get('id')}/${avatar}.png`
@ -40,23 +42,13 @@ class UserCard extends Component {
<a <a
uk-tooltip="" uk-tooltip=""
title="Sign out" title="Sign out"
uk-icon="icon: sign-out"
onClick={() => { onClick={() => {
this.props.dispatch(Actions.userLogout) this.props.dispatch(Actions.userLogout)
}} }}
/> >
<GoSignOut className="smol-bump" />
</a>
</li> </li>
{this.props.user.isRoot === true ? (
<li>
<NavLink
uk-tooltip=""
title="Root"
uk-icon="icon: bolt"
to="/root/"
activeClassName="uk-active"
/>
</li>
) : null}
</ul> </ul>
</div> </div>
</div> </div>

View file

@ -61,3 +61,7 @@
.rp-discord .rp-discord
border: 1px solid var(--c-discord-dark) border: 1px solid var(--c-discord-dark)
box-shadow: 0 0 1px rgba(0,0,0,0.3) box-shadow: 0 0 1px rgba(0,0,0,0.3)
svg.smol-bump
position: relative
top: -0.125rem

View file

@ -1,18 +1,18 @@
import React, { Fragment } from 'react' import * as React from 'react'
import { GoX, GoThumbsup } from 'react-icons/go'
import goodImg from './images/whynoroles-good.png' import goodImg from './images/whynoroles-good.png'
import badImg from './images/whynoroles-bad.png' import badImg from './images/whynoroles-bad.png'
const WhyNoRoles = props => { const WhyNoRoles = (props) => {
return ( return (
<Fragment> <>
<h2>Why don't I see any roles in my editor?</h2> <h2>Why don't I see any roles in my editor?</h2>
<p> <p>
Roleypoly needs to be a higher role position than other roles in order to assign Roleypoly needs to be a higher role position than other roles in order to assign
them to anyone. them to anyone.
</p> </p>
<h3 className="pages__bad"> <h3 className="pages__bad">
Bad <i uk-icon="icon: ban"></i> Bad <GoX className="smol-bump" />
</h3> </h3>
<img src={badImg} className="rp-discord" alt="Bad example" /> <img src={badImg} className="rp-discord" alt="Bad example" />
<p> <p>
@ -20,13 +20,13 @@ const WhyNoRoles = props => {
any roles above it. any roles above it.
</p> </p>
<h3 className="pages__good"> <h3 className="pages__good">
Good <i uk-icon="icon: check"></i> Good <GoThumbsup className="smol-bump" />
</h3> </h3>
<img src={goodImg} className="rp-discord" alt="Good example" /> <img src={goodImg} className="rp-discord" alt="Good example" />
<p> <p>
In this example, Roleypoly is above other roles, and will be able to assign them. In this example, Roleypoly is above other roles, and will be able to assign them.
</p> </p>
</Fragment> </>
) )
} }