Skip to content

Commit

Permalink
✨ change organizer thread to reviewers thread (#809)
Browse files Browse the repository at this point in the history
  • Loading branch information
mbernardeau committed Jul 16, 2020
1 parent 58436db commit 34fe2bf
Show file tree
Hide file tree
Showing 11 changed files with 60 additions and 61 deletions.
4 changes: 2 additions & 2 deletions config/firestore.rules
Expand Up @@ -83,8 +83,8 @@ service cloud.firestore {

// ORGANIZERS THREAD
match /organizersThread/{message} {
allow list: if authenticated() && canEditEvent(get(/databases/$(database)/documents/events/$(event)));
allow create: if authenticated() && canEditEvent(get(/databases/$(database)/documents/events/$(event)));
allow list: if authenticated() && itsMyEvent(get(/databases/$(database)/documents/events/$(event)));
allow create: if authenticated() && itsMyEvent(get(/databases/$(database)/documents/events/$(event)));
allow update: if authenticated() && itsMyMessage(get(/databases/$(database)/documents/events/$(event)/proposals/$(proposal)/organizersThread/$(message)));
allow delete: if authenticated() && itsMyMessage(get(/databases/$(database)/documents/events/$(event)/proposals/$(proposal)/organizersThread/$(message)));
}
Expand Down
8 changes: 4 additions & 4 deletions src/firebase/proposals.js
Expand Up @@ -91,7 +91,7 @@ export const updateRating = (eventId, proposalId, uid, ratingUpdated, rated) =>
.update({ ...ratingUpdated, [`usersRatings.${uid}`]: rated })
}

export const queryOrganizersThread = (eventId, proposalId) =>
export const queryReviewersThread = (eventId, proposalId) =>
firebase
.firestore()
.collection('events')
Expand All @@ -101,7 +101,7 @@ export const queryOrganizersThread = (eventId, proposalId) =>
.collection('organizersThread')
.orderBy('date', 'asc')

export const addOrganizersThreadMessage = async (eventId, proposalId, message, user) =>
export const addReviewersThreadMessage = async (eventId, proposalId, message, user) =>
firebase
.firestore()
.collection('events')
Expand All @@ -117,7 +117,7 @@ export const addOrganizersThreadMessage = async (eventId, proposalId, message, u
date: firebase.firestore.FieldValue.serverTimestamp(),
})

export const updateOrganizersThreadMessage = async (eventId, proposalId, messageId, message) => {
export const updateReviewersThreadMessage = async (eventId, proposalId, messageId, message) => {
await firebase
.firestore()
.collection('events')
Expand All @@ -132,7 +132,7 @@ export const updateOrganizersThreadMessage = async (eventId, proposalId, message
})
}

export const deleteOrganizersThreadMessage = async (eventId, proposalId, messageId) => {
export const deleteReviewersThreadMessage = async (eventId, proposalId, messageId) => {
await firebase
.firestore()
.collection('events')
Expand Down
5 changes: 2 additions & 3 deletions src/screens/organizer/proposal/actions/actions.jsx
Expand Up @@ -8,7 +8,7 @@ import { ROLE_OWNER_OR_MEMBER } from 'firebase/constants'

import TeamRatings from './teamRatings'
import SpeakerSurveys from './speakerSurveys'
import OrganizersThread from './organizersThread'
import ReviewersThread from './reviewersThread'
import EditProposal from './editProposal'
import styles from './actions.module.css'

Expand All @@ -20,9 +20,8 @@ const Actions = ({ eventId, proposal, surveyActive, displayOrganizersRatings, cl
{displayOrganizersRatings && <TeamRatings proposalId={proposal.id} />}

{surveyActive && <SpeakerSurveys eventId={eventId} proposalId={proposal.id} />}

<OrganizersThread eventId={eventId} proposalId={proposal.id} />
</HasRole>
<ReviewersThread eventId={eventId} proposalId={proposal.id} />
</Titlebar>
)

Expand Down

This file was deleted.

This file was deleted.

@@ -0,0 +1 @@
export { default } from './reviewersThread.container'
@@ -1,10 +1,10 @@
import { inject } from '@k-ramel/react'

import OrganizersThread from './organizersThread'
import ReviewersThread from './reviewersThread'

const mapStore = (store) => {
const { uid } = store.auth.get()
return { user: store.data.users.get(uid) }
}

export default inject(mapStore)(OrganizersThread)
export default inject(mapStore)(ReviewersThread)
Expand Up @@ -7,11 +7,11 @@ import Button from 'components/button'
import IconLabel from 'components/iconLabel'
import Thread from 'components/thread'

import useOrganizerThreads from './useOrganizerThreads'
import styles from './organizersThread.module.css'
import useReviewerThreads from './useReviewerThreads'
import styles from './reviewersThread.module.css'

const OrganizersThread = ({ eventId, proposalId, user }) => {
const { messages, saveMessage, deleteMessage } = useOrganizerThreads({
const ReviewersThread = ({ eventId, proposalId, user }) => {
const { messages, saveMessage, deleteMessage } = useReviewerThreads({
eventId,
proposalId,
user,
Expand All @@ -20,16 +20,16 @@ const OrganizersThread = ({ eventId, proposalId, user }) => {
const nbMessages = !isEmpty(messages) ? ` (${messages.length})` : ''
return (
<Drawer
title="Organizers thread"
title="Reviewers thread"
renderTrigger={({ show }) => (
<Button secondary onClick={show}>
<IconLabel icon="fa fa-comments" label={`Organizers thread${nbMessages}`} />
<IconLabel icon="fa fa-comments" label={`Reviewers thread${nbMessages}`} />
</Button>
)}
>
<Thread
className={styles.organizersThread}
description="Discuss with other organizers about this proposal. The speaker WILL NOT see these comments."
className={styles.reviewersThread}
description="Discuss with other reviewers about this proposal. The speaker WILL NOT see these comments."
currentUser={user.uid}
messages={messages}
onSaveMessage={saveMessage}
Expand All @@ -39,14 +39,14 @@ const OrganizersThread = ({ eventId, proposalId, user }) => {
)
}

OrganizersThread.propTypes = {
ReviewersThread.propTypes = {
eventId: PropTypes.string.isRequired,
proposalId: PropTypes.string.isRequired,
user: PropTypes.object,
}

OrganizersThread.defaultProps = {
ReviewersThread.defaultProps = {
user: {},
}

export default OrganizersThread
export default ReviewersThread
@@ -0,0 +1,3 @@
.reviewersThread {
max-width: 600px;
}
Expand Up @@ -2,17 +2,17 @@ import { useState, useEffect } from 'react'

import { toDate } from 'helpers/firebase'
import {
queryOrganizersThread,
addOrganizersThreadMessage,
updateOrganizersThreadMessage,
deleteOrganizersThreadMessage,
queryReviewersThread,
addReviewersThreadMessage,
updateReviewersThreadMessage,
deleteReviewersThreadMessage,
} from 'firebase/proposals'

export default ({ eventId, proposalId, user }) => {
const [messages, setMessages] = useState([])

useEffect(() => {
const query = queryOrganizersThread(eventId, proposalId)
const query = queryReviewersThread(eventId, proposalId)
const unsubscribe = query.onSnapshot((snapshot) => {
const newMessages = snapshot.docs.map((doc) => {
const { message, modified, uid, date, displayName, photoURL } = doc.data()
Expand All @@ -34,14 +34,14 @@ export default ({ eventId, proposalId, user }) => {

const saveMessage = async (message, messageId) => {
if (messageId) {
await updateOrganizersThreadMessage(eventId, proposalId, messageId, message)
await updateReviewersThreadMessage(eventId, proposalId, messageId, message)
} else {
await addOrganizersThreadMessage(eventId, proposalId, message, user)
await addReviewersThreadMessage(eventId, proposalId, message, user)
}
}

const deleteMessage = (messageId) => {
deleteOrganizersThreadMessage(eventId, proposalId, messageId)
deleteReviewersThreadMessage(eventId, proposalId, messageId)
}

return { messages, saveMessage, deleteMessage }
Expand Down
Expand Up @@ -3,42 +3,42 @@ import { act } from 'react-test-renderer'
import { renderHook } from '@testing-library/react-hooks'

import {
queryOrganizersThread,
addOrganizersThreadMessage,
updateOrganizersThreadMessage,
deleteOrganizersThreadMessage,
queryReviewersThread,
addReviewersThreadMessage,
updateReviewersThreadMessage,
deleteReviewersThreadMessage,
} from 'firebase/proposals'
import { toDate } from 'helpers/firebase'

import useOrganizerThreads from './useOrganizerThreads'
import useReviewerThreads from './useReviewerThreads'

describe('useOrganizerThreads', () => {
describe('useReviewerThreads', () => {
beforeEach(() => {
queryOrganizersThread.mockReset()
addOrganizersThreadMessage.mockReset()
updateOrganizersThreadMessage.mockReset()
deleteOrganizersThreadMessage.mockReset()
queryReviewersThread.mockReset()
addReviewersThreadMessage.mockReset()
updateReviewersThreadMessage.mockReset()
deleteReviewersThreadMessage.mockReset()
toDate.mockReset()
})

it('should return default values of the hook', async () => {
queryOrganizersThread.mockReturnValue({
queryReviewersThread.mockReturnValue({
onSnapshot: (callback) => {
callback({ docs: [] })
return () => jest.fn()
},
})

const { result } = renderHook(() =>
useOrganizerThreads({ eventId: 'eventId', proposalId: 'proposalId', user: {} }),
useReviewerThreads({ eventId: 'eventId', proposalId: 'proposalId', user: {} }),
)

expect(result.current.messages).toEqual([])
})

it('should return messages', async () => {
toDate.mockReturnValue('date')
queryOrganizersThread.mockReturnValue({
queryReviewersThread.mockReturnValue({
onSnapshot: (callback) => {
callback({
docs: [
Expand All @@ -58,7 +58,7 @@ describe('useOrganizerThreads', () => {
})

const { result } = renderHook(() =>
useOrganizerThreads({ eventId: 'eventId', proposalId: 'proposalId', user: { uid: 'alice' } }),
useReviewerThreads({ eventId: 'eventId', proposalId: 'proposalId', user: { uid: 'alice' } }),
)

expect(result.current.messages).toEqual([
Expand All @@ -75,41 +75,41 @@ describe('useOrganizerThreads', () => {
})

it('should add a message', async () => {
queryOrganizersThread.mockReturnValue({
queryReviewersThread.mockReturnValue({
onSnapshot: (callback) => {
callback({ docs: [] })
return () => jest.fn()
},
})

const { result } = renderHook(() =>
useOrganizerThreads({ eventId: 'eventId', proposalId: 'proposalId', user: {} }),
useReviewerThreads({ eventId: 'eventId', proposalId: 'proposalId', user: {} }),
)

await act(async () => {
await result.current.saveMessage('hello')
})

expect(addOrganizersThreadMessage.mock.calls[0]).toEqual(['eventId', 'proposalId', 'hello', {}])
expect(addReviewersThreadMessage.mock.calls[0]).toEqual(['eventId', 'proposalId', 'hello', {}])
})

it('should update a message', async () => {
queryOrganizersThread.mockReturnValue({
queryReviewersThread.mockReturnValue({
onSnapshot: (callback) => {
callback({ docs: [] })
return () => jest.fn()
},
})

const { result } = renderHook(() =>
useOrganizerThreads({ eventId: 'eventId', proposalId: 'proposalId', user: {} }),
useReviewerThreads({ eventId: 'eventId', proposalId: 'proposalId', user: {} }),
)

await act(async () => {
await result.current.saveMessage('hello', 'message1')
})

expect(updateOrganizersThreadMessage.mock.calls[0]).toEqual([
expect(updateReviewersThreadMessage.mock.calls[0]).toEqual([
'eventId',
'proposalId',
'message1',
Expand All @@ -118,22 +118,22 @@ describe('useOrganizerThreads', () => {
})

it('should delete a message', async () => {
queryOrganizersThread.mockReturnValue({
queryReviewersThread.mockReturnValue({
onSnapshot: (callback) => {
callback({ docs: [] })
return () => jest.fn()
},
})

const { result } = renderHook(() =>
useOrganizerThreads({ eventId: 'eventId', proposalId: 'proposalId', user: {} }),
useReviewerThreads({ eventId: 'eventId', proposalId: 'proposalId', user: {} }),
)

await act(async () => {
await result.current.deleteMessage('message1')
})

expect(deleteOrganizersThreadMessage.mock.calls[0]).toEqual([
expect(deleteReviewersThreadMessage.mock.calls[0]).toEqual([
'eventId',
'proposalId',
'message1',
Expand All @@ -143,10 +143,10 @@ describe('useOrganizerThreads', () => {

jest.mock('firebase/proposals', () => ({
__esModule: true,
queryOrganizersThread: jest.fn(),
addOrganizersThreadMessage: jest.fn(),
updateOrganizersThreadMessage: jest.fn(),
deleteOrganizersThreadMessage: jest.fn(),
queryReviewersThread: jest.fn(),
addReviewersThreadMessage: jest.fn(),
updateReviewersThreadMessage: jest.fn(),
deleteReviewersThreadMessage: jest.fn(),
}))

jest.mock('helpers/firebase', () => ({
Expand Down

0 comments on commit 34fe2bf

Please sign in to comment.