feat: release v0.2.0 profiles, chat, freeze, and bots

Ship the product pass on the v0.1.3 schema with additive migrations, a replica migration lock, and bot accounts kept out of people lists.
This commit is contained in:
ahp
2026-10-10 16:42:35 +03:30
parent 8586bbafcc
commit 22d92c133d
85 changed files with 10510 additions and 1341 deletions
+12 -3
View File
@@ -28,6 +28,8 @@ import {
} from "@/components/ui/dropdown-menu";
import { Button } from "@/components/ui/button";
import { cn, formatFaNumber } from "@/lib/utils";
import { GlobalSearch } from "@/components/global-search";
import { isVerifiedRole, VerifiedBadge } from "@/components/verified-badge";
const navLinks = [
{ href: "/cap", label: "درخت مهارت" },
@@ -63,6 +65,7 @@ export function Navbar() {
<BrandMark />
</Link>
<div className="flex items-center gap-2">
<GlobalSearch />
<ThemeToggle />
{pathname !== "/login" && (
<Button asChild size="sm" className="font-bold">
@@ -173,7 +176,10 @@ export function Navbar() {
className="h-11 w-11"
/>
<div className="min-w-0">
<p className="truncate text-sm font-extrabold">{liveUser.name}</p>
<p className="flex min-w-0 items-center gap-1 text-sm font-extrabold">
<span className="truncate">{liveUser.name}</span>
{isVerifiedRole(liveUser.role) && <VerifiedBadge role={liveUser.role} />}
</p>
<p className="truncate text-[11px] text-muted-foreground">{liveUser.email}</p>
<p className="text-[11px] text-primary">{roleLabel(liveUser.role)}</p>
</div>
@@ -181,6 +187,9 @@ export function Navbar() {
<DropdownMenuItem onClick={() => router.push("/profile")}>
<User /> پروفایل من
</DropdownMenuItem>
<DropdownMenuItem onClick={() => router.push("/settings")}>
<User /> تنظیمات
</DropdownMenuItem>
<DropdownMenuItem onSelect={() => setStudioOpen(true)}>
<User /> ویرایش آواتار
</DropdownMenuItem>
@@ -200,8 +209,8 @@ export function Navbar() {
</DropdownMenuContent>
</DropdownMenu>
<Dialog open={studioOpen} onOpenChange={setStudioOpen}>
<DialogContent className="max-h-[85vh] max-w-sm gap-3 overflow-y-auto chat-scroll rounded-2xl">
<DialogHeader>
<DialogContent className="flex max-h-[min(85vh,40rem)] max-w-sm flex-col gap-3 overflow-hidden rounded-2xl">
<DialogHeader className="shrink-0">
<DialogTitle className="text-center">ویرایش آواتار</DialogTitle>
</DialogHeader>
<AvatarStudio user={liveUser} onClose={() => setStudioOpen(false)} />