<template> 
 | 
  <a-card class="general-card" :title="$t('userInfo.title.latestActivity')"> 
 | 
    <template #extra> 
 | 
      <a-link>{{ $t('userInfo.viewAll') }}</a-link> 
 | 
    </template> 
 | 
    <a-list :bordered="false"> 
 | 
      <a-list-item 
 | 
        v-for="activity in activityList" 
 | 
        :key="activity.id" 
 | 
        action-layout="horizontal" 
 | 
      > 
 | 
        <a-skeleton 
 | 
          v-if="loading" 
 | 
          :loading="loading" 
 | 
          :animation="true" 
 | 
          class="skeleton-item" 
 | 
        > 
 | 
          <a-row :gutter="6"> 
 | 
            <a-col :span="2"> 
 | 
              <a-skeleton-shape shape="circle" /> 
 | 
            </a-col> 
 | 
            <a-col :span="22"> 
 | 
              <a-skeleton-line :widths="['40%', '100%']" :rows="2" /> 
 | 
            </a-col> 
 | 
          </a-row> 
 | 
        </a-skeleton> 
 | 
        <a-list-item-meta 
 | 
          v-else 
 | 
          :title="activity.title" 
 | 
          :description="activity.description" 
 | 
        > 
 | 
          <template #avatar> 
 | 
            <a-avatar> 
 | 
              <img :src="activity.avatar" /> 
 | 
            </a-avatar> 
 | 
          </template> 
 | 
        </a-list-item-meta> 
 | 
      </a-list-item> 
 | 
    </a-list> 
 | 
  </a-card> 
 | 
</template> 
 | 
  
 | 
<script lang="ts" setup> 
 | 
  import { ref } from 'vue'; 
 | 
  import { queryLatestActivity, LatestActivity } from '@/api/user-center'; 
 | 
  import useLoading from '@/hooks/loading'; 
 | 
  
 | 
  const { loading, setLoading } = useLoading(true); 
 | 
  const activityList = ref<LatestActivity[]>(new Array(7).fill({})); 
 | 
  const fetchData = async () => { 
 | 
    try { 
 | 
      const { data } = await queryLatestActivity(); 
 | 
      activityList.value = data; 
 | 
    } catch (err) { 
 | 
      // you can report use errorHandler or other 
 | 
    } finally { 
 | 
      setLoading(false); 
 | 
    } 
 | 
  }; 
 | 
  fetchData(); 
 | 
</script> 
 | 
  
 | 
<style scoped lang="less"> 
 | 
  .latest-activity { 
 | 
    &-header { 
 | 
      display: flex; 
 | 
      align-items: center; 
 | 
      justify-content: space-between; 
 | 
    } 
 | 
  } 
 | 
  .general-card :deep(.arco-list-item) { 
 | 
    padding-left: 0; 
 | 
    border-bottom: none; 
 | 
    .arco-list-item-meta-content { 
 | 
      flex: 1; 
 | 
      padding-bottom: 27px; 
 | 
      border-bottom: 1px solid var(--color-neutral-3); 
 | 
    } 
 | 
    .arco-list-item-meta-avatar { 
 | 
      padding-bottom: 27px; 
 | 
    } 
 | 
    .skeleton-item { 
 | 
      margin-top: 10px; 
 | 
      padding-bottom: 20px; 
 | 
      border-bottom: 1px solid var(--color-neutral-3); 
 | 
    } 
 | 
  } 
 | 
</style> 
 |