plane/web/store/inbox/inbox_issue_detail.store.ts
sriram veeraghanta 6595a387d0
feat: event tracking using posthog and created application provider to render multiple wrappers (#2757)
* fix: event tracker changes

* fix: App provider implementation using wrappers

* fix: updating packages

* fix: handling warning

* fix: wrapper fixes and minor optimization changes

* fix: chore app-provider clearnup

* fix: cleanup

* fix: removing jitsu tracking

* fix: minor updates

* fix: adding event to posthog event tracker (#2802)

* dev: posthog event tracker update intitiate

* fix: adding events for posthog integration

* fix: event payload

---------

Co-authored-by: Ramesh Kumar Chandra <31303617+rameshkumarchandra@users.noreply.github.com>
2023-11-20 13:29:54 +05:30

255 lines
6.6 KiB
TypeScript

import { observable, action, makeObservable, runInAction } from "mobx";
// types
import { RootStore } from "../root";
// services
import { InboxService } from "services/inbox.service";
// types
import { IInboxIssue, IIssue, TInboxStatus } from "types";
// constants
import { INBOX_ISSUE_SOURCE } from "constants/inbox";
export interface IInboxIssueDetailsStore {
// states
loader: boolean;
error: any | null;
// observables
issueDetails: {
[issueId: string]: IInboxIssue;
};
// actions
fetchIssueDetails: (
workspaceSlug: string,
projectId: string,
inboxId: string,
issueId: string
) => Promise<IInboxIssue>;
createIssue: (
workspaceSlug: string,
projectId: string,
inboxId: string,
data: Partial<IIssue>
) => Promise<IInboxIssue>;
updateIssue: (
workspaceSlug: string,
projectId: string,
inboxId: string,
issueId: string,
data: Partial<IInboxIssue>
) => Promise<void>;
updateIssueStatus: (
workspaceSlug: string,
projectId: string,
inboxId: string,
issueId: string,
data: TInboxStatus
) => Promise<void>;
deleteIssue: (workspaceSlug: string, projectId: string, inboxId: string, issueId: string) => Promise<void>;
}
export class InboxIssueDetailsStore implements IInboxIssueDetailsStore {
// states
loader: boolean = false;
error: any | null = null;
// observables
issueDetails: { [issueId: string]: IInboxIssue } = {};
// root store
rootStore;
// services
inboxService;
constructor(_rootStore: RootStore) {
makeObservable(this, {
// states
loader: observable.ref,
error: observable.ref,
// observables
issueDetails: observable.ref,
// actions
fetchIssueDetails: action,
createIssue: action,
updateIssueStatus: action,
deleteIssue: action,
});
this.rootStore = _rootStore;
this.inboxService = new InboxService();
}
fetchIssueDetails = async (workspaceSlug: string, projectId: string, inboxId: string, issueId: string) => {
try {
runInAction(() => {
this.loader = true;
});
const issueResponse = await this.inboxService.getInboxIssueById(workspaceSlug, projectId, inboxId, issueId);
runInAction(() => {
this.loader = false;
this.issueDetails = {
...this.issueDetails,
[issueId]: issueResponse,
};
});
return issueResponse;
} catch (error) {
runInAction(() => {
this.loader = false;
this.error = error;
});
throw error;
}
};
createIssue = async (workspaceSlug: string, projectId: string, inboxId: string, data: Partial<IIssue>) => {
const payload = {
issue: {
name: data.name,
description: data.description,
description_html: data.description_html,
priority: data.priority,
},
source: INBOX_ISSUE_SOURCE,
};
try {
const response = await this.inboxService.createInboxIssue(workspaceSlug, projectId, inboxId, payload);
runInAction(() => {
this.issueDetails = {
...this.issueDetails,
[response.id]: response,
};
this.rootStore.inboxIssues.inboxIssues = {
...this.rootStore.inboxIssues.inboxIssues,
[inboxId]: [response, ...this.rootStore.inboxIssues.inboxIssues[inboxId]],
};
});
return response;
} catch (error) {
runInAction(() => {
this.error = error;
});
throw error;
}
};
updateIssue = async (
workspaceSlug: string,
projectId: string,
inboxId: string,
issueId: string,
data: Partial<IInboxIssue>
) => {
const updatedIssue = { ...this.issueDetails[issueId], ...data };
try {
runInAction(() => {
this.issueDetails = {
...this.issueDetails,
[issueId]: updatedIssue,
};
this.rootStore.inboxIssues.inboxIssues = {
...this.rootStore.inboxIssues.inboxIssues,
[inboxId]: this.rootStore.inboxIssues.inboxIssues[inboxId].map((issue) => {
if (issue.issue_inbox[0].id === issueId) return updatedIssue;
return issue;
}),
};
});
await this.inboxService.patchInboxIssue(workspaceSlug, projectId, inboxId, issueId, { issue: data });
} catch (error) {
runInAction(() => {
this.error = error;
});
this.rootStore.inboxIssues.fetchInboxIssues(workspaceSlug, projectId, inboxId);
this.fetchIssueDetails(workspaceSlug, projectId, inboxId, issueId);
throw error;
}
};
updateIssueStatus = async (
workspaceSlug: string,
projectId: string,
inboxId: string,
issueId: string,
data: TInboxStatus
) => {
const updatedIssue = { ...this.issueDetails[issueId] };
updatedIssue.issue_inbox[0] = {
...updatedIssue.issue_inbox[0],
...data,
};
try {
runInAction(() => {
this.issueDetails = {
...this.issueDetails,
[issueId]: updatedIssue,
};
this.rootStore.inboxIssues.inboxIssues = {
...this.rootStore.inboxIssues.inboxIssues,
[inboxId]: this.rootStore.inboxIssues.inboxIssues[inboxId].map((issue) => {
if (issue.issue_inbox[0].id === issueId) return updatedIssue as IInboxIssue;
return issue;
}),
};
});
await this.inboxService.markInboxStatus(workspaceSlug, projectId, inboxId, issueId, data);
} catch (error) {
runInAction(() => {
this.error = error;
});
this.rootStore.inboxIssues.fetchInboxIssues(workspaceSlug, projectId, inboxId);
this.fetchIssueDetails(workspaceSlug, projectId, inboxId, issueId);
throw error;
}
};
deleteIssue = async (workspaceSlug: string, projectId: string, inboxId: string, issueId: string) => {
const updatedIssues = { ...this.issueDetails };
delete updatedIssues[issueId];
try {
runInAction(() => {
this.issueDetails = updatedIssues;
this.rootStore.inboxIssues.inboxIssues = {
...this.rootStore.inboxIssues.inboxIssues,
[inboxId]: this.rootStore.inboxIssues.inboxIssues[inboxId]?.filter(
(issue) => issue.issue_inbox[0].id !== issueId
),
};
});
await this.inboxService.deleteInboxIssue(workspaceSlug, projectId, inboxId, issueId);
} catch (error) {
runInAction(() => {
this.error = error;
});
this.rootStore.inboxIssues.fetchInboxIssues(workspaceSlug, projectId, inboxId);
this.fetchIssueDetails(workspaceSlug, projectId, inboxId, issueId);
throw error;
}
};
}