From c64a7005d35d3cfe6959a1abcac02ffdc4383104 Mon Sep 17 00:00:00 2001 From: RoyceDa Date: Fri, 20 Feb 2026 17:43:56 +0200 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=20=D0=BA=D0=BE=D0=B4=20?= =?UTF-8?q?=D0=B2=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D0=B9,=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=83?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=B0=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D0=B0=D1=80=D0=BA=D0=B8=20=D0=BD=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=B8=D0=B0=D0=BB=D0=BE=D0=B3,=20=D0=B0=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D1=83=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MessageAttachments/MessageAvatar.tsx | 2 +- .../MessageAttachments/MessageFile.tsx | 2 +- .../MessageAttachments/MessageImage.tsx | 2 +- .../AttachmentProvider/useAttachment.ts | 19 ++++++++----------- .../AvatarProvider/AvatarProvider.tsx | 10 +++++++++- app/providers/AvatarProvider/useSaveAvatar.ts | 4 ++-- 6 files changed, 22 insertions(+), 17 deletions(-) diff --git a/app/components/MessageAttachments/MessageAvatar.tsx b/app/components/MessageAttachments/MessageAvatar.tsx index 99b1e01..561cb21 100644 --- a/app/components/MessageAttachments/MessageAvatar.tsx +++ b/app/components/MessageAttachments/MessageAvatar.tsx @@ -19,7 +19,7 @@ export function MessageAvatar(props: AttachmentProps) { download, downloadStatus, getBlob, - getPreview} = useAttachment(props.attachment, props.chacha_key_plain); + getPreview} = useAttachment(props.attachment, props.parent); const mainRef = useRef(null); const { open } = useImageViewer(); const preview = getPreview(); diff --git a/app/components/MessageAttachments/MessageFile.tsx b/app/components/MessageAttachments/MessageFile.tsx index a75021d..e17a5d6 100644 --- a/app/components/MessageAttachments/MessageFile.tsx +++ b/app/components/MessageAttachments/MessageFile.tsx @@ -19,7 +19,7 @@ export function MessageFile(props : AttachmentProps) { } = useAttachment( props.attachment, - props.chacha_key_plain, + props.parent, ); const preview = getPreview(); const error = downloadStatus == DownloadStatus.ERROR; diff --git a/app/components/MessageAttachments/MessageImage.tsx b/app/components/MessageAttachments/MessageImage.tsx index 77f8ef2..5c3b016 100644 --- a/app/components/MessageAttachments/MessageImage.tsx +++ b/app/components/MessageAttachments/MessageImage.tsx @@ -19,7 +19,7 @@ export function MessageImage(props: AttachmentProps) { download, downloadStatus, getBlob, - getPreview } = useAttachment(props.attachment, props.chacha_key_plain); + getPreview } = useAttachment(props.attachment, props.parent); const mainRef = useRef(null); const error = downloadStatus == DownloadStatus.ERROR; const { open } = useImageViewer(); diff --git a/app/providers/AttachmentProvider/useAttachment.ts b/app/providers/AttachmentProvider/useAttachment.ts index 5960ba2..d5d88d2 100644 --- a/app/providers/AttachmentProvider/useAttachment.ts +++ b/app/providers/AttachmentProvider/useAttachment.ts @@ -1,4 +1,4 @@ -import { useContext, useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { useDownloadStatus } from "../TransportProvider/useDownloadStatus"; import { useUploadStatus } from "../TransportProvider/useUploadStatus"; import { useFileStorage } from "../../hooks/useFileStorage"; @@ -10,11 +10,11 @@ import { useDialogsCache } from "../DialogProvider/useDialogsCache"; import { useConsoleLogger } from "../../hooks/useConsoleLogger"; import { Attachment, AttachmentType } from "../ProtocolProvider/protocol/packets/packet.message"; import { useMemory } from "../MemoryProvider/useMemory"; -import { DialogContext } from "../DialogProvider/DialogProvider"; import { useSaveAvatar } from "../AvatarProvider/useSaveAvatar"; import { AVATAR_PASSWORD_TO_ENCODE } from "@/app/constants"; import { useDialog } from "../DialogProvider/useDialog"; import { useCore } from "@/app/hooks/useCore"; +import { MessageProps } from "@/app/components/Messages/Message"; export enum DownloadStatus { DOWNLOADED, @@ -25,7 +25,7 @@ export enum DownloadStatus { ERROR } -export function useAttachment(attachment: Attachment, keyPlain: string) { +export function useAttachment(attachment: Attachment, parentMessage: MessageProps) { const uuidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/; const uploadedPercentage = useUploadStatus(attachment.id); const downloadPercentage = useDownloadStatus(attachment.id); @@ -39,13 +39,7 @@ export function useAttachment(attachment: Attachment, keyPlain: string) { const {info} = useConsoleLogger('useAttachment'); const {updateAttachmentsInMessagesByAttachmentId} = useDialog(); const {getDownloadsPath} = useCore(); - - const context = useContext(DialogContext); - if(!context) { - throw new Error("useAttachment must be used within a DialogProvider"); - } - const {dialog} = context; const saveAvatar = useSaveAvatar(); useEffect(() => { @@ -155,7 +149,7 @@ export function useAttachment(attachment: Attachment, keyPlain: string) { } setDownloadStatus(DownloadStatus.DECRYPTING); //console.info("Decrypted attachment ", Buffer.from(keyPlain, 'binary').toString('hex')); - const decrypted = await decodeWithPassword(keyPlain, downloadedBlob); + const decrypted = await decodeWithPassword(parentMessage.chacha_key_plain, downloadedBlob); setDownloadTag(""); if(attachment.type == AttachmentType.FILE) { /** @@ -189,7 +183,10 @@ export function useAttachment(attachment: Attachment, keyPlain: string) { await writeFile(avatarPath, Buffer.from(await encodeWithPassword(AVATAR_PASSWORD_TO_ENCODE, decrypted))); setDownloadStatus(DownloadStatus.DOWNLOADED); - saveAvatar(dialog, avatarPath, decrypted); + /** + * Устанавливаем аватарку тому, кто ее прислал. + */ + saveAvatar(parentMessage.from, avatarPath, decrypted); return; } /** diff --git a/app/providers/AvatarProvider/AvatarProvider.tsx b/app/providers/AvatarProvider/AvatarProvider.tsx index 0ef4274..ba8b5e4 100644 --- a/app/providers/AvatarProvider/AvatarProvider.tsx +++ b/app/providers/AvatarProvider/AvatarProvider.tsx @@ -7,7 +7,15 @@ import { useConsoleLogger } from "@/app/hooks/useConsoleLogger"; import { useSystemAccounts } from "../SystemAccountsProvider/useSystemAccounts"; import { AVATAR_PASSWORD_TO_ENCODE } from "@/app/constants"; -export const AvatarContext = createContext({}); +export interface AvatarProviderContextValue { + deliveredAvatars: string[]; + saveAvatar: (fromPublicKey: string, path : string, decryptedContent : string) => Promise; + loadAvatarsFromCacheByPublicKey: (publicKey : string, allDecode? : boolean) => Promise; + changeAvatar: (base64Image : string, entity : string) => Promise; + decodedAvatarsCache: AvatarCacheEntry[]; +} + +export const AvatarContext = createContext(null); interface AvatarProviderProps { children: React.ReactNode; diff --git a/app/providers/AvatarProvider/useSaveAvatar.ts b/app/providers/AvatarProvider/useSaveAvatar.ts index b9ba0db..1177f69 100644 --- a/app/providers/AvatarProvider/useSaveAvatar.ts +++ b/app/providers/AvatarProvider/useSaveAvatar.ts @@ -1,9 +1,9 @@ import { useContext } from "react"; import { AvatarContext } from "./AvatarProvider"; -export function useSaveAvatar() { +export function useSaveAvatar() : (fromPublicKey: string, path : string, decryptedContent : string) => Promise { const context : any = useContext(AvatarContext); - if(!context){ + if(!context){ throw new Error("useSaveAvatar must be used within an AvatarProvider"); } return context.saveAvatar;