ChannelSelectWithToken.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import { useState } from "react";
  2. import { Button, Input, Space, Tooltip, Typography } from "antd";
  3. import {
  4. FolderOpenOutlined,
  5. CheckCircleTwoTone,
  6. LoadingOutlined,
  7. WarningTwoTone,
  8. } from "@ant-design/icons";
  9. import type { IChannel, TChannelType } from "../../../src/api/Channel";
  10. import { post } from "../../../src/request";
  11. import ChannelTableModal from "./ChannelTableModal";
  12. import type {
  13. IPayload,
  14. ITokenCreate,
  15. ITokenCreateResponse,
  16. TPower,
  17. } from "../../../src/api/token";
  18. const { Text } = Typography;
  19. interface IData {
  20. value: string;
  21. label: string;
  22. }
  23. interface IWidget {
  24. channelsId?: string[];
  25. type?: TChannelType;
  26. book?: number;
  27. para?: number;
  28. power?: TPower;
  29. onChange?: (channel?: string | null) => void;
  30. }
  31. const ChannelSelectWithToken = ({
  32. type,
  33. book,
  34. para,
  35. power,
  36. onChange,
  37. }: IWidget) => {
  38. const [curr, setCurr] = useState<IData>();
  39. const [access, setAccess] = useState<boolean>();
  40. const [loading, setLoading] = useState(false);
  41. return (
  42. <Space>
  43. <Input
  44. allowClear
  45. value={curr?.label}
  46. placeholder="选择一个版本"
  47. onChange={(event) => {
  48. if (event.target.value.trim().length === 0) {
  49. setCurr(undefined);
  50. setAccess(undefined);
  51. if (onChange) {
  52. onChange(undefined);
  53. }
  54. }
  55. }}
  56. />
  57. <ChannelTableModal
  58. chapter={book && para ? { book: book, paragraph: para } : undefined}
  59. channelType={type}
  60. trigger={<Button icon={<FolderOpenOutlined />} type="text" />}
  61. onSelect={(channel: IChannel) => {
  62. setCurr({ value: channel.id, label: channel.name });
  63. //验证权限
  64. if (power) {
  65. setLoading(true);
  66. const payload: IPayload[] = [];
  67. payload.push({
  68. res_id: channel.id,
  69. res_type: "channel",
  70. power: power,
  71. });
  72. const url = "/v2/access-token";
  73. const values = { payload: payload };
  74. console.info("token api request", url, values);
  75. post<ITokenCreate, ITokenCreateResponse>(url, values)
  76. .then((json) => {
  77. console.info("token api response", json);
  78. if (json.ok) {
  79. if (json.data.count > 0) {
  80. setAccess(true);
  81. }
  82. }
  83. })
  84. .finally(() => setLoading(false));
  85. }
  86. if (onChange) {
  87. onChange(channel.id + (power ? "@" + power : ""));
  88. }
  89. }}
  90. />
  91. <Text type="secondary">{power}</Text>
  92. {loading ? (
  93. <LoadingOutlined />
  94. ) : typeof access !== "undefined" ? (
  95. access ? (
  96. <CheckCircleTwoTone twoToneColor="#52c41a" />
  97. ) : (
  98. <Tooltip title="无法获取指定的权限">
  99. <WarningTwoTone twoToneColor="#eb2f96" />
  100. </Tooltip>
  101. )
  102. ) : (
  103. <></>
  104. )}
  105. </Space>
  106. );
  107. };
  108. export default ChannelSelectWithToken;