feat(profile)!: replace sidebar and add avatar navigation

Rename the global Sidebar route, UI, assets, analytics, and payment return context to Profile. Add accessible message-avatar navigation and preserve the source character across auth and logout flows.

BREAKING CHANGE: /sidebar has been removed; use /profile instead.
This commit is contained in:
2026-07-21 18:08:12 +08:00
parent 6cd3a0c2d2
commit 9deb320cf6
67 changed files with 565 additions and 256 deletions
+54
View File
@@ -0,0 +1,54 @@
"use client";
import { useEffect, useState } from "react";
import { pwaUtil } from "@/utils/pwa";
type PwaInstallResult = Awaited<ReturnType<typeof pwaUtil.install>>;
export function usePwaInstallEntry() {
const [canInstall, setCanInstall] = useState(false);
useEffect(() => {
const updateInstallEntryVisibility = () => {
setCanInstall(pwaUtil.canShowInstallEntry());
};
pwaUtil.prepareInstallPrompt();
updateInstallEntryVisibility();
const unsubscribe = pwaUtil.subscribe(updateInstallEntryVisibility);
return () => {
unsubscribe();
};
}, []);
const installApp = async () => {
pwaUtil.prepareInstallPrompt();
const result = await pwaUtil.install();
setCanInstall(
shouldKeepPwaInstallEntryVisible({
result,
isInstalled: pwaUtil.isInstalled(),
canShowInstallEntry: pwaUtil.canShowInstallEntry(),
}),
);
};
return {
canInstall,
installApp,
};
}
export function shouldKeepPwaInstallEntryVisible({
result,
isInstalled,
canShowInstallEntry,
}: {
result: PwaInstallResult;
isInstalled: boolean;
canShowInstallEntry: boolean;
}): boolean {
return result !== "accepted" && !isInstalled && canShowInstallEntry;
}