index.tsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /**
  2. * 必须要兼容,手动输入,以及选择负载均衡名字
  3. * @author tuonian
  4. * @date 2023/7/4
  5. */
  6. import {AutoTypeInputProps, AdvanceInputConfigs} from "planning-tools";
  7. import {Input, Select} from "antd";
  8. import {useAppSelector} from "../../../../store";
  9. import {ChangeEvent, useEffect, useMemo, useState} from "react";
  10. import './index.less'
  11. const protocols = [{value:"http", label:"http"},{ value: 'https',label: 'https'}]
  12. export const ProxyPassInput = ({value, onChange}: AutoTypeInputProps)=>{
  13. const upstreamServer = useAppSelector(state => state.nginx.upstream);
  14. const [data,setData] = useState<string>()
  15. const [protocol,setProtocol] = useState<string>("http")
  16. const options = useMemo(()=>{
  17. let list:any[] = []
  18. if (upstreamServer?.upstreams){
  19. list = upstreamServer.upstreams.map(item=>{
  20. return {
  21. label: item.name,
  22. value: item.name
  23. }
  24. })
  25. }
  26. return list
  27. },[upstreamServer])
  28. useEffect(()=>{
  29. if (!value || typeof value !=='string'){
  30. setData(undefined)
  31. return
  32. }
  33. if (value.startsWith('https://')){
  34. setProtocol('https')
  35. }else if (value.startsWith('http://')){
  36. setProtocol('http')
  37. }
  38. let pass = value.replace(/http(s)?:\/\//,'');
  39. if (pass.endsWith('/')){
  40. pass = pass.substring(0,pass.length-1)
  41. }
  42. if (pass){
  43. setData(pass)
  44. }
  45. },[value])
  46. const triggerChange = (pro: string,host?: string)=>{
  47. if (!pro || !host){
  48. return
  49. }
  50. let pass = `${pro}://${host}`
  51. if (!pass.endsWith('/')){
  52. pass=pass+'/'
  53. }
  54. onChange?.(pass)
  55. }
  56. const onProtocolChange = (pro: string)=>{
  57. setProtocol(pro)
  58. triggerChange(pro,data)
  59. }
  60. const onSelectUpstream = (v?:string)=>{
  61. if (v){
  62. setData(v)
  63. triggerChange(protocol,v)
  64. }
  65. }
  66. const userInputChange = (e: ChangeEvent<any>) =>{
  67. const v = e.currentTarget.value;
  68. setData(v);
  69. triggerChange(protocol,v)
  70. }
  71. return (<div className="proxy-pass-input">
  72. <Select value={protocol} onChange={onProtocolChange}
  73. className="protocol" options={protocols} />
  74. <Input onChange={userInputChange} value={data} allowClear/>
  75. <Select onChange={onSelectUpstream}
  76. placeholder="选择负载均衡"
  77. allowClear
  78. className="upstream-select"
  79. options={options} />
  80. </div>)
  81. }
  82. AdvanceInputConfigs['proxy_pass'] = ProxyPassInput