diff --git a/app/javascript/src/components/ModalsContainer/index.jsx b/app/javascript/src/components/ModalsContainer/index.jsx
deleted file mode 100644
index 7cf9aff55..000000000
--- a/app/javascript/src/components/ModalsContainer/index.jsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import React from "react";
-import LeaveTeamModal from "./modals/LeaveTeamModal";
-
-export default () =>
-
-
-
;
diff --git a/app/javascript/src/components/actions/TeamsActions.js b/app/javascript/src/components/actions/TeamsActions.js
index ba7fa7262..60356c6d7 100644
--- a/app/javascript/src/components/actions/TeamsActions.js
+++ b/app/javascript/src/components/actions/TeamsActions.js
@@ -1,41 +1,37 @@
-import axios from "../../config/axios";
-import _ from "lodash";
-import { TEAMS_PATH, CHANGE_TEAM_PATH } from "../../config/api_endpoints";
+// @flow
+import type {
+ Teams$Team,
+ Action$LeaveTeam,
+ Action$AddTeamData,
+ Actopm$SetCurrentTeam
+} from "flow-typed";
+import type { Dispatch } from "redux-thunk";
+import { getTeams, changeCurrentTeam } from "../../services/api/teams_api";
import {
GET_LIST_OF_TEAMS,
- SET_CURRENT_TEAM,
- SHOW_LEAVE_TEAM_MODAL
+ SET_CURRENT_TEAM
} from "../../config/action_types";
-export function leaveTeamModalShow(show = false, team = {}) {
- return {
- payload: { team, show },
- type: SHOW_LEAVE_TEAM_MODAL
- };
-}
-
-export function addTeamsData(data) {
+export function addTeamsData(data: Array): Action$AddTeamData {
return {
type: GET_LIST_OF_TEAMS,
payload: data
};
}
-export function setCurrentTeam(team) {
+export function setCurrentTeam(team: Teams$Team): Actopm$SetCurrentTeam {
return {
team,
type: SET_CURRENT_TEAM
};
}
-export function getTeamsList() {
+export function getTeamsList(): Dispatch {
return dispatch => {
- axios
- .get(TEAMS_PATH, { withCredentials: true })
+ getTeams()
.then(response => {
- const teams = response.data.teams.collection;
+ const { teams, currentTeam } = response;
dispatch(addTeamsData(teams));
- const currentTeam = _.find(teams, team => team.current_team);
dispatch(setCurrentTeam(currentTeam));
})
.catch(error => {
@@ -44,14 +40,12 @@ export function getTeamsList() {
};
}
-export function changeTeam(team_id) {
+export function changeTeam(teamID: number): Dispatch {
return dispatch => {
- axios
- .post(CHANGE_TEAM_PATH, { team_id }, { withCredentials: true })
+ changeCurrentTeam(teamID)
.then(response => {
- const teams = response.data.teams.collection;
+ const { teams, currentTeam } = response;
dispatch(addTeamsData(teams));
- const currentTeam = _.find(teams, team => team.current_team);
dispatch(setCurrentTeam(currentTeam));
})
.catch(error => {
diff --git a/app/javascript/src/components/reducers/TeamReducers.js b/app/javascript/src/components/reducers/TeamReducers.js
index ac889c627..34ff7566c 100644
--- a/app/javascript/src/components/reducers/TeamReducers.js
+++ b/app/javascript/src/components/reducers/TeamReducers.js
@@ -1,7 +1,6 @@
import {
SET_CURRENT_TEAM,
- GET_LIST_OF_TEAMS,
- SHOW_LEAVE_TEAM_MODAL
+ GET_LIST_OF_TEAMS
} from "../../config/action_types";
export const setCurrentTeam = (
@@ -23,13 +22,3 @@ export const getListOfTeams = (state = { collection: [] }, action) => {
}
return state;
};
-
-export const showLeaveTeamModal = (
- state = { show: false, team: { id: 0, name: "", user_team_id: 0 } },
- action
-) => {
- if (action.type === SHOW_LEAVE_TEAM_MODAL) {
- return { ...state, ...action.payload };
- }
- return state;
-};
diff --git a/app/javascript/src/config/action_types.js b/app/javascript/src/config/action_types.js
index 2ae8f4162..a3536e9ad 100644
--- a/app/javascript/src/config/action_types.js
+++ b/app/javascript/src/config/action_types.js
@@ -1,20 +1,18 @@
+// @flow
+
// teams
-export const SET_CURRENT_TEAM = "SET_CURRENT_TEAM";
-export const GET_LIST_OF_TEAMS = "GET_LIST_OF_TEAMS";
-export const SET_TEAM_DETAILS = "SET_TEAM_DETAILS";
+export const SET_CURRENT_TEAM: string = "SET_CURRENT_TEAM";
+export const GET_LIST_OF_TEAMS: string = "GET_LIST_OF_TEAMS";
+export const SET_TEAM_DETAILS: string = "SET_TEAM_DETAILS";
// users
-export const USER_LOGOUT = "USER_LOGOUT";
-export const SET_CURRENT_USER = "SET_CURRENT_USER";
+export const USER_LOGOUT: string = "USER_LOGOUT";
+export const SET_CURRENT_USER: string = "SET_CURRENT_USER";
// user teams
-export const LEAVE_TEAM = "LEAVE_TEAM";
-
-// modals
-export const SHOW_LEAVE_TEAM_MODAL = "SHOW_LEAVE_TEAM_MODAL";
-export const UPDATE_TEAM_DESCRIPTION_MODAL = "UPDATE_TEAM_DESCRIPTION_MODAL";
+export const LEAVE_TEAM: string = "LEAVE_TEAM";
// alerts
-export const ADD_ALERT = "ADD_ALERT";
-export const CLEAR_ALERT = "CLEAR_ALERT";
-export const CLEAR_ALL_ALERTS = "CLEAR_ALL_ALERTS";
+export const ADD_ALERT: string = "ADD_ALERT";
+export const CLEAR_ALERT: string = "CLEAR_ALERT";
+export const CLEAR_ALL_ALERTS: string = "CLEAR_ALL_ALERTS";
diff --git a/app/javascript/src/config/api_endpoints.js b/app/javascript/src/config/api_endpoints.js
deleted file mode 100644
index fb110526c..000000000
--- a/app/javascript/src/config/api_endpoints.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// settings
-export const SETTINGS_PATH = "/settings";
-export const SETTINGS_ACCOUNT_PATH = "/settings/account";
-// teams
-export const TEAMS_PATH = "/client_api/teams";
-export const CHANGE_TEAM_PATH = "/client_api/teams/change_team";
-export const TEAM_DETAILS_PATH = "/client_api/teams/:team_id/details";
-
-// search
-export const SEARCH_PATH = "/search";
-
-// notifications
-export const RECENT_NOTIFICATIONS_PATH = "/client_api/recent_notifications";
-// info dropdown_title
-export const CUSTOMER_SUPPORT_LINK = "http://scinote.net/support";
-export const TUTORIALS_LINK = "http://scinote.net/product/tutorials/";
-export const RELEASE_NOTES_LINK = "http://scinote.net/docs/release-notes/";
-export const PREMIUM_LINK = "http://scinote.net/premium/";
-export const CONTACT_US_LINK =
- "http://scinote.net/story-of-scinote/#contact-scinote";
-
-// user teams
-export const LEAVE_TEAM_PATH = "/client_api/users/leave_team";
-
-// settings
-export const SETTINGS_TEAMS = "/settings/teams";
diff --git a/app/javascript/src/config/axios.js b/app/javascript/src/config/axios.js
deleted file mode 100644
index b514b7001..000000000
--- a/app/javascript/src/config/axios.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// @TODO remove this file ASAP the preferences/profile refactoring is merged
-import axios from "axios";
-import store from "./store";
-import { SIGN_IN_PATH } from "./routes";
-import { destroyState } from "../components/actions/UsersActions";
-
-export default axios.create({
- withCredentials: true,
- headers: {
- "X-CSRF-TOKEN": document.querySelector('meta[name="csrf-token"]').content
- },
- validateStatus(status) {
- if (status === 401) {
- store.dispatch(destroyState);
- window.location = SIGN_IN_PATH;
- }
- return status >= 200 && status < 300;
- }
-});
diff --git a/app/javascript/src/config/reducers.js b/app/javascript/src/config/reducers.js
index 1f7cbc866..075aa2e18 100644
--- a/app/javascript/src/config/reducers.js
+++ b/app/javascript/src/config/reducers.js
@@ -2,8 +2,7 @@ import { combineReducers } from "redux";
import { USER_LOGOUT } from "./action_types";
import {
setCurrentTeam,
- getListOfTeams,
- showLeaveTeamModal
+ getListOfTeams
} from "../components/reducers/TeamReducers";
import { currentUser } from "../components/reducers/UsersReducer";
import { alerts } from "../components/reducers/AlertsReducers";
@@ -12,7 +11,6 @@ const appReducer = combineReducers({
current_team: setCurrentTeam,
all_teams: getListOfTeams,
current_user: currentUser,
- showLeaveTeamModal,
alerts
});
diff --git a/app/javascript/src/config/routes.js b/app/javascript/src/config/routes.js
index 74abccff0..a46097b54 100644
--- a/app/javascript/src/config/routes.js
+++ b/app/javascript/src/config/routes.js
@@ -2,8 +2,21 @@ export const ROOT_PATH = "/";
export const SIGN_IN_PATH = "/users/sign_in";
// Settings page
+export const SETTINGS_PATH = "/settings";
export const SETTINGS_TEAMS_ROUTE = "/settings/teams";
export const SETTINGS_TEAM_ROUTE = "/settings/teams/:id";
export const SETTINGS_NEW_TEAM_ROUTE = "/settings/teams/new";
export const SETTINGS_ACCOUNT_PROFILE = "/settings/account/profile";
export const SETTINGS_ACCOUNT_PREFERENCES = "/settings/account/preferences";
+
+// search
+export const SEARCH_PATH = "/search";
+
+
+// info dropdown_title
+export const CUSTOMER_SUPPORT_LINK = "http://scinote.net/support";
+export const TUTORIALS_LINK = "http://scinote.net/product/tutorials/";
+export const RELEASE_NOTES_LINK = "http://scinote.net/docs/release-notes/";
+export const PREMIUM_LINK = "http://scinote.net/premium/";
+export const CONTACT_US_LINK =
+ "http://scinote.net/story-of-scinote/#contact-scinote";
diff --git a/app/javascript/src/index.jsx b/app/javascript/src/index.jsx
index 19e7725f6..335cae4bb 100644
--- a/app/javascript/src/index.jsx
+++ b/app/javascript/src/index.jsx
@@ -9,7 +9,6 @@ import messages from "./config/locales/messages";
import store from "./config/store";
import AlertsContainer from "./components/AlertsContainer";
-import ModalsContainer from "./components/ModalsContainer";
import SettingsPage from "./scenes/SettingsPage";
import Navigation from "./components/Navigation";
@@ -34,7 +33,6 @@ const ScinoteApp = () =>
-
;
diff --git a/app/javascript/src/scenes/SettingsPage/index.jsx b/app/javascript/src/scenes/SettingsPage/index.jsx
index 8125b54ad..82f300155 100644
--- a/app/javascript/src/scenes/SettingsPage/index.jsx
+++ b/app/javascript/src/scenes/SettingsPage/index.jsx
@@ -7,6 +7,7 @@ import { FormattedMessage } from "react-intl";
import {
ROOT_PATH,
+ SETTINGS_PATH,
SETTINGS_TEAMS_ROUTE,
SETTINGS_TEAM_ROUTE,
SETTINGS_ACCOUNT_PROFILE,
@@ -14,8 +15,6 @@ import {
SETTINGS_NEW_TEAM_ROUTE
} from "../../config/routes";
-import { SETTINGS_PATH, SETTINGS_TEAMS } from "../../config/api_endpoints";
-
import PageTitle from "../../components/PageTitle";
import NotFound from "../../components/404/NotFound";
import SettingsProfile from "./scenes/profile";
@@ -74,7 +73,7 @@ export default class SettingsPage extends Component<*, State> {
diff --git a/app/javascript/src/components/ModalsContainer/modals/LeaveTeamModal.jsx b/app/javascript/src/scenes/SettingsPage/scenes/teams/components/LeaveTeamModal.jsx
similarity index 76%
rename from app/javascript/src/components/ModalsContainer/modals/LeaveTeamModal.jsx
rename to app/javascript/src/scenes/SettingsPage/scenes/teams/components/LeaveTeamModal.jsx
index 68b5702b1..78b7f0b56 100644
--- a/app/javascript/src/components/ModalsContainer/modals/LeaveTeamModal.jsx
+++ b/app/javascript/src/scenes/SettingsPage/scenes/teams/components/LeaveTeamModal.jsx
@@ -3,14 +3,12 @@ import PropTypes, { bool, number, string, func } from "prop-types";
import { Modal, Button, Alert, Glyphicon } from "react-bootstrap";
import { FormattedMessage, FormattedHTMLMessage } from "react-intl";
import { connect } from "react-redux";
-import axios from "../../../config/axios";
+import { leaveTeam } from "../../../../../services/api/teams_api";
-import { LEAVE_TEAM_PATH } from "../../../config/api_endpoints";
import {
addTeamsData,
- setCurrentTeam,
- leaveTeamModalShow
-} from "../../actions/TeamsActions";
+ setCurrentTeam
+} from "../../../../../components/actions/TeamsActions";
class LeaveTeamModal extends Component {
constructor(props) {
@@ -20,26 +18,22 @@ class LeaveTeamModal extends Component {
}
onCloseModal() {
- this.props.leaveTeamModalShow(false);
+ this.props.hideLeaveTeamModel();
}
leaveTeam() {
- const teamUrl = `${LEAVE_TEAM_PATH}?team=${this.props.team
- .id}&user_team=${this.props.team.user_team_id}`;
- axios
- .delete(teamUrl, {
- withCredentials: true
- })
+ const { id, user_team_id } = this.props.team;
+ leaveTeam(id, user_team_id)
.then(response => {
- const teams = response.data.teams.collection;
+ const { teams, currentTeam } = response;
+ this.props.updateTeamsState(teams);
this.props.addTeamsData(teams);
- const currentTeam = _.find(teams, team => team.current_team);
this.props.setCurrentTeam(currentTeam);
})
.catch(error => {
console.log("error: ", error.response.data.message);
});
- this.props.leaveTeamModalShow(false);
+ this.props.hideLeaveTeamModel();
}
render() {
@@ -90,6 +84,7 @@ class LeaveTeamModal extends Component {
}
LeaveTeamModal.propTypes = {
+ updateTeamsState: func.isRequired,
showModal: bool.isRequired,
team: PropTypes.shape({
id: number.isRequired,
@@ -97,17 +92,11 @@ LeaveTeamModal.propTypes = {
user_team_id: number.isRequired
}).isRequired,
addTeamsData: func.isRequired,
- leaveTeamModalShow: func.isRequired,
+ hideLeaveTeamModel: func.isRequired,
setCurrentTeam: func.isRequired
};
-const mapStateToProps = ({ showLeaveTeamModal }) => ({
- showModal: showLeaveTeamModal.show,
- team: showLeaveTeamModal.team
-});
-
-export default connect(mapStateToProps, {
- leaveTeamModalShow,
+export default connect(null, {
addTeamsData,
setCurrentTeam
})(LeaveTeamModal);
diff --git a/app/javascript/src/scenes/SettingsPage/scenes/teams/components/TeamsDataTable.jsx b/app/javascript/src/scenes/SettingsPage/scenes/teams/components/TeamsDataTable.jsx
index 163c25e0b..2985b3d9a 100644
--- a/app/javascript/src/scenes/SettingsPage/scenes/teams/components/TeamsDataTable.jsx
+++ b/app/javascript/src/scenes/SettingsPage/scenes/teams/components/TeamsDataTable.jsx
@@ -1,24 +1,40 @@
import React, { Component } from "react";
import PropTypes, { func, number, string, bool } from "prop-types";
-import { connect } from "react-redux";
import { Button } from "react-bootstrap";
import { Link } from "react-router-dom";
import { FormattedMessage } from "react-intl";
-import { leaveTeamModalShow } from "../../../../../components/actions/TeamsActions";
import DataTable from "../../../../../components/data_table";
import { SETTINGS_TEAMS_ROUTE } from "../../../../../config/routes";
+import LeaveTeamModal from "./LeaveTeamModal";
+const DefaultTeam = {
+ id: 0,
+ name: "",
+ current_team: false,
+ user_team_id: 0,
+ role: "",
+ members: 0,
+ can_be_leaved: false
+};
class TeamsDataTable extends Component {
constructor(props) {
super(props);
-
+ this.state = {
+ leaveTeamModalShow: false,
+ team: DefaultTeam
+ };
this.leaveTeamModal = this.leaveTeamModal.bind(this);
this.leaveTeamButton = this.leaveTeamButton.bind(this);
this.linkToTeam = this.linkToTeam.bind(this);
+ this.hideLeaveTeamModel = this.hideLeaveTeamModel.bind(this);
}
leaveTeamModal(e, team) {
- this.props.leaveTeamModalShow(true, team);
+ this.setState({ leaveTeamModalShow: true, team });
+ }
+
+ hideLeaveTeamModel() {
+ this.setState({ leaveTeamModalShow: false, team: DefaultTeam });
}
leaveTeamButton(id, team) {
@@ -90,18 +106,26 @@ class TeamsDataTable extends Component {
}
];
return (
-
+
+
+
+
);
}
}
TeamsDataTable.propTypes = {
- leaveTeamModalShow: func.isRequired,
+ updateTeamsState: func.isRequired,
teams: PropTypes.arrayOf(
PropTypes.shape({
id: number.isRequired,
@@ -114,4 +138,4 @@ TeamsDataTable.propTypes = {
)
};
-export default connect(null, { leaveTeamModalShow })(TeamsDataTable);
+export default TeamsDataTable;
diff --git a/app/javascript/src/scenes/SettingsPage/scenes/teams/index.jsx b/app/javascript/src/scenes/SettingsPage/scenes/teams/index.jsx
index 699eb14be..9c995aebc 100644
--- a/app/javascript/src/scenes/SettingsPage/scenes/teams/index.jsx
+++ b/app/javascript/src/scenes/SettingsPage/scenes/teams/index.jsx
@@ -3,11 +3,8 @@
import React, { Component } from "react";
import styled from "styled-components";
import { Breadcrumb } from "react-bootstrap";
-import { connect } from "react-redux";
import { FormattedMessage } from "react-intl";
-import type { State } from "flow-typed";
-import type { MapStateToProps } from "react-redux";
-
+import { getTeams } from "../../../../services/api/teams_api";
import { BORDER_LIGHT_COLOR } from "../../../../config/constants/colors";
import PageTitle from "../../../../components/PageTitle";
@@ -24,22 +21,44 @@ const Wrapper = styled.div`
`;
type Props = {
- tabState: Function,
+ tabState: Function
+};
+
+type State = {
teams: Array
};
-class SettingsTeams extends Component {
- static defaultProps = {
- teams: [{ id: 0, name: "", current_team: "", role: "", members: 0 }]
- };
+class SettingsTeams extends Component {
+ constructor(props: Props) {
+ super(props);
+ this.state = {
+ teams: [
+ {
+ id: 0,
+ name: "",
+ current_team: true,
+ role: "",
+ members: 0,
+ can_be_leaved: false
+ }
+ ]
+ };
+ (this: any).updateTeamsState = this.updateTeamsState.bind(this);
+ }
componentDidMount() {
+ getTeams().then(({ teams }) => {
+ this.updateTeamsState(teams);
+ });
// set team tab on active
this.props.tabState("2");
}
+ updateTeamsState(teams: Array): void {
+ this.setState({ teams });
+ }
+
render() {
- const { teams } = this.props;
return (
@@ -48,16 +67,15 @@ class SettingsTeams extends Component {
-
-
+
+
);
}
}
-const mapStateToProps: MapStateToProps<*, *, *> = (state: State) => ({
- teams: state.all_teams.collection
-});
-
-export default connect(mapStateToProps)(SettingsTeams);
+export default SettingsTeams;
diff --git a/app/javascript/src/services/api/endpoints.js b/app/javascript/src/services/api/endpoints.js
index 83a2ac416..8fe772400 100644
--- a/app/javascript/src/services/api/endpoints.js
+++ b/app/javascript/src/services/api/endpoints.js
@@ -8,7 +8,7 @@ export const ACTIVITIES_PATH = "/client_api/activities";
// settings
export const SETTINGS_PATH = "/settings";
-export const SETTINGS_ACCOUNT_PATH = "/settings/account";
+
// teams
export const TEAMS_PATH = "/client_api/teams";
export const CHANGE_TEAM_PATH = "/client_api/teams/change_team";
@@ -16,9 +16,6 @@ export const TEAM_DETAILS_PATH = "/client_api/teams/:team_id/details";
export const TEAM_UPDATE_PATH = "/client_api/teams/update";
export const CURRENT_USER_PATH = "/client_api/current_user_info"
-// search
-export const SEARCH_PATH = "/search";
-
// users
export const USER_PROFILE_INFO = "/client_api/users/profile_info";
export const UPDATE_USER_PATH = "/client_api/users/update";
diff --git a/app/javascript/src/services/api/teams_api.js b/app/javascript/src/services/api/teams_api.js
index 38e9e511d..5812a4ab2 100644
--- a/app/javascript/src/services/api/teams_api.js
+++ b/app/javascript/src/services/api/teams_api.js
@@ -1,7 +1,14 @@
// @flow
import type { Teams$NewTeam, Team$Update } from "flow-typed";
+import _ from "lodash";
import { axiosInstance } from "./config";
-import { TEAM_DETAILS_PATH, TEAMS_PATH, TEAM_UPDATE_PATH } from "./endpoints";
+import {
+ TEAM_DETAILS_PATH,
+ TEAM_UPDATE_PATH,
+ TEAMS_PATH,
+ CHANGE_TEAM_PATH,
+ LEAVE_TEAM_PATH
+} from "./endpoints";
export const getTeamDetails = (teamID: number): Promise<*> => {
const path = TEAM_DETAILS_PATH.replace(":team_id", teamID);
@@ -15,3 +22,26 @@ export const updateTeam = (teamID: number, teamData: Team$Update): Promise<*> =>
axiosInstance
.post(TEAM_UPDATE_PATH, { team_id: teamID, team: teamData })
.then(({ data }) => data.team);
+
+export const getTeams = (): Promise<*> =>
+ axiosInstance.get(TEAMS_PATH).then(({ data }) => {
+ const teams = data.teams.collection;
+ const currentTeam = _.find(teams, team => team.current_team);
+ return { teams, currentTeam };
+ });
+
+export const changeCurrentTeam = (teamID: number): Promise<*> =>
+ axiosInstance.post(CHANGE_TEAM_PATH, { team_id: teamID }).then(({ data }) => {
+ const teams = data.teams.collection;
+ const currentTeam = _.find(teams, team => team.current_team);
+ return { teams, currentTeam };
+ });
+
+export const leaveTeam = (teamID: number, userTeamID: number): Promise<*> => {
+ const teamUrl = `${LEAVE_TEAM_PATH}?team=${teamID}&user_team=${userTeamID}`;
+ return axiosInstance.delete(teamUrl).then(({ data }) => {
+ const teams = data.teams.collection;
+ const currentTeam = _.find(teams, team => team.current_team);
+ return { teams, currentTeam };
+ });
+};
diff --git a/flow-typed/action_types.js b/flow-typed/action_types.js
new file mode 100644
index 000000000..78b758bd4
--- /dev/null
+++ b/flow-typed/action_types.js
@@ -0,0 +1,12 @@
+// @flow
+import type { Teams$Team } from "flow-typed";
+
+export type Action$AddTeamData = {
+ payload: Array,
+ type: "GET_LIST_OF_TEAMS"
+}
+
+export type Actopm$SetCurrentTeam = {
+ team: Teams$Team,
+ action: "SET_CURRENT_TEAM"
+}
diff --git a/flow-typed/teams_types.js b/flow-typed/teams_types.js
index 878b1e368..055449f30 100644
--- a/flow-typed/teams_types.js
+++ b/flow-typed/teams_types.js
@@ -21,7 +21,6 @@ export type Teams$NewTeam = {
description: string
};
-
export type Teams$Team = {
id: number,
name: string,