fix: bug and auth fixes (#1224)

* fix: sign in and invitation page fixes

* fix: project and workspace services track event fix

* fix: user onboarding complete track event fix

* fix: issue track event fix

* fix: partial property , issue comment and mark as done issue track event fix

* fix: bulk delete , move to cycle or module and issue label track event fix

* fix: state , cycle and module track event fix

* fix: pages and block track event fix

* fix: integration , estimate , importer , analytics and gpt track event fix

* fix: view track event fix

* fix: build fix

* fix: build fix
This commit is contained in:
Anmol Singh Bhatia 2023-06-06 21:36:00 +05:30 committed by GitHub
parent c127353281
commit 6f2a38ad66
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
117 changed files with 1319 additions and 494 deletions

View file

@ -27,7 +27,7 @@ import { Loader } from "components/ui";
import { renderShortNumericDateFormat, timeAgo } from "helpers/date-time.helper";
import { addSpaceIfCamelCase } from "helpers/string.helper";
// types
import { IIssueComment, IIssueLabels } from "types";
import { ICurrentUserResponse, IIssueComment, IIssueLabels } from "types";
import { PROJECT_ISSUES_ACTIVITY, PROJECT_ISSUE_LABELS } from "constants/fetch-keys";
import useEstimateOption from "hooks/use-estimate-option";
@ -110,7 +110,11 @@ const activityDetails: {
},
};
export const IssueActivitySection: React.FC = () => {
type Props = {
user: ICurrentUserResponse | undefined;
};
export const IssueActivitySection: React.FC<Props> = ({ user }) => {
const router = useRouter();
const { workspaceSlug, projectId, issueId } = router.query;
@ -143,7 +147,8 @@ export const IssueActivitySection: React.FC = () => {
projectId as string,
issueId as string,
comment.id,
comment
comment,
user
)
.then((res) => {
mutateIssueActivities();
@ -160,7 +165,8 @@ export const IssueActivitySection: React.FC = () => {
workspaceSlug as string,
projectId as string,
issueId as string,
commentId
commentId,
user
)
.then(() => mutateIssueActivities());
};

View file

@ -14,7 +14,7 @@ import useToast from "hooks/use-toast";
// ui
import { Loader, SecondaryButton } from "components/ui";
// types
import type { IIssueComment } from "types";
import type { ICurrentUserResponse, IIssueComment } from "types";
// fetch-keys
import { PROJECT_ISSUES_ACTIVITY } from "constants/fetch-keys";
@ -40,7 +40,11 @@ const defaultValues: Partial<IIssueComment> = {
comment_html: "",
};
export const AddComment: React.FC = () => {
type Props = {
user: ICurrentUserResponse | undefined;
};
export const AddComment: React.FC<Props> = ({ user }) => {
const {
handleSubmit,
control,
@ -67,7 +71,13 @@ export const AddComment: React.FC = () => {
)
return;
await issuesServices
.createIssueComment(workspaceSlug as string, projectId as string, issueId as string, formData)
.createIssueComment(
workspaceSlug as string,
projectId as string,
issueId as string,
formData,
user
)
.then(() => {
mutate(PROJECT_ISSUES_ACTIVITY(issueId as string));
reset(defaultValues);

View file

@ -17,7 +17,7 @@ import { ExclamationTriangleIcon } from "@heroicons/react/24/outline";
// ui
import { SecondaryButton, DangerButton } from "components/ui";
// types
import type { IIssue } from "types";
import type { ICurrentUserResponse, IIssue } from "types";
// fetch-keys
import {
CYCLE_ISSUES_WITH_PARAMS,
@ -30,9 +30,10 @@ type Props = {
isOpen: boolean;
handleClose: () => void;
data: IIssue | null;
user: ICurrentUserResponse | undefined;
};
export const DeleteIssueModal: React.FC<Props> = ({ isOpen, handleClose, data }) => {
export const DeleteIssueModal: React.FC<Props> = ({ isOpen, handleClose, data, user }) => {
const [isDeleteLoading, setIsDeleteLoading] = useState(false);
const router = useRouter();
@ -57,7 +58,7 @@ export const DeleteIssueModal: React.FC<Props> = ({ isOpen, handleClose, data })
if (!workspaceSlug || !projectId || !data) return;
await issueServices
.deleteIssue(workspaceSlug as string, projectId as string, data.id)
.deleteIssue(workspaceSlug as string, projectId as string, data.id, user)
.then(() => {
if (issueView === "calendar") {
const calendarFetchKey = cycleId

View file

@ -39,7 +39,7 @@ import { SparklesIcon, XMarkIcon } from "@heroicons/react/24/outline";
// helpers
import { cosineSimilarity } from "helpers/string.helper";
// types
import type { IIssue } from "types";
import type { ICurrentUserResponse, IIssue } from "types";
// rich-text-editor
const RemirrorRichTextEditor = dynamic(() => import("components/rich-text-editor"), {
ssr: false,
@ -91,6 +91,7 @@ export interface IssueFormProps {
setCreateMore: React.Dispatch<React.SetStateAction<boolean>>;
handleClose: () => void;
status: boolean;
user: ICurrentUserResponse | undefined;
}
export const IssueForm: FC<IssueFormProps> = ({
@ -103,6 +104,7 @@ export const IssueForm: FC<IssueFormProps> = ({
setCreateMore,
handleClose,
status,
user,
}) => {
// states
const [mostSimilarIssue, setMostSimilarIssue] = useState<IIssue | undefined>();
@ -177,10 +179,15 @@ export const IssueForm: FC<IssueFormProps> = ({
setIAmFeelingLucky(true);
aiService
.createGptTask(workspaceSlug as string, projectId as string, {
prompt: issueName,
task: "Generate a proper description for this issue in context of a project management software.",
})
.createGptTask(
workspaceSlug as string,
projectId as string,
{
prompt: issueName,
task: "Generate a proper description for this issue in context of a project management software.",
},
user
)
.then((res) => {
if (res.response === "")
setToastAlert({
@ -227,12 +234,18 @@ export const IssueForm: FC<IssueFormProps> = ({
isOpen={stateModal}
handleClose={() => setStateModal(false)}
projectId={projectId}
user={user}
/>
<CreateUpdateCycleModal
isOpen={cycleModal}
handleClose={() => setCycleModal(false)}
user={user}
/>
<CreateUpdateCycleModal isOpen={cycleModal} handleClose={() => setCycleModal(false)} />
<CreateLabelModal
isOpen={labelModal}
handleClose={() => setLabelModal(false)}
projectId={projectId}
user={user}
/>
</>
)}

View file

@ -102,9 +102,15 @@ export const CreateUpdateIssueModal: React.FC<IssuesModalProps> = ({
if (!workspaceSlug || !projectId) return;
await issuesService
.addIssueToCycle(workspaceSlug as string, activeProject ?? "", cycleId, {
issues: [issueId],
})
.addIssueToCycle(
workspaceSlug as string,
activeProject ?? "",
cycleId,
{
issues: [issueId],
},
user
)
.then(() => {
if (cycleId) {
mutate(CYCLE_ISSUES_WITH_PARAMS(cycleId, params));
@ -117,9 +123,15 @@ export const CreateUpdateIssueModal: React.FC<IssuesModalProps> = ({
if (!workspaceSlug || !projectId) return;
await modulesService
.addIssuesToModule(workspaceSlug as string, activeProject ?? "", moduleId as string, {
issues: [issueId],
})
.addIssuesToModule(
workspaceSlug as string,
activeProject ?? "",
moduleId as string,
{
issues: [issueId],
},
user
)
.then(() => {
if (moduleId) {
mutate(MODULE_ISSUES_WITH_PARAMS(moduleId as string, params));
@ -148,7 +160,7 @@ export const CreateUpdateIssueModal: React.FC<IssuesModalProps> = ({
if (!workspaceSlug) return;
await issuesService
.createIssues(workspaceSlug as string, activeProject ?? "", payload)
.createIssues(workspaceSlug as string, activeProject ?? "", payload, user)
.then(async (res) => {
mutate(PROJECT_ISSUES_LIST_WITH_PARAMS(activeProject ?? "", params));
if (payload.cycle && payload.cycle !== "") await addIssueToCycle(res.id, payload.cycle);
@ -180,7 +192,7 @@ export const CreateUpdateIssueModal: React.FC<IssuesModalProps> = ({
const updateIssue = async (payload: Partial<IIssue>) => {
await issuesService
.updateIssue(workspaceSlug as string, activeProject ?? "", data?.id ?? "", payload)
.updateIssue(workspaceSlug as string, activeProject ?? "", data?.id ?? "", payload, user)
.then((res) => {
if (isUpdatingSingleIssue) {
mutate<IIssue>(PROJECT_ISSUES_DETAILS, (prevData) => ({ ...prevData, ...res }), false);
@ -261,6 +273,7 @@ export const CreateUpdateIssueModal: React.FC<IssuesModalProps> = ({
projectId={activeProject ?? ""}
setActiveProject={setActiveProject}
status={data ? true : false}
user={user}
/>
</Dialog.Panel>
</Transition.Child>

View file

@ -7,6 +7,7 @@ import { mutate } from "swr";
// hooks
import useToast from "hooks/use-toast";
import useUserAuth from "hooks/use-user-auth";
// services
import issuesService from "services/issues.service";
// components
@ -37,6 +38,9 @@ type Props = {
export const MyIssuesListItem: React.FC<Props> = ({ issue, properties, projectId }) => {
const router = useRouter();
const { workspaceSlug } = router.query;
const { user } = useUserAuth();
const { setToastAlert } = useToast();
const partialUpdateIssue = useCallback(
@ -55,7 +59,7 @@ export const MyIssuesListItem: React.FC<Props> = ({ issue, properties, projectId
);
issuesService
.patchIssue(workspaceSlug as string, projectId as string, issueId, formData)
.patchIssue(workspaceSlug as string, projectId as string, issueId, formData, user)
.then((res) => {
mutate(USER_ISSUE(workspaceSlug as string));
})
@ -110,6 +114,7 @@ export const MyIssuesListItem: React.FC<Props> = ({ issue, properties, projectId
<ViewPrioritySelect
issue={issue}
partialUpdateIssue={partialUpdateIssue}
user={user}
isNotAllowed={isNotAllowed}
/>
)}
@ -117,6 +122,7 @@ export const MyIssuesListItem: React.FC<Props> = ({ issue, properties, projectId
<ViewStateSelect
issue={issue}
partialUpdateIssue={partialUpdateIssue}
user={user}
isNotAllowed={isNotAllowed}
/>
)}
@ -124,6 +130,7 @@ export const MyIssuesListItem: React.FC<Props> = ({ issue, properties, projectId
<ViewDueDateSelect
issue={issue}
partialUpdateIssue={partialUpdateIssue}
user={user}
isNotAllowed={isNotAllowed}
/>
)}

View file

@ -12,6 +12,7 @@ import { TwitterPicker } from "react-color";
import { Popover, Listbox, Transition } from "@headlessui/react";
// hooks
import useToast from "hooks/use-toast";
import useUserAuth from "hooks/use-user-auth";
// services
import issuesService from "services/issues.service";
import modulesService from "services/modules.service";
@ -76,6 +77,8 @@ export const IssueDetailsSidebar: React.FC<Props> = ({
const router = useRouter();
const { workspaceSlug, projectId, issueId } = router.query;
const { user } = useUserAuth();
const { memberRole } = useProjectMyMembership();
const { setToastAlert } = useToast();
@ -110,7 +113,7 @@ export const IssueDetailsSidebar: React.FC<Props> = ({
const handleNewLabel = (formData: any) => {
if (!workspaceSlug || !projectId || isSubmitting) return;
issuesService
.createIssueLabel(workspaceSlug as string, projectId as string, formData)
.createIssueLabel(workspaceSlug as string, projectId as string, formData, user)
.then((res) => {
reset(defaultValues);
issueLabelMutate((prevData) => [...(prevData ?? []), res], false);
@ -124,9 +127,15 @@ export const IssueDetailsSidebar: React.FC<Props> = ({
if (!workspaceSlug || !projectId || !issueDetail) return;
issuesService
.addIssueToCycle(workspaceSlug as string, projectId as string, cycleDetails.id, {
issues: [issueDetail.id],
})
.addIssueToCycle(
workspaceSlug as string,
projectId as string,
cycleDetails.id,
{
issues: [issueDetail.id],
},
user
)
.then((res) => {
mutate(ISSUE_DETAILS(issueId as string));
});
@ -139,9 +148,15 @@ export const IssueDetailsSidebar: React.FC<Props> = ({
if (!workspaceSlug || !projectId || !issueDetail) return;
modulesService
.addIssuesToModule(workspaceSlug as string, projectId as string, moduleDetail.id, {
issues: [issueDetail.id],
})
.addIssuesToModule(
workspaceSlug as string,
projectId as string,
moduleDetail.id,
{
issues: [issueDetail.id],
},
user
)
.then((res) => {
mutate(ISSUE_DETAILS(issueId as string));
});
@ -228,6 +243,7 @@ export const IssueDetailsSidebar: React.FC<Props> = ({
handleClose={() => setDeleteIssueModal(false)}
isOpen={deleteIssueModal}
data={issueDetail ?? null}
user={user}
/>
<div className="sticky top-5 w-full divide-y-2 divide-brand-base">
<div className="flex items-center justify-between pb-3">

View file

@ -21,15 +21,16 @@ import { ChevronRightIcon, PlusIcon, XMarkIcon } from "@heroicons/react/24/outli
// helpers
import { orderArrayBy } from "helpers/array.helper";
// types
import { IIssue, ISubIssueResponse } from "types";
import { ICurrentUserResponse, IIssue, ISubIssueResponse } from "types";
// fetch-keys
import { PROJECT_ISSUES_LIST, SUB_ISSUES } from "constants/fetch-keys";
type Props = {
parentIssue: IIssue;
user: ICurrentUserResponse | undefined;
};
export const SubIssuesList: FC<Props> = ({ parentIssue }) => {
export const SubIssuesList: FC<Props> = ({ parentIssue, user }) => {
// states
const [createIssueModal, setCreateIssueModal] = useState(false);
const [subIssuesListModal, setSubIssuesListModal] = useState(false);
@ -134,7 +135,7 @@ export const SubIssuesList: FC<Props> = ({ parentIssue }) => {
);
issuesService
.patchIssue(workspaceSlug.toString(), projectId.toString(), issueId, { parent: null })
.patchIssue(workspaceSlug.toString(), projectId.toString(), issueId, { parent: null }, user)
.then((res) => {
mutate(SUB_ISSUES(parentIssue.id ?? ""));

View file

@ -12,7 +12,7 @@ import { AssigneesList, Avatar, CustomSearchSelect, Tooltip } from "components/u
// icons
import { UserGroupIcon } from "@heroicons/react/24/outline";
// types
import { IIssue } from "types";
import { ICurrentUserResponse, IIssue } from "types";
// fetch-keys
import { PROJECT_MEMBERS } from "constants/fetch-keys";
@ -22,6 +22,7 @@ type Props = {
position?: "left" | "right";
selfPositioned?: boolean;
tooltipPosition?: "left" | "right";
user: ICurrentUserResponse | undefined;
isNotAllowed: boolean;
};
@ -31,6 +32,7 @@ export const ViewAssigneeSelect: React.FC<Props> = ({
position = "left",
selfPositioned = false,
tooltipPosition = "right",
user,
isNotAllowed,
}) => {
const router = useRouter();
@ -83,7 +85,8 @@ export const ViewAssigneeSelect: React.FC<Props> = ({
projectName: issue.project_detail.name,
issueId: issue.id,
},
"ISSUE_PROPERTY_UPDATE_ASSIGNEE"
"ISSUE_PROPERTY_UPDATE_ASSIGNEE",
user
);
}}
options={options}

View file

@ -7,15 +7,21 @@ import { findHowManyDaysLeft } from "helpers/date-time.helper";
// services
import trackEventServices from "services/track-event.service";
// types
import { IIssue } from "types";
import { ICurrentUserResponse, IIssue } from "types";
type Props = {
issue: IIssue;
partialUpdateIssue: (formData: Partial<IIssue>, issueId: string) => void;
user: ICurrentUserResponse | undefined;
isNotAllowed: boolean;
};
export const ViewDueDateSelect: React.FC<Props> = ({ issue, partialUpdateIssue, isNotAllowed }) => {
export const ViewDueDateSelect: React.FC<Props> = ({
issue,
partialUpdateIssue,
user,
isNotAllowed,
}) => {
const router = useRouter();
const { workspaceSlug } = router.query;
@ -51,7 +57,8 @@ export const ViewDueDateSelect: React.FC<Props> = ({ issue, partialUpdateIssue,
projectName: issue.project_detail.name,
issueId: issue.id,
},
"ISSUE_PROPERTY_UPDATE_DUE_DATE"
"ISSUE_PROPERTY_UPDATE_DUE_DATE",
user
);
}}
className={issue?.target_date ? "w-[6.5rem]" : "w-[5rem] text-center"}

View file

@ -11,13 +11,14 @@ import { CustomSelect, Tooltip } from "components/ui";
// icons
import { PlayIcon } from "@heroicons/react/24/outline";
// types
import { IIssue } from "types";
import { ICurrentUserResponse, IIssue } from "types";
type Props = {
issue: IIssue;
partialUpdateIssue: (formData: Partial<IIssue>, issueId: string) => void;
position?: "left" | "right";
selfPositioned?: boolean;
user: ICurrentUserResponse | undefined;
isNotAllowed: boolean;
};
@ -26,6 +27,7 @@ export const ViewEstimateSelect: React.FC<Props> = ({
partialUpdateIssue,
position = "left",
selfPositioned = false,
user,
isNotAllowed,
}) => {
const router = useRouter();
@ -51,7 +53,8 @@ export const ViewEstimateSelect: React.FC<Props> = ({
projectName: issue.project_detail.name,
issueId: issue.id,
},
"ISSUE_PROPERTY_UPDATE_ESTIMATE"
"ISSUE_PROPERTY_UPDATE_ESTIMATE",
user
);
}}
label={

View file

@ -7,7 +7,7 @@ import { CustomSelect, Tooltip } from "components/ui";
// icons
import { getPriorityIcon } from "components/icons/priority-icon";
// types
import { IIssue } from "types";
import { ICurrentUserResponse, IIssue } from "types";
// constants
import { PRIORITIES } from "constants/project";
// services
@ -18,6 +18,7 @@ type Props = {
partialUpdateIssue: (formData: Partial<IIssue>, issueId: string) => void;
position?: "left" | "right";
selfPositioned?: boolean;
user: ICurrentUserResponse | undefined;
isNotAllowed: boolean;
};
@ -26,6 +27,7 @@ export const ViewPrioritySelect: React.FC<Props> = ({
partialUpdateIssue,
position = "left",
selfPositioned = false,
user,
isNotAllowed,
}) => {
const router = useRouter();
@ -45,7 +47,8 @@ export const ViewPrioritySelect: React.FC<Props> = ({
projectName: issue.project_detail.name,
issueId: issue.id,
},
"ISSUE_PROPERTY_UPDATE_PRIORITY"
"ISSUE_PROPERTY_UPDATE_PRIORITY",
user
);
}}
maxHeight="md"

View file

@ -13,7 +13,7 @@ import { getStateGroupIcon } from "components/icons";
import { addSpaceIfCamelCase } from "helpers/string.helper";
import { getStatesList } from "helpers/state.helper";
// types
import { IIssue } from "types";
import { ICurrentUserResponse, IIssue } from "types";
// fetch-keys
import { STATES_LIST } from "constants/fetch-keys";
@ -22,6 +22,7 @@ type Props = {
partialUpdateIssue: (formData: Partial<IIssue>, issueId: string) => void;
position?: "left" | "right";
selfPositioned?: boolean;
user: ICurrentUserResponse | undefined;
isNotAllowed: boolean;
};
@ -30,6 +31,7 @@ export const ViewStateSelect: React.FC<Props> = ({
partialUpdateIssue,
position = "left",
selfPositioned = false,
user,
isNotAllowed,
}) => {
const router = useRouter();
@ -77,21 +79,25 @@ export const ViewStateSelect: React.FC<Props> = ({
projectName: issue.project_detail.name,
issueId: issue.id,
},
"ISSUE_PROPERTY_UPDATE_STATE"
"ISSUE_PROPERTY_UPDATE_STATE",
user
);
const oldState = states.find((s) => s.id === issue.state);
const newState = states.find((s) => s.id === data);
if (oldState?.group !== "completed" && newState?.group !== "completed") {
trackEventServices.trackIssueMarkedAsDoneEvent({
workspaceSlug: issue.workspace_detail.slug,
workspaceId: issue.workspace_detail.id,
projectId: issue.project_detail.id,
projectIdentifier: issue.project_detail.identifier,
projectName: issue.project_detail.name,
issueId: issue.id,
});
trackEventServices.trackIssueMarkedAsDoneEvent(
{
workspaceSlug: issue.workspace_detail.slug,
workspaceId: issue.workspace_detail.id,
projectId: issue.project_detail.id,
projectIdentifier: issue.project_detail.identifier,
projectName: issue.project_detail.name,
issueId: issue.id,
},
user
);
}
}}
options={options}