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>