master
1---
2import { asideConfig, siteConfig } from '@/config';
3import { getPosts, getPostsCount } from '@utils/content-utils';
4import { t } from '@utils/i18n';
5import { Icon } from 'astro-icon/components';
6import { render } from 'astro:content';
7---
8
9<div class="stats stats-vertical w-full">
10 {
11 asideConfig.siteInfo.stats.map(async (entry) => {
12 switch (entry) {
13 case 'post-count': {
14 const postsCount = await getPostsCount();
15 return (
16 <div class="stat">
17 <div class="stat-title flex flex-row items-center gap-1">
18 <Icon name="material-symbols:folder-open-rounded" />
19 <span>{t.status.totalPosts}</span>
20 </div>
21 <div class="stat-value text-base">{t.status.postsCount(postsCount)}</div>
22 </div>
23 );
24 }
25 case 'last-updated':
26 return (
27 <div class="stat">
28 <div class="stat-title flex flex-row items-center gap-1">
29 <Icon name="material-symbols:refresh-rounded" />
30 <span>{t.status.lastUpdated()}</span>
31 </div>
32 <div class="stat-value text-base">
33 <time datetime={new Date().toISOString()}>
34 {new Date().toLocaleDateString(siteConfig.lang.replace('_', '-'))}
35 </time>
36 </div>
37 </div>
38 );
39 case 'site-words-count':
40 return (
41 <div class="stat">
42 <div class="stat-title flex flex-row items-center gap-1">
43 <Icon name="material-symbols:docs-rounded" />
44 <span>{t.status.totalWords()}</span>
45 </div>
46 <div class="stat-value text-base">
47 {(async () => {
48 const posts = await getPosts();
49 const words = await Promise.all(
50 posts.map(async (post) => {
51 const { remarkPluginFrontmatter } = await render(post);
52 return remarkPluginFrontmatter.words as number;
53 })
54 );
55 const total = words.reduce((acc, cur) => acc + cur, 0);
56 return t.status.wordsCount(total);
57 })()}
58 </div>
59 </div>
60 );
61 case 'site-run-days':
62 return (
63 <div class="stat">
64 <div class="stat-title flex flex-row items-center gap-1">
65 <Icon name="material-symbols:calendar-clock-rounded" />
66 <span>{t.status.runTime()}</span>
67 </div>
68 <div class="stat-value text-base">
69 <time
70 datetime={siteConfig.createAt.toISOString()}
71 data-force-relative="true"
72 data-no-ago="true"
73 >
74 {siteConfig.createAt.toLocaleDateString(siteConfig.lang.replace('_', '-'))}
75 </time>
76 </div>
77 </div>
78 );
79 }
80 })
81 }
82</div>