ソースを参照

feat(share): 实现自定义分享功能

- 新增 useShare 钩子处理分享逻辑- 更新 moment、home 等页面的分享实现
- 添加 ShareActionSheet 组件用于展示分享选项
- 新增微信好友和朋友圈分享图标
EvilDragon 2 ヶ月 前
コミット
c937bc9ccb

+ 23 - 8
packages/app/src/components/moment-item.vue

@@ -22,7 +22,11 @@ const props = withDefaults(
   }>(),
   {},
 )
-const emits = defineEmits<{ delete: [id: number]; like: [options: any] }>()
+const emits = defineEmits<{
+  delete: [id: number]
+  like: [options: any]
+  share: [options: CircleRes]
+}>()
 const router = useRouter()
 const { features, clickByPermission } = usePermissions()
 const memberLevelsStore = useMemberLevelsStore()
@@ -169,19 +173,30 @@ onMounted(async () => {
       </view>
       <view class="flex justify-between">
         <div>
-          <button
-            open-type="share"
-            class="bg-transparent! p-0!"
-            :data-options="options"
-            @click.stop
-          >
+          <template v-if="features.shareMoment">
+            <button
+              open-type="share"
+              class="bg-transparent! p-0!"
+              :data-options="options"
+              @click.stop
+            >
+              <view
+                class="flex items-center text-[rgba(0,0,0,0.85)] text-3.5 font-400 line-height-5.5"
+              >
+                <wd-img width="15" height="15" src="/static/svgs/share.svg"></wd-img>
+                <view class="ml-1">{{ props.options.shareCount }}</view>
+              </view>
+            </button>
+          </template>
+          <template v-else>
             <view
+              @click.stop="clickByPermission('share', () => emits('share', options))"
               class="flex items-center text-[rgba(0,0,0,0.85)] text-3.5 font-400 line-height-5.5"
             >
               <wd-img width="15" height="15" src="/static/svgs/share.svg"></wd-img>
               <view class="ml-1">{{ props.options.shareCount }}</view>
             </view>
-          </button>
+          </template>
         </div>
         <view class="flex items-center text-[rgba(0,0,0,0.85)] text-3.5 font-400 line-height-5.5">
           <wd-img width="15" height="15" src="/static/svgs/comment.svg"></wd-img>

+ 8 - 1
packages/app/src/composables/permissions.ts

@@ -82,7 +82,13 @@ export const usePermissions = () => {
    * 按钮操作权限
    */
   const clickByPermission = (
-    name: 'wechatAgentExchange' | 'caseExchange' | 'mallExchange' | 'thumbsUp' | 'exchange',
+    name:
+      | 'wechatAgentExchange'
+      | 'caseExchange'
+      | 'mallExchange'
+      | 'thumbsUp'
+      | 'exchange'
+      | 'share',
     callback: () => void,
   ) => {
     const features = [
@@ -96,6 +102,7 @@ export const usePermissions = () => {
        * 活动游学兑换
        */
       { name: 'exchange', meta: { canNotLogin: false, canNotDesigner: false } },
+      { name: 'share', meta: { canNotLogin: false, canNotDesigner: false } },
     ]
     const feature = features.find((item) => item.name === name)
     if (feature) {

+ 55 - 0
packages/app/src/composables/share.ts

@@ -0,0 +1,55 @@
+import { shareCircle, shareDesignerHome } from '@/core/libs/requests'
+import { messages } from '@/core/libs/messages'
+
+export const useShare = () => {
+  const shareAppMessage = async ({ from, target }) => {
+    // const res: Page.CustomShareContent = {}
+    // if (from === 'button') {
+    //   console.log(target)
+    //
+    //   if (target.dataset.type === 'homepage') {
+    //     res.title = `${userInfo.value.nickname}: “${designerInfo.value.designDesc}”`
+    //     res.imageUrl = designerInfo.value?.sharePageUrl
+    //     res.path = `/pages/mine/homepage/index?id=${id.value}&isShared=true`
+    //   } else {
+    //     await shareCircle(target.dataset.options.id)
+    //     res.path = `/pages/home/moment/index?id=${target.dataset.options.id}&isShared=true`
+    //     res.imageUrl = target.dataset.options.bannerUrls[0]
+    //     res.title = `${target.dataset.options.stylistName}: ${target.dataset.options.circleDesc}`
+    //   }
+    // }
+    // if (from === 'menu') {
+    //   res.title = `${userInfo.value.nickname}: “${designerInfo.value.designDesc}”`
+    //   res.imageUrl = designerInfo.value?.sharePageUrl
+    //   res.path = `/pages/mine/homepage/index?id=${id.value}&isShared=true`
+    // }
+    // return res
+
+    console.log('from', from)
+    console.log('target', target)
+    const res: Page.CustomShareContent = {}
+    if (from === 'button') {
+      if (target.dataset.type === 'homepage') {
+        await shareDesignerHome({
+          stylistId: target.dataset.options.homepageId,
+          bizId: target.dataset.options.userId,
+        })
+        res.title = target.dataset.shareContent.title
+        res.imageUrl = target.dataset.shareContent.imageUrl
+        res.path = target.dataset.shareContent.path
+      } else {
+        if (['1', '2'].includes(target.dataset.options.circleType)) {
+          await shareCircle(target.dataset.options.id)
+        }
+        res.path = `/pages/home/moment/index?id=${target.dataset.options.id}&isShared=true`
+        res.imageUrl = target.dataset.options.bannerUrls[0]
+        res.title = `${target.dataset.options.stylistName}: ${target.dataset.options.circleDesc}`
+      }
+    }
+    if (from === 'menu') {
+      res.title = messages.home.shareTitle
+    }
+    return res
+  }
+  return { shareAppMessage }
+}

+ 10 - 1
packages/app/src/core/libs/requests.ts

@@ -22,7 +22,8 @@ import {
   Certificate,
   UserBasicInfo,
   ActivitySignUp,
-  Product, ConfirmOrder,
+  Product,
+  ConfirmOrder,
 } from './models'
 import dayjs from 'dayjs'
 
@@ -201,6 +202,14 @@ export const getCircle = (id: string) =>
  */
 export const deleteCircle = (id: string) => httpDelete('/app-api/member/circle/delete', { id })
 export const shareCircle = (id: string) => httpGet('/app-api/member/circle/share', { id })
+/**
+ * /app-api/member/designer/shareHomeHistory 分享设计师主页
+ */
+export const shareDesignerHome = (data: {
+  stylistId: number
+  bizId: number
+  // shareType:
+}) => httpPost('/app-api/member/designer/shareHomeHistory', data)
 export const getCircleUpvotes = (id) =>
   httpGet<{
     total: number

+ 50 - 0
packages/app/src/pages/common/components/share-action-sheet.vue

@@ -0,0 +1,50 @@
+<script setup lang="ts">
+import timeline from '@designer-hub/assets/src/libs/assets/timeline'
+import wechat from '@designer-hub/assets/src/libs/assets/wechat'
+
+const modelValue = defineModel({
+  default: false,
+  type: Boolean,
+})
+const props = withDefaults(
+  defineProps<{
+    options?: any
+  }>(),
+  {},
+)
+const emits = defineEmits<{ select: [action: string | 'share' | 'timeline'] }>()
+const actions = [
+  { icon: wechat, title: '微信好友', value: 'share' },
+  { icon: timeline, title: '朋友圈', value: 'timeline' },
+]
+const handleAction = (it: { value: string }) => {
+  modelValue.value = false
+  emits('select', it.value)
+}
+</script>
+
+<template>
+  <wd-action-sheet v-model="modelValue" title="分享到" @close="modelValue = false">
+    <view class="" style="">
+      <div class="flex justify-around">
+        <template v-for="(it, index) in actions" :key="index">
+          <button :open-type="it.value" :data-options="options">
+            <div class="flex flex-col items-center gap-2" @click="handleAction(it)">
+              <div class="w-12 h-12 relative">
+                <wd-img width="100%" height="100%" :src="it.icon"></wd-img>
+              </div>
+              <div class="text-black/60 text-xs font-normal font-['PingFang SC'] leading-relaxed">
+                {{ it.title }}
+              </div>
+            </div>
+          </button>
+        </template>
+      </div>
+      <div>
+        <wd-button block type="text" @click="modelValue = false">取消</wd-button>
+      </div>
+    </view>
+  </wd-action-sheet>
+</template>
+
+<style scoped lang="scss"></style>

+ 25 - 16
packages/app/src/pages/home/index.vue

@@ -39,6 +39,8 @@ import { Activity, StudyTour } from '../../core/libs/models'
 import PageHelperEvo from '@/components/page-helper-evo.vue'
 import { useMessage } from 'wot-design-uni'
 import { useHonorDialog } from '../../composables/honor-dialog'
+import ShareActionSheet from '@/pages/common/components/share-action-sheet.vue'
+import { useShare } from '@/composables/share'
 
 defineOptions({
   name: 'Home',
@@ -48,6 +50,7 @@ const { show } = useHonorDialog()
 const userStore = useUserStore()
 const { userInfo } = storeToRefs(userStore)
 const { features, isLogined } = usePermissions()
+const { shareAppMessage } = useShare()
 const pageHelperRef = ref<ComponentExposed<typeof PageHelperEvo>>()
 const { data: indexConfigsData, run: setIndexConfigsData } = useRequest(
   () => getSetIndexConfigs(),
@@ -62,6 +65,9 @@ const autoplay = ref(true)
 const homeBannerRef = ref<ComponentExposed<typeof HomeBanner>[]>()
 const hotActivities =
   ref<{ type: 'studyTour' | 'activity'; data: StudyTour & Activity; startAt: string | number }[]>()
+const shareActionState = ref(false)
+// const shareRef = ref<Comp>()
+const shareOptions = ref()
 const currentStudyTour = computed(() =>
   studyTours.value.find(
     (it) => dayjs(it.studyStartTime).isBefore(dayjs()) && dayjs(it.studyEndTime).isAfter(dayjs()),
@@ -103,6 +109,10 @@ const handlePlay = async (id) => {
   autoplay.value = false
   await updateSetIndexConfig(body)
 }
+const handleShare = (options: any) => {
+  shareOptions.value = options
+  shareActionState.value = true
+}
 onShow(async () => {
   await pageHelperRef.value?.reload()
   const reqs = [setHotActivities()]
@@ -122,21 +132,15 @@ onHide(() => {
   // autoplay.value = true
   homeBannerRef.value?.[swiperCurrent.value]?.videoContext.pause()
 })
-onShareAppMessage(async ({ from, target }) => {
-  console.log('from', from)
-  console.log('target', target)
-  const res: Page.CustomShareContent = {}
-  if (from === 'button') {
-    await shareCircle(target.dataset.options.id)
-    res.path = `/pages/home/moment/index?id=${target.dataset.options.id}&isShared=true`
-    res.imageUrl = target.dataset.options.bannerUrls[0]
-    res.title = `${target.dataset.options.stylistName}: ${target.dataset.options.circleDesc}`
-  }
-  if (from === 'menu') {
-    res.title = messages.home.shareTitle
-  }
-  return res
-})
+onShareAppMessage(shareAppMessage)
+// onShareTimeline(async ({from, target}) => {
+//   const res: Page.ShareTimelineContent = {}
+//   if (from === 'button') {
+//     // await shareCircle(target.dataset.options.id)
+//     // res.path = `/pages/home/moment/index?id=${target.dataset.options.id}&isShared=true`
+//   }
+//   return res
+// })
 </script>
 
 <template>
@@ -208,13 +212,18 @@ onShareAppMessage(async ({ from, target }) => {
           <template #default="{ source }">
             <template v-for="it of source.list" :key="it.id">
               <view class="my-3">
-                <MomentItem :options="it" @like="handleLike"></MomentItem>
+                <MomentItem :options="it" @like="handleLike" @share="handleShare"></MomentItem>
               </view>
             </template>
           </template>
         </PageHelperEvo>
       </view>
     </view>
+    <ShareActionSheet
+      ref="shareRef"
+      v-model="shareActionState"
+      :options="shareOptions"
+    ></ShareActionSheet>
   </view>
 </template>
 

+ 34 - 16
packages/app/src/pages/home/moment/index.vue

@@ -35,9 +35,11 @@ import Card from '@/components/card.vue'
 import { get } from 'radash'
 import { DictType } from '../../../core/libs/models'
 import MomentVideo from '@/pages/home/components/moment-video.vue'
-import {ComponentExposed} from "vue-component-type-helpers";
+import { ComponentExposed } from 'vue-component-type-helpers'
+import { useShare } from '@/composables/share'
 
 const { features, clickByPermission } = usePermissions()
+const { shareAppMessage } = useShare()
 const userStore = useUserStore()
 const { userInfo } = storeToRefs(userStore)
 const router = useRouter()
@@ -164,19 +166,7 @@ onLoad(async (query: { id: string; isShared?: boolean }) => {
 //   await shareCircle(id.value)
 //   return { title: data.value?.circleDesc }
 // })
-onShareAppMessage(async ({ from, target }) => {
-  console.log('from', from)
-  console.log('target', target)
-  // if (!features.value.shareMoment) {
-  //   return handleShareClick()
-  // }
-  const res: Page.CustomShareContent = {}
-  await shareCircle(id.value)
-  res.path = `/pages/home/moment/index?id=${id.value}&isShared=true`
-  res.imageUrl = data.value?.bannerUrls[0]
-  res.title = `${data.value?.stylistName}: ${data.value?.circleDesc}`
-  return res
-})
+onShareAppMessage(shareAppMessage)
 </script>
 <template>
   <view class="bg-white flex-grow">
@@ -395,16 +385,44 @@ onShareAppMessage(async ({ from, target }) => {
         </div>
         <view class="flex justify-around flex-1">
           <div>
-            <button open-type="share" class="bg-transparent! p-0!">
+            <template v-if="features.shareMoment">
+              <button
+                open-type="share"
+                class="bg-transparent! p-0!"
+                :data-options="data"
+                @click.stop
+              >
+                <view
+                  class="flex flex-col items-center text-[rgba(0,0,0,0.85)] text-3.5 font-400 line-height-5.5"
+                >
+                  <div class="w-4.5 h-4.5 flex items-center justify-center">
+                    <wd-img width="15" height="15" src="/static/svgs/share.svg"></wd-img>
+                  </div>
+                  <view class="">{{ data?.shareCount || 0 }}</view>
+                </view>
+              </button>
+            </template>
+            <template v-else>
+              <!--              <view-->
+              <!--                @click.stop="clickByPermission('share', () => emits('share', options))"-->
+              <!--                class="flex items-center text-[rgba(0,0,0,0.85)] text-3.5 font-400 line-height-5.5"-->
+              <!--              >-->
+              <!--                <wd-img width="15" height="15" src="/static/svgs/share.svg"></wd-img>-->
+              <!--                <view class="ml-1">{{ props.options.shareCount }}</view>-->
+              <!--              </view>-->
               <view
                 class="flex flex-col items-center text-[rgba(0,0,0,0.85)] text-3.5 font-400 line-height-5.5"
+                @click.stop="clickByPermission('share', () => run())"
               >
                 <div class="w-4.5 h-4.5 flex items-center justify-center">
                   <wd-img width="15" height="15" src="/static/svgs/share.svg"></wd-img>
                 </div>
                 <view class="">{{ data?.shareCount || 0 }}</view>
               </view>
-            </button>
+            </template>
+
+            <!--            <button open-type="share" class="bg-transparent! p-0!">-->
+            <!--            </button>-->
           </div>
           <view
             class="flex flex-col items-center text-[rgba(0,0,0,0.85)] text-3.5 font-400 line-height-5.5"

+ 14 - 25
packages/app/src/pages/mine/homepage/index.vue

@@ -34,8 +34,10 @@ import { usePermissions } from '../../../composables/permissions'
 import ImageEvo from '@/components/image-evo.vue'
 import more from '@designer-hub/assets/src/libs/assets/more'
 import qrCode from '@designer-hub/assets/src/libs/assets/qrCode'
+import {useShare} from "@/composables/share";
 
-const { features } = usePermissions()
+const { features, clickByPermission } = usePermissions()
+const {shareAppMessage} = useShare()
 const { alert, confirm } = useMessage()
 const router = useRouter()
 const userStore = useUserStore()
@@ -160,29 +162,7 @@ onUnload(async () => {
     })
   }
 })
-onShareAppMessage(async ({ from, target }) => {
-  const res: Page.CustomShareContent = {}
-  if (from === 'button') {
-    console.log(target)
-
-    if (target.dataset.type === 'homepage') {
-      res.title = `${userInfo.value.nickname}: “${designerInfo.value.designDesc}”`
-      res.imageUrl = designerInfo.value?.sharePageUrl
-      res.path = `/pages/mine/homepage/index?id=${id.value}&isShared=true`
-    } else {
-      await shareCircle(target.dataset.options.id)
-      res.path = `/pages/home/moment/index?id=${target.dataset.options.id}&isShared=true`
-      res.imageUrl = target.dataset.options.bannerUrls[0]
-      res.title = `${target.dataset.options.stylistName}: ${target.dataset.options.circleDesc}`
-    }
-  }
-  if (from === 'menu') {
-    res.title = `${userInfo.value.nickname}: “${designerInfo.value.designDesc}”`
-    res.imageUrl = designerInfo.value?.sharePageUrl
-    res.path = `/pages/mine/homepage/index?id=${id.value}&isShared=true`
-  }
-  return res
-})
+onShareAppMessage(shareAppMessage)
 onShareTimeline(() => ({}))
 defineExpose({
   navBarFixed: false,
@@ -393,8 +373,17 @@ defineExpose({
             class="p-0 after:b-none"
             block
             :round="false"
-            open-type="share"
+            :open-type="features.shareMoment ? 'share' : ''"
             :data-type="'homepage'"
+            :data-share-content="{
+              title: `${userInfo.nickname}: “${designerInfo.designDesc}”`,
+              imageUrl: designerInfo.sharePageUrl,
+              path: `/pages/mine/homepage/index?id=${id}&isShared=true`,
+            }"
+            :data-options="{
+              homepageId: id,
+              userId: userInfo.userId,
+            }"
           >
             <wd-button block :round="false">分享</wd-button>
           </button>

+ 11 - 0
packages/assets/src/assets/timeline.svg

@@ -0,0 +1,11 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <circle cx="24" cy="24" r="24" fill="#50BE3B"/>
+    <path d="M28.2173 12.6921C28.2173 12.6921 26.6218 12.0352 24.1819 12.0352C21.7419 12.0352 20.1465 12.7859 20.1465 12.7859L28.2173 20.9036V12.6921H28.2173Z" fill="white"/>
+    <path d="M32.5816 15.5531C30.8455 13.8639 29.2032 13.2539 29.2032 13.2539L29.1562 24.6563L34.9747 18.8379C34.9747 18.8379 34.2708 17.2425 32.5816 15.5532L32.5816 15.5531Z" fill="white"/>
+    <path d="M35.3032 20.0586L27.1855 28.0825V28.1294H35.3971C35.3971 28.1294 36.054 26.5339 36.054 24.094C36.054 21.654 35.3032 20.0586 35.3032 20.0586Z" fill="white"/>
+    <path d="M29.2501 34.9337C29.2501 34.9337 30.8456 34.2299 32.5348 32.5406C34.2241 30.8045 34.834 29.1622 34.834 29.1622L23.4316 29.1152L29.2501 34.9337L29.2501 34.9337Z" fill="white"/>
+    <path d="M20.0996 27.1914V35.403C20.0996 35.403 21.695 36.0599 24.135 36.0599C26.575 36.0599 28.1704 35.3091 28.1704 35.3091L20.1465 27.1914H20.0996Z" fill="white"/>
+    <path d="M15.8286 32.5407C17.5647 34.2299 19.207 34.8399 19.207 34.8399L19.254 23.4375L13.4355 29.2559C13.4355 29.2559 14.1394 30.8513 15.8286 32.5406L15.8286 32.5407Z" fill="white"/>
+    <path d="M13.0144 20.0118C13.0144 20.0118 12.3574 21.6072 12.3574 24.0472C12.3574 26.4871 13.1082 28.0826 13.1082 28.0826L21.2259 20.0117H13.0144V20.0118Z" fill="white"/>
+    <path d="M19.1132 13.1602C19.1132 13.1602 17.5178 13.8171 15.8285 15.5533C14.1393 17.2894 13.5293 18.9317 13.5293 18.9317L24.9317 18.9786L19.1133 13.1602L19.1132 13.1602Z" fill="white"/>
+</svg>

+ 14 - 0
packages/assets/src/assets/wechat.svg

@@ -0,0 +1,14 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <g clip-path="url(#clip0_3244_1463)">
+        <path d="M14.9668 18.065C14.9668 18.4817 15.1323 18.8812 15.4269 19.1758C15.7215 19.4705 16.1211 19.636 16.5377 19.636C16.9543 19.636 17.3539 19.4705 17.6485 19.1758C17.9431 18.8812 18.1086 18.4817 18.1086 18.065C18.1086 17.6484 17.9431 17.2489 17.6485 16.9542C17.3539 16.6596 16.9543 16.4941 16.5377 16.4941C16.1211 16.4941 15.7215 16.6596 15.4269 16.9542C15.1323 17.2489 14.9668 17.6484 14.9668 18.065Z" fill="#50B674"/>
+        <path d="M21.9922 18.0221C21.9922 18.4387 22.1577 18.8383 22.4523 19.1329C22.7469 19.4275 23.1465 19.593 23.5631 19.593C23.9797 19.593 24.3793 19.4275 24.6739 19.1329C24.9685 18.8383 25.134 18.4387 25.134 18.0221C25.134 17.6054 24.9685 17.2059 24.6739 16.9113C24.3793 16.6167 23.9797 16.4512 23.5631 16.4512C23.1465 16.4512 22.7469 16.6167 22.4523 16.9113C22.1577 17.2059 21.9922 17.6054 21.9922 18.0221Z" fill="#50B674"/>
+        <path d="M25.9199 25.0479C25.9199 25.3373 26.0349 25.6147 26.2394 25.8193C26.444 26.0239 26.7215 26.1388 27.0108 26.1388C27.3002 26.1388 27.5776 26.0239 27.7822 25.8193C27.9868 25.6147 28.1017 25.3373 28.1017 25.0479C28.1017 24.7586 27.9868 24.4811 27.7822 24.2766C27.5776 24.072 27.3002 23.957 27.0108 23.957C26.7215 23.957 26.444 24.072 26.2394 24.2766C26.0349 24.4811 25.9199 24.7586 25.9199 25.0479Z" fill="#50B674"/>
+        <path d="M31.4609 25.1339C31.4609 25.4232 31.5759 25.7007 31.7805 25.9053C31.985 26.1099 32.2625 26.2248 32.5518 26.2248C32.8412 26.2248 33.1187 26.1099 33.3232 25.9053C33.5278 25.7007 33.6428 25.4232 33.6428 25.1339C33.6428 24.8445 33.5278 24.5671 33.3232 24.3625C33.1187 24.1579 32.8412 24.043 32.5518 24.043C32.2625 24.043 31.985 24.1579 31.7805 24.3625C31.5759 24.5671 31.4609 24.8445 31.4609 25.1339Z" fill="#50B674"/>
+        <path d="M24 0C10.7345 0 0 10.7345 0 24C0 37.2655 10.7345 48 24 48C37.2655 48 48 37.2655 48 24C48 10.7345 37.2655 0 24 0ZM19.8982 29.5418C18.6327 29.5418 17.6291 29.28 16.3636 29.0182L12.8291 30.7636L13.8327 27.7527C11.3018 26.0073 9.81818 23.7382 9.81818 20.9455C9.81818 16.1455 14.3564 12.3927 19.8982 12.3927C24.8291 12.3927 29.1927 15.4036 30.0655 19.4618C29.76 19.4182 29.4109 19.4182 29.1055 19.4182C24.3055 19.4182 20.5527 22.9964 20.5527 27.4036C20.5527 28.1455 20.6836 28.8436 20.8582 29.4982C20.5091 29.4982 20.2036 29.5418 19.8982 29.5418ZM34.6473 33.0764L35.3891 35.6073L32.64 34.08C31.6364 34.3418 30.6327 34.6036 29.6291 34.6036C24.8291 34.6036 21.0764 31.3309 21.0764 27.3164C21.0764 23.3018 24.8291 20.0291 29.6291 20.0291C34.1673 20.0291 38.1818 23.3018 38.1818 27.3164C38.1818 29.5418 36.6982 31.5491 34.6473 33.0764Z" fill="#50B674"/>
+    </g>
+    <defs>
+        <clipPath id="clip0_3244_1463">
+            <rect width="48" height="48" fill="white"/>
+        </clipPath>
+    </defs>
+</svg>

+ 2 - 0
packages/assets/src/libs/assets/timeline.ts

@@ -0,0 +1,2 @@
+import timeline from '../../assets/timeline.svg' 
+ export default timeline

+ 2 - 0
packages/assets/src/libs/assets/wechat.ts

@@ -0,0 +1,2 @@
+import wechat from '../../assets/wechat.svg' 
+ export default wechat