This commit is contained in:
ntr 2019-08-13 15:44:17 +10:00
parent 143b0e92cb
commit 99c575ac69
11 changed files with 1761 additions and 0 deletions

9
acp/.babelrc Normal file
View File

@ -0,0 +1,9 @@
{
"presets": [
"es2015",
"react"
],
"plugins": [
["transform-react-jsx", { "pragma":"preact.h" }]
]
}

1501
acp/.eslintrc.js Normal file

File diff suppressed because it is too large Load Diff

5
acp/.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
package-lock.json
node_modules/
dist/
.cache/
assets/molecules

21
acp/acp.html Normal file
View File

@ -0,0 +1,21 @@
<!DOCTYPE html>
<html>
<head>
<title>mnml - acp</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta name=apple-mobile-web-app-capable content=yes>
<meta name=apple-mobile-web-app-status-bar-style content=black>
<meta name="description" content="mnml pvp tbs">
<meta name="author" content="ntr@smokestack.io">
<link rel="stylesheet" href="./node_modules/izitoast/dist/css/iziToast.min.css"></script>
<link href="https://fonts.googleapis.com/css?family=Jura" rel="stylesheet">
<link rel="stylesheet" href="assets/styles/normalize.css">
<link rel="stylesheet" href="assets/styles/skeleton.css">
</head>
</head>
<body>
<noscript>js is required to run mnml</noscript>
</body>
<script src="./acp.js"></script>
</html>

14
acp/acp.js Normal file
View File

@ -0,0 +1,14 @@
require('./../client/assets/styles/styles.less');
require('./../client/assets/styles/menu.less');
require('./../client/assets/styles/nav.less');
require('./../client/assets/styles/footer.less');
require('./../client/assets/styles/account.less');
require('./../client/assets/styles/controls.less');
require('./../client/assets/styles/instance.less');
require('./../client/assets/styles/vbox.less');
require('./../client/assets/styles/game.less');
require('./../client/assets/styles/styles.mobile.css');
require('./../client/assets/styles/instance.mobile.css');
// kick it off
require('./src/acp');

50
acp/package.json Normal file
View File

@ -0,0 +1,50 @@
{
"name": "mnml-client",
"version": "0.2.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "parcel watch acp.html --no-hmr --out-dir /var/lib/mnml/public/current",
"build": "parcel build acp.html",
"lint": "eslint --fix --ext .jsx src/",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "UNLICENSED",
"dependencies": {
"anime": "^0.1.2",
"animejs": "^3.0.1",
"async": "^2.6.2",
"axios": "^0.19.0",
"borc": "^2.0.3",
"docco": "^0.7.0",
"izitoast": "^1.4.0",
"keymaster": "^1.6.2",
"linkstate": "^1.1.1",
"lodash": "^4.17.15",
"node-sass": "^4.12.0",
"parcel": "^1.12.3",
"preact": "^8.4.2",
"preact-compat": "^3.19.0",
"preact-context": "^1.1.3",
"preact-redux": "^2.1.0",
"react-stripe-elements": "^3.0.0",
"redux": "^4.0.0"
},
"devDependencies": {
"babel-core": "^6.26.3",
"babel-plugin-module-resolver": "^3.2.0",
"babel-preset-es2015": "^6.24.1",
"babel-preset-react": "^6.24.1",
"eslint": "^5.6.0",
"eslint-config-airbnb-base": "^13.1.0",
"eslint-plugin-import": "^2.14.0",
"eslint-plugin-react": "^7.11.1",
"jest": "^18.0.0",
"less": "^3.9.0"
},
"alias": {
"react": "preact-compat",
"react-dom": "preact-compat"
}
}

35
acp/src/acp.jsx Normal file
View File

@ -0,0 +1,35 @@
const preact = require('preact');
// const logger = require('redux-diff-logger');
const { Provider, connect } = require('preact-redux');
const { createStore, combineReducers } = require('redux');
const reducers = require('./reducers');
const actions = require('./actions');
const Users = require('./acp.users');
// Redux Store
const store = createStore(
combineReducers(reducers),
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__(),
);
document.fonts.load('16pt "Jura"').then(() => {
const Acp = () => (
<Provider store={store}>
<div id="mnml">
<nav>
<h1>acp</h1>
<hr/>
<button>users</button>
</nav>
<Users />
<aside></aside>
</div>
</Provider>
);
// eslint-disable-next-line
preact.render(<Acp />, document.body);
});

91
acp/src/acp.users.jsx Normal file
View File

@ -0,0 +1,91 @@
const preact = require('preact');
const { Component } = require('preact');
const { connect } = require('preact-redux');
const linkState = require('linkstate').default;
const axios = require('axios');
const actions = require('./actions');
const addState = connect(
function receiveState(state) {
const {
account,
user,
} = state;
return {
account, user,
};
},
function receiveDispatch(dispatch) {
function setUser(user) {
dispatch(actions.setUser(user));
}
return { setUser };
}
);
class AccountStatus extends Component {
constructor(props) {
super(props);
this.state = {
account: {},
search: '',
msg: '-',
};
}
render(args, state) {
const {
user,
} = args;
const {
msg,
search,
} = state;
const getUser = () =>
axios.get(`/api/acp/user/${search}`)
.then(response => {
this.setState({ msg: response });
})
.catch(error => {
this.setState({ msg: error });
});
if (!user) {
return (
<main>
<div>{msg.message}</div>
<label for="current">Username:</label>
<input
class="login-input"
type="text"
name="username"
value={this.state.search}
onInput={linkState(this, 'search')}
placeholder="username"
/>
<button
onClick={getUser}>
Search
</button>
</main>
);
}
return (
<main>
{JSON.stringify(user)}
</main>
);
}
}
module.exports = addState(AccountStatus);

2
acp/src/actions.jsx Normal file
View File

@ -0,0 +1,2 @@
export const setAccount = value => ({ type: 'SET_ACCOUNT', value });
export const setUser = value => ({ type: 'SET_USER', value });

16
acp/src/reducers.jsx Normal file
View File

@ -0,0 +1,16 @@
function createReducer(defaultState, actionType) {
return function reducer(state = defaultState, action) {
switch (action.type) {
case actionType:
return action.value;
default:
return state;
}
};
}
/* eslint-disable key-spacing */
module.exports = {
account: createReducer(null, 'SET_ACCOUNT'),
user: createReducer(null, 'SET_USER'),
};

View File

@ -204,6 +204,23 @@ function postData(url = '/', data = {}) {
});
}
function getData(url = '/', data = {}) {
// Default options are marked with *
return fetch(`/api${url}`, {
method: 'GET', // *GET, POST, PUT, DELETE, etc.
// mode: 'no-cors', // no-cors, cors, *same-origin
cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
credentials: 'include', // include, same-origin, *omit
headers: {
Accept: 'application/json',
'content-type': 'application/json',
},
redirect: 'error', // manual, *follow, error
// referrer: ', // no-referrer, *client
body: JSON.stringify(data), // body data type must match "Content-Type" header
});
}
function errorToast(message) {
toast.error({
position: 'topRight',