diff --git a/apps/space/components/issues/board-views/list/block.tsx b/apps/space/components/issues/board-views/list/block.tsx index a4b1ad2b8..7e6175ebb 100644 --- a/apps/space/components/issues/board-views/list/block.tsx +++ b/apps/space/components/issues/board-views/list/block.tsx @@ -14,6 +14,7 @@ import { useMobxStore } from "lib/mobx/store-provider"; import { IIssue } from "types/issue"; // store import { RootStore } from "store/root"; +import { IssueVotes } from "components/issues/peek-overview"; export const IssueListBlock: FC<{ issue: IIssue }> = observer((props) => { const { issue } = props; @@ -56,19 +57,6 @@ export const IssueListBlock: FC<{ issue: IIssue }> = observer((props) => {
- {projectStore.deploySettings?.votes && ( - <> - {/* upvotes */} -
- -
- {/* downotes */} -
- -
- - )} - {/* priority */} {issue?.priority && (
diff --git a/apps/space/components/issues/peek-overview/comment-detail-card.tsx b/apps/space/components/issues/peek-overview/comment-detail-card.tsx index 7dee29aae..a43942f4c 100644 --- a/apps/space/components/issues/peek-overview/comment-detail-card.tsx +++ b/apps/space/components/issues/peek-overview/comment-detail-card.tsx @@ -61,8 +61,8 @@ export const CommentCard: React.FC = observer((props) => { ) : (
{comment.actor_detail.is_bot - ? comment.actor_detail.first_name.charAt(0) - : comment.actor_detail.display_name.charAt(0)} + ? comment?.actor_detail?.first_name?.charAt(0) + : comment?.actor_detail?.display_name?.charAt(0)}
)} diff --git a/apps/space/store/issue_details.ts b/apps/space/store/issue_details.ts index b8722d51e..10679cf17 100644 --- a/apps/space/store/issue_details.ts +++ b/apps/space/store/issue_details.ts @@ -89,7 +89,7 @@ class IssueDetailStore implements IssueDetailStore { this.details = { ...this.details, [issueId]: { - ...issueDetails, + ...(this.details[issueId] ?? issueDetails), comments: commentsResponse, }, }; diff --git a/apps/space/store/issue_legacy.ts b/apps/space/store/issue_legacy.ts deleted file mode 100644 index a2cc2e306..000000000 --- a/apps/space/store/issue_legacy.ts +++ /dev/null @@ -1,566 +0,0 @@ -// mobx -import { observable, action, computed, makeObservable, runInAction, reaction } from "mobx"; -// service -import IssueService from "services/issue.service"; -// types -import { IssueDetailType, TIssueBoardKeys, IIssueLabel, IIssueState, IIssue } from "types/issue"; - -export interface IIssueStore { - currentIssueBoardView: TIssueBoardKeys | null; - loader: boolean; - error: any | null; - states: IIssueState[] | null; - labels: IIssueLabel[] | null; - issues: IIssue[] | null; - issue_detail: IssueDetailType; - userSelectedStates: string[]; - userSelectedLabels: string[]; - userSelectedPriorities: string[]; - activePeekOverviewIssueId: string | null; - getCountOfIssuesByState: (state: string) => number; - getFilteredIssuesByState: (state: string) => IIssue[]; - getUserSelectedFilter: (key: "state" | "priority" | "label", value: string) => boolean; - checkIfFilterExistsForKey: (key: "state" | "priority" | "label") => boolean; - clearUserSelectedFilter: (key: "state" | "priority" | "label" | "all") => void; - getIfFiltersIsEmpty: () => boolean; - getURLDefinition: ( - workspaceSlug: string, - projectId: string, - action?: { - key: "state" | "priority" | "label" | "all"; - value?: string; - removeAll?: boolean; - } - ) => string; - setActivePeekOverviewIssueId: (value: any) => void; - setCurrentIssueBoardView: (view: TIssueBoardKeys) => void; - fetchPublicIssues: (workspaceSlug: string, projectId: string, params: any) => Promise; - getIssueByIdAsync: (workspaceSlug: string, projectId: string, issueId: string) => Promise; -} - -class IssueLegacyStore { - currentIssueBoardView: TIssueBoardKeys | null = null; - - loader: boolean = false; - error: any | null = null; - - states: IIssueState[] | null = null; - labels: IIssueLabel[] | null = null; - issues: IIssue[] | null = null; - - issue_detail: IssueDetailType = {}; - - activePeekOverviewIssueId: string | null = null; - - userSelectedStates: string[] = []; - userSelectedLabels: string[] = []; - userSelectedPriorities: string[] = []; - // root store - rootStore; - // service - issueService; - - constructor(_rootStore: any) { - makeObservable(this, { - // observable - currentIssueBoardView: observable, - - loader: observable, - error: observable, - - states: observable.ref, - labels: observable.ref, - issues: observable.ref, - issue_detail: observable.ref, - - activePeekOverviewIssueId: observable.ref, - - userSelectedStates: observable.ref, - userSelectedLabels: observable.ref, - userSelectedPriorities: observable.ref, - // action - setCurrentIssueBoardView: action, - fetchPublicIssues: action, - // computed - }); - - this.rootStore = _rootStore; - this.issueService = new IssueService(); - } - - // computed - getCountOfIssuesByState(state_id: string): number { - return this.issues?.filter((issue) => issue.state == state_id).length || 0; - } - - getFilteredIssuesByState(state_id: string): IIssue[] | [] { - return this.issues?.filter((issue) => issue.state == state_id) || []; - } - - setActivePeekOverviewIssueId = (issueId: string | null) => (this.activePeekOverviewIssueId = issueId); - - /** - * - * @param key Is the key of the filter, i.e. state, label, priority - * @param value Is the value of the filter, i.e. state_id, label_id, priority - * @returns boolean - */ - - getUserSelectedFilter(key: "state" | "priority" | "label", value: string): boolean { - if (key == "state") { - return this.userSelectedStates.includes(value); - } else if (key == "label") { - return this.userSelectedLabels.includes(value); - } else if (key == "priority") { - return this.userSelectedPriorities.includes(value); - } else { - return false; - } - } - - checkIfFilterExistsForKey: (key: "state" | "priority" | "label") => boolean = (key) => { - if (key == "state") { - return this.userSelectedStates.length > 0; - } else if (key == "label") { - return this.userSelectedLabels.length > 0; - } else if (key == "priority") { - return this.userSelectedPriorities.length > 0; - } else { - return false; - } - }; - - clearUserSelectedFilter(key: "state" | "priority" | "label" | "all") { - if (key == "state") { - this.userSelectedStates = []; - } else if (key == "label") { - this.userSelectedLabels = []; - } else if (key == "priority") { - this.userSelectedPriorities = []; - } else if (key == "all") { - this.userSelectedStates = []; - this.userSelectedLabels = []; - this.userSelectedPriorities = []; - } - } - - getIfFiltersIsEmpty: () => boolean = () => - this.userSelectedStates.length === 0 && - this.userSelectedLabels.length === 0 && - this.userSelectedPriorities.length === 0; - - getURLDefinition = ( - workspaceSlug: string, - projectId: string, - action?: { - key: "state" | "priority" | "label" | "all"; - value?: string; - removeAll?: boolean; - } - ) => { - let url = `/${workspaceSlug}/${projectId}?board=${this.currentIssueBoardView}`; - - if (action) { - if (action.key === "state") - this.userSelectedStates = action.removeAll - ? [] - : [...this.userSelectedStates].filter((state) => state !== action.value); - if (action.key === "label") - this.userSelectedLabels = action.removeAll - ? [] - : [...this.userSelectedLabels].filter((label) => label !== action.value); - if (action.key === "priority") - this.userSelectedPriorities = action.removeAll - ? [] - : [...this.userSelectedPriorities].filter((priority) => priority !== action.value); - if (action.key === "all") { - this.userSelectedStates = []; - this.userSelectedLabels = []; - this.userSelectedPriorities = []; - } - } - - if (this.checkIfFilterExistsForKey("state")) { - url += `&states=${this.userSelectedStates.join(",")}`; - } - if (this.checkIfFilterExistsForKey("label")) { - url += `&labels=${this.userSelectedLabels.join(",")}`; - } - if (this.checkIfFilterExistsForKey("priority")) { - url += `&priorities=${this.userSelectedPriorities.join(",")}`; - } - - return url; - }; - - // action - setCurrentIssueBoardView = async (view: TIssueBoardKeys) => { - this.currentIssueBoardView = view; - }; - - fetchPublicIssues = async (workspaceSlug: string, projectId: string, params: any) => { - try { - this.loader = true; - this.error = null; - - const response = await this.issueService.getPublicIssues(workspaceSlug, projectId, params); - - if (response) { - const _states: IIssueState[] = [...response?.states]; - const _labels: IIssueLabel[] = [...response?.labels]; - const _issues: IIssue[] = [...response?.issues]; - runInAction(() => { - this.states = _states; - this.labels = _labels; - this.issues = _issues; - this.loader = false; - }); - return response; - } - } catch (error) { - this.loader = false; - this.error = error; - return error; - } - }; - - getIssueByIdAsync = async (workspaceSlug: string, projectId: string, issueId: string): Promise => { - try { - const response = this.issues?.find((issue) => issue.id === issueId); - - if (response) { - const _issue_detail = { - ...this.issue_detail, - [issueId]: { - issue: response, - comments: [], - reactions: [], - votes: [], - }, - }; - runInAction(() => { - this.issue_detail = _issue_detail; - }); - - this.getIssueReactionsAsync(workspaceSlug, projectId, issueId); - this.getIssueVotesAsync(workspaceSlug, projectId, issueId); - this.getIssueCommentsAsync(workspaceSlug, projectId, issueId); - } - - return this.issue_detail[issueId] as any; - } catch (error) { - this.loader = false; - this.error = error; - throw error; - } - }; - - getIssueVotesAsync = async (workspaceSlug: string, projectId: string, issueId: string) => { - try { - const response = await this.issueService.getIssueVotes(workspaceSlug, projectId, issueId); - - if (response) { - const _issue_detail = { - ...this.issue_detail, - [issueId]: { - ...this.issue_detail[issueId], - votes: response, - }, - }; - runInAction(() => { - this.issue_detail = _issue_detail; - }); - } - - return response; - } catch (error) { - this.loader = false; - this.error = error; - throw error; - } - }; - - createIssueVoteAsync = async ( - workspaceSlug: string, - projectId: string, - issueId: string, - data: { - vote: 1 | -1; - } - ) => { - try { - const response = await this.issueService.createIssueVote(workspaceSlug, projectId, issueId, data); - - if (response) { - const _issue_detail = { - ...this.issue_detail, - [issueId]: { - ...this.issue_detail[issueId], - votes: [ - ...{ ...this.issue_detail }[issueId].votes.filter( - (vote) => vote.actor !== this.rootStore?.user?.currentUser?.id - ), - response, - ], - }, - }; - runInAction(() => { - this.issue_detail = _issue_detail; - }); - } - - return response; - } catch (error) { - this.loader = false; - this.error = error; - throw error; - } - }; - - deleteIssueVoteAsync = async (workspaceSlug: string, projectId: string, issueId: string) => { - try { - const _votes = (this.issue_detail[issueId].votes = this.issue_detail[issueId].votes.filter( - (vote) => vote.actor !== this.rootStore?.user?.user?.id - )); - - runInAction(() => { - this.issue_detail[issueId].votes = _votes; - }); - - const response = await this.issueService.deleteIssueVote(workspaceSlug, projectId, issueId); - - const votesAfterCall = await this.issueService.getIssueVotes(workspaceSlug, projectId, issueId); - - if (votesAfterCall) - runInAction(() => { - this.issue_detail[issueId].votes = votesAfterCall; - }); - - return response; - } catch (error) { - this.loader = false; - this.error = error; - throw error; - } - }; - - getIssueReactionsAsync = async (workspaceSlug: string, projectId: string, issueId: string) => { - try { - const response = await this.issueService.getIssueReactions(workspaceSlug, projectId, issueId); - - if (response) { - const _issue_detail = { - ...this.issue_detail, - [issueId]: { - ...this.issue_detail[issueId], - reactions: response, - }, - }; - runInAction(() => { - this.issue_detail = _issue_detail; - }); - } - - return response; - } catch (error) { - this.loader = false; - this.error = error; - throw error; - } - }; - - createIssueReactionAsync = async (workspaceSlug: string, projectId: string, issueId: string, data: any) => { - try { - const response = await this.issueService.createIssueReaction(workspaceSlug, projectId, issueId, data); - - if (response) { - const _issue_detail = { - ...this.issue_detail, - [issueId]: { - ...this.issue_detail[issueId], - reactions: [...this.issue_detail[issueId].reactions, response], - }, - }; - runInAction(() => { - this.issue_detail = _issue_detail; - }); - } - - return response; - } catch (error) { - this.loader = false; - this.error = error; - throw error; - } - }; - - deleteIssueReactionAsync = async (workspaceSlug: string, projectId: string, issueId: string, reactionHex: string) => { - try { - const newReactionsList = this.issue_detail[issueId].reactions.filter( - (reaction) => reaction.reaction !== reactionHex - ); - - const _issue_detail = { - ...this.issue_detail, - [issueId]: { - ...this.issue_detail[issueId], - reactions: newReactionsList, - }, - }; - - runInAction(() => { - this.issue_detail = _issue_detail; - }); - - const response = await this.issueService.deleteIssueReaction(workspaceSlug, projectId, issueId, reactionHex); - - const reactionsAfterCall = await this.issueService.getIssueReactions(workspaceSlug, projectId, issueId); - - if (reactionsAfterCall) { - const _issue_detail = { - ...this.issue_detail, - [issueId]: { - ...this.issue_detail[issueId], - reactions: reactionsAfterCall, - }, - }; - runInAction(() => { - this.issue_detail = _issue_detail; - }); - } - - return response; - } catch (error) { - this.loader = false; - this.error = error; - throw error; - } - }; - - getIssueCommentsAsync = async (workspaceSlug: string, projectId: string, issueId: string) => { - try { - const response = await this.issueService.getIssueComments(workspaceSlug, projectId, issueId); - - if (response) { - const _issue_detail = { - ...this.issue_detail, - [issueId]: { - ...this.issue_detail[issueId], - comments: response, - }, - }; - runInAction(() => { - this.issue_detail = _issue_detail; - }); - } - - return response; - } catch (error) { - this.loader = false; - this.error = error; - throw error; - } - }; - - createIssueCommentAsync = async (workspaceSlug: string, projectId: string, issueId: string, data: any) => { - try { - const response = await this.issueService.createIssueComment(workspaceSlug, projectId, issueId, data); - - if (response) { - const _issue_detail = { - ...this.issue_detail, - [issueId]: { - ...this.issue_detail[issueId], - comments: [...this.issue_detail[issueId].comments, response], - }, - }; - runInAction(() => { - this.issue_detail = _issue_detail; - }); - } - - return response; - } catch (error) { - this.loader = false; - this.error = error; - throw error; - } - }; - - updateIssueCommentAsync = async ( - workspaceSlug: string, - projectId: string, - issueId: string, - commentId: string, - data: any - ) => { - try { - const response = await this.issueService.updateIssueComment(workspaceSlug, projectId, issueId, commentId, data); - - if (response) { - const _issue_detail = { - ...this.issue_detail, - [issueId]: { - ...this.issue_detail[issueId], - comments: [ - ...this.issue_detail[issueId].comments.filter((comment) => comment.id !== response.id), - response, - ], - }, - }; - runInAction(() => { - this.issue_detail = _issue_detail; - }); - } - - return response; - } catch (error) { - this.loader = false; - this.error = error; - throw error; - } - }; - - deleteIssueCommentAsync = async (workspaceSlug: string, projectId: string, issueId: string, commentId: string) => { - try { - const newCommentsList = this.issue_detail[issueId].comments.filter((comment) => comment.id !== commentId); - - const _issue_detail = { - ...this.issue_detail, - [issueId]: { - ...this.issue_detail[issueId], - comments: newCommentsList, - }, - }; - - runInAction(() => { - this.issue_detail = _issue_detail; - }); - - const response = await this.issueService.deleteIssueComment(workspaceSlug, projectId, issueId, commentId); - - const commentsAfterCall = await this.issueService.getIssueComments(workspaceSlug, projectId, issueId); - - if (commentsAfterCall) { - const _issue_detail = { - ...this.issue_detail, - [issueId]: { - ...this.issue_detail[issueId], - comments: commentsAfterCall, - }, - }; - runInAction(() => { - this.issue_detail = _issue_detail; - }); - } - - return response; - } catch (error) { - this.loader = false; - this.error = error; - throw error; - } - }; -} - -export default IssueLegacyStore;