DislikeDrawer.tsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { Button, Drawer, Input, Tag } from 'antd';
  2. import React, { useState } from 'react';
  3. interface Tags {
  4. reason: string;
  5. reason_type: string;
  6. }
  7. const DislikeDrawer: React.FC<{
  8. open: boolean;
  9. setFeedbackOpen: React.Dispatch<React.SetStateAction<boolean>>;
  10. list: Tags[];
  11. feedback: (params: {
  12. feedback_type: string;
  13. reason_types?: string[] | undefined;
  14. remark?: string | undefined;
  15. }) => void;
  16. loading: boolean;
  17. }> = ({ open, setFeedbackOpen, list, feedback, loading }) => {
  18. const [selectedTags, setSelectedTags] = useState<Tags[]>([]);
  19. const [remark, setRemark] = useState<string>('');
  20. return (
  21. <Drawer
  22. title='你的反馈助我进步'
  23. placement='bottom'
  24. open={open}
  25. onClose={() => setFeedbackOpen(false)}
  26. destroyOnClose={true}
  27. height={'auto'}
  28. >
  29. <div className='flex flex-col w-full gap-4'>
  30. <div className='flex w-full flex-wrap gap-2'>
  31. {list?.map(item => {
  32. const isSelect = selectedTags.findIndex(tag => tag.reason_type === item.reason_type) > -1;
  33. return (
  34. <Tag
  35. key={item.reason_type}
  36. className={`text-sm text-[#525964] p-1 px-2 rounded-md cursor-pointer ${isSelect ? 'border-[#0c75fc] text-[#0c75fc]' : ''}`}
  37. onClick={() => {
  38. setSelectedTags((preArr: Tags[]) => {
  39. const index = preArr.findIndex(tag => tag.reason_type === item.reason_type);
  40. if (index > -1) {
  41. return [...preArr.slice(0, index), ...preArr.slice(index + 1)];
  42. }
  43. return [...preArr, item];
  44. });
  45. }}
  46. >
  47. {item.reason}
  48. </Tag>
  49. );
  50. })}
  51. </div>
  52. <Input.TextArea
  53. placeholder='描述一下具体问题或更优的答案'
  54. className='h-24 resize-none mb-2'
  55. value={remark}
  56. onChange={e => setRemark(e.target.value.trim())}
  57. />
  58. <div className='flex gap-2 justify-end'>
  59. <Button
  60. className='w-16 h-8'
  61. onClick={() => {
  62. setFeedbackOpen(false);
  63. }}
  64. >
  65. 取消
  66. </Button>
  67. <Button
  68. type='primary'
  69. className='min-w-16 h-8'
  70. onClick={async () => {
  71. const reason_types = selectedTags.map(item => item.reason_type);
  72. await feedback?.({
  73. feedback_type: 'unlike',
  74. reason_types,
  75. remark,
  76. });
  77. }}
  78. loading={loading}
  79. >
  80. 确认
  81. </Button>
  82. </div>
  83. </div>
  84. </Drawer>
  85. );
  86. };
  87. export default DislikeDrawer;