front
Gorji 3 years ago
parent c4c16adeb3
commit 759bdc0bc3
  1. 3
      .babelrc
  2. 13
      package.json
  3. 3
      src/Redux/Reducers/Reduce.js
  4. 5
      src/Redux/actions/chat.js
  5. 6
      src/Redux/actions/index.js
  6. 3
      src/Redux/actions/public.js
  7. 9
      src/Redux/actions/user.js
  8. 7
      src/Redux/index.js
  9. 28
      src/Redux/proxy.js
  10. 12
      src/Redux/reducers/chat.js
  11. 6
      src/Redux/reducers/index.js
  12. 12
      src/Redux/reducers/public.js
  13. 15
      src/Redux/reducers/user.js
  14. 9
      src/Redux/store.js
  15. 13
      src/views/Auth/Login/Login.js
  16. 43
      src/views/Home/Body/ChatList/ChatList.js
  17. 15
      src/views/Home/Header/NavbarDrawer/NavbarDrawer.js
  18. 33
      yarn.lock

@ -0,0 +1,3 @@
{
"plugins": ["wildcard"]
}

@ -2,7 +2,6 @@
"name": "chat-pwa", "name": "chat-pwa",
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"proxy": "http://localhost:4040/",
"dependencies": { "dependencies": {
"@material-ui/core": "^4.11.4", "@material-ui/core": "^4.11.4",
"@material-ui/icons": "^4.11.2", "@material-ui/icons": "^4.11.2",
@ -13,7 +12,10 @@
"audio-react-recorder": "^1.0.4", "audio-react-recorder": "^1.0.4",
"axios": "^0.21.1", "axios": "^0.21.1",
"babel-eslint": "^10.1.0", "babel-eslint": "^10.1.0",
"babel-plugin-import-directory": "^1.1.0",
"babel-plugin-wildcard": "^7.0.0",
"bootstrap": "^4.6.0", "bootstrap": "^4.6.0",
"create-index": "^2.6.0",
"jalali-moment": "^3.3.10", "jalali-moment": "^3.3.10",
"leaflet": "^1.7.1", "leaflet": "^1.7.1",
"node-sass": "^5.0.0", "node-sass": "^5.0.0",
@ -41,7 +43,8 @@
"test": "react-scripts test", "test": "react-scripts test",
"eject": "react-scripts eject", "eject": "react-scripts eject",
"prettier": "prettier --write \"**/*\"", "prettier": "prettier --write \"**/*\"",
"eslint": "eslint \"**/*.js\"" "eslint": "eslint \"**/*.js\"",
"index": "create-index ./src/Redux -r"
}, },
"browserslist": [ "browserslist": [
">0.2%", ">0.2%",
@ -61,5 +64,9 @@
"eslint-plugin-react": "7.19.0", "eslint-plugin-react": "7.19.0",
"eslint-plugin-react-hooks": "2.5.1", "eslint-plugin-react-hooks": "2.5.1",
"prettier": "^2.2.1" "prettier": "^2.2.1"
} },
"plugins": [
"wildcard",
"import-directory"
]
} }

@ -1,3 +0,0 @@
import { combineReducers } from 'redux';
export default combineReducers({});

@ -0,0 +1,5 @@
import proxy from '../proxy';
export const list =
(data = {}) =>
async (dispatch) =>
(await proxy.get('chat/list', data)).dispatch(dispatch);

@ -0,0 +1,6 @@
// @create-index
export { default as chat } from './chat.js';
export { default as public } from './public.js';
export { default as user } from './user.js';

@ -0,0 +1,3 @@
import proxy from '../proxy';
export const otp = (data) => async (dispatch) =>
(await proxy.get('public/otp', data)).dispatch(dispatch);

@ -0,0 +1,9 @@
import proxy from '../proxy';
export const login =
(data = {}) =>
async (dispatch) =>
(await proxy.login(data)).dispatch(dispatch);
export const logout =
(data = {}) =>
async (dispatch) =>
(await proxy.logout(data)).dispatch(dispatch);

@ -0,0 +1,7 @@
// @create-index
export { default as actions } from './actions';
export { default as proxy } from './proxy.js';
export { default as reducers } from './reducers';
export { default as store } from './store.js';

@ -9,18 +9,26 @@ const Axios = axios.create({
validateStatus: null, validateStatus: null,
baseURL, baseURL,
}); });
class dispatch {}
class Proxy { class Proxy {
get = (url, params, opt = {}) => this.check(() => Axios.get(url, { params, ...opt })); get = (url, params, opt = {}) => this.check(url, () => Axios.get(url, { params, ...opt }));
post = (url, params, opt = {}) => this.check(() => Axios.post(url, params, opt)); post = (url, params, opt = {}) => this.check(url, () => Axios.post(url, params, opt));
put = (url, params, opt = {}) => this.check(() => Axios.put(url, params, opt)); put = (url, params, opt = {}) => this.check(url, () => Axios.put(url, params, opt));
delete = (url, params, opt = {}) => this.check(() => Axios.delete(url, params, opt)); delete = (url, params, opt = {}) => this.check(url, () => Axios.delete(url, params, opt));
check = async (fetch) => { result = (url, data) => ({
...data,
dispatch: (dispatch) => {
dispatch({ type: url, data });
return data;
},
});
check = async (url, fetch) => {
let response = await fetch(); let response = await fetch();
switch (response.status) { switch (response.status) {
case 200: case 200:
return response.data.data; return this.result(url, response.data.data);
case 401: case 401:
if (await this.refresh()) return (await fetch()).data.data; if (await this.refresh()) return this.result(url, (await fetch()).data.data);
break; break;
default: default:
toast(response.data.message); toast(response.data.message);
@ -35,10 +43,11 @@ class Proxy {
}; };
login = async (data, opt = { headers: { Authorization: `Bearer ${token}` } }) => { login = async (data, opt = { headers: { Authorization: `Bearer ${token}` } }) => {
const login = await this.post(loginURL, data, opt); const login = await this.post(loginURL, data, opt);
if (!login) return false; if (!login) this.result('login', false);
localStorage.setItem('refresh', login.refreshToken); localStorage.setItem('refresh', login.refreshToken);
delete login.refreshToken; delete login.refreshToken;
return login; if (data != {}) setTimeout(() => (window.location.href = '/'), 100);
return this.result('login', login);
}; };
logout = async () => { logout = async () => {
this.post(logoutURL); this.post(logoutURL);
@ -48,4 +57,5 @@ class Proxy {
status = () => (localStorage.getItem('refresh') ? true : false); status = () => (localStorage.getItem('refresh') ? true : false);
} }
const _proxy = new Proxy(); const _proxy = new Proxy();
export default _proxy; export default _proxy;

@ -0,0 +1,12 @@
const initialState = {
list: [],
};
export default function chat(state = initialState, action) {
let { type, data } = action;
switch (type) {
case 'chat/list':
return { ...state, list: data };
default:
return state;
}
}

@ -0,0 +1,6 @@
// @create-index
export { default as chat } from './chat.js';
export { default as public } from './public.js';
export { default as user } from './user.js';

@ -0,0 +1,12 @@
const initialState = {
otp: null,
};
export default function publics(state = initialState, action) {
let { type, data } = action;
switch (type) {
case 'public/otp':
return { ...state, ...data };
default:
return state;
}
}

@ -0,0 +1,15 @@
import proxy from '../proxy';
const initialState = {
isLogin: proxy.status(),
};
export default function user(state = initialState, action) {
let { type, data } = action;
switch (type) {
case 'login':
return { ...state, ...data, islogin: proxy.status() };
case 'logout':
return { ...state, islogin: proxy.status() };
default:
return state;
}
}

@ -1,16 +1,13 @@
import { createStore, applyMiddleware } from 'redux'; import { createStore, applyMiddleware } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension'; import { composeWithDevTools } from 'redux-devtools-extension';
import rootReducer from './Reducers/Reduce'; import { combineReducers } from 'redux';
import * as reducers from './reducers';
import thunk from 'redux-thunk'; import thunk from 'redux-thunk';
const initialState = {}; const initialState = {};
const middleware = [thunk]; const middleware = [thunk];
const store = createStore( const store = createStore(
rootReducer, combineReducers(reducers),
initialState, initialState,
composeWithDevTools(applyMiddleware(...middleware)) composeWithDevTools(applyMiddleware(...middleware))
); );
export default store; export default store;

@ -1,9 +1,12 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import Mobile from './Mobile/Mobile'; import Mobile from './Mobile/Mobile';
import Code from './Code/Code'; import Code from './Code/Code';
import proxy from '../../../Redux/proxy'; import { otp } from '../../../Redux/actions/public';
import { login } from '../../../Redux/actions/user';
import { connect } from 'react-redux';
import './Login.scss'; import './Login.scss';
export default class Login extends Component { class Login extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.state = { this.state = {
@ -12,9 +15,8 @@ export default class Login extends Component {
} }
async componentDidUpdate() { async componentDidUpdate() {
const { cellphone, otp, section } = this.state; const { cellphone, otp, section } = this.state;
if (cellphone && !otp) proxy.get('public/otp', { cellphone }); if (cellphone && !otp) this.props.otp({ cellphone });
if (section && cellphone && otp) if (section && cellphone && otp) this.props.login({ cellphone, otp });
if (await proxy.login({ cellphone, otp })) window.location.href = '/';
} }
render() { render() {
@ -39,3 +41,4 @@ export default class Login extends Component {
); );
} }
} }
export default connect((state) => ({ isLogin: state.user.isLogin }), { otp, login })(Login);

@ -1,41 +1,17 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import Chat from './Chat/Chat'; import Chat from './Chat/Chat';
import pencil from '../../../../assets/icons/pencil.svg'; import pencil from '../../../../assets/icons/pencil.svg';
import logo from '../../../../assets/icons/logo.svg';
import './ChatList.scss'; import './ChatList.scss';
import proxy from '../../../../Redux/proxy'; import { list } from '../../../../Redux/actions/chat';
import { connect } from 'react-redux';
export default class ChatList extends Component { class ChatList extends Component {
constructor(props) { componentDidMount() {
super(props); this.props.list();
this.state = {
chats: [
{
id: 0,
name: 'داستان نمونه',
lastMessage: 'نمونه اولیه داستان ایما',
imageUrl: logo,
badge: 'جدید',
},
{
id: 0,
name: 'نمونه امکانات',
lastMessage: 'نمونه امکانات داستان ایما',
imageUrl: logo,
badge: 'تست',
},
],
};
}
async componentDidMount() {
console.log(proxy);
let chatList = await proxy.get('chat/list');
console.log(chatList);
} }
render() { render() {
return ( return (
<div className="chat-list d-flex flex-column"> <div className="chat-list d-flex flex-column">
{this.state.chats.map((item, i) => ( {this.props.chat_list.map((item, i) => (
<Chat key={i} data={item} /> <Chat key={i} data={item} />
))} ))}
<div className="chat-list__float d-flex" style={{ filter: 'grayscale(2)' }}> <div className="chat-list__float d-flex" style={{ filter: 'grayscale(2)' }}>
@ -45,3 +21,10 @@ export default class ChatList extends Component {
); );
} }
} }
export default connect(
(state) => ({
chat_list: state.chat.list || [],
}),
{ list }
)(ChatList);

@ -9,8 +9,9 @@ import SettingsIcon from '@material-ui/icons/Settings';
import UpdateIcon from '@material-ui/icons/Update'; import UpdateIcon from '@material-ui/icons/Update';
import ReportIcon from '@material-ui/icons/Report'; import ReportIcon from '@material-ui/icons/Report';
import ShareIcon from '@material-ui/icons/Share'; import ShareIcon from '@material-ui/icons/Share';
import proxy from '../../../../Redux/proxy'; import { logout } from '../../../../Redux/actions/user';
// import {connect} from 'react-redux'; import { connect } from 'react-redux';
import './NavbarDrawer.scss'; import './NavbarDrawer.scss';
class NavbarDrawer extends Component { class NavbarDrawer extends Component {
constructor(props) { constructor(props) {
@ -52,7 +53,7 @@ class NavbarDrawer extends Component {
link: '/auth', link: '/auth',
icon: <ExitToAppIcon style={{ color: 'white', width: 35, height: 35, marginLeft: 10 }} />, icon: <ExitToAppIcon style={{ color: 'white', width: 35, height: 35, marginLeft: 10 }} />,
toast: '', toast: '',
onClick: proxy.logout, onClick: this.props.logout,
}, },
], ],
}; };
@ -91,10 +92,4 @@ class NavbarDrawer extends Component {
); );
} }
} }
export default connect((state) => ({ isLogin: state.user.isLogin }), { logout })(NavbarDrawer);
// const mapStateToProps = state => ({
// status: state.user.status,
// });
// export default connect(mapStateToProps,{})(NavbarDrawer);
export default NavbarDrawer;

@ -1165,7 +1165,7 @@
dependencies: dependencies:
regenerator-runtime "^0.13.4" regenerator-runtime "^0.13.4"
"@babel/template@^7.10.4", "@babel/template@^7.12.13", "@babel/template@^7.3.3": "@babel/template@^7.1.2", "@babel/template@^7.10.4", "@babel/template@^7.12.13", "@babel/template@^7.3.3":
version "7.12.13" version "7.12.13"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327"
integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==
@ -2837,6 +2837,13 @@ babel-plugin-dynamic-import-node@^2.3.3:
dependencies: dependencies:
object.assign "^4.1.0" object.assign "^4.1.0"
babel-plugin-import-directory@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/babel-plugin-import-directory/-/babel-plugin-import-directory-1.1.0.tgz#69c3f630418cae8d97fec35211a6a538f6bb4df6"
integrity sha512-D0zOCA1g+OPYFVDl1R63wcQ3/viQt9dwfQfu+QnsQcpHzbNkiNqnlFQnBWgMgaf/oReb8tKEQ1ssFUK4vOC2Xw==
dependencies:
"@babel/template" "^7.1.2"
babel-plugin-istanbul@^6.0.0: babel-plugin-istanbul@^6.0.0:
version "6.0.0" version "6.0.0"
resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765"
@ -2929,6 +2936,13 @@ babel-plugin-transform-react-remove-prop-types@0.4.24:
resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a"
integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==
babel-plugin-wildcard@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/babel-plugin-wildcard/-/babel-plugin-wildcard-7.0.0.tgz#ad72322e6b794717eeb616f8966c17ec1e431bfb"
integrity sha512-3duaRaULzxmmgr+YO9EPEE3m/irVyOWKvXCOz2S41tlp0g2UarSEtpM++D3IS+asK205OOqW1ajnjFeoRRqfZg==
dependencies:
rimraf "^2.6.2"
babel-preset-current-node-syntax@^1.0.0: babel-preset-current-node-syntax@^1.0.0:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b"
@ -3953,6 +3967,17 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
safe-buffer "^5.0.1" safe-buffer "^5.0.1"
sha.js "^2.4.8" sha.js "^2.4.8"
create-index@^2.6.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/create-index/-/create-index-2.6.0.tgz#6839c1445513a23c655d331bcdb34528466d6bf9"
integrity sha512-c9p7sNMIfiKv+RRORw9jbwxMRLrkt0Hq8PFGLxcDXGoMqqGrwnDIw97tUnpdp9rAkIToAPbqejH6qHpGWQGAww==
dependencies:
chalk "^4.0.0"
glob "^7.1.6"
lodash "^4.17.15"
moment "^2.25.3"
yargs "^15.3.1"
cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
version "7.0.3" version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
@ -8247,7 +8272,7 @@ mkdirp@^1.0.3, mkdirp@^1.0.4:
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
moment@^2.26.0: moment@^2.25.3, moment@^2.26.0:
version "2.29.1" version "2.29.1"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
@ -10775,7 +10800,7 @@ rimraf@2.6.3:
dependencies: dependencies:
glob "^7.1.3" glob "^7.1.3"
rimraf@^2.5.4, rimraf@^2.6.3: rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3:
version "2.7.1" version "2.7.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
@ -12991,7 +13016,7 @@ yargs@^13.3.2:
y18n "^4.0.0" y18n "^4.0.0"
yargs-parser "^13.1.2" yargs-parser "^13.1.2"
yargs@^15.4.1: yargs@^15.3.1, yargs@^15.4.1:
version "15.4.1" version "15.4.1"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==

Loading…
Cancel
Save