Add managed content and keyboard usage insights
CI / verify (push) Has been cancelled
CI / publish (push) Has been cancelled

Introduce versioned official content workflows and privacy-safe keyboard analytics, while preventing repeat DeviceCheck sign-ins from incorrectly restricting eligible accounts.
This commit is contained in:
Rocky
2026-08-21 13:34:03 +08:00
parent b5212dcdc2
commit d0abe27623
55 changed files with 4690 additions and 111 deletions
@@ -4,6 +4,7 @@ import {
BrainCircuit,
ChartNoAxesCombined,
Gauge,
Keyboard,
Repeat2,
Sparkles,
Target,
@@ -264,6 +265,74 @@ export function AnalyticsPage() {
</Card>
</section>
<section className="grid gap-6 xl:grid-cols-2" aria-label="键盘输入统计">
<Card className="overflow-hidden">
<SectionHeader
title="键盘中英文输入"
description="仅统计 OSGKeyboard 本地聚合后的手动提交字符,不包含输入内容"
icon={Keyboard}
/>
<ComparisonBarChart
items={[
{
label: "中文",
value: data.keyboardUsage.chineseCharacters,
hint: `占中英文 ${optionalPercent(data.keyboardUsage.chineseSharePercent)}`,
},
{
label: "英文",
value: data.keyboardUsage.englishCharacters,
hint: `占中英文 ${optionalPercent(data.keyboardUsage.englishSharePercent)}`,
},
{
label: "其他",
value: data.keyboardUsage.otherCharacters,
hint: "数字、标点与 Emoji",
},
]}
primaryLabel="提交字符数"
primaryTone="primary"
/>
<MetricRows
rows={[
["输入活跃用户", formatNumber(data.keyboardUsage.activeUsers)],
["激活到输入转化", rateLabel(data.keyboardUsage.activationToInput)],
["中文活跃用户", formatNumber(data.keyboardUsage.chineseActiveUsers)],
["英文活跃用户", formatNumber(data.keyboardUsage.englishActiveUsers)],
["中英双语用户", formatNumber(data.keyboardUsage.bilingualActiveUsers)],
["总提交字符", formatNumber(data.keyboardUsage.totalCharacters)],
]}
/>
</Card>
<Card className="overflow-hidden">
<SectionHeader
title="输入会话结构"
description="一次键盘激活期间至少提交一个字符才计为输入会话"
icon={Activity}
/>
<ComparisonBarChart
items={[
{ label: "仅中文", value: data.keyboardUsage.chineseOnlySessions },
{ label: "仅英文", value: data.keyboardUsage.englishOnlySessions },
{ label: "中英混合", value: data.keyboardUsage.mixedLanguageSessions },
{ label: "仅其他", value: data.keyboardUsage.otherOnlySessions },
]}
primaryLabel="输入会话"
primaryTone="success"
/>
<MetricRows
rows={[
["输入会话总数", formatNumber(data.keyboardUsage.inputSessions)],
[
"平均每会话字符",
optionalDecimal(data.keyboardUsage.averageCharactersPerInputSession),
],
]}
/>
</Card>
</section>
<section className="grid gap-6 xl:grid-cols-3">
<Card className="overflow-hidden">
<SectionHeader title="付费转化" description="StoreKit 已验证交易" icon={BadgeDollarSign} />