LangInputTextarea.tsx 2.6 KB

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