LangInput.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import React, { useEffect } from "react";
  2. import { ListLangBySearchKey } from "@/api";
  3. import { useRequest } from "umi";
  4. import { AutoComplete } from "antd";
  5. interface LanItem {
  6. en: string;
  7. key: string;
  8. ["zh-CN"]: string;
  9. }
  10. export default function LangInput({
  11. value,
  12. onChange,
  13. disabled,
  14. style
  15. }: {
  16. value?: Record<string, string>[];
  17. onChange?: (value: Record<string, string>[], key?: string) => void;
  18. disabled?: boolean;
  19. style?: React.CSSProperties;
  20. }) {
  21. const [lanOptions, setLanOptions] = React.useState<any[]>([]);
  22. const [formModel, setFormModel] = React.useState({
  23. langText: "",
  24. en: value?.find(item => item.name === 'en')?.value || "",
  25. ["zh-CN"]: value?.find(item => item.name === 'zh-CN')?.value || "",
  26. });
  27. const { run } = useRequest(ListLangBySearchKey, {
  28. manual: true,
  29. onSuccess(data, params) {
  30. setLanOptions(
  31. (data.result || []).map((item: LanItem) => ({
  32. ...item,
  33. label: `${item.en || ""}[zh-CN:${item["zh-CN"]}]`,
  34. value: item[params[0].searchLan],
  35. }))
  36. );
  37. },
  38. });
  39. const handleSearch = (serchKey: string, searchLan: "en" | "zh-CN") => {
  40. run({
  41. maxCount: 10,
  42. searchKey: serchKey,
  43. searchLan,
  44. });
  45. };
  46. const handleSelectLang = (option: LanItem) => {
  47. setFormModel(() => {
  48. return {
  49. ...formModel,
  50. langText: option.key,
  51. en: option?.en,
  52. ["zh-CN"]: option?.["zh-CN"],
  53. };
  54. });
  55. };
  56. const handleChange = (key: "en" | "zh-CN", val: string) => {
  57. setFormModel(() => {
  58. return {
  59. ...formModel,
  60. langText: "",
  61. [key]: val,
  62. };
  63. });
  64. };
  65. useEffect(() => {
  66. onChange?.([
  67. { name: 'en', value: formModel.en},
  68. { name: 'zh-CN', value: formModel["zh-CN"]},
  69. ], formModel.langText);
  70. }, [formModel]);
  71. return (
  72. <div>
  73. <div>
  74. <AutoComplete
  75. allowClear
  76. placeholder="中文"
  77. options={lanOptions}
  78. onSearch={(val) => handleSearch(val, "zh-CN")}
  79. value={formModel["zh-CN"]}
  80. onChange={(val) => handleChange("zh-CN", val)}
  81. onSelect={(_val, opt) => handleSelectLang(opt)}
  82. disabled={disabled}
  83. style={style}
  84. />
  85. </div>
  86. <div>
  87. <AutoComplete
  88. allowClear
  89. style={{ width: "100%", ...(style || {}) }}
  90. placeholder="英文"
  91. options={lanOptions}
  92. onSearch={(val) => handleSearch(val, "en")}
  93. value={formModel.en}
  94. onChange={(val) => handleChange("en", val)}
  95. onSelect={(_val, opt) => handleSelectLang(opt)}
  96. disabled={disabled}
  97. />
  98. </div>
  99. </div>
  100. );
  101. }