diff --git a/src/common/actions/cycle.js b/src/common/actions/cycle.js
index 01ca8425..7fab71cc 100644
--- a/src/common/actions/cycle.js
+++ b/src/common/actions/cycle.js
@@ -1,7 +1,8 @@
import {normalize} from 'normalizr'
+import socketCluster from 'socketcluster-client'
import {flatten, getGraphQLFetcher} from 'src/common/util'
-import {findUsers} from './user'
+import {findMembers} from './member'
import types from './types'
import schemas from './schemas'
import queries from './queries'
@@ -25,33 +26,48 @@ export function getCycleVotingResults(options = {}) {
return dispatch(action)
.then(() => {
- return options.withUsers ? _findUsersForCycleVotingResults(dispatch, getState) : null
+ return options.withMembers ? _findMembersForCycleVotingResults(dispatch, getState) : null
})
}
}
-export function receivedCycleVotingResults(cycleVotingResults) {
+export function subscribeToCycleVotingResults(cycleId) {
return (dispatch, getState) => {
- dispatch(_receivedCycleVotingResultsWithoutLoadingUsers(cycleVotingResults))
- return _findUsersForCycleVotingResults(dispatch, getState)
+ if (cycleId) {
+ console.log(`subscribing to voting results for cycle ${cycleId} ...`)
+ this.socket = socketCluster.connect()
+ this.socket.on('connect', () => console.log('... socket connected'))
+ this.socket.on('disconnect', () => console.log('socket disconnected, will try to reconnect socket ...'))
+ this.socket.on('connectAbort', () => null)
+ this.socket.on('error', error => console.warn(error.message))
+ const cycleVotingResultsChannel = this.socket.subscribe(`cycleVotingResults-${cycleId}`)
+ cycleVotingResultsChannel.watch(cycleVotingResults => {
+ const response = normalize(cycleVotingResults, schemas.cycleVotingResults)
+ dispatch({type: types.RECEIVED_CYCLE_VOTING_RESULTS, response})
+ dispatch(_findMembersForCycleVotingResults(dispatch, getState))
+ })
+ }
}
}
-function _findUsersForCycleVotingResults(dispatch, getState) {
- // we'll only load users from IDM that haven't already been loaded, because
+export function unsubscribeFromCycleVotingResults(cycleId) {
+ if (this.socket && cycleId) {
+ console.log(`unsubscribing from voting results for cycle ${cycleId} ...`)
+ this.socket.unwatch(`cycleVotingResults-${cycleId}`)
+ this.socket.unsubscribe(`cycleVotingResults-${cycleId}`)
+ }
+}
+
+function _findMembersForCycleVotingResults(dispatch, getState) {
+ // we'll only load members that haven't already been loaded, because
// it's unlikely that their names, handles, and avatars have changed since
// the last load, and those are the attributes we use in the voting results
const {
cycleVotingResults: {cycleVotingResults: {CURRENT: cycleVotingResults}},
- users: {users},
+ members: {members},
} = getState()
- const memberIds = flatten(cycleVotingResults.pools.map(_ => _.users.map(_ => _.id)))
- const userIdsToLoad = memberIds.filter(memberId => !users[memberId])
- return userIdsToLoad.length === 0 ? null : dispatch(findUsers(userIdsToLoad))
-}
-
-function _receivedCycleVotingResultsWithoutLoadingUsers(cycleVotingResults) {
- const response = normalize(cycleVotingResults, schemas.cycleVotingResults)
- return {type: types.RECEIVED_CYCLE_VOTING_RESULTS, response}
+ const memberIds = flatten(cycleVotingResults.pools.map(pool => pool.members.map(m => m.id)))
+ const memberIdsToLoad = memberIds.filter(memberId => !members[memberId])
+ return memberIdsToLoad.length === 0 ? null : dispatch(findMembers(memberIdsToLoad))
}
diff --git a/src/common/actions/member.js b/src/common/actions/member.js
new file mode 100644
index 00000000..2768c717
--- /dev/null
+++ b/src/common/actions/member.js
@@ -0,0 +1,100 @@
+import {normalize} from 'normalizr'
+
+import {getGraphQLFetcher} from 'src/common/util'
+import types from './types'
+import schemas from './schemas'
+import queries from './queries'
+
+export function deactivateMember(memberId) {
+ return {
+ types: [
+ types.DEACTIVATE_MEMBER_REQUEST,
+ types.DEACTIVATE_MEMBER_SUCCESS,
+ types.DEACTIVATE_MEMBER_FAILURE,
+ ],
+ shouldCallAPI: () => true,
+ callAPI: (dispatch, getState) => {
+ const query = queries.deactivateMember(memberId)
+ return getGraphQLFetcher(dispatch, getState().auth)(query)
+ .then(graphQLResponse => graphQLResponse.data.deactivateMember)
+ },
+ redirect: _redirectMember,
+ payload: {},
+ }
+}
+
+export function findMembers() {
+ return {
+ types: [
+ types.FIND_MEMBERS_REQUEST,
+ types.FIND_MEMBERS_SUCCESS,
+ types.FIND_MEMBERS_FAILURE,
+ ],
+ shouldCallAPI: () => true,
+ callAPI: (dispatch, getState) => {
+ const query = queries.findMembers()
+ return getGraphQLFetcher(dispatch, getState().auth)(query)
+ .then(graphQLResponse => graphQLResponse.data.findMembers)
+ .then(members => normalize(members, schemas.members))
+ },
+ payload: {},
+ }
+}
+
+export function getMemberSummary(identifier) {
+ return {
+ types: [
+ types.GET_MEMBER_SUMMARY_REQUEST,
+ types.GET_MEMBER_SUMMARY_SUCCESS,
+ types.GET_MEMBER_SUMMARY_FAILURE,
+ ],
+ shouldCallAPI: () => true,
+ callAPI: (dispatch, getState) => {
+ const query = queries.getMemberSummary(identifier)
+ return getGraphQLFetcher(dispatch, getState().auth)(query)
+ .then(graphQLResponse => graphQLResponse.data.getMemberSummary)
+ },
+ payload: {},
+ }
+}
+
+export function reassignMembersToChapter(memberIds, chapterId) {
+ return {
+ types: [
+ types.REASSIGN_MEMBERS_TO_CHAPTER_REQUEST,
+ types.REASSIGN_MEMBERS_TO_CHAPTER_SUCCESS,
+ types.REASSIGN_MEMBERS_TO_CHAPTER_FAILURE,
+ ],
+ shouldCallAPI: () => true,
+ callAPI: (dispatch, getState) => {
+ const mutation = queries.reassignMembersToChapter(memberIds, chapterId)
+ return getGraphQLFetcher(dispatch, getState().auth)(mutation)
+ .then(graphQLResponse => graphQLResponse.data.reassignMembersToChapter)
+ .then(members => normalize(members, schemas.members))
+ },
+ redirect: '/members',
+ payload: {memberIds, chapterId},
+ }
+}
+
+export function updateMember(values) {
+ return {
+ types: [
+ types.UPDATE_MEMBER_REQUEST,
+ types.UPDATE_MEMBER_SUCCESS,
+ types.UPDATE_MEMBER_FAILURE,
+ ],
+ shouldCallAPI: () => true,
+ callAPI: (dispatch, getState) => {
+ const mutation = queries.updateMember(values)
+ return getGraphQLFetcher(dispatch, getState().auth)(mutation)
+ .then(graphQLResponse => graphQLResponse.data.updateMember)
+ },
+ redirect: _redirectMember,
+ payload: {},
+ }
+}
+
+function _redirectMember(member) {
+ return member && member.handle ? `/members/${member.handle}` : '/members'
+}
diff --git a/src/common/actions/project.js b/src/common/actions/project.js
index bb016c8b..5fb03a74 100644
--- a/src/common/actions/project.js
+++ b/src/common/actions/project.js
@@ -103,40 +103,6 @@ export function importProject(values) {
}
}
-export function unlockSurvey(memberId, projectId) {
- return {
- types: [
- types.UNLOCK_SURVEY_REQUEST,
- types.UNLOCK_SURVEY_SUCCESS,
- types.UNLOCK_SURVEY_FAILURE,
- ],
- shouldCallAPI: () => true,
- callAPI: (dispatch, getState) => {
- const query = queries.unlockSurvey(memberId, projectId)
- return getGraphQLFetcher(dispatch, getState().auth)(query)
- .then(graphQLResponse => graphQLResponse.data.unlockRetroSurveyForUser)
- },
- payload: {memberId, projectId},
- }
-}
-
-export function lockSurvey(memberId, projectId) {
- return {
- types: [
- types.LOCK_SURVEY_REQUEST,
- types.LOCK_SURVEY_SUCCESS,
- types.LOCK_SURVEY_FAILURE,
- ],
- shouldCallAPI: () => true,
- callAPI: (dispatch, getState) => {
- const query = queries.lockSurvey(memberId, projectId)
- return getGraphQLFetcher(dispatch, getState().auth)(query)
- .then(graphQLResponse => graphQLResponse.data.lockRetroSurveyForUser)
- },
- payload: {memberId, projectId},
- }
-}
-
export function deleteProject(identifier) {
return {
types: [
diff --git a/src/common/actions/queries/deactivateMember.js b/src/common/actions/queries/deactivateMember.js
new file mode 100644
index 00000000..67ca5c9c
--- /dev/null
+++ b/src/common/actions/queries/deactivateMember.js
@@ -0,0 +1,14 @@
+export default function deactivateMember(memberId) {
+ return {
+ variables: {memberId},
+ query: `
+ mutation ($memberId: ID!) {
+ deactivateMember(identifier: $memberId) {
+ id
+ active
+ handle
+ }
+ }
+ `,
+ }
+}
diff --git a/src/common/actions/queries/findMembers.js b/src/common/actions/queries/findMembers.js
index ebd73303..3d0ce14e 100644
--- a/src/common/actions/queries/findMembers.js
+++ b/src/common/actions/queries/findMembers.js
@@ -1,10 +1,11 @@
-export default function findMembers() {
+export default function findMembers(identifiers) {
return {
- variables: {},
+ variables: {identifiers},
query: `
- query {
- findMembers {
+ query ($identifiers: [String]) {
+ findMembers(identifiers: $identifiers) {
id
+ chapterId
chapter {
id
name
@@ -12,6 +13,19 @@ export default function findMembers() {
timezone
inviteCodes
}
+ phone
+ email
+ name
+ handle
+ avatarUrl
+ profileUrl
+ timezone
+ active
+ phaseId
+ phase {
+ id
+ number
+ }
createdAt
updatedAt
}
diff --git a/src/common/actions/queries/findUsers.js b/src/common/actions/queries/findUsers.js
deleted file mode 100644
index fa71d9f1..00000000
--- a/src/common/actions/queries/findUsers.js
+++ /dev/null
@@ -1,27 +0,0 @@
-export default function findUsers(identifiers) {
- return {
- variables: {identifiers},
- query: `
- query ($identifiers: [String]) {
- findUsers(identifiers: $identifiers) {
- id
- chapterId
- phone
- email
- name
- handle
- avatarUrl
- profileUrl
- timezone
- active
- phase {
- id
- number
- }
- createdAt
- updatedAt
- }
- }
- `,
- }
-}
diff --git a/src/common/actions/queries/getCycleVotingResults.js b/src/common/actions/queries/getCycleVotingResults.js
index 91825511..01a8faba 100644
--- a/src/common/actions/queries/getCycleVotingResults.js
+++ b/src/common/actions/queries/getCycleVotingResults.js
@@ -21,7 +21,7 @@ export default function getCycleVotingResults() {
id
name
voterMemberIds
- users {
+ members {
id
}
phase {
diff --git a/src/common/actions/queries/getUserSummary.js b/src/common/actions/queries/getMemberSummary.js
similarity index 83%
rename from src/common/actions/queries/getUserSummary.js
rename to src/common/actions/queries/getMemberSummary.js
index 2930a4df..55ae2882 100644
--- a/src/common/actions/queries/getUserSummary.js
+++ b/src/common/actions/queries/getMemberSummary.js
@@ -1,11 +1,11 @@
import {FEEDBACK_TYPE_DESCRIPTORS} from 'src/common/models/feedbackType'
-export default function getUserSummary(identifier) {
+export default function Member(identifier) {
return {
variables: {identifier},
query: `query ($identifier: String!) {
- getUserSummary(identifier: $identifier) {
- user {
+ Member(identifier: $identifier) {
+ member {
id
phone
email
@@ -26,7 +26,7 @@ export default function getUserSummary(identifier) {
name
}
}
- userProjectSummaries {
+ memberProjectSummaries {
project {
id
name
@@ -44,7 +44,7 @@ export default function getUserSummary(identifier) {
phase
}
}
- userProjectEvaluations {
+ memberProjectEvaluations {
${FEEDBACK_TYPE_DESCRIPTORS.GENERAL_FEEDBACK}
}
}
diff --git a/src/common/actions/queries/getProjectSummary.js b/src/common/actions/queries/getProjectSummary.js
index 55454792..8ef5bf67 100644
--- a/src/common/actions/queries/getProjectSummary.js
+++ b/src/common/actions/queries/getProjectSummary.js
@@ -34,18 +34,18 @@ export default function getProjectSummary(identifier) {
number
}
}
- projectUserSummaries {
- user {
+ projectMemberSummaries {
+ member {
id
name
handle
avatarUrl
}
- userProjectEvaluations {
+ memberProjectEvaluations {
${FEEDBACK_TYPE_DESCRIPTORS.GENERAL_FEEDBACK}
}
- userRetrospectiveComplete
- userRetrospectiveUnlocked
+ memberRetrospectiveComplete
+ memberRetrospectiveUnlocked
}
}
}`,
diff --git a/src/common/actions/queries/index.js b/src/common/actions/queries/index.js
index 709bc61d..613512a2 100644
--- a/src/common/actions/queries/index.js
+++ b/src/common/actions/queries/index.js
@@ -1,5 +1,6 @@
export default {
createInviteCode: require('./createInviteCode'),
+ deleteProject: require('./deleteProject'),
findChapters: require('./findChapters'),
findPhases: require('./findPhases'),
findPhaseSummaries: require('./findPhaseSummaries'),
@@ -7,20 +8,18 @@ export default {
findProjects: require('./findProjects'),
findProjectsForCycle: require('./findProjectsForCycle'),
findRetrospectiveSurveys: require('./findRetrospectiveSurveys'),
- findUsers: require('./findUsers'),
getChapter: require('./getChapter'),
getCycleVotingResults: require('./getCycleVotingResults'),
getProject: require('./getProject'),
getProjectSummary: require('./getProjectSummary'),
getRetrospectiveSurvey: require('./getRetrospectiveSurvey'),
- getUserSummary: require('./getUserSummary'),
+ getMemberSummary: require('./getMemberSummary'),
importProject: require('./importProject'),
+ lockSurveyForMember: require('./lockSurveyForMember'),
reassignMembersToChapter: require('./reassignMembersToChapter'),
saveChapter: require('./saveChapter'),
saveRetrospectiveSurveyResponses: require('./saveRetrospectiveSurveyResponses'),
submitSurvey: require('./submitSurvey'),
- unlockSurvey: require('./unlockSurvey'),
- lockSurvey: require('./lockSurvey'),
- deleteProject: require('./deleteProject'),
- updateUser: require('./updateUser'),
+ unlockSurveyForMember: require('./unlockSurveyForMember'),
+ updateMember: require('./updateMember'),
}
diff --git a/src/common/actions/queries/lockSurvey.js b/src/common/actions/queries/lockSurvey.js
deleted file mode 100644
index ea56a21e..00000000
--- a/src/common/actions/queries/lockSurvey.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import {FEEDBACK_TYPE_DESCRIPTORS} from 'src/common/models/feedbackType'
-
-export default function lockSurvey(memberId, projectId) {
- return {
- variables: {memberId, projectId},
- query: `
- mutation($memberId: ID!, $projectId: ID!) {
- lockRetroSurveyForUser(memberId: $memberId, projectId: $projectId) {
- project {
- id
- name
- artifactURL
- retrospectiveSurveyId
- createdAt
- updatedAt
- goal {
- number
- title
- phase
- }
- chapter {
- id
- name
- }
- cycle {
- id
- cycleNumber
- state
- startTimestamp
- endTimestamp
- }
- }
- projectUserSummaries {
- user {
- id
- name
- handle
- avatarUrl
- }
- userProjectEvaluations {
- ${FEEDBACK_TYPE_DESCRIPTORS.GENERAL_FEEDBACK}
- }
- userRetrospectiveComplete
- userRetrospectiveUnlocked
- }
- }
- }
- `,
- }
-}
diff --git a/src/common/actions/queries/lockSurveyForMember.js b/src/common/actions/queries/lockSurveyForMember.js
new file mode 100644
index 00000000..ff11d90a
--- /dev/null
+++ b/src/common/actions/queries/lockSurveyForMember.js
@@ -0,0 +1,14 @@
+export default function lockSurveyForMember(surveyId, memberId) {
+ return {
+ variables: {surveyId, memberId},
+ query: `
+ mutation($surveyId: ID!, $memberId: ID!) {
+ lockSurveyForMember(surveyId: $surveyId, memberId: $memberId) {
+ id
+ completedBy
+ unlockedFor
+ }
+ }
+ `,
+ }
+}
diff --git a/src/common/actions/queries/unlockSurvey.js b/src/common/actions/queries/unlockSurvey.js
deleted file mode 100644
index 985549d1..00000000
--- a/src/common/actions/queries/unlockSurvey.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import {FEEDBACK_TYPE_DESCRIPTORS} from 'src/common/models/feedbackType'
-
-export default function unlockSurvey(memberId, projectId) {
- return {
- variables: {memberId, projectId},
- query: `
- mutation($memberId: ID!, $projectId: ID!) {
- unlockRetroSurveyForUser(memberId: $memberId, projectId: $projectId) {
- project {
- id
- name
- artifactURL
- retrospectiveSurveyId
- createdAt
- updatedAt
- goal {
- number
- title
- phase
- }
- chapter {
- id
- name
- }
- cycle {
- id
- cycleNumber
- state
- startTimestamp
- endTimestamp
- }
- }
- projectUserSummaries {
- user {
- id
- name
- handle
- avatarUrl
- }
- userProjectEvaluations {
- ${FEEDBACK_TYPE_DESCRIPTORS.GENERAL_FEEDBACK}
- }
- userRetrospectiveComplete
- userRetrospectiveUnlocked
- }
- }
- }
- `,
- }
-}
diff --git a/src/common/actions/queries/unlockSurveyForMember.js b/src/common/actions/queries/unlockSurveyForMember.js
new file mode 100644
index 00000000..aa89e0f3
--- /dev/null
+++ b/src/common/actions/queries/unlockSurveyForMember.js
@@ -0,0 +1,14 @@
+export default function unlockSurveyForMember(surveyId, memberId) {
+ return {
+ variables: {surveyId, memberId},
+ query: `
+ mutation($surveyId: ID!, $memberId: ID!) {
+ unlockSurveyForMember(surveyId: $surveyId, memberId: $memberId) {
+ id
+ completedBy
+ unlockedFor
+ }
+ }
+ `,
+ }
+}
diff --git a/src/common/actions/queries/updateUser.js b/src/common/actions/queries/updateMember.js
similarity index 50%
rename from src/common/actions/queries/updateUser.js
rename to src/common/actions/queries/updateMember.js
index dbc20554..b46376d3 100644
--- a/src/common/actions/queries/updateUser.js
+++ b/src/common/actions/queries/updateMember.js
@@ -1,9 +1,9 @@
-export default function updateUser(values) {
+export default function updateMember(values) {
return {
variables: {values},
query: `
- mutation ($values: InputUser!) {
- updateUser(values: $values) {
+ mutation ($values: InputMember!) {
+ updateMember(values: $values) {
id
handle
updatedAt
diff --git a/src/common/actions/schemas/index.js b/src/common/actions/schemas/index.js
index 2f2af459..cfdd474f 100644
--- a/src/common/actions/schemas/index.js
+++ b/src/common/actions/schemas/index.js
@@ -6,13 +6,11 @@ const cycleVotingResults = new Schema('cycleVotingResults')
const phase = new Schema('phases')
const member = new Schema('members')
const project = new Schema('projects')
-const user = new Schema('users')
const chapters = arrayOf(chapter)
const phases = arrayOf(phase)
const members = arrayOf(member)
const projects = arrayOf(project)
-const users = arrayOf(user)
cycle.define({chapter})
cycleVotingResults.define({cycle})
@@ -29,6 +27,4 @@ export default {
members,
project,
projects,
- user,
- users,
}
diff --git a/src/common/actions/survey.js b/src/common/actions/survey.js
index 87bfb885..51c84a92 100644
--- a/src/common/actions/survey.js
+++ b/src/common/actions/survey.js
@@ -77,6 +77,40 @@ export function submitSurvey(surveyId) {
}
}
+export function unlockSurveyForMember(surveyId, memberId) {
+ return {
+ types: [
+ types.UNLOCK_SURVEY_REQUEST,
+ types.UNLOCK_SURVEY_SUCCESS,
+ types.UNLOCK_SURVEY_FAILURE,
+ ],
+ shouldCallAPI: () => true,
+ callAPI: (dispatch, getState) => {
+ const query = queries.unlockSurveyForMember(surveyId, memberId)
+ return getGraphQLFetcher(dispatch, getState().auth)(query)
+ .then(graphQLResponse => graphQLResponse.data.unlockSurveyForMember)
+ },
+ payload: {surveyId, memberId},
+ }
+}
+
+export function lockSurveyForMember(surveyId, memberId) {
+ return {
+ types: [
+ types.LOCK_SURVEY_REQUEST,
+ types.LOCK_SURVEY_SUCCESS,
+ types.LOCK_SURVEY_FAILURE,
+ ],
+ shouldCallAPI: () => true,
+ callAPI: (dispatch, getState) => {
+ const query = queries.lockSurveyForMember(surveyId, memberId)
+ return getGraphQLFetcher(dispatch, getState().auth)(query)
+ .then(graphQLResponse => graphQLResponse.data.lockSurveyForMember)
+ },
+ payload: {surveyId, memberId},
+ }
+}
+
export function setSurveyGroup(groupIndex) {
return {type: types.SET_SURVEY_GROUP, groupIndex}
}
diff --git a/src/common/actions/types/index.js b/src/common/actions/types/index.js
index e01542a8..036953f3 100644
--- a/src/common/actions/types/index.js
+++ b/src/common/actions/types/index.js
@@ -29,10 +29,6 @@ export default keyMirror({
FIND_PROJECTS_SUCCESS: null,
FIND_PROJECTS_FAILURE: null,
- FIND_USERS_REQUEST: null,
- FIND_USERS_SUCCESS: null,
- FIND_USERS_FAILURE: null,
-
GET_CHAPTER_REQUEST: null,
GET_CHAPTER_SUCCESS: null,
GET_CHAPTER_FAILURE: null,
@@ -57,13 +53,13 @@ export default keyMirror({
GET_SURVEY_SUCCESS: null,
GET_SURVEY_FAILURE: null,
- GET_USER_SUMMARY_REQUEST: null,
- GET_USER_SUMMARY_SUCCESS: null,
- GET_USER_SUMMARY_FAILURE: null,
+ GET_MEMBER_SUMMARY_REQUEST: null,
+ GET_MEMBER_SUMMARY_SUCCESS: null,
+ GET_MEMBER_SUMMARY_FAILURE: null,
- DEACTIVATE_USER_REQUEST: null,
- DEACTIVATE_USER_SUCCESS: null,
- DEACTIVATE_USER_FAILURE: null,
+ DEACTIVATE_MEMBER_REQUEST: null,
+ DEACTIVATE_MEMBER_SUCCESS: null,
+ DEACTIVATE_MEMBER_FAILURE: null,
IMPORT_PROJECT_REQUEST: null,
IMPORT_PROJECT_SUCCESS: null,
@@ -73,9 +69,9 @@ export default keyMirror({
REASSIGN_MEMBERS_TO_CHAPTER_SUCCESS: null,
REASSIGN_MEMBERS_TO_CHAPTER_FAILURE: null,
- UPDATE_USER_REQUEST: null,
- UPDATE_USER_SUCCESS: null,
- UPDATE_USER_FAILURE: null,
+ UPDATE_MEMBER_REQUEST: null,
+ UPDATE_MEMBER_SUCCESS: null,
+ UPDATE_MEMBER_FAILURE: null,
RECEIVED_CYCLE_VOTING_RESULTS: null,
diff --git a/src/common/actions/user.js b/src/common/actions/user.js
deleted file mode 100644
index 3863c9b5..00000000
--- a/src/common/actions/user.js
+++ /dev/null
@@ -1,126 +0,0 @@
-import {normalize} from 'normalizr'
-
-import {getGraphQLFetcher} from 'src/common/util'
-import types from './types'
-import schemas from './schemas'
-import queries from './queries'
-
-export function findUsers(identifiers) {
- return {
- types: [
- types.FIND_USERS_REQUEST,
- types.FIND_USERS_SUCCESS,
- types.FIND_USERS_FAILURE,
- ],
- shouldCallAPI: () => true,
- callAPI: (dispatch, getState) => {
- const query = queries.findUsers(identifiers)
- return getGraphQLFetcher(dispatch, getState().auth)(query)
- .then(graphQLResponse => graphQLResponse.data.findUsers)
- .then(users => normalize(users, schemas.users))
- },
- payload: {},
- }
-}
-
-export function deactivateUser(id) {
- return {
- types: [
- types.DEACTIVATE_USER_REQUEST,
- types.DEACTIVATE_USER_SUCCESS,
- types.DEACTIVATE_USER_FAILURE,
- ],
- shouldCallAPI: () => true,
- callAPI: (dispatch, getState) => {
- const query = {
- query: 'mutation ($memberId: ID!) { deactivateUser(identifier: $memberId) { id active handle } }',
- variables: {memberId: id},
- }
- return getGraphQLFetcher(dispatch, getState().auth)(query)
- .then(graphQLResponse => graphQLResponse.data.deactivateUser)
- },
- payload: {},
- }
-}
-
-export function findMembers(options = {}) {
- return (dispatch, getState) => {
- const action = {
- types: [
- types.FIND_MEMBERS_REQUEST,
- types.FIND_MEMBERS_SUCCESS,
- types.FIND_MEMBERS_FAILURE,
- ],
- shouldCallAPI: () => true,
- callAPI: (dispatch, getState) => {
- const query = queries.findMembers()
- return getGraphQLFetcher(dispatch, getState().auth)(query)
- .then(graphQLResponse => graphQLResponse.data.findMembers)
- .then(members => normalize(members, schemas.members))
- },
- payload: {},
- }
-
- return dispatch(action)
- .then(() => {
- if (options.withUsers) {
- const memberIds = Object.keys(getState().members.members)
- return dispatch(findUsers(memberIds))
- }
- })
- }
-}
-
-export function getUserSummary(identifier) {
- return {
- types: [
- types.GET_USER_SUMMARY_REQUEST,
- types.GET_USER_SUMMARY_SUCCESS,
- types.GET_USER_SUMMARY_FAILURE,
- ],
- shouldCallAPI: () => true,
- callAPI: (dispatch, getState) => {
- const query = queries.getUserSummary(identifier)
- return getGraphQLFetcher(dispatch, getState().auth)(query)
- .then(graphQLResponse => graphQLResponse.data.getUserSummary)
- },
- payload: {},
- }
-}
-
-export function reassignMembersToChapter(memberIds, chapterId) {
- return {
- types: [
- types.REASSIGN_MEMBERS_TO_CHAPTER_REQUEST,
- types.REASSIGN_MEMBERS_TO_CHAPTER_SUCCESS,
- types.REASSIGN_MEMBERS_TO_CHAPTER_FAILURE,
- ],
- shouldCallAPI: () => true,
- callAPI: (dispatch, getState) => {
- const mutation = queries.reassignMembersToChapter(memberIds, chapterId)
- return getGraphQLFetcher(dispatch, getState().auth)(mutation)
- .then(graphQLResponse => graphQLResponse.data.reassignMembersToChapter)
- .then(members => normalize(members, schemas.members))
- },
- redirect: '/members',
- payload: {memberIds, chapterId},
- }
-}
-
-export function updateUser(values) {
- return {
- types: [
- types.UPDATE_USER_REQUEST,
- types.UPDATE_USER_SUCCESS,
- types.UPDATE_USER_FAILURE,
- ],
- shouldCallAPI: () => true,
- callAPI: (dispatch, getState) => {
- const mutation = queries.updateUser(values)
- return getGraphQLFetcher(dispatch, getState().auth)(mutation)
- .then(graphQLResponse => graphQLResponse.data.updateUser)
- },
- redirect: user => (user && user.handle ? `/users/${user.handle}` : '/users'),
- payload: {},
- }
-}
diff --git a/src/common/components/CycleVotingResults/index.jsx b/src/common/components/CycleVotingResults/index.jsx
index da9b07ae..cc686063 100644
--- a/src/common/components/CycleVotingResults/index.jsx
+++ b/src/common/components/CycleVotingResults/index.jsx
@@ -8,7 +8,7 @@ import VotingPoolResults, {poolPropType} from 'src/common/components/VotingPoolR
import styles from './index.css'
const currentUserIsInPool = (currentUser, pool) => {
- return pool.users.some(user => user.id === currentUser.id)
+ return pool.members.some(member => member.id === currentUser.id)
}
export default class CycleVotingResults extends Component {
diff --git a/src/common/components/UserDetail/index.jsx b/src/common/components/MemberDetail/index.jsx
similarity index 56%
rename from src/common/components/UserDetail/index.jsx
rename to src/common/components/MemberDetail/index.jsx
index da41739d..582be521 100644
--- a/src/common/components/UserDetail/index.jsx
+++ b/src/common/components/MemberDetail/index.jsx
@@ -7,88 +7,84 @@ import Helmet from 'react-helmet'
import ConfirmationDialog from 'src/common/components/ConfirmationDialog'
import WrappedButton from 'src/common/components/WrappedButton'
import ContentSidebar from 'src/common/components/ContentSidebar'
-import UserProjectSummary from 'src/common/components/UserProjectSummary'
+import MemberProjectSummary from 'src/common/components/MemberProjectSummary'
import {Flex} from 'src/common/components/Layout'
import {formatPartialPhoneNumber} from 'src/common/util/format'
-import {userCan} from 'src/common/util'
import styles from './index.scss'
import theme from './theme.scss'
-class UserDetail extends Component {
+class MemberDetail extends Component {
constructor(props) {
super(props)
this.renderSidebar = this.renderSidebar.bind(this)
this.renderTabs = this.renderTabs.bind(this)
this.renderProjects = this.renderProjects.bind(this)
this.handleChangeTab = this.handleChangeTab.bind(this)
- this.showDeactivateUserDialog = this.showDeactivateUserDialog.bind(this)
- this.hideDeactivateUserDialog = this.hideDeactivateUserDialog.bind(this)
- this.handleDeactivateUser = this.handleDeactivateUser.bind(this)
- this.state = {tabIndex: 0, showingDeactivateUserDialog: false}
+ this.showDeactivateDialog = this.showDeactivateDialog.bind(this)
+ this.handleClickCancelDeactivate = this.handleClickCancelDeactivate.bind(this)
+ this.handleClickConfirmDeactivate = this.handleClickConfirmDeactivate.bind(this)
+ this.state = {tabIndex: 0, showDeactivateDialog: false}
}
- showDeactivateUserDialog() {
- this.setState({showingDeactivateUserDialog: true})
+ handleClickDeactivate() {
+ this.setState({showDeactivateDialog: true})
}
- hideDeactivateUserDialog() {
- this.setState({showingDeactivateUserDialog: false})
+ handleClickCancelDeactivate() {
+ this.setState({showDeactivateDialog: false})
}
handleChangeTab(tabIndex) {
this.setState({tabIndex})
}
- handleDeactivateUser() {
- const {onDeactivateUser} = this.props
- onDeactivateUser(this.props.user.id)
- this.setState({showingDeactivateUserDialog: false})
+ handleClickConfirmDeactivate() {
+ const {onClickDeactivate} = this.props
+ onClickDeactivate(this.props.member.id)
+ this.setState({showDeactivateDialog: false})
}
renderSidebar() {
- const {user, currentUser, defaultAvatarURL, onClickEdit} = this.props
+ const {showEdit, showDeactivate, member, defaultAvatarURL, onClickEdit} = this.props
- const emailLink = user.email ? (
-
- {user.email}
+ const emailLink = member.email ? (
+
+ {member.email}
) : null
- const phoneLink = user.phone ? (
-
- {formatPartialPhoneNumber(user.phone)}
+ const phoneLink = member.phone ? (
+
+ {formatPartialPhoneNumber(member.phone)}
) : null
- const canBeDeactivated = user.active && userCan(currentUser, 'deactivateUser')
- const canBeEdited = userCan(currentUser, 'updateUser')
-
- const deactivateUserDialog = canBeDeactivated ? (
+ const deactivateDialog = showDeactivate ? (