Category.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import { Dropdown, type MenuProps, message, Tag, Typography } from "antd";
  2. import {
  3. ATaskCategory,
  4. type ITaskData,
  5. type ITaskResponse,
  6. type ITaskUpdateRequest,
  7. type TTaskCategory,
  8. } from "../../api/task";
  9. import { useIntl } from "react-intl";
  10. import { patch } from "../../request";
  11. const { Text } = Typography;
  12. interface IWidget {
  13. task?: ITaskData;
  14. onChange?: (data: ITaskData[]) => void;
  15. }
  16. const Category = ({ task, onChange }: IWidget) => {
  17. const intl = useIntl();
  18. const placeholder = intl.formatMessage({ id: "labels.task.category" });
  19. interface IMenu {
  20. key: TTaskCategory;
  21. label: string;
  22. }
  23. const items: MenuProps["items"] = ATaskCategory.map((item) => {
  24. const value: IMenu = {
  25. key: item,
  26. label: intl.formatMessage({
  27. id: `labels.task.category.${item}`,
  28. }),
  29. };
  30. return value;
  31. });
  32. const onClick: MenuProps["onClick"] = (e) => {
  33. if (!task) {
  34. console.error("no task");
  35. return;
  36. }
  37. const setting: ITaskUpdateRequest = {
  38. id: task.id,
  39. studio_name: "",
  40. category: e.key as TTaskCategory,
  41. };
  42. const url = `/v2/task/${task.id}`;
  43. console.info("api request", url, setting);
  44. patch<ITaskUpdateRequest, ITaskResponse>(url, setting).then((json) => {
  45. console.info("api response", json);
  46. if (json.ok) {
  47. message.success("Success");
  48. onChange && onChange([json.data]);
  49. } else {
  50. message.error(json.message);
  51. }
  52. });
  53. };
  54. return (
  55. <Dropdown menu={{ items, onClick }}>
  56. <Tag>
  57. <Text type={task?.category ? "success" : "secondary"}>
  58. {intl.formatMessage({
  59. id: `labels.task.category.${task?.category}`,
  60. defaultMessage: placeholder,
  61. })}
  62. </Text>
  63. </Tag>
  64. </Dropdown>
  65. );
  66. };
  67. export default Category;