Skip to content

Commit

Permalink
Don't modify tweet objects client-side - store tweet -> assignment ma…
Browse files Browse the repository at this point in the history
…pping elsewhere #14
  • Loading branch information
keithamoss committed Dec 13, 2018
1 parent 0b5938f commit b536c1c
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 35 deletions.
3 changes: 0 additions & 3 deletions django/scremsong/app/reviewers.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,5 @@ def get_all_pending_assignments(user=None):

for assignment in assignments:
assignmentsById[assignment["id"]] = assignment

tweets[assignment["social_id"]]["reviewer_id"] = assignment["user_id"]
tweets[assignment["social_id"]]["review_status"] = assignment["status"]

return {"assignments": assignmentsById, "tweets": tweets}
5 changes: 0 additions & 5 deletions django/scremsong/app/twitter.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,6 @@ def fetch_some_tweets(startIndex, stopIndex, sinceId=None, maxId=None, columnIds
"tweet_ids": column_tweet_ids,
})

social_assignments = get_social_assignments(SocialPlatformChoice.TWITTER, column_tweet_ids)
for assignment in social_assignments:
tweets[assignment["social_id"]]["reviewer_id"] = assignment["user_id"]
tweets[assignment["social_id"]]["review_status"] = assignment["status"]

return {
"columns": columns,
"tweets": tweets,
Expand Down
12 changes: 6 additions & 6 deletions frontend/src/redux/modules/reviewers.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,12 @@ export default function reducer(state: IModule = initialState, action: IAction)
return dotProp.set(state, "assignments", action.assignments)
case SET_CURRENT_REVIEWER:
return dotProp.set(state, "currentReviewerId", action.reviewerId)
case ASSIGN_REVIEWER:
state = dotProp.set(state, `tweets.${action.tweetId}.reviewer_id`, action.reviewerId)
return dotProp.set(state, `tweets.${action.tweetId}.review_status`, "SocialAssignmentStatus.PENDING")
case UNASSIGN_REVIEWER:
state = dotProp.delete(state, `tweets.${action.tweetId}.reviewer_id`)
return dotProp.delete(state, `tweets.${action.tweetId}.review_status`)
// case ASSIGN_REVIEWER:
// state = dotProp.set(state, `tweets.${action.tweetId}.reviewer_id`, action.reviewerId)
// return dotProp.set(state, `tweets.${action.tweetId}.review_status`, "SocialAssignmentStatus.PENDING")
// case UNASSIGN_REVIEWER:
// state = dotProp.delete(state, `tweets.${action.tweetId}.reviewer_id`)
// return dotProp.delete(state, `tweets.${action.tweetId}.review_status`)
case MARK_ASSIGNMENT_DONE:
// return dotProp.set(state, `assignments.${assignmentIndex}.status`, "SocialAssignmentStatus.DONE")
return dotProp.delete(state, `assignments.${action.assignmentId}`)
Expand Down
22 changes: 13 additions & 9 deletions frontend/src/redux/modules/social.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
import * as dotProp from "dot-prop-immutable"
// import { IAnalyticsMeta } from "../../shared/analytics/GoogleAnalytics"
import { values as objectValues } from "lodash-es/"
import { Action } from "redux"
import { IActionReviewersListAssignments, IActionsTweetsFetch } from "src/websockets/actions"
import { WS_REVIEWERS_LIST_ASSIGNMENTS, WS_TWEETS_FETCH_SOME } from "src/websockets/constants"
import { IThunkExtras } from "../../redux/modules/interfaces"
import { eSocialAssignmentStatus } from "./reviewers"
// import { IAnalyticsMeta } from "../../shared/analytics/GoogleAnalytics"
import { IReviewerAssignment } from "./reviewers"

// Actions
const LOAD_TWEETS = "scremsong/tweets/LOAD_TWEETS"
const DISMISS = "scremsong/tweets/DISMISS"

const initialState: IModule = {
tweets: [],
tweets: {},
tweet_assignments: {},
}

// Reducer
Expand All @@ -20,10 +22,14 @@ export default function reducer(state: IModule = initialState, action: IAction)
switch (action.type) {
case LOAD_TWEETS:
case WS_TWEETS_FETCH_SOME:
// case WS_TWEETS_FETCH_SOME_NEW_TWEETS:
case WS_REVIEWERS_LIST_ASSIGNMENTS:
// case WS_TWEETS_FETCH_SOME_NEW_TWEETS:
// console.log("social.WS_TWEETS_FETCH_SOME_NEW_TWEETS or social.WS_TWEETS_FETCH_SOME or social.LOAD_TWEETS", action)
return dotProp.set(state, "tweets", { ...state.tweets, ...action.tweets })
case WS_REVIEWERS_LIST_ASSIGNMENTS:
objectValues(action.assignments).forEach((assignment: IReviewerAssignment, index: number) => {
state = dotProp.set(state, `tweet_assignments.${assignment.social_id}`, assignment.id)
})
return dotProp.set(state, "tweets", { ...state.tweets, ...action.tweets })
case DISMISS:
return dotProp.set(state, `tweets.${action.tweetId}.is_dismissed`, true)
default:
Expand All @@ -45,7 +51,7 @@ export const dismissTweet = (tweetId: string): IActionDismissTweet => ({
// Models
export interface IModule {
tweets: ISocialTweetList
tweet_assignments: ISocialTweetAssignment
tweet_assignments: ISocialTweetAssignments
}

export interface IActionLoadTweets extends Action<typeof LOAD_TWEETS> {
Expand All @@ -60,16 +66,14 @@ export interface ISocialTweetList {
[key: string]: ISocialTweet
}

export interface ISocialTweetAssignment {
export interface ISocialTweetAssignments {
[key: string]: number
}

export interface ISocialTweet {
id: number
data: ISocialTweetData
is_dismissed: boolean
review_status?: eSocialAssignmentStatus
reviewer_id?: number
}

export interface ISocialTweetData {}
Expand Down
25 changes: 16 additions & 9 deletions frontend/src/triage/TweetColumn/TweetColumn.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import * as React from "react"
import Tweet from "react-tweet"
import { AutoSizer, CellMeasurer, CellMeasurerCache, InfiniteLoader, List } from "react-virtualized"
import "react-virtualized/styles.css"
import { IReviewerUser } from "src/redux/modules/reviewers"
import { ISocialTweetList } from "src/redux/modules/social"
import { eSocialAssignmentStatus, IReviewerAssignment, IReviewerUser } from "src/redux/modules/reviewers"
import { ISocialTweetAssignments, ISocialTweetList } from "src/redux/modules/social"
import { ITriageColumn } from "src/redux/modules/triage"
import styled from "styled-components"

Expand All @@ -23,7 +23,9 @@ export interface IProps {
column: ITriageColumn
tweet_ids: string[]
tweets: ISocialTweetList
tweet_assignments: ISocialTweetAssignments
reviewers: IReviewerUser[]
assignments: IReviewerAssignment[]
loadMoreRows: any
assignTweet: any
dismissTweet: any
Expand Down Expand Up @@ -123,7 +125,7 @@ export class TweetColumn extends React.Component<IProps, {}> {
}

private _rowRenderer = ({ index, isScrolling, isVisible, key, parent, style }: any) => {
const { column, tweet_ids, tweets, reviewers } = this.props
const { column, tweet_ids, tweets, tweet_assignments, reviewers, assignments } = this.props

if (index >= column.total_tweets) {
return (
Expand All @@ -144,8 +146,14 @@ export class TweetColumn extends React.Component<IProps, {}> {
if (tweets[tweetId].is_dismissed) {
tweetStyle = { ...tweetStyle, backgroundColor: "grey" }
}
if ("review_status" in tweets[tweetId] && tweets[tweetId].review_status === "SocialAssignmentStatus.DONE") {
tweetStyle = { ...tweetStyle, backgroundColor: "lightgreen" }

let assignment: IReviewerAssignment | null = null
if (tweetId in tweet_assignments) {
const assignmentId = tweet_assignments[tweetId]
assignment = assignments[assignmentId]
if (assignment.status === eSocialAssignmentStatus.DONE) {
tweetStyle = { ...tweetStyle, backgroundColor: "lightgreen" }
}
}

return (
Expand All @@ -156,18 +164,17 @@ export class TweetColumn extends React.Component<IProps, {}> {
<IconMenu
iconButtonElement={
<IconButton tooltip="Assign this tweet to a reviewer" tooltipPosition="bottom-right">
{!("reviewer_id" in tweets[tweetId]) && <ActionAssignment />}
{"reviewer_id" in tweets[tweetId] && <ActionAssignmentInd />}
{assignment !== null ? <ActionAssignmentInd /> : <ActionAssignment />}
</IconButton>
}
anchorOrigin={{ horizontal: "left", vertical: "top" }}
targetOrigin={{ horizontal: "left", vertical: "top" }}
onItemClick={this.props.assignTweet}
>
{"reviewer_id" in tweets[tweetId] && <MenuItem primaryText={<em>Unassign</em>} data-tweetid={tweetId} />}
{assignment !== null && <MenuItem primaryText={<em>Unassign</em>} data-tweetid={tweetId} />}
{reviewers.map((reviewer: IReviewerUser) => {
let primaryText: string | JSX.Element = reviewer.name
if ("reviewer_id" in tweets[tweetId] && tweets[tweetId].reviewer_id === reviewer.id) {
if (assignment !== null && assignment.user_id === reviewer.id) {
primaryText += " (Assigned)"
}
if (reviewer.is_accepting_assignments === false) {
Expand Down
12 changes: 9 additions & 3 deletions frontend/src/triage/TweetColumn/TweetColumnContainer.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import * as React from "react"
import { connect } from "react-redux"
import { IStore } from "src/redux/modules/interfaces"
import { assignAReviewer, IReviewerUser, unassignAReviewer } from "src/redux/modules/reviewers"
import { dismissATweet, fetchTweets, ISocialTweetList } from "src/redux/modules/social"
import { assignAReviewer, IReviewerAssignment, IReviewerUser, unassignAReviewer } from "src/redux/modules/reviewers"
import { dismissATweet, fetchTweets, ISocialTweetAssignments, ISocialTweetList } from "src/redux/modules/social"
import { ITriageColumn } from "src/redux/modules/triage"
import TweetColumn from "./TweetColumn"

Expand All @@ -13,7 +13,9 @@ export interface IProps {
export interface IStoreProps {
tweet_ids: string[]
tweets: ISocialTweetList
tweet_assignments: ISocialTweetAssignments
reviewers: IReviewerUser[]
assignments: IReviewerAssignment[]
}

export interface IDispatchProps {
Expand All @@ -32,14 +34,16 @@ export class TweetColumnContainer extends React.Component<TComponentProps, {}> {
this.loadMoreRows = props.loadMoreRows.bind(this, props.column)
}
public render() {
const { column, tweet_ids, tweets, reviewers, assignTweet, dismissTweet } = this.props
const { column, tweet_ids, tweets, tweet_assignments, reviewers, assignments, assignTweet, dismissTweet } = this.props

return (
<TweetColumn
column={column}
tweet_ids={tweet_ids}
tweets={tweets}
tweet_assignments={tweet_assignments}
reviewers={reviewers}
assignments={assignments}
loadMoreRows={this.loadMoreRows}
assignTweet={assignTweet}
dismissTweet={dismissTweet}
Expand All @@ -54,7 +58,9 @@ const mapStateToProps = (state: IStore, ownProps: TComponentProps): IStoreProps
return {
tweet_ids: triage.column_tweets[ownProps.column.id],
tweets: social.tweets,
tweet_assignments: social.tweet_assignments,
reviewers: reviewers.users,
assignments: reviewers.assignments,
}
}

Expand Down

0 comments on commit b536c1c

Please sign in to comment.