plane/apps/app/components/issues/view-select/state.tsx

83 lines
2.2 KiB
TypeScript
Raw Normal View History

import { useRouter } from "next/router";
import useSWR from "swr";
// services
import stateService from "services/state.service";
// ui
import { CustomSelect, Tooltip } from "components/ui";
// helpers
import { addSpaceIfCamelCase } from "helpers/string.helper";
import { getStatesList } from "helpers/state.helper";
// types
import { IIssue } from "types";
// fetch-keys
import { STATE_LIST } from "constants/fetch-keys";
2023-03-05 14:52:01 +00:00
import { getStateGroupIcon } from "components/icons";
type Props = {
issue: IIssue;
partialUpdateIssue: (formData: Partial<IIssue>) => void;
2023-03-05 14:52:01 +00:00
position?: "left" | "right";
selfPositioned?: boolean;
isNotAllowed: boolean;
};
export const ViewStateSelect: React.FC<Props> = ({
issue,
partialUpdateIssue,
2023-03-05 14:52:01 +00:00
position = "left",
selfPositioned = false,
isNotAllowed,
}) => {
const router = useRouter();
2023-02-13 14:08:58 +00:00
const { workspaceSlug } = router.query;
const { data: stateGroups } = useSWR(
2023-02-13 14:08:58 +00:00
workspaceSlug && issue ? STATE_LIST(issue.project) : null,
workspaceSlug && issue
? () => stateService.getStates(workspaceSlug as string, issue.project)
: null
);
const states = getStatesList(stateGroups ?? {});
2023-03-05 14:52:01 +00:00
const currentState = states?.find((s) => s.id === issue.state);
return (
<CustomSelect
label={
<>
2023-03-05 14:52:01 +00:00
{getStateGroupIcon(
currentState?.group ?? "backlog",
"16",
"16",
currentState?.color ?? ""
)}
<Tooltip
tooltipHeading="State"
2023-03-05 14:52:01 +00:00
tooltipContent={addSpaceIfCamelCase(currentState?.name ?? "")}
>
2023-03-05 14:52:01 +00:00
<span>{addSpaceIfCamelCase(currentState?.name ?? "")}</span>
</Tooltip>
</>
}
value={issue.state}
2023-03-05 14:52:01 +00:00
onChange={(data: string) => partialUpdateIssue({ state: data })}
maxHeight="md"
noChevron
disabled={isNotAllowed}
2023-03-05 14:52:01 +00:00
position={position}
selfPositioned={selfPositioned}
>
{states?.map((state) => (
<CustomSelect.Option key={state.id} value={state.id}>
<>
2023-03-05 14:52:01 +00:00
{getStateGroupIcon(state.group, "16", "16", state.color)}
{addSpaceIfCamelCase(state.name)}
</>
</CustomSelect.Option>
))}
</CustomSelect>
);
};