index.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import {useAppDispatch, useAppSelector} from "../../../store";
  2. import {useEffect, useRef, useState} from "react";
  3. import {INginxServer, INginxStream} from "../../../models/nginx.ts";
  4. import {cloneDeep} from "lodash";
  5. import {useFormConfig} from "../config.tsx";
  6. import { FormTable, FormTableInstance, Message} from "auto-antd";
  7. import './index.less'
  8. import {Button} from "antd";
  9. import {NginxApis} from "../../../api/nginx.ts";
  10. import {NginxActions} from "../../../store/slice/nginx.ts";
  11. import {SyncButton} from "../server/components/SyncButton.tsx";
  12. const createStreamServer = ()=>{
  13. return {
  14. id: 0,
  15. isStream: true,
  16. isUpstream: false,
  17. server_name: 'stream.all',
  18. listen: 0,
  19. locations: [],
  20. nginxId: 0,
  21. enable: true,
  22. } as INginxServer
  23. }
  24. /**
  25. * nginx 的steam的server
  26. * @constructor
  27. */
  28. export const NginxStream = () => {
  29. const nginx = useAppSelector(state => state.nginx.current);
  30. const servers = useAppSelector(state => state.nginx.servers);
  31. const [data,setData] = useState<INginxStream[]>([])
  32. const [loading,setLoading] = useState(false)
  33. const streamServerRef = useRef<INginxServer>()
  34. const dispatch = useAppDispatch()
  35. const formConfig = useFormConfig();
  36. const formRef = useRef<FormTableInstance>()
  37. useEffect(()=>{
  38. const streamServer = servers.find(item=>item.isStream);
  39. if (streamServer){
  40. streamServerRef.current = streamServer
  41. setData(cloneDeep(streamServer.streams || []))
  42. }else {
  43. const newData = createStreamServer()
  44. newData.nginxId = nginx?.id || 0
  45. streamServerRef.current = newData
  46. setData([])
  47. }
  48. },[servers])
  49. const onSubmitData = async ()=>{
  50. const stream = streamServerRef.current;
  51. if (!stream || !nginx?.id){
  52. return false
  53. }
  54. const postData = cloneDeep(stream);
  55. postData.nginxId = nginx.id
  56. postData.enable = true
  57. let isOk = false
  58. try {
  59. const values = await formRef.current?.onSyncSubmit(true);
  60. console.log('values',values);
  61. postData.streams = values;
  62. isOk = true
  63. }catch (e: any){
  64. console.log('e',e);
  65. const errorFields = e.errorFields || [];
  66. if (errorFields.length){
  67. const errMsg = errorFields[0].errors[0]
  68. Message.warning(errMsg)
  69. }else {
  70. Message.warning('请检查配置,端口和后端服务为必填项,需要输入完整')
  71. }
  72. }
  73. if (isOk){
  74. return postData
  75. }
  76. return false
  77. }
  78. const onSave = async ()=>{
  79. if (!nginx?.id){
  80. return
  81. }
  82. const postData = await onSubmitData()
  83. if (!postData){
  84. return
  85. }
  86. setLoading(true)
  87. console.log('postData', postData)
  88. NginxApis.updateServer(nginx, postData)
  89. .then((data)=>{
  90. if (postData.id){
  91. dispatch(NginxActions.updateServer(data))
  92. }else {
  93. dispatch(NginxActions.addServer(data))
  94. }
  95. Message.success('save success!')
  96. })
  97. .catch(e=>{
  98. Message.warning(e.msg || e.message)
  99. })
  100. .finally(()=>{
  101. setLoading(false)
  102. })
  103. }
  104. return (<div className="page stream-page">
  105. <div className="page-header">
  106. <span>TCP/UDP</span>
  107. <div>
  108. <SyncButton onSubmitData={onSubmitData}/>
  109. <Button loading={loading} onClick={onSave} type="primary">保存</Button>
  110. </div>
  111. </div>
  112. <div className="page-container">
  113. <FormTable
  114. columns={formConfig.stream as any}
  115. data={data}
  116. ref={formRef as any}
  117. />
  118. </div>
  119. </div>)
  120. }