import { http, httpDelete, httpGet, httpPost, httpPut } from '../../utils/http'
import { Schedule } from '../models/schedule'
import {
  Category,
  Content,
  DictType,
  MaterialDealer,
  MaterialDealerDetail,
  MaterialDealerHomePage,
  MaterialDealerRes,
  Comment,
  Activity,
  BannerMode,
  Banner,
  StudyTour,
  PointsOrder,
  UserAuthInfo,
  ResPageData,
  Message,
  Coupon,
  MyStudyTour,
} from './models'
import dayjs from 'dayjs'
import { pointsCancel } from '../../../../merchant/node_modules/@designer-hub/app/src/core/libs/requests'

export const getUserInfo = () =>
  httpGetMock<any>({
    avatar: 'https://via.placeholder.com/21x21',
    nickname: '苏小萌',
  })
export const getSchedule = () =>
  httpGetMock<Schedule>({
    name: '东京艺术设计研习营',
    cover: 'https://via.placeholder.com/375x297',
    items: [
      {
        title: '早稻田大学课程',
        time: '9:00',
        content:
          '是位于日本东京都新宿区的一所著名的私立大学。它由早稻田大学的创始人大隈重信于1882年创立，是日本超级国际化大学计划（Top Global University Project）选定的大学之一，也是日本顶尖的高等教育机构之一。',
        momentExample: 'https://via.placeholder.com/285x157',
        monentHint: '*说明：打卡地XX，收集上课素材',
      },
      {
        title: '早稻田大学博物馆参观',
        time: '11:00',
        content:
          '早稻田大学拥有多座博物馆，‌其中最著名的是早稻田大学历史馆。‌早稻田大学历史馆收藏、‌展示着著名校友在运动方面的杰出表现和成就，‌馆内的解说牌以日语和英语标示，‌展现了传统样式风格的建筑。',
        momentExample: 'https://via.placeholder.com/285x157',
        monentHint: '*说明：打卡地XX，收集上课素材',
      },
    ],
  })
export const getClassmates = () =>
  httpGetMock<any[]>([
    {
      avatar: 'https://via.placeholder.com/35x35',
      nickname: '苏小萌',
      level: '0',
    },
    {
      avatar: 'https://via.placeholder.com/35x35',
      nickname: '苏小萌',
      level: '0',
    },
    {
      avatar: 'https://via.placeholder.com/35x35',
    },
  ])
export const getClassmate = () =>
  httpGetMock<any>({
    title: '2023同学荟|清华空间环境艺术设计研修班 阔步向未来',
    author: {
      avatar: 'https://via.placeholder.com/35x35',
      nickname: '苏小萌',
      level: '0',
    },
    viewNum: 125,
    createdAt: dayjs('2024-07-15').toDate(),
    content: '<div>111111</div>',
  })
export const getMaterialDealers = () =>
  httpGetMock<any[]>([
    {
      name: 'IMOLA瓷砖',
      icon: 'https://via.placeholder.com/78x78',
      brandType: '进口品牌',
      type: '瓷砖',
      views: 1000,
      createdAt: dayjs('2024-07-15').toDate(),
    },
    {
      name: 'IMOLA瓷砖',
      icon: 'https://via.placeholder.com/78x78',
      brandType: '进口品牌',
      type: '瓷砖',
      views: 1000,
      createdAt: dayjs('2024-07-15').toDate(),
    },
  ])
export const weixinMiniAppLogin = (phoneCode: string, loginCode: string, state: string) =>
  httpPost<any>('/app-api/member/auth/weixin-mini-app-login', {
    phoneCode,
    loginCode,
    state,
  })
export const testLogin = (data: { mobile: string; password: string }) =>
  httpPost<any>('/app-api/member/auth/login2', data)
export const getMemberUserInfo = () => httpGet<any>('/app-api/member/user/get')
export const updateMemberUserInfo = (data = {}) => httpPut<any>('/app-api/member/user/update', data)
export const getByDictType = (
  type: string | 'member_channel_source' | 'member_spatial_expertise_type' | DictType,
) =>
  httpGet<
    {
      label: string
      value: string
      dictType: string
      status: number
    }[]
  >('/app-api/system/dict-data/type', { type })
export const validateReferrerCode = (data: { code: string }) =>
  httpPost('/app-api/member/user-auth-info/referrer-validate-code', {}, data)
export const createUserAuthInfo = (
  data: Partial<{
    id: number
    userId: number
    designerName: string
    gender: number
    mobile: string
    channelSource: number
    referrer: string
    employer: string
    spatialExpertiseType: number
    attachment: string
    auditStatus: number
    remark: string
  }>,
) => httpPost<any>('/app-api/member/user-auth-info/create', data)
/**
 * 获取设计师审核信息
 */
export const getUserAuthInfo = () => httpGet<UserAuthInfo>('/app-api/member/user-auth-info/get')
/**
 * 更新设计师审核信息
 */
export const updateUserAuthInfo = (
  data: Partial<{
    id: number
    userId: number
    designerName: string
    gender: number
    mobile: string
    channelSource: number
    referrer: string
    employer: string
    spatialExpertiseType: number
    attachment: string
    auditStatus: number
    remark: string
  }>,
) => httpPost('/app-api/member/user-auth-info/update', data)
export const getCircles = (query: { tagName?: string; circleType?: string; stylistId?: string }) =>
  httpGet<{
    list: {
      id: number
      headUrl?: string
      stylistId?: number
      stylistName?: string
      marketing?: string
      circleDesc?: string
      tagName?: string
      detailsType?: string
      detailsUrl?: string
      detailsDesc?: string
      circleType?: string
      spaceType?: string
      designStyle?: string
      spaceAddr?: string
      customerDemand?: string
      createTime: number
      bannerUrls: string[]
      shareCount?: number
      upvoteCount?: number
      ownUpvote: boolean
      reviewCount: number
    }[]
  }>('/app-api/member/circle/page', query)
export const createCircle = (data: Partial<Circle>) =>
  httpPost<any>('/app-api/member/circle/create', data)
export const getCircle = (id: string) =>
  httpGet<Partial<CircleRes>>('/app-api/member/circle/get', { id })
/**
 * 删除个人圈子
 */
export const deleteCircle = (id: string) => httpDelete('/app-api/member/circle/delete', { id })
export const shareCircle = (id: string) => httpGet('/app-api/member/circle/share', { id })
export const getCircleUpvotes = (id) =>
  httpGet<{
    total: number
    list: {
      id: number
      circleId: number
      userId: number
      upvpteTime: number
      createTime: number
      userName: string
    }[]
  }>('/app-api/member/circle-upvote/page', { circleId: id })
export const createCircleUpvote = (data: { circleId: number; userId: number; userName: string }) =>
  httpPost('/app-api/member/circle-upvote/create', data)
/**
 * 取消圈子点赞
 */
export const cancelCircleUpvote = (query: { id: string }) =>
  httpGet('/app-api/member/circle-upvote/delete', query)
export const createCircleReview = (
  data: Partial<{
    circleId: string
    userId: string | number
    userName: string
    reviewContent: string
    replayReviewId: string
  }>,
) => httpPost<any>('/app-api/member/circle-review/create', data)
export const deleteCircleReview = (id) => httpGet('/app-api/member/circle-review/delete', { id })
export const getCircleReviews = (query: { circleId: string }) =>
  httpGet<{
    list: Comment[]
  }>('/app-api/member/circle-review/getCircleReviewByCircleId', query)
export const createCircleReviewUpvote = (data: {
  circleId: number
  userId: number
  userName: string
  reviewId: number
}) => httpPost('/app-api/member/circle-review-upvote/create', data)
export const cancelCircleReviewUpvote = (query: {
  circleId: string
  userId: string
  reviewId: string
}) => httpGet('/app-api/member/circle-review-upvote/cancel', query)
export const getCircleReviewUpvotes = (query: { circleId: string; reviewId?: string }) =>
  httpGet('/app-api/member/circle-review-upvote/page', query)
export const getReviewReplay = (query: { id: string }) =>
  httpGet('/app-api/member/circle-review/getReviewReplay', query)
export const getTasks = (query) =>
  httpGet<{
    list: {
      id: number
      taskKey: string
      taskValue: string
      createTime: string
      sort: number
      status: number
    }[]
  }>('/app-api/basicsetting/set-task-center/page', query)
/**
 * 获取发布圈子任务状态
 */
export const getCircleTaskStatus = () => httpGet('/app-api/member/circle/taskIntegral')
export const getCircleTags = (query) =>
  httpGet<{
    list: {
      id: number
      labelName: string
      labelType: number
      usageCount: number
      creator: string
      createTime: number
    }[]
  }>('/app-api/basicsetting/set-label/page', query)
export const getSetIndexConfigs = (query = {}) =>
  httpGet<{
    list: {
      id: number
      name: string
      indexPromotionalVideoImage: string
      coverVideoImage: string
      sort: number
      playCount: number
      status: number
      createTime: string
    }[]
  }>('/app-api/basicsetting/set-index-config/page', query)

/**
 * 获取材料商列表
 * @param query {{brandLevel: '1'|'2'}}
 * @returns {Promise<*>}
 */
export const getMaterials = (query = {}) =>
  httpGet<{
    list: MaterialDealer[]
  }>('/app-api/member/materials/page', query)
export const getAppMaterials = () =>
  httpGet<MaterialDealerRes[]>('/app-api/member/materials/appMaterialsList')
export const getAppMaterial = (id: number) =>
  httpGet<MaterialDealerDetail>('/app-api/member/materials/queryHomePage', { materialsId: id })
export const getMaterialHomePage = (id: number) =>
  httpGet<Partial<MaterialDealerHomePage>>('/app-api/member/materials/queryHomePage', {
    materialsId: id,
  })
export const getMaterialDetail = (query: { id: string }) =>
  httpGet<MaterialDealerDetail>('/app-api/member/materials/getDetail', query)
export const createMaterialsReferrer = (data) =>
  httpPost('/app-api/member/materials-referrer/create', data)
export const getContents = (query: {
  contentType?: '1' | '2' | '3'
  contentCategory?: string
  pageSize?: string
}) => httpGet<{ list: Content[] }>('/app-api/member/content-manger/page', query)
export const getAllCategories = () =>
  httpGet<Category[]>('/app-api/member/categories/getAllCategories')
export const getContent = (query: { id: string }) =>
  httpGet<Content>('/app-api/member/content-manger/get', query)
export const getProductCategories = () =>
  httpGet<Category[]>('/app-api/member/product-type/getAllProductCategories', {})
export const getProducts = (query: { oneCategory?: string; secondCategory?: string }) =>
  httpGet<{
    list: {
      prodcutName: string
      productId: string
      needPoints: number
      points: number
      productPrice: string
      productCoverImgUrl: string
      productDetailsImgUrl: string
      contentDesc: string
      productType: string
      oneCategory: any
      secondCategory: string
    }[]
  }>('/app-api/member/product/page', query)
/**
 * 获取超值划算商品
 */
export const getFavourableProducts = () =>
  httpPost<
    {
      id: number
      prodcutName: string
      productId: string
      oneCategory: string
      oneCategoryName: string
      secondCategory: string
      secondCategoryName: string
      isRestrict: number
      productRepertory: number
      productPrice: string
      productType: number
      vendorId: number
      vendorName: string
      needPoints: number
      points: number
      gainType: number
      exchangeDesc: string
      productCoverImgUrl: string
      productDetailsImgUrl: string
      contentDesc: string
      status: number
      exchangeCount: number
      memberLevelIds: string
      memberLevelName: string
      favourablePoints: number
      favourableEndDate: string
      createTime: string
      updateTime: string
    }[]
  >('/app-api/member/product/listFavourableProduct')
export const getProduct = (id: string) =>
  httpGet<{
    id: number
    prodcutName: string
    productId: string
    oneCategory: any
    oneCategoryName: any
    secondCategory: string
    secondCategoryName: any
    isRestrict: number
    productRepertory: any
    productPrice: string
    productType: number
    vendorId: any
    vendorName: string
    needPoints: number
    points: number
    gainType: number
    exchangeDesc: string
    productCoverImgUrl: string
    productDetailsImgUrl: string
    contentDesc: string
    status: number
    exchangeCount: any
    memberLevelId: any
    memberLevelName: any
    favourablePoints: any
    favourableEndDate: any
    createTime: number
    updateTime: number
  }>('/app-api/member/product/detail', { productId: id })
export const getProductItemBuy = (query: { userId: number }) =>
  httpPost<{
    list: Partial<{
      productId: string
      prodcutName: string
      oneCategory: any
      secondCategory: string
      isRestrict: number
      productRepertory: any
      productPrice: string
      productType: string
      vendorId: any
      vendorName: string
      needPoints: number
      points?: number
      gainType: number
      exchangeDesc: any
      productCoverImgUrl: string
      productDetailsImgUrl: string
      contentDesc: string
      status: number
      exchangeCount: any
      memberLevelId: any
      memberLevelName: any
      favourablePoints?: number
      favourableEndDate?: number
      favourableStatus: number
      count: number
      createTime: any
      userId: number
      nums: number
    }>[]
    total: number
  }>('/app-api/member/product-item-buy/select', query)
/**
 * 商品添加到购物车
 */
export const createProductItemBuy = (data: {
  doList: {
    createTime?: string
    updateTime?: string
    creator?: string
    updater?: string
    deleted?: boolean
    id?: number
    productId?: string
    userId?: number
    points: number
    nums: number
  }[]
}) => httpPost('/app-api/member/product-item-buy/create', data)
/**
 * 从购物车删除商品
 */
export const deleteProductItemBuy = (data: {
  doList: {
    createTime?: string
    updateTime?: string
    creator?: string
    updater?: string
    deleted?: boolean
    id?: number
    productId?: string
    userId?: number
    nums?: number
  }[]
}) => httpPost('/app-api/member/product-item-buy/delete', data)
/**
 * 购物车商品数量增减
 */
// export const updateProductItemNums = (data: {
//   userId: number
//   productId: string
//   changingNum: number
// }) => httpPost('/app-api/member/product-item-buy/increase-or-decrease/product/num', data)
/**
 * 商城下单
 */
export const productPlacing = (data: {
  isShoppingCart: number
  userId: number
  list: {
    orderNo?: string
    productId?: string
    points?: number
    nums?: number
    productName: string
    orderImgUrl: string
    /**
     * 商家id
     */
    vendorId: string | number
  }[]
  couponList: {
    couponId: number
    brandPoints: number
  }[]
  totalsPoints?: number
  totalsCouponPoints?: number
  totalsCurrPoints?: number
}) => httpPost('/app-api/member/points-order/placing', data)
/**
 * 订单结算
 */
export const orderPay = (data: {
  isShoppingCart: number
  userId: number
  list: {
    orderNo?: string
    productId?: string
    points?: number
    nums?: number
  }[]
  couponList: {
    couponId: number
    brandPoints: number
  }[]
  totalsPoints?: number
  totalsCouponPoints?: number
  totalsCurrPoints?: number
}) => httpPost(`/app-api/member/points-order/placingPay`, data)
/**
 * 积分结账
 */
export const pointsPay = (data: { userId: number; points: number; vendorId: number }) =>
  httpPost('/app-api/member/points-order/orderAndPaymentCompleted', data)
export const getPointsOrders = (query) =>
  httpGet<{
    list: PointsOrder[]
    total: number
  }>('/app-api/member/points-order/page', query)
export const getPointsOrder = (id) =>
  httpGet<Partial<PointsOrder>>('/app-api/member/points-order/get', { id })
/**
 * 取消订单
 */
export const cancelOrder = (id) => httpGet('/app-api/member/points-order/orderCancel', { id })
export const getActivities = (query) =>
  httpGet<{
    list: Activity[]
  }>('/app-api/member/activity/page', query)
export const getActivity = (id: string) =>
  httpGet<Partial<Activity>>('/app-api/member/activity/get', { id })
export const activitySignup = (data: { id: number }) =>
  httpPost('/app-api/member/activity/signup', data)
/**
 * 获取活动报名列表
 */
export const getActivitySignups = (query: { activityId: string }) =>
  httpGet<{
    list: {
      id: number
      activityId: number
      userId: number
      applyTime: number
      applyType: number
      applyStatus: number
      applyPoints: any
      isJoin: string
      createTime: number
      name: string
      headImgUrl: string
      mobile: string
      brokerId: any
      brokerName: string
      memberLevelId: number
      memberLevelName: any
    }[]
    total: number
  }>('/app-api/member/activity/signup/page', query)
/**
 * 获取游学列表
 */
export const getStudyTours = (query) =>
  httpGet<{ list: StudyTour[]; total: number }>('/app-api/member/app-study-abroad/page', query)
/**
 * 获取游学详情
 */
export const getStudyTour = (id: string) =>
  httpGet<StudyTour>('/app-api/member/app-study-abroad/get', { id })
/**
 * 游学报名
 */
export const studyTourSignup = (data: { id: number }) =>
  httpPost('/app-api/member/app-study-abroad/signup', data)
/**
 * 获取游学报名列表
 */
export const getStudyTourSignups = (query: { studyId: string }) =>
  httpGet<{
    list: {
      id: number
      activityId: number
      userId: number
      applyTime: number
      applyType: number
      applyStatus: number
      applyPoints: any
      isJoin: string
      createTime: number
      name: string
      headImgUrl: string
      mobile: string
      brokerId: any
      brokerName: string
      memberLevelId: number
      memberLevelName: any
    }[]
    total: number
  }>('/app-api/member/app-study-abroad/signup/page', query)
/**
 * 获取Banner列表
 */
export const getBanners = (query: { mode: BannerMode }) =>
  httpGet<Banner[]>('/app-api/member/banner/get-by-mode', query)
/**
 * 获取消息列表
 */
export const getMessages = (query) =>
  httpGet<ResPageData<Message>>('/app-api/member/message-manage/page', query)
/**
 * 删除消息
 */
export const deleteMessage = (id: string) =>
  httpPost('/app-api/member/message-manage/delete', {}, { id })
/**
 * 更新消息
 */
export const updateMessage = (data: Partial<Message>) =>
  httpPut('/app-api/member/message-manage/update', data)
/**
 * 积分订单取消
 */
export const orderPointsCancel = (query: { id: string; cancelReason: string }) =>
  httpGet('/app-api/member/points-details/points-cancel', query)
/**
 * 积分订单确认
 */
export const orderPointsSubmit = (data: { id: number; userId: number; couponUserId: number }) =>
  httpPost('/app-api/member/points-details/confirm', data)
/**
 * 获取Banner
 */
export const getBanner = (id) => httpGet<Banner>('/app-api/member/banner/get-by-id', { id })
/**
 * 获取积分明细列表
 */
export const getPoints = (query) =>
  httpGet<{
    list: {
      id: number
      pointsType: string
      typeName: string
      pointsCategory: string
      categoryName: string
      sourceId: number
      name: string
      pointsStauts: string
      points: number
      orderMoney: string
      materialsId: number
      materialsBrand: string
      stylistId: number
      brokerId: number
      stylistName: string
      brokerName: string
      generateTime: string
      verifyTime: string
      completeTime: string
      turnDownTime: string
      cancelTime: string
      cancelReason: string
      turnDownReason: string
      remark: string
      couponId: number
      orderNo: string
      createTime: string
    }[]
    total: number
  }>(`/app-api/member/points-details/pageAllByYear/${query.year}`, query)
/**
 * 获取会员等级列表
 */
export const getMemberLevels = () =>
  httpGet<
    {
      id: number
      memberLevel: number
      memberLevelName: string
      upgradeCriteria: number
      points: number
      retentionDaysCriteria: number
      retentionDays?: number
      memberBgImage: string
      associatedMemberRights: string
      associatedMemberRightsName: any
      status: number
      createTime: number
    }[]
  >('/app-api/basicsetting/set-member-level-config/list')
/**
 * 获取设计师信息
 */
export const getDesignerInfo = (userId) =>
  httpGet<
    Partial<{
      id: number
      userId: number
      brokerId: number
      brokerName: string
      status: string
      authTime: number
      points: number
      headImgUrl: string
      shareCount: number
      viewCount: number
      winCustomerCount: number
      serviceYears: string
      serviceCustomerCount: number
      designFee: string
      memberValidTime: number
      personalIdentity: string
      designDesc: string
      followFocus: string
      homePageUrl: string
      sharePageUrl: string
      retryStatus: number
      videoNumber: string
    }>
  >('/app-api/member/designer/getDesignerInfo', { userId })
/**
 * 更新设计师信息
 */
export const updateDesignerInfo = (data) =>
  httpPost<any>('/app-api/member/designer/updateDesignerInfo', data)
/**
 * 预约设计师
 */
export const reserveDesigner = (data: {
  stylistId: number
  stylistName: string
  appointmentName: string
  appointmentPhone: string
}) => httpPost<any>('/app-api/member/designer/reserveDesigner', data)
/**
 * 创建设计师主页浏览记录
 */
export const createBrowseHistory = (data: {
  stylistId: number
  /**
   * 业务id
   */
  bizId?: string
  /**
   * 业务类型,可用值:分享,获客,浏览
   */
  bizType?: string
  /**
   * 时长：单位-秒
   */
  duration?: string
}) => httpPost('/app-api/member/designer/browseHistory', data)
export const getBrowseHistories = (query) =>
  httpGet<
    ResPageData<{
      createTime: number
      updateTime: number
      creator: string
      updater: string
      deleted: boolean
      id: number
      stylistId: number
      stylistName: string
      bizId: any
      bizType: string
      duration: string
      creatorName: string
    }>
  >('/app-api/member/designer/getBrowseHistory', query)
/**
 * 通过ID获取用户信息
 */
export const getUserInfoById = (id) =>
  httpGet<
    Partial<{
      mobile: string
      status: string
      nickname: string
      avatar: string
      name: string
      sex: string
      areaId: number
      areaName: string
      birthday: string
      mark: string
      tagIds: string
      levelId: number
      groupId: number
      id: number
      registerIp: string
      loginIp: string
      loginDate: string
      createTime: string
      point: number
      totalPoint: number
      tagNames: string
      levelName: string
      groupName: string
      experience: number
    }>
  >('/app-api/member/user/getByUserId', { id })
/**
 * 获取会员等级配置
 */
export const getAppMemberLevelConfigs = () =>
  httpGet<
    {
      id: number
      memberLevel: number
      memberLevelName: string
      upgradeCriteria: number
      points: number
      retentionDaysCriteria: number
      retentionDays: number
      memberBgImage: string
      associatedMemberRights: string
      associatedMemberRightsName: string
      status: number
      createTime: string
      setMemberRights: {
        createTime: string
        updateTime: string
        creator: string
        updater: string
        deleted: boolean
        id: number
        rightsName: string
        rightsType: number
        rightsImage: string
        rightsDescription: string
        associatedMemberRightsLevel: string
        status: number
      }[]
    }[]
  >('/app-api/basicsetting/app-set-member-level-config/listAndRights')
/**
 * 到店打卡
 */
export const storeAndPunchIn = (data: { id: number }) =>
  http<boolean>({
    url: '/app-api/member/user-auth-info/storeAndPunchIn',
    data,
    hideErrorToast: true,
    method: 'POST',
  })
/**
 * 获取优惠券
 */
export const getCoupons = (query) =>
  httpGet<ResPageData<Coupon>>('/app-api/member/coupon-user/page', query)
/**
 * 获取商品优惠券
 */
export const getProductCoupons = (query) =>
  httpGet<Coupon[]>('/app-api/member/coupon-user/coupon-user-by-product-ids-page', query)
/**
 * 获取积分券
 */
export const getPointsCoupons = (query) =>
  httpGet<Coupon[]>('/app-api/member/coupon-user/coupon-user-by-point-ids-page', query)
/**
 * 获取已报名的游学
 */
export const getMyStudyTours = (query = {}) =>
  httpGet<MyStudyTour[]>('/app-api/member/app-study-abroad/getSignUpStudyAbroad', query)
export const refreshToken = (refreshToken: string) =>
  httpPost<any>('/app-api/member/auth/refresh-token', {}, { refreshToken })
export const httpGetMock = <T>(data: T) =>
  new Promise<IResData<T>>((resolve) => resolve({ code: 1, msg: '', data } as IResData<T>))
export interface Circle {
  headUrl: string
  stylistId: string | number
  stylistName: string
  marketing: string
  circleDesc: string
  tagName: string
  detailsType: string
  detailsUrl: string
  detailsDesc: string
  circleType: string
  spaceType: string
  designStyle: string
  spaceAddr: string
  customerDemand: string
  bannerUrls: string[]
}
export interface CircleRes {
  id: number
  headUrl?: string
  stylistId?: number
  stylistName?: string
  marketing?: string
  circleDesc?: string
  tagName?: string
  detailsType?: string
  detailsUrl?: string
  detailsDesc?: string
  circleType?: string
  spaceType?: string
  designStyle?: string
  spaceAddr?: string
  customerDemand?: string
  createTime: number
  bannerUrls: string[]
  shareCount?: number
  upvoteCount?: number
  ownUpvote: boolean
  reviewCount: number
}
