Bläddra i källkod

接口对接完成

bding 8 månader sedan
förälder
incheckning
4dc646d3f1

+ 78 - 6
src/Column/Column.service.ts

@@ -69,6 +69,9 @@ export interface IUpdateParams {
   NickName: string
 }
 export interface IColumnDetail {
+  LikeCount: number
+  IsLikeCount: boolean
+  SpecialLikeCount: number
   CompanyTags: string[] // 公司标签
   IndustryTags: string[] // 行业标签
   SpecialColumnId: number
@@ -119,15 +122,26 @@ export interface IColumnDetail {
 }
 
 export interface IMessageDetail {
-  Msg: string
+  LikeCount: number
+  CreateTime: string
+  RealName: string //用户实际名称
+  Headimgurl: string //用户头像
+  Content: string //留言内容
+  SourceTitle: string //专栏标题
   CheckIds: number[]
-  Id: number
-  ChildrenList: IMsgChildrenList[]
+  MessageId: number //留言消息ID
+  YanxuanSpecialId: number
+  Status: number //消息状态,0未公开、1:已公开
+  TopTime: number //置顶时间(大于零置顶,等于零未置顶)
+  HaveOtherTop: boolean //是否有其它的置顶
+  ChildList: IMsgChildrenList[]
 }
 
 export interface IMsgChildrenList {
-  Msg: string
-  Ind: number
+  Headimgurl: string | undefined
+  CreateTime: string //创建时间
+  MessageId: number
+  Content: string //留言内容
 }
 export interface IActivityDetialBase {
   IsNeedBusinessCard: boolean // 是否需要上传名片
@@ -247,7 +261,35 @@ export const ColumnService = {
       method: 'get',
       params: { Status } // 1:未发布,2:审核中 3:已发布 4:驳回
     }),
-
+  getColumnManageList: (
+    PageSize: number, // 每页数据条数
+    CurrentIndex: number, // 当前页页码,从1开始
+    MessageType: number //留言类型1:普通留言、2:公开留言
+  ): INewResponse<IMessageDetail[]> =>
+    NewAxiosInstanceFunc({
+      url: `yanxuan_special/message/manage/list`,
+      method: 'get',
+      params: { PageSize, CurrentIndex, MessageType } // 1:未发布,2:审核中 3:已发布 4:驳回
+    }),
+  getColumnAuthorFansList: (
+    PageSize: number, // 每页数据条数
+    CurrentIndex: number // 当前页页码,从1开始
+  ): INewResponse<IMessageDetail[]> =>
+    NewAxiosInstanceFunc({
+      url: `yanxuan_special/author/fans_list`,
+      method: 'get',
+      params: { PageSize, CurrentIndex } // 1:未发布,2:审核中 3:已发布 4:驳回
+    }),
+  getColumnSpecialList: (
+    PageSize: number, // 每页数据条数
+    CurrentIndex: number, // 当前页页码,从1开始
+    YanxuanSpecialId: number
+  ): INewResponse<IMessageDetail[]> =>
+    NewAxiosInstanceFunc({
+      url: `yanxuan_special/message/special/list`,
+      method: 'get',
+      params: { PageSize, CurrentIndex, YanxuanSpecialId } //
+    }),
   postUpdateAuthorHeadImg: (SpecialColumnId: number, HeadImg: string): INewResponse =>
     NewAxiosInstanceFunc({
       url: `/yanxuan_special/author/head_img`,
@@ -310,5 +352,35 @@ export const ColumnService = {
       url: `/yanxuan_special/enable`,
       method: 'post',
       data: { Id, Status, Reason } // 1通过2驳回
+    }),
+  postMessageAdd: (YanxuanSpecialId: number, Content: string, ParentId?: number): INewResponse =>
+    NewAxiosInstanceFunc({
+      url: `/yanxuan_special/message/add`,
+      method: 'post',
+      data: { YanxuanSpecialId, ParentId, Content }
+    }),
+  postMessageDelete: (MessageId: number): INewResponse =>
+    NewAxiosInstanceFunc({
+      url: `/yanxuan_special/message/delete`,
+      method: 'post',
+      data: { MessageId }
+    }),
+  postMessagePublic: (MessageIds: (string | number)[], DoType: number): INewResponse =>
+    NewAxiosInstanceFunc({
+      url: `/yanxuan_special/message/public`,
+      method: 'post',
+      data: { MessageIds, DoType }
+    }),
+  postMessageTop: (MessageId: number, DoType: number): INewResponse =>
+    NewAxiosInstanceFunc({
+      url: `/yanxuan_special/message/top`,
+      method: 'post',
+      data: { MessageId, DoType }
+    }),
+  postMessageLike: (MessageId: number, DoType: number): INewResponse =>
+    NewAxiosInstanceFunc({
+      url: `/yanxuan_special/message/like`,
+      method: 'post',
+      data: { MessageId, DoType }
     })
 }

+ 21 - 4
src/Column/ColumnIndex.tsx

@@ -11,6 +11,7 @@ import type { RcFile, UploadFile, UploadProps } from 'antd/es/upload/interface'
 
 import { ReactComponent as ColumnNew } from 'assets/columnnew.svg'
 import { ReactComponent as ColumnCenterSvg } from 'assets/columncenter.svg'
+import { ReactComponent as ColumnMessageSvg } from 'assets/columnmessage.svg'
 import { ReactComponent as ReseachSvg } from 'assets/reseachactivity.svg'
 import { ReactComponent as PhotoSvg } from 'assets/photo.svg'
 import EmptyImg from 'assets/empty.png'
@@ -241,6 +242,15 @@ const ColumnIndex: React.FC<IColumnIndexProps> = props => {
       setColumnList(newList)
     }
   }
+  const handleChangeLike = (id: number) => {
+    const newList = JSON.parse(JSON.stringify(columnList))
+    const findIndex = newList.findIndex((item: IColumnDetail) => item.Id === id)
+    if (findIndex !== -1) {
+      newList[findIndex].IsLikeCount ? newList[findIndex].LikeCount-- : newList[findIndex].LikeCount++
+      newList[findIndex].IsLikeCount = !newList[findIndex].IsLikeCount
+      setColumnList(newList)
+    }
+  }
   // 关注专栏
   const handleOnFollowColumn = () => {
     // 检查是否登录了,未登录进入登录页面
@@ -262,7 +272,9 @@ const ColumnIndex: React.FC<IColumnIndexProps> = props => {
 
   // 显示获赞和收藏弹框
   const showCollectionsFansModal = (type: string) => {
-    type === '粉丝' ? setFansModalShow(true) : setCollectionsShow(true)
+    if (props.columnId && columnInfo?.UserId === login2p.userInfo?.UserId && columnInfo?.Status === 1) {
+      type === '粉丝' ? setFansModalShow(true) : setCollectionsShow(true)
+    }
   }
   // 获赞和收藏弹框的关闭事件
   const CollectionFansClose = (type: string) => {
@@ -434,7 +446,12 @@ const ColumnIndex: React.FC<IColumnIndexProps> = props => {
                 <div className="columnindex-note-list-wrapper">
                   {columnList?.map((item: IColumnDetail, index) => (
                     <div className="note-item" key={index}>
-                      <ColumnContent detail={item} type="list" onCollect={handleChangeCollection} />
+                      <ColumnContent
+                        detail={item}
+                        type="list"
+                        onCollect={handleChangeCollection}
+                        onLike={handleChangeLike}
+                      />
                     </div>
                   ))}
                 </div>
@@ -456,7 +473,7 @@ const ColumnIndex: React.FC<IColumnIndexProps> = props => {
             onClick={handleOpenModel.bind(this, 'openCenter')}
           />
           <div className="columnindex-right-text">内容中心</div>
-          <ColumnCenterSvg
+          <ColumnMessageSvg
             className="columnindex-right-svg columnindex-svg-center"
             onClick={handleOpenModel.bind(this, 'openMessage')}
           />
@@ -479,7 +496,7 @@ const ColumnIndex: React.FC<IColumnIndexProps> = props => {
       ) : null}
       {openCenter ? <ColumnCenter open={openCenter} onClose={handleClose} /> : null}
       {openMessage ? <ColumnMessage open={openMessage} onClose={handleClose} /> : null}
-      <LikesCollections open={collectionsShow} onClose={CollectionFansClose} />
+      <LikesCollections open={collectionsShow} columnInfoFrom={columnInfo} onClose={CollectionFansClose} />
       <ColumnFansModal open={fansModalShow} onClose={CollectionFansClose} />
     </div>
   )

+ 102 - 41
src/Column/components/ColumnContent.tsx

@@ -4,7 +4,7 @@ import { useHistory } from 'react-router-dom'
 import dayjs from 'dayjs'
 
 import { Modal, message } from 'antd'
-import { StarFilled, StarOutlined, EyeOutlined } from '@ant-design/icons'
+import { StarFilled, StarOutlined, EyeOutlined, LikeOutlined, LikeFilled } from '@ant-design/icons'
 import { ReactComponent as Close } from 'assets/close.svg'
 
 import { useLogin2p } from 'Login2p/Login2pContext'
@@ -13,7 +13,7 @@ import Picture from 'Activity/components/Picture'
 import { FilesSvg } from 'Column/ColumnEditor'
 import { ColumnStatus } from './ColumnCenter'
 import AskAdd from 'Material/components/AskAdd'
-
+import ColumnContentMessage from './ColumnContentMessage'
 import { ITryType, INewPermissionType } from 'Material/components/NoPermission'
 import PayNoPermission from 'Material/components/PayNoPermission'
 import styles from '../css/ColumnDetail.module.scss'
@@ -34,13 +34,14 @@ interface IColumnContentProps {
   detail: IColumnDetail | IEditColumnDetail // 直接传入渲染的数据
   type?: 'detail' | 'list' | 'preview' | 'check' // detail-详情页,list-列表页,preview-预览页,check-审查页
   onCollect?: (ID: number) => void // 收藏回调(预览时没有收藏功能)
+  onLike?: (ID: number) => void // 收藏回调(预览时没有收藏功能)
   onClose?: () => void
   handleToRefresh?: () => void
 }
 
 /**笔记/观点 */
 const ColumnContent: React.FC<IColumnContentProps> = props => {
-  const { detail, type = 'detail', onClose, onCollect, handleToRefresh } = props
+  const { detail, type = 'detail', onClose, onCollect, handleToRefresh, onLike } = props
   const login2p = useLogin2p()
   const history = useHistory()
   const [bigImg, setBigImg] = useState<string>() // 展开的图片
@@ -56,6 +57,16 @@ const ColumnContent: React.FC<IColumnContentProps> = props => {
       }
     }
   })
+  // 点赞/取消点赞(研选专栏)
+  const { run: postMessageLike } = useRequest(ColumnService.postMessageLike, {
+    manual: true,
+    onSuccess: res => {
+      message.info(res.data.Msg || res.data.ErrMsg)
+      if (res.data.Success) {
+        onLike && onLike(detail.Id)
+      }
+    }
+  })
   // 审核文章
   const { run: applyCheckColumnNote } = useRequest(ColumnService.postCheckColumnNote, {
     manual: true,
@@ -110,6 +121,14 @@ const ColumnContent: React.FC<IColumnContentProps> = props => {
     }
     applyCollect(detail.Id, !!collect ? 2 : 1)
   }
+  // 点赞与取消点赞
+  const handleOnLike = (like: boolean) => {
+    if (!login2p.jwt) {
+      message.error('请先登录')
+      return
+    }
+    postMessageLike(detail.Id, !!like ? 0 : 1)
+  }
   // 查看全文
   const handleToDetail = () => {
     window.open(`/column/detail/${detail.Id}`)
@@ -252,35 +271,49 @@ const ColumnContent: React.FC<IColumnContentProps> = props => {
             onRefresh={handleToRefresh}
           />
         )}
-
-      {(detail as IColumnDetail)?.HasPermission === INewPermissionType.OK && (
-        <>
-          {type === 'list' && (
-            <div className="g-flex g-flex-v-center g-flex-between m-b-md note-showmore-line">
-              <div className="g-flex g-flex-v-center">
-                <div className="note-pv">
-                  <EyeOutlined size={14} className="pv-icon" />
-                  <span>{(detail as IColumnDetail).Pv || 0}</span>
-                </div>
-                {(detail as IColumnDetail)?.IsCollect ? (
-                  <StarFilled
-                    className="collect-icon"
-                    onClick={handleOnCollect.bind(this, (detail as IColumnDetail)?.IsCollect)}
-                  />
-                ) : (
-                  <StarOutlined
-                    className="collect-icon"
-                    onClick={handleOnCollect.bind(this, (detail as IColumnDetail)?.IsCollect)}
-                  />
-                )}
-                <span className="collect-count">{(detail as IColumnDetail)?.CollectNum}</span>
-              </div>
-              <div className="note-showmore-btn" onClick={handleToDetail}>
-                查看全文
+      <>
+        {type === 'list' && (
+          <div className="g-flex g-flex-v-center g-flex-between m-b-md note-showmore-line">
+            <div className="g-flex g-flex-v-center">
+              <div className="note-pv">
+                <EyeOutlined size={14} className="pv-icon" />
+                <span>{(detail as IColumnDetail).Pv || 0}</span>
               </div>
+              {(detail as IColumnDetail)?.IsCollect ? (
+                <StarFilled
+                  className="collect-icon"
+                  onClick={handleOnCollect.bind(this, (detail as IColumnDetail)?.IsCollect)}
+                />
+              ) : (
+                <StarOutlined
+                  className="collect-icon"
+                  onClick={handleOnCollect.bind(this, (detail as IColumnDetail)?.IsCollect)}
+                />
+              )}
+              <span style={{ marginRight: 10 }} className="collect-count">
+                {(detail as IColumnDetail)?.CollectNum}
+              </span>
+              {(detail as IColumnDetail)?.IsLikeCount ? (
+                <LikeFilled
+                  className="collect-icon"
+                  onClick={handleOnLike.bind(this, (detail as IColumnDetail)?.IsLikeCount)}
+                />
+              ) : (
+                <LikeOutlined
+                  className="collect-icon"
+                  onClick={handleOnLike.bind(this, (detail as IColumnDetail)?.IsLikeCount)}
+                />
+              )}
+              <span className="collect-count">{(detail as IColumnDetail)?.LikeCount}</span>
             </div>
-          )}
-
+            <div className="note-showmore-btn" onClick={handleToDetail}>
+              查看全文
+            </div>
+          </div>
+        )}
+      </>
+      {(detail as IColumnDetail)?.HasPermission === INewPermissionType.OK && (
+        <>
           {!login2p.jwt && type === 'detail' ? (
             <div className="please-login-btn" onClick={handleToShowMore}>
               请登录后查看更多内容
@@ -341,17 +374,45 @@ const ColumnContent: React.FC<IColumnContentProps> = props => {
                 )}
               </div>
               {type === 'detail' && (detail as IColumnDetail).Status === ColumnStatus.Published && (
-                <div
-                  className="columndetail-collect"
-                  onClick={handleOnCollect.bind(this, (detail as IColumnDetail)?.IsCollect)}
-                >
-                  {(detail as IColumnDetail)?.IsCollect ? (
-                    <StarFilled size={20} className={`option-icon`} />
-                  ) : (
-                    <StarOutlined size={20} className="option-icon" />
-                  )}
-                  <span className="option-text">{(detail as IColumnDetail)?.IsCollect ? '已' : ''}收藏</span>
-                </div>
+                <>
+                  <div className="detail-pv-collect-like note-showmore-line">
+                    <div className="note-pv">
+                      <EyeOutlined size={14} className="pv-icon" />
+                      <span>{(detail as IColumnDetail).Pv || 0}</span>
+                    </div>
+                    <div>
+                      {(detail as IColumnDetail)?.IsCollect ? (
+                        <StarFilled
+                          className="collect-icon"
+                          onClick={handleOnCollect.bind(this, (detail as IColumnDetail)?.IsCollect)}
+                        />
+                      ) : (
+                        <StarOutlined
+                          className="collect-icon"
+                          onClick={handleOnCollect.bind(this, (detail as IColumnDetail)?.IsCollect)}
+                        />
+                      )}
+                      <span style={{ marginRight: 10 }} className="collect-count">
+                        {(detail as IColumnDetail)?.CollectNum}
+                      </span>
+                      {(detail as IColumnDetail)?.IsLikeCount ? (
+                        <LikeFilled
+                          className="collect-icon"
+                          onClick={handleOnLike.bind(this, (detail as IColumnDetail)?.IsLikeCount)}
+                        />
+                      ) : (
+                        <LikeOutlined
+                          className="collect-icon"
+                          onClick={handleOnLike.bind(this, (detail as IColumnDetail)?.IsLikeCount)}
+                        />
+                      )}
+                      <span className="collect-count">{(detail as IColumnDetail)?.LikeCount}</span>
+                    </div>
+                  </div>
+                  {/* <div>请写下您的留言</div>
+                   */}
+                  <ColumnContentMessage detailId={(detail as IColumnDetail).Id} />
+                </>
               )}
             </>
           )}

+ 143 - 0
src/Column/components/ColumnContentMessage.tsx

@@ -0,0 +1,143 @@
+import React, { useEffect, useState } from 'react'
+import useRequest from '@ahooksjs/use-request/es'
+import { Input, message, Modal } from 'antd'
+import { ColumnService, IMessageDetail } from 'Column/Column.service'
+
+import { LikeOutlined, DeleteOutlined } from '@ant-design/icons'
+import styles from '../css/ColumnMessage.module.scss'
+interface IColumnCenterProps {
+  detailId: number
+}
+
+/**研选专栏 */
+const ColumnContentMessage: React.FC<IColumnCenterProps> = props => {
+  const { detailId } = props
+  const pageSize = 100000
+  const currentIndex = 1
+  const [inputShow, setInputShow] = useState<boolean>(false) // 是否显示留言输入框
+  const [massageList, setMassageList] = useState<IMessageDetail[]>([]) // 是否显示留言输入框
+  const [messageContent, setMessageContent] = useState<string>('') // 是否显示留言输入框
+
+  const handleChangeMessage = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
+    setMessageContent(e.target.value)
+  }
+  const submitHandler = () => {
+    applyCheckColumnNote(detailId, messageContent)
+  }
+  //   添加留言
+  const { run: applyCheckColumnNote } = useRequest(ColumnService.postMessageAdd, {
+    manual: true,
+    onSuccess: res => {
+      res.data.Success ? message.success(res.data.Msg) : message.error(res.data.Msg || res.data.ErrMsg)
+      setInputShow(false)
+    }
+  })
+
+  //   获取留言数据
+  const { run: getColumnSpecialList } = useRequest(ColumnService.getColumnSpecialList, {
+    manual: true,
+    formatResult: response => response.data.Data,
+    onSuccess: res => {
+      setMassageList(res.List)
+    }
+  })
+  // deleceMessageHandler
+  const deleceMessageHandler = (item: IMessageDetail) => {
+    Modal.confirm({
+      title: '提醒',
+      content: '确定要删除此回复内容吗?',
+      okText: '确定',
+      cancelText: '取消',
+      centered: true,
+      closable: true,
+      onOk: () => {
+        postMessageDelete(item.MessageId)
+      }
+    })
+  }
+
+  //  删除留言的接口
+  const { run: postMessageDelete } = useRequest(ColumnService.postMessageDelete, {
+    manual: true,
+    onSuccess: res => {
+      res.data.Success ? message.success(res.data.Msg) : message.error(res.data.Msg || res.data.ErrMsg)
+      getColumnSpecialList(pageSize, currentIndex, detailId)
+    }
+  })
+  useEffect(() => {
+    if (detailId) {
+      getColumnSpecialList(pageSize, currentIndex, detailId)
+    }
+  }, [detailId])
+
+  return (
+    <div>
+      {!inputShow ? (
+        <div
+          className={styles['columndetail-messge-select-ipt']}
+          onClick={() => {
+            setInputShow(true)
+          }}
+        >
+          留言会私信给作者,作者设置留言公开后将在文章下展示
+        </div>
+      ) : (
+        <div style={{ marginTop: 20 }}>
+          <Input.TextArea
+            placeholder="留言会私信给作者,作者设置留言公开后将在文章下展示"
+            autoSize={{ minRows: 3, maxRows: 3 }}
+            required
+            value={messageContent}
+            onChange={handleChangeMessage}
+          />
+          <div className={styles['columndetail-messge-ipt-btn']}>
+            <span
+              onClick={() => {
+                setInputShow(false)
+              }}
+            >
+              取消
+            </span>
+            <span onClick={submitHandler}>提交</span>
+          </div>
+        </div>
+      )}
+      {massageList.length > 0 &&
+        massageList.map(item => (
+          <div key={item.MessageId} className={styles['columndetail-message-list']}>
+            <div className={styles['item-img-btn']}>
+              <div>
+                <img src={item.Headimgurl} />
+                <span>{item.CreateTime}</span>
+              </div>
+              <div>
+                {item.Status === 0 ? (
+                  <DeleteOutlined className={styles['delete-icon']} onClick={() => deleceMessageHandler(item)} />
+                ) : (
+                  <>
+                    <LikeOutlined className={styles['collect-icon']} />
+                    <span>{item.LikeCount}</span>
+                  </>
+                )}
+              </div>
+            </div>
+            <div className={styles['columndetail-messge-content']}>{item.Content}</div>
+            {item.ChildList.length > 0 &&
+              item.ChildList.map(child => (
+                <div key={child.MessageId} className={styles['columndetail-messge-child-list']}>
+                  <div className={styles['item-img-btn']}>
+                    <div>
+                      <img src={child.Headimgurl} />
+                      <span>{child.CreateTime}</span>
+                    </div>
+                  </div>
+                  <div className={styles['columndetail-messge-content']}>{child.Content}</div>
+                </div>
+              ))}
+          </div>
+        ))}
+    </div>
+  )
+}
+
+export default ColumnContentMessage

+ 64 - 3
src/Column/components/ColumnFansModal.tsx

@@ -1,23 +1,84 @@
 import React, { useEffect, useState } from 'react'
 import useRequest from '@ahooksjs/use-request/es'
+import InfiniteScroll from 'react-infinite-scroll-component'
 
-import { Modal } from 'antd'
+import { ColumnService, IMessageDetail } from 'Column/Column.service'
+import { Modal, List } from 'antd'
+import styles from '../css/ColumnMessage.module.scss'
 
 interface IColumnCenterProps {
   open: boolean // 是否打开
   onClose: (type: 'Collection' | 'Fans') => void // 关闭
 }
-
+interface IColumnAuthorFansData {
+  CompanyName: string // 公司名称
+  RealName: string //用户实际名称
+  SellerName: string // 是否打开
+  CreateTime: string // 创建时间
+  Headimgurl: string //用户头像
+}
 /**研选专栏 */
 const ColumnFansModal: React.FC<IColumnCenterProps> = props => {
   const { open, onClose } = props
+  const pageSize = 9
+  const customData = {
+    emptyText: '暂时没有粉丝'
+  }
+  const [listData, setListData] = useState<IColumnAuthorFansData[]>([])
+  const [currentPage, setCurrentPage] = useState<number>(1)
+  const [hasMore, setHasMore] = useState<boolean>(false) // 列表加载更多
+
+  const { loading: listLoading, run } = useRequest(ColumnService.getColumnAuthorFansList, {
+    manual: true,
+    formatResult: response => response.data.Data,
+    onSuccess: res => {
+      console.log(res)
+
+      setListData([...listData, ...(res.List || [])])
 
+      console.log(listData, '-----')
+
+      setHasMore(res ? !res.Paging.IsEnd : false)
+    }
+  })
   const handleOnClose = () => {
     props.onClose('Fans')
   }
+
+  const handleGetMore = () => {
+    if (listLoading || !hasMore) return
+    setCurrentPage(currentPage + 1)
+    run(pageSize, currentPage + 1)
+  }
+
+  useEffect(() => {
+    setCurrentPage(1)
+    setListData([])
+    if (open) {
+      run(pageSize, currentPage)
+    }
+  }, [open])
   return (
     <Modal title="粉丝列表" open={open} onCancel={handleOnClose} footer={null}>
-      <div>暂时没有粉丝</div>
+      <InfiniteScroll
+        dataLength={listData?.length || 0}
+        next={handleGetMore}
+        hasMore={hasMore}
+        loader={null}
+        scrollableTarget="scrollableDiv"
+      >
+        <List
+          dataSource={listData || []}
+          locale={customData}
+          renderItem={(item: IColumnAuthorFansData) => (
+            <div className={styles['message-fans-content']}>
+              <img src={item.Headimgurl} alt="" />
+              <span>{item.RealName}</span>
+              <span>{item.CompanyName}</span>
+            </div>
+          )}
+        />
+      </InfiniteScroll>
     </Modal>
   )
 }

+ 187 - 122
src/Column/components/ColumnMessage.tsx

@@ -5,6 +5,9 @@ import { Checkbox, Drawer, Modal, Tabs, TabsProps, message, Button, Form, Input,
 import { ReactComponent as Close } from 'assets/close.svg'
 import { ColumnService, IMessageDetail } from 'Column/Column.service'
 import styles from '../css/ColumnIndex.module.scss'
+
+import { CheckboxValueType } from 'antd/lib/checkbox/Group'
+
 const { Item } = Form
 interface IColumnCenterProps {
   open: boolean // 是否打开
@@ -13,83 +16,77 @@ interface IColumnCenterProps {
 
 /**研选专栏 留言管理 */
 const ColumnMessage: React.FC<IColumnCenterProps> = props => {
-  const [messageList, setMessageList] = useState<IMessageDetail[]>([
-    {
-      Msg: 'Item 1',
-      CheckIds: [],
-      Id: 1,
-      ChildrenList: [
-        { Msg: 'Child 1-1', Ind: 11 },
-        { Msg: 'Child 1-2', Ind: 12 }
-      ]
-    },
-    {
-      Msg: 'Item 2',
-      CheckIds: [],
-      Id: 2,
-      ChildrenList: [
-        { Msg: 'Child 2-1', Ind: 22 },
-        { Msg: 'Child 2-2', Ind: 21 }
-      ]
-    }
-  ]) // 列表
+  const { open } = props
+  const pageSize = 10
+  const currentIndex = 1
+  const [messageList, setMessageList] = useState<IMessageDetail[]>([]) // 列表
   const [selectCheckbox, setSelectCheckbox] = useState<(string | number)[]>([]) // 选择Id
   const [msgTextVisible, setMsgTextVisible] = useState<boolean>(false) // 选择Id
+  const [replyItemID, setReplyItemID] = useState<number>(0) // 选择Id
+  const [replyParentId, setReplyreplyParentId] = useState<number>(0) // 选择Id
+  const [tabsAct, setTabsAct] = useState<number>(1) // 选择Id
   const [form] = Form.useForm()
   useEffect(() => {
     console.log(11)
-  }, [])
+    if (open) {
+      getColumnManageList(pageSize, currentIndex, tabsAct)
+    }
+  }, [open])
 
   // 列表
-  // const { run: getColumnCenterList } = useRequest(ColumnService.getColumnCenterList, {
-  //   manual: true,
-  //   formatResult: response => response.data.Data,
-  //   onSuccess: res => {
-  //     setMessageList(res)
-  //   }
-  // })
-  const handleChange = (checkedValues: number[], item: IMessageDetail) => {
+  const { run: getColumnManageList } = useRequest(ColumnService.getColumnManageList, {
+    manual: true,
+    formatResult: response => response.data.Data,
+    onSuccess: res => {
+      console.log(res)
+
+      setMessageList(res.List)
+    }
+  })
+
+  // 多选框的选择事件
+  const checkboxChange = (e: CheckboxValueType[], item: IMessageDetail) => {
     const updatedMessage = messageList.map(msg => {
-      if (msg.Id === item.Id) {
-        return { ...msg, CheckIds: checkedValues }
+      if (item.MessageId === msg.MessageId) {
+        if (e.length > 0 && item.CheckIds.length === 0) {
+          const arr = []
+          arr.push(item.MessageId)
+          item.ChildList.forEach(child => {
+            arr.push(child.MessageId)
+          })
+          return { ...msg, CheckIds: arr }
+        } else {
+          return { ...msg, CheckIds: [] }
+        }
+      } else {
+        return msg
       }
-      return msg
     })
-    if (checkedValues.length > 0) {
-      setSelectCheckbox([...selectCheckbox, item.Id])
-    } else {
-      setSelectCheckbox(selectCheckbox.filter(key => key !== item.Id))
-    }
+    let arr: number[] = []
+
+    updatedMessage.forEach(_ => {
+      arr = [...arr, ..._.CheckIds]
+    })
+    setSelectCheckbox(arr)
     setMessageList(updatedMessage)
   }
 
-  const handleChildChange = (checkedId: number, parentId: number) => {
-    const checkedValues: Array<number> = []
-    if (checkedId) {
-      messageList.forEach(item => {
-        if (item.Id === parentId) {
-          checkedValues.push(item.Id)
-          item.ChildrenList.forEach(child => checkedValues.push(child.Ind))
-        }
-      })
-      handleChange(checkedValues, messageList.find(item => item.Id === parentId)!)
-    }
-  }
   // 设置共开的按钮点击事件
   const setupClickHandler = () => {
-    console.log(selectCheckbox)
+    postMessagePublic(selectCheckbox, 1)
   }
+
   // 留言的确定事件
   const handleFinish = (value: { Content: string }) => {
     console.log(value)
+    applyCheckColumnNote(replyItemID, value.Content, replyParentId)
   }
   // 留言的取消事件
-
   const handleOnModalClose = () => {
     form.resetFields()
     setMsgTextVisible(false)
   }
-  // 算出留言回复的按钮
+  //删除留言回复的按钮
   const deleteHandle = (id: number) => {
     Modal.confirm({
       title: '提醒',
@@ -99,26 +96,25 @@ const ColumnMessage: React.FC<IColumnCenterProps> = props => {
       centered: true,
       closable: true,
       onOk: () => {
-        console.log('点击了')
-
-        // 这里就是删除的请求了
+        postMessageDelete(id)
       }
     })
   }
   // 点击回复的按钮
   const replyMsgHandler = (item: IMessageDetail) => {
-    console.log(item)
+    setReplyItemID(item.YanxuanSpecialId)
+    setReplyreplyParentId(item.MessageId)
     setMsgTextVisible(true)
   }
 
   // 点击了置顶按钮
   const toppingHandler = (item: IMessageDetail) => {
-    console.log(item)
+    const DoType = item.TopTime > 0 ? 0 : 1
+    postMessageTop(item.MessageId, DoType)
   }
 
   // 点击取消精选
   const cancelSelectionHandler = (item: IMessageDetail) => {
-    console.log(item)
     Modal.confirm({
       title: '提醒',
       content: '取消精选后,留言将回到普通留言栏下',
@@ -127,62 +123,79 @@ const ColumnMessage: React.FC<IColumnCenterProps> = props => {
       centered: true,
       closable: true,
       onOk: () => {
-        console.log('点击了')
-
-        // 这里就是删除的请求了
+        postMessagePublic([item.MessageId], 0)
       }
     })
   }
-
+  // 文章详情
+  const handleToDetail = (item: IMessageDetail) => {
+    window.open(`/column/detail/${item.YanxuanSpecialId}`)
+  }
   const items: TabsProps['items'] = [
     {
       key: '1',
       label: <span className="column-tabs">普通留言</span>,
       children: (
         <div className="columncenter-content">
-          <div>
-            <Button type="primary" size="small" disabled={!selectCheckbox.length} onClick={setupClickHandler}>
+          <div className="content-disclosure">
+            <span
+              className={selectCheckbox.length ? 'columncenter-content-btn' : 'columncenter-content-btn btn-disabled'}
+              onClick={setupClickHandler}
+            >
               设为公开
-            </Button>
-            留言设为公开后将在文章下展示
+            </span>
+            <span> 留言设为公开后将在文章下展示</span>
           </div>
-          {messageList.map(item => (
-            <div key={item.Id}>
-              <Checkbox
-                key={item.Id}
-                checked={item.CheckIds.length > 0} // 当Item有任何一个Child被选中时,Item被选中
-                onChange={e => {
-                  const allChildIds = (item.ChildrenList || []).map(child => child.Ind)
-                  // 当Item的Checkbox被点击时,选择或取消选择所有子项
-                  handleChange(e.target.checked ? allChildIds : [], item)
-                }}
-              >
-                {item.Msg}
-              </Checkbox>
-              <p>
-                <Button type="primary" size="small" onClick={() => replyMsgHandler(item)}>
-                  回复
-                </Button>
-              </p>
-              {item.ChildrenList?.map(child => (
-                <div key={child.Ind} style={{ marginLeft: 20 }}>
-                  <Checkbox
-                    disabled={item.CheckIds.length > 0}
-                    key={child.Ind}
-                    checked={item.CheckIds.includes(child.Ind)}
-                    onChange={() => handleChildChange(child.Ind, item.Id)}
-                  >
-                    {child.Msg}
+          {messageList.length > 0 &&
+            messageList.map(item => (
+              <div key={item.MessageId}>
+                <Checkbox.Group
+                  style={{ display: 'block' }}
+                  value={item.CheckIds}
+                  onChange={(e: CheckboxValueType[]) => {
+                    checkboxChange(e, item)
+                  }}
+                >
+                  <Checkbox value={item.MessageId}>
+                    <span style={{ fontWeight: '600' }}>{item.Content}</span>
                   </Checkbox>
-                  <p>
-                    <Button type="primary" size="small" onClick={() => deleteHandle(child.Ind)} danger>
-                      删除
-                    </Button>
-                  </p>
-                </div>
-              ))}
-            </div>
-          ))}
+                  <div className="columncenter-content-img-time">
+                    <img src={item.Headimgurl} alt="" />
+                    <span> {item.CreateTime}</span>
+                  </div>
+                  <div className="columncenter-content-item-title">
+                    <p className="item-title" onClick={() => handleToDetail(item)}>
+                      {item.SourceTitle}
+                    </p>
+                    <span className="columncenter-content-btn" onClick={() => replyMsgHandler(item)}>
+                      回复
+                    </span>
+                  </div>
+                  <div className="columncenter-content-child">
+                    {item.ChildList.length > 0 &&
+                      item.ChildList.map(child => (
+                        <div key={child.MessageId} style={{ marginLeft: 20 }}>
+                          <Checkbox disabled={item.CheckIds.includes(item.MessageId)} value={child.MessageId}>
+                            {child.Content}
+                          </Checkbox>
+                          <div className="child-img-time">
+                            <div className="columncenter-content-img-time">
+                              <img src={child.Headimgurl} alt="" />
+                              <span> {child.CreateTime}</span>
+                            </div>
+                            <span
+                              className="columncenter-content-btn detele-btn"
+                              onClick={() => deleteHandle(child.MessageId)}
+                            >
+                              删除
+                            </span>
+                          </div>
+                        </div>
+                      ))}
+                  </div>
+                </Checkbox.Group>
+              </div>
+            ))}
         </div>
       )
     },
@@ -192,25 +205,41 @@ const ColumnMessage: React.FC<IColumnCenterProps> = props => {
       label: <span className="column-tabs">公开的留言</span>,
       children: (
         <div className="columncenter-content">
-          {messageList.map(item => (
-            <div key={item.Id}>
-              {item.Msg}
-
-              <p>
-                <Button type="primary" size="small" onClick={() => toppingHandler(item)}>
-                  置顶
-                </Button>
-                <Button type="primary" size="small" onClick={() => cancelSelectionHandler(item)}>
-                  取消精选
-                </Button>
-              </p>
-              {item.ChildrenList?.map(child => (
-                <div key={child.Ind} style={{ marginLeft: 20 }}>
-                  {child.Msg}
+          {messageList &&
+            messageList.length > 0 &&
+            messageList.map(item => (
+              <div key={item.MessageId} style={{ marginBottom: 30 }}>
+                <div className="columncenter-content-disclosure"> {item.Content}</div>
+                <div className="columncenter-content-img-time">
+                  <span> {item.RealName}</span>
+                  <span style={{ marginLeft: 10 }}> {item.CreateTime}</span>
+                </div>
+                <div className="columncenter-content-item-title">
+                  <p className="item-title" onClick={() => handleToDetail(item)}>
+                    {item.SourceTitle}
+                  </p>
+                  <div>
+                    <span className="columncenter-content-btn" onClick={() => toppingHandler(item)}>
+                      {item.TopTime > 0 ? '已置顶' : '置顶'}
+                    </span>
+                    <span
+                      style={{ marginLeft: 10 }}
+                      className="columncenter-content-btn"
+                      onClick={() => cancelSelectionHandler(item)}
+                    >
+                      取消精选
+                    </span>
+                  </div>
                 </div>
-              ))}
-            </div>
-          ))}
+                {item.ChildList.length > 0 &&
+                  item.ChildList.map(child => (
+                    <div key={child.MessageId} style={{ marginLeft: 20 }}>
+                      <div className="columncenter-content-disclosure"> {child.Content}</div>
+                      {child.CreateTime}
+                    </div>
+                  ))}
+              </div>
+            ))}
         </div>
       )
     }
@@ -218,8 +247,10 @@ const ColumnMessage: React.FC<IColumnCenterProps> = props => {
 
   // 点击了tabs的change
   const onChange = (key: string) => {
-    // setMessageList()
-    // getColumnCenterList(Number(key))
+    setMessageList([])
+    setSelectCheckbox([])
+    setTabsAct(Number(key))
+    getColumnManageList(pageSize, currentIndex, Number(key))
   }
 
   // 关闭了侧边Drawer
@@ -227,6 +258,40 @@ const ColumnMessage: React.FC<IColumnCenterProps> = props => {
     props.onClose('openMessage')
   }
 
+  //  留言的回复
+  const { run: applyCheckColumnNote } = useRequest(ColumnService.postMessageAdd, {
+    manual: true,
+    onSuccess: res => {
+      res.data.Success ? message.success(res.data.Msg) : message.error(res.data.Msg || res.data.ErrMsg)
+      setMsgTextVisible(false)
+      getColumnManageList(pageSize, currentIndex, tabsAct)
+    }
+  })
+
+  //  删除留言的接口
+  const { run: postMessageDelete } = useRequest(ColumnService.postMessageDelete, {
+    manual: true,
+    onSuccess: res => {
+      res.data.Success ? message.success(res.data.Msg) : message.error(res.data.Msg || res.data.ErrMsg)
+      getColumnManageList(pageSize, currentIndex, tabsAct)
+    }
+  })
+  //  精选留言的接口
+  const { run: postMessagePublic } = useRequest(ColumnService.postMessagePublic, {
+    manual: true,
+    onSuccess: res => {
+      res.data.Success ? message.success(res.data.Msg) : message.error(res.data.Msg || res.data.ErrMsg)
+      getColumnManageList(pageSize, currentIndex, tabsAct)
+    }
+  })
+  //  置顶留言的接口
+  const { run: postMessageTop } = useRequest(ColumnService.postMessageTop, {
+    manual: true,
+    onSuccess: res => {
+      res.data.Success ? message.success(res.data.Msg) : message.error(res.data.Msg || res.data.ErrMsg)
+      getColumnManageList(pageSize, currentIndex, tabsAct)
+    }
+  })
   return (
     <Drawer
       title="留言管理"

+ 5 - 3
src/Column/components/LikesCollections.tsx

@@ -5,20 +5,22 @@ import { Modal } from 'antd'
 
 interface IColumnCenterProps {
   open: boolean // 是否打开
+  columnInfoFrom: any
   onClose: (type: 'Collection' | 'Fans') => void // 关闭
 }
 
 /**研选专栏 */
 const LikesCollections: React.FC<IColumnCenterProps> = props => {
-  const { open, onClose } = props
+  const { open, columnInfoFrom, onClose } = props
+  console.log(columnInfoFrom)
 
   const handleOnClose = () => {
     props.onClose('Collection')
   }
   return (
     <Modal title="获赞与收藏" open={open} onCancel={handleOnClose} footer={null}>
-      <div>当前获得点赞数 999+</div>
-      <div>当前获得收藏数 999+</div>
+      <div>当前获得点赞数 {columnInfoFrom?.CollectNum}</div>
+      <div>当前获得收藏数 {columnInfoFrom?.SpecialLikeCount}</div>
     </Modal>
   )
 }

+ 13 - 8
src/Column/css/ColumnDetail.module.scss

@@ -199,15 +199,20 @@
         color: #faa12f;
       }
     }
+    .detail-pv-collect-like {
+      width: 100%;
+      display: flex;
+      justify-content: space-between;
+    }
     .columndetail-collect {
-      position: fixed;
-      right: 50%;
-      bottom: 50px;
-      z-index: 2;
-      -moz-transform: translateX(50%);
-      -webkit-transform: translateX(50%);
-      -o-transform: translateX(50%);
-      transform: translateX(50%);
+      // position: fixed;
+      // right: 50%;
+      // bottom: 50px;
+      // z-index: 2;
+      // -moz-transform: translateX(50%);
+      // -webkit-transform: translateX(50%);
+      // -o-transform: translateX(50%);
+      // transform: translateX(50%);
       padding: 4px 20px;
       color: #ffffff;
       display: flex;

+ 69 - 0
src/Column/css/ColumnIndex.module.scss

@@ -282,6 +282,18 @@
             color: #faa12f;
           }
         }
+
+      }
+      .columncenter-content-btn {
+        display: inline-block;
+        text-align: center;
+        line-height: 29px;
+        width: 87px;
+        height: 29px;
+        border-radius: 42px;
+        background-color: #F1A84A;
+        color: #fff;
+        cursor: pointer;
       }
       .columncenter-tag {
         height: 22px;
@@ -292,6 +304,10 @@
         display: inline-block;
         margin-bottom: 10px;
       }
+      .columncenter-content-disclosure {
+        font-weight: 600;
+        margin: 10px 0;
+      }
       .columncenter-operate-btn {
         width: 87px;
         height: 29px;
@@ -301,6 +317,59 @@
         font-size: 16px;
         cursor: pointer;
       }
+      .content-disclosure {
+        margin: 20px 0;
+        color: #999;
+        .btn-disabled {
+          background: #e5efff;
+          // color: #faa12f;
+        }
+        :last-child {
+          display: inline-block;
+          margin-left: 8px;
+        }
+      }
+      .columncenter-content-img-time {
+        display: flex;
+        align-items: center;
+        margin: 10px 0 0;
+        font-size: 14px;
+        img {
+          display: inline-block;
+          width: 20px;
+          height: 20px;
+          margin-right: 10px;
+          border-radius: 50%;
+        }
+      }
+      .columncenter-content-item-title {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        .item-title {
+          font-size: 14px;
+          color: #F1A84A;
+          cursor: pointer;
+        }
+      }
+      .columncenter-content-child {
+        margin-left: 20px;
+        font-size: 14px;
+        margin-bottom: 40px;
+        .child-img-time {
+          display: flex;
+          align-items: center;
+          justify-content: space-between;
+          img {
+            display: inline-block;
+            width: 20px;
+            height: 20px;
+            margin-right: 10px;
+            border-radius: 50%;
+          }
+        }
+      }
+
       .detele-btn {
         background: #fff0ed;
         color: #d54941;

+ 81 - 0
src/Column/css/ColumnMessage.module.scss

@@ -0,0 +1,81 @@
+.columndetail-messge-select-ipt {
+  margin-top: 20px;
+  width: 100%;
+  height: 97px;
+  padding: 10px 20px;
+  border-radius: 3px;
+  background-color: #f0f1f3;
+  color: #666666;
+}
+.columndetail-messge-ipt-btn {
+  display: flex;
+  justify-content: flex-end;
+  margin-top: 20px;
+  span {
+    display: inline-block;
+    width: 87px;
+    height: 29px;
+    text-align: center;
+    line-height: 29px;
+    border-radius: 42px;
+    color: #fff;
+    background-color: #faa12f;
+    margin-left: 20px;
+    cursor: pointer;
+  }
+}
+.columndetail-message-list {
+  margin-top: 20px;
+  font-size: 14px;
+  color: #333;
+  .item-img-btn {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    img {
+      width: 20px;
+      height: 20px;
+      border-radius: 50%;
+      display: inline-block;
+      margin-right: 10px;
+    }
+    :first-child {
+      display: flex;
+      align-items: center;
+    }
+  }
+  .collect-icon {
+    font-size: 14px;
+    color: #ffc000;
+    margin-right: 5px;
+    vertical-align: middle;
+    cursor: pointer;
+  }
+  .delete-icon {
+    font-size: 14px;
+    cursor: pointer;
+    color: #d54941;
+  }
+}
+.columndetail-messge-child-list {
+  margin: 10px 0 20px 30px;
+  // display: flex;
+}
+.columndetail-messge-content {
+  margin: 10px 0;
+}
+
+.message-fans-content {
+  display: flex;
+  align-items: center;
+  margin-top: 10px;
+  img {
+    width: 20px;
+    height: 20px;
+    border-radius: 50px;
+  }
+  :nth-child(2) {
+    width: 60px;
+    margin: 0 20px 0 10px;
+  }
+}

+ 25 - 0
src/assets/columnmessage.svg

@@ -0,0 +1,25 @@
+<svg width="90" height="90" viewBox="0 0 90 90" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_1045_15406)">
+<rect x="8" y="7" width="68" height="68" rx="8" fill="#E7B453" shape-rendering="crispEdges"/>
+<g clip-path="url(#clip0_1045_15406)">
+<path d="M60.7545 54.3084C60.7545 55.355 60.3388 56.3588 59.5987 57.0988C58.8587 57.8388 57.855 58.2546 56.8084 58.2546H27.1947C26.1481 58.2546 25.1444 57.8388 24.4043 57.0988C23.6643 56.3588 23.2485 55.355 23.2485 54.3084V35.3041C23.2485 34.2575 23.6643 33.2538 24.4043 32.5137C25.1444 31.7737 26.1481 31.3579 27.1947 31.3579H56.8098C57.8564 31.3579 58.8601 31.7737 59.6002 32.5137C60.3402 33.2538 60.756 34.2575 60.756 35.3041V54.3055L60.7545 54.3084ZM25.9085 53.6215C25.9085 54.7104 26.7913 55.5946 27.8816 55.5946H56.1229C56.6462 55.5946 57.1481 55.3867 57.5181 55.0167C57.8881 54.6467 58.096 54.1448 58.096 53.6215V35.991C58.096 35.4677 57.8881 34.9658 57.5181 34.5958C57.1481 34.2258 56.6462 34.0179 56.1229 34.0179H27.8816C27.3583 34.0179 26.8565 34.2258 26.4864 34.5958C26.1164 34.9658 25.9085 35.4677 25.9085 35.991V53.6186V53.6215Z" fill="white"/>
+<path d="M29.2072 40.7746C29.2072 40.4218 29.3473 40.0835 29.5967 39.8341C29.8461 39.5847 30.1844 39.4446 30.5372 39.4446H31.4535C31.6282 39.4446 31.8012 39.479 31.9625 39.5458C32.1239 39.6126 32.2705 39.7106 32.394 39.8341C32.5175 39.9576 32.6155 40.1042 32.6823 40.2656C32.7491 40.427 32.7836 40.5999 32.7836 40.7746C32.7836 40.9492 32.7491 41.1222 32.6823 41.2835C32.6155 41.4449 32.5175 41.5915 32.394 41.715C32.2705 41.8385 32.1239 41.9365 31.9625 42.0033C31.8012 42.0702 31.6282 42.1046 31.4535 42.1046H30.5372C30.1844 42.1046 29.8461 41.9644 29.5967 41.715C29.3473 41.4656 29.2072 41.1273 29.2072 40.7746ZM36.1202 40.7746C36.1202 40.4218 36.2604 40.0835 36.5098 39.8341C36.7592 39.5847 37.0975 39.4446 37.4502 39.4446H52.3813C52.556 39.4446 52.7289 39.479 52.8903 39.5458C53.0516 39.6126 53.1983 39.7106 53.3218 39.8341C53.4453 39.9576 53.5432 40.1042 53.6101 40.2656C53.6769 40.427 53.7113 40.5999 53.7113 40.7746C53.7113 40.9492 53.6769 41.1222 53.6101 41.2835C53.5432 41.4449 53.4453 41.5915 53.3218 41.715C53.1983 41.8385 53.0516 41.9365 52.8903 42.0033C52.7289 42.0702 52.556 42.1046 52.3813 42.1046H37.4502C37.0975 42.1046 36.7592 41.9644 36.5098 41.715C36.2604 41.4656 36.1202 41.1273 36.1202 40.7746ZM28.9426 31.7189L39.8135 25.1463L41.1962 27.4336L30.3252 34.0076L28.9426 31.7203V31.7189ZM43.3461 27.3693L44.7302 25.082L55.5412 31.6195L54.1586 33.9068L43.3461 27.3693ZM29.2072 48.93C29.2072 48.5772 29.3473 48.2389 29.5967 47.9895C29.8461 47.7401 30.1844 47.6 30.5372 47.6H52.5742C52.927 47.6 53.2653 47.7401 53.5147 47.9895C53.7641 48.2389 53.9042 48.5772 53.9042 48.93C53.9042 49.2827 53.7641 49.621 53.5147 49.8704C53.2653 50.1198 52.927 50.26 52.5742 50.26H30.5372C30.3625 50.26 30.1896 50.2256 30.0282 50.1587C29.8668 50.0919 29.7202 49.9939 29.5967 49.8704C29.4732 49.7469 29.3752 49.6003 29.3084 49.4389C29.2416 49.2776 29.2072 49.1046 29.2072 48.93Z" fill="white"/>
+<path d="M42.0001 29.4625C41.4934 29.4628 40.9916 29.3633 40.5233 29.1697C40.0551 28.976 39.6296 28.692 39.2711 28.334C38.9126 27.9759 38.6281 27.5507 38.434 27.0827C38.2398 26.6146 38.1397 26.113 38.1394 25.6063C38.1391 25.0996 38.2386 24.5978 38.4323 24.1295C38.6259 23.6613 38.9099 23.2358 39.268 22.8773C39.6261 22.5188 40.0513 22.2343 40.5193 22.0402C40.9873 21.846 41.489 21.7459 41.9957 21.7456C43.019 21.745 44.0006 22.151 44.7247 22.8742C45.4487 23.5974 45.8557 24.5785 45.8563 25.6019C45.8569 26.6252 45.451 27.6068 44.7278 28.3309C44.0046 29.0549 43.0234 29.4619 42.0001 29.4625ZM42.0001 24.4056C41.8426 24.4053 41.6866 24.4361 41.541 24.4961C41.3954 24.556 41.263 24.6441 41.1515 24.7553C41.0399 24.8664 40.9513 24.9985 40.8908 25.1439C40.8303 25.2892 40.799 25.4451 40.7987 25.6026C40.7984 25.7601 40.8291 25.9161 40.8891 26.0617C40.9491 26.2073 41.0372 26.3396 41.1484 26.4512C41.2595 26.5628 41.3915 26.6513 41.5369 26.7119C41.6823 26.7724 41.8382 26.8037 41.9957 26.804C42.3135 26.8046 42.6186 26.6789 42.8438 26.4545C43.0689 26.2302 43.1957 25.9256 43.1963 25.6077C43.1969 25.2899 43.0712 24.9848 42.8469 24.7596C42.6225 24.5345 42.3179 24.4076 42.0001 24.4071V24.4056Z" fill="white"/>
+</g>
+</g>
+<defs>
+<filter id="filter0_d_1045_15406" x="0" y="0" width="90" height="90" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dx="3" dy="4"/>
+<feGaussianBlur stdDeviation="5.5"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.937255 0 0 0 0 0.807843 0 0 0 0 0.482353 0 0 0 0.42 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1045_15406"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1045_15406" result="shape"/>
+</filter>
+<clipPath id="clip0_1045_15406">
+<rect width="38" height="38" fill="white" transform="translate(23 21)"/>
+</clipPath>
+</defs>
+</svg>