ultisuite-client/components/agenda/agenda-video-toggle.tsx
R3D347HR4Y ad1370ea7e
Some checks are pending
E2E / Playwright e2e (push) Waiting to run
feat: enhance configuration and add new demo layouts
- Introduced turbopack alias for canvas in next.config.mjs.
- Updated package.json scripts for development and branding tasks.
- Added new dependencies for Tiptap extensions.
- Implemented new demo layouts for agenda, contacts, drive, and mail applications.
- Enhanced globals.css for improved theming and splash screen animations.
- Added OAuth callback handling for drive mounts.
- Updated layout components to integrate new demo shells and improve structure.
2026-06-12 19:10:24 +02:00

101 lines
2.9 KiB
TypeScript

"use client"
import Link from "next/link"
import { ExternalLink } from "lucide-react"
import { Button } from "@/components/ui/button"
import { AgendaVideoProviderIcon } from "@/components/agenda/agenda-video-provider-icon"
import {
canAutoGenerateVideoLink,
videoJoinLabel,
videoToggleLabel,
} from "@/lib/agenda/agenda-video-conference"
import type { AgendaVideoProvider } from "@/lib/agenda/agenda-settings-types"
import { isUltiMeetUrl, meetJoinPath } from "@/lib/meet/meet-url"
import { cn } from "@/lib/utils"
export function AgendaVideoToggle({
provider,
enabled,
onEnabledChange,
meetUrl,
disabled = false,
pending = false,
compact = false,
tabIndex,
}: {
provider: AgendaVideoProvider
enabled: boolean
onEnabledChange: (enabled: boolean) => void
meetUrl?: string
disabled?: boolean
pending?: boolean
compact?: boolean
tabIndex?: number
}) {
if (provider === "none") return null
if (meetUrl) {
const inAppJoin = provider === "ultimeet" && isUltiMeetUrl(meetUrl)
const joinHref = inAppJoin ? meetJoinPath(meetUrl) : meetUrl
return (
<div className="flex flex-wrap items-center gap-2">
<Button
asChild
variant="outline"
className={cn("h-9 rounded-full gap-2", compact && "h-8 text-xs")}
>
{inAppJoin ? (
<Link href={joinHref}>
<AgendaVideoProviderIcon provider={provider} className="size-4" />
{videoJoinLabel(provider)}
</Link>
) : (
<a href={joinHref} target="_blank" rel="noopener noreferrer">
<AgendaVideoProviderIcon provider={provider} className="size-4" />
{videoJoinLabel(provider)}
<ExternalLink className="size-3.5 opacity-60" aria-hidden />
</a>
)}
</Button>
<Button
type="button"
variant="ghost"
className={cn("h-9 rounded-full text-muted-foreground", compact && "h-8 text-xs")}
disabled={pending}
onClick={() => onEnabledChange(false)}
>
Retirer
</Button>
</div>
)
}
const auto = canAutoGenerateVideoLink(provider)
return (
<div className="flex flex-col gap-1">
<Button
type="button"
variant={enabled ? "default" : "outline"}
className={cn(
"h-9 w-fit rounded-full gap-2",
compact && "h-8 text-xs",
enabled && "shadow-sm",
)}
tabIndex={tabIndex}
disabled={disabled || pending}
onClick={() => onEnabledChange(!enabled)}
>
<AgendaVideoProviderIcon provider={provider} className="size-4" />
{videoToggleLabel(provider, enabled)}
</Button>
{enabled && !auto ? (
<p className="text-[11px] text-muted-foreground">
Lien généré automatiquement bientôt ajoutez-le dans le lieu en attendant.
</p>
) : null}
</div>
)
}