resource-card.tsx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import { apiInterceptors, getResource } from '@/client/api';
  2. import { DeleteFilled } from '@ant-design/icons';
  3. import { Card, Input, Select, Switch } from 'antd';
  4. import React, { useEffect, useState } from 'react';
  5. import { useTranslation } from 'react-i18next';
  6. interface IProps {
  7. resourceTypeOptions: any[];
  8. updateResourcesByIndex: (data: any, index: number) => void;
  9. index: number;
  10. resource: any;
  11. }
  12. export default function ResourceCard(props: IProps) {
  13. const { resourceTypeOptions, updateResourcesByIndex, index, resource: editResource } = props;
  14. const { t } = useTranslation();
  15. const [resourceType, setResourceType] = useState<string>(editResource.type || resourceTypeOptions?.[0].label);
  16. const [resourceValueOptions, setResourceValueOptions] = useState<any[]>([]);
  17. const [resource, setResource] = useState<any>({
  18. name: editResource.name,
  19. type: editResource.type,
  20. value: editResource.value,
  21. is_dynamic: editResource.is_dynamic || false,
  22. });
  23. const fetchResource = async () => {
  24. const [_, data] = await apiInterceptors(getResource({ type: resourceType }));
  25. if (data) {
  26. setResourceValueOptions(
  27. data?.map(item => {
  28. return { label: item.label, value: item.key + '' };
  29. }),
  30. );
  31. } else {
  32. setResourceValueOptions([]);
  33. }
  34. };
  35. const handleChange = (value: string) => {
  36. setResourceType(value);
  37. };
  38. const updateResource = (value: any, type: string) => {
  39. const tempResource = resource;
  40. tempResource[type] = value;
  41. setResource(tempResource);
  42. updateResourcesByIndex(tempResource, index);
  43. };
  44. const handleDeleteResource = () => {
  45. updateResourcesByIndex(null, index);
  46. };
  47. useEffect(() => {
  48. fetchResource();
  49. updateResource(resource.type || resourceType, 'type');
  50. }, [resourceType]);
  51. useEffect(() => {
  52. // fix bug :Resolve the issue of incorrect parameter echo for resources under app editing
  53. updateResource(editResource.value || resourceValueOptions[0]?.label, 'value');
  54. setResource({ ...resource, value: editResource.value || resourceValueOptions[0]?.label });
  55. }, [resourceValueOptions]);
  56. return (
  57. <Card
  58. className='mb-3 dark:bg-[#232734] border-gray-200'
  59. title={`${t('resource')} ${index + 1}`}
  60. extra={
  61. <DeleteFilled
  62. className='text-[#ff1b2e] !text-lg'
  63. onClick={() => {
  64. handleDeleteResource();
  65. }}
  66. />
  67. }
  68. >
  69. <div className='flex-1'>
  70. <div className='flex items-center mb-6'>
  71. <div className='font-bold mr-4 w-32 text-center'>
  72. <span className='text-[#ff4d4f] font-normal'>*</span>&nbsp;{t('resource_name')}:
  73. </div>
  74. <Input
  75. className='w-1/3'
  76. required
  77. value={resource.name}
  78. onInput={(e: React.ChangeEvent<HTMLInputElement>) => {
  79. updateResource(e.target.value, 'name');
  80. }}
  81. />
  82. <div className='flex items-center'>
  83. <div className='font-bold w-32 text-center'>{t('resource_dynamic')}</div>
  84. <Switch
  85. defaultChecked={editResource.is_dynamic || false}
  86. style={{ background: resource.is_dynamic ? '#1677ff' : '#ccc' }}
  87. onChange={value => {
  88. updateResource(value, 'is_dynamic');
  89. }}
  90. />
  91. </div>
  92. </div>
  93. <div className='flex mb-5 items-center'>
  94. <div className='font-bold mr-4 w-32 text-center'>{t('resource_type')}: </div>
  95. <Select
  96. className='w-1/3'
  97. options={resourceTypeOptions}
  98. value={resource.type || resourceTypeOptions?.[0]}
  99. onChange={value => {
  100. updateResource(value, 'type');
  101. handleChange(value);
  102. }}
  103. />
  104. <div className='font-bold w-32 text-center'>{t('resource_value')}:</div>
  105. {resourceValueOptions?.length > 0 ? (
  106. <Select
  107. value={resource.value}
  108. className='flex-1'
  109. options={resourceValueOptions}
  110. onChange={value => {
  111. updateResource(value, 'value');
  112. }}
  113. />
  114. ) : (
  115. <Input
  116. className='flex-1'
  117. value={resource.value || editResource.value}
  118. onInput={(e: React.ChangeEvent<HTMLInputElement>) => {
  119. updateResource(e.target.value, 'value');
  120. }}
  121. />
  122. )}
  123. </div>
  124. </div>
  125. </Card>
  126. );
  127. }