sipher/src/components/ui/layout/page-header.tsx
Nixyan 07f9984f03 Enhance authentication and messaging features with OLM integration
- Added support for consuming one-time keys (OTK) in the authentication flow.
- Implemented new mutation `consumeOTK` to handle OTK consumption and update user accounts.
- Updated participant details to include OLM account information.
- Refactored socket management to improve direct messaging functionality.
- Introduced new UI components for password handling and user interactions.
- Updated dependencies in package.json and bun.lock for compatibility and feature enhancements.
2026-01-07 14:47:07 -03:00

132 lines
3.8 KiB
TypeScript

"use client"
import { Button } from "@/components/ui/button"
import { PhoneIcon, SearchIcon, UserIcon, UsersIcon, VideoIcon } from "lucide-react"
import UserCard from "../user/user-card"
export interface PageHeaderProps {
currentChannel: SiPher.Channel | null
page: "friends" | "support" | "dm" | "server"
friendsPage?: "all" | "available"
onFriendsPageChange?: (page: "all" | "available") => void
onAddFriend?: () => void
dmChannel?: {
id: string
participantDetails: {
id: string
name: string
username: string
displayUsername: string
image: string
status: "online" | "busy" | "offline" | "away"
}[]
}
serverId?: string
serverChannelId?: string
}
export function PageHeader({
currentChannel,
page,
friendsPage,
onFriendsPageChange,
onAddFriend,
dmChannel,
serverId,
serverChannelId,
}: PageHeaderProps) {
return (
<div className="flex items-center min-h-10 max-h-10 border-b border-border/40 sticky top-0 z-10 bg-background">
{/* SCS or DM Selector */}
<div className="flex justify-center items-center gap-2 max-w-72 min-w-72 border-r h-10 border-border/40">
{!currentChannel || currentChannel.type === "DM" ? (
<Button
variant="outline"
className="w-[calc(100%-2rem)] h-3/4 rounded-lg hover:cursor-pointer"
>
<SearchIcon className="size-4" />
<span className="text-sm font-medium">Search for a Server or DM</span>
</Button>
) : (
<span className="text-sm font-medium">{currentChannel.name}</span>
)}
</div>
{/* Page title/options */}
{dmChannel ? (
<div className="flex flex-row justify-start items-center gap-2 w-full px-4">
<UserCard
userName={dmChannel.participantDetails[0].name}
image={dmChannel.participantDetails[0].image}
status={dmChannel.participantDetails[0].status}
size="small"
/>
<span className="text-sm font-medium">{dmChannel.participantDetails[0].name}</span>
<div className="flex flex-row gap-2 ml-auto">
<Button
variant="ghost"
size="icon"
className="h-8 w-8"
>
<PhoneIcon className="size-4" />
</Button>
<Button
variant="ghost"
size="icon"
className="h-8 w-8"
>
<VideoIcon className="size-4" />
</Button>
<Button
variant="ghost"
size="icon"
className="h-8 w-8"
>
<UserIcon className="size-4" />
</Button>
</div>
</div>
) : serverChannelId ? (
<div className="flex flex-row justify-start items-center gap-2 w-full px-4">
<span className="text-sm font-medium">#{serverChannelId}</span>
</div>
) : page === "friends" ? (
<div className="flex flex-row justify-start items-center gap-2 w-full">
<div className="flex flex-row gap-2 justify-start p-2">
<UsersIcon className="size-4" />
<span className="text-sm font-medium">Friends</span>
</div>
<span className="text-sm font-medium"></span>
<div className="flex flex-row gap-2 h-full">
<Button
variant="ghost"
disabled={friendsPage === "available"}
className={`h-full hover:cursor-pointer justify-start p-2 ${friendsPage === "available" ? "bg-primary text-primary-foreground" : ""
}`}
onClick={() => onFriendsPageChange?.("available")}
>
Available
</Button>
<Button
variant="ghost"
disabled={friendsPage === "all"}
className={`h-full hover:cursor-pointer justify-start p-2 ${friendsPage === "all" ? "bg-primary text-primary-foreground" : ""
}`}
onClick={() => onFriendsPageChange?.("all")}
>
All Known
</Button>
<Button
variant="ghost"
className="h-full bg-primary text-primary-foreground hover:cursor-pointer justify-start p-2"
onClick={onAddFriend}
>
Add Friend
</Button>
</div>
</div>
) : null}
</div>
)
}