This commit is contained in:
lendry
2026-07-10 12:14:06 +03:00
parent a4b4577c55
commit a0966e7ba2
6 changed files with 112 additions and 17 deletions

View File

@@ -148,6 +148,7 @@ import {
detectChatMessageType,
fileIconLabel,
formatFileSize,
isVideoNoteMessage,
parseLocationMetadata,
parseMessageMetadata,
resolveChatContentType
@@ -2182,6 +2183,16 @@ export function FamilyGroupView({ groupId }: { groupId: string }) {
/>
);
}
if (isVideoNoteMessage(message, e2ePayload)) {
const metaDuration = e2ePayload?.durationMs ?? parseMessageMetadata(message.metadataJson).durationMs;
return (
<ChatVideoNotePlayer
src={media.blobUrl}
durationMs={typeof metaDuration === 'number' ? metaDuration : undefined}
variant={mine ? 'mine' : 'theirs'}
/>
);
}
if (message.type === 'VIDEO') {
const metaDuration = e2ePayload?.durationMs ?? parseMessageMetadata(message.metadataJson).durationMs;
return (
@@ -2193,16 +2204,6 @@ export function FamilyGroupView({ groupId }: { groupId: string }) {
/>
);
}
if (message.type === 'VIDEO_NOTE') {
const metaDuration = e2ePayload?.durationMs ?? parseMessageMetadata(message.metadataJson).durationMs;
return (
<ChatVideoNotePlayer
src={media.blobUrl}
durationMs={typeof metaDuration === 'number' ? metaDuration : undefined}
variant={mine ? 'mine' : 'theirs'}
/>
);
}
return (
<button
type="button"

View File

@@ -32,7 +32,8 @@ export function PinLockModal({ open, isSubmitting, error, onSubmit, onLogout }:
return (
<Dialog open={open} onOpenChange={() => undefined}>
<DialogContent
className="relative !top-[max(1.5rem,10vh)] !-translate-y-0 [&>button]:hidden"
placement="upper"
className="relative [&>button]:hidden"
onPointerDownOutside={(event) => event.preventDefault()}
onEscapeKeyDown={(event) => event.preventDefault()}
>
@@ -74,6 +75,19 @@ export function PinLockModal({ open, isSubmitting, error, onSubmit, onLogout }:
<Button type="submit" size="lg" className="w-full rounded-[18px]" disabled={isSubmitting || !isPinInputComplete(pin)}>
{isSubmitting ? 'Проверяем...' : 'Разблокировать'}
</Button>
{onLogout ? (
<Button
type="button"
variant="ghost"
size="lg"
className="w-full rounded-[18px] text-[#6b6f7b]"
disabled={isSubmitting}
onClick={onLogout}
>
<DoorOpen className="mr-2 h-4 w-4" />
Выйти из аккаунта
</Button>
) : null}
</form>
</DialogContent>
</Dialog>

View File

@@ -7,11 +7,41 @@ import { cn } from '@/lib/utils';
export const Dialog = DialogPrimitive.Root;
export const DialogTrigger = DialogPrimitive.Trigger;
export function DialogContent({ className, children, ...props }: React.ComponentProps<typeof DialogPrimitive.Content>) {
export function DialogContent({
className,
placement = 'center',
children,
style,
...props
}: React.ComponentProps<typeof DialogPrimitive.Content> & {
placement?: 'center' | 'upper';
}) {
const placementStyle: React.CSSProperties =
placement === 'upper'
? {
top: 'max(1.5rem, 10vh)',
left: '50%',
transform: 'translateX(-50%)',
margin: 0
}
: {
top: '50%',
left: '50%',
transform: 'translate(-50%, -50%)',
margin: 0
};
const overlayZ = placement === 'upper' ? 'z-[300]' : 'z-[200]';
const contentZ = placement === 'upper' ? 'z-[301]' : 'z-[201]';
return (
<DialogPrimitive.Portal>
<DialogPrimitive.Overlay className="fixed inset-0 z-[200] bg-black/50 backdrop-blur-[1px]" />
<DialogPrimitive.Content className={cn('fixed left-1/2 top-1/2 z-[201] w-[min(92vw,520px)] -translate-x-1/2 -translate-y-1/2 rounded-[28px] bg-white p-6 shadow-2xl', className)} {...props}>
<DialogPrimitive.Overlay className={cn('fixed inset-0 bg-black/50 backdrop-blur-[1px]', overlayZ)} />
<DialogPrimitive.Content
className={cn('fixed w-[min(92vw,520px)] rounded-[28px] bg-white p-6 shadow-2xl', contentZ, className)}
style={{ ...placementStyle, ...style }}
{...props}
>
{children}
<DialogPrimitive.Close className="absolute right-5 top-5 rounded-full p-1 hover:bg-[#f4f5f8]" aria-label="Закрыть">
<X className="h-4 w-4" />