11<script setup lang="ts">
2+ import { computed } from ' vue' ;
3+ import { useRouter } from ' vue-router' ;
24import { useI18n } from ' vue-i18n' ;
3- import {
4- NCard ,
5- NTabs ,
6- NTabPane ,
7- NDivider ,
8- NRow ,
9- NButton ,
10- NModal
11- } from ' naive-ui' ;
12-
13- import {
14- fetchNewsList ,
15- fetchJokes ,
16- JokeEntry ,
17- NewsEntry ,
18- fetchNews
19- } from ' @/models/news' ;
20- import { convertTimestamp } from ' @/utils/time' ;
5+ import { NCard , NTabs , NTabPane , NDivider , NRow , NButton } from ' naive-ui' ;
216
7+ import { useStore } from ' @/store' ;
228import { useMutableRef , usePromiseEffect } from ' @/hooks' ;
9+ import { fetchJokes , JokeEntry } from ' @/models/news' ;
10+ import { convertTimestamp } from ' @/utils/time' ;
2311
24- import MarkdownContainer from ' @/components/MarkdownContainer' ;
25-
26- interface NewsEntryWithContent extends NewsEntry {
27- content: string ;
28- }
29-
12+ const store = useStore ();
3013const { t, locale } = useI18n ();
31- const [news, setNews] = useMutableRef ([] as NewsEntry []);
3214const [jokes, setJokes] = useMutableRef ([] as JokeEntry []);
33- const [selected, setSelected] = useMutableRef <NewsEntryWithContent | null >(
34- null
35- );
36- const [show, setShow] = useMutableRef (false );
15+ const router = useRouter ();
3716
38- usePromiseEffect (fetchNewsList , setNews );
39- usePromiseEffect (fetchJokes , setJokes );
17+ const panelLimit = 6 ;
18+ const entries = computed (() => store .state .newsEntries .slice (0 , panelLimit ));
19+ usePromiseEffect (() => fetchJokes (panelLimit ), setJokes );
4020
41- async function handleClick(link : NewsEntry ) {
42- setSelected ({ ... link , content: await fetchNews (link ) });
43- setShow (true );
44- }
21+ const handleClick = (index : number ) => router .push (` /news/${index } ` );
4522 </script >
4623
4724<template >
4825 <NDivider title-placement="left">{{ t('sider.news') }}</NDivider >
4926 <NCard content-style =" padding : 0 20px ;" :bordered =" false " >
5027 <NTabs type="segment" size="small" pane-class="tab-pane">
5128 <NTabPane name="Mirror">
52- <NRow v-for =" link in news " :key =" link .content " >
53- <NButton text tag="a" @click =" handleClick (link )" >
29+ <NRow v-for =" ( entry , index ) in entries " :key =" entry .content " >
30+ <NButton text tag="a" @click =" handleClick (index )" >
5431 <span class =" link-title" >
55- {{
56- convertTimestamp(link.time, locale as 'zh' | 'en') +
57- ' - ' +
58- link.name
59- }}
32+ {{ convertTimestamp(entry.time, locale) + ' - ' + entry.name }}
6033 </span >
6134 </NButton >
6235 </NRow >
@@ -72,17 +45,6 @@ async function handleClick(link: NewsEntry) {
7245 </NTabPane >
7346 </NTabs >
7447 </NCard >
75- <NModal
76- style =" width : min (600px , 90% )"
77- preset="card"
78- size="huge"
79- :title =" selected ?.name "
80- v-if =" selected "
81- v-model :show =" show "
82- bordered
83- >
84- <MarkdownContainer :content =" selected .content " />
85- </NModal >
8648</template >
8749
8850<style scoped lang="less">
0 commit comments