From 738e54daede815079fbdf0bb65b84ba67c747bbb Mon Sep 17 00:00:00 2001 From: 4eb0da <4eb0da@yandex-team.com> Date: Tue, 16 Sep 2025 12:42:09 +0300 Subject: [PATCH] Custom file dialog commit_hash:711677a73f1ec8302190d28f891f5ba4c190536d --- .mapping.json | 1 - visual-editor/src/App.svelte | 20 +++++++++-- visual-editor/src/lib.ts | 34 ++++++++++++++++++- .../src/lib/components/controls/Text.svelte | 2 +- .../components/prop-dialog/File2Dialog.svelte | 11 +++--- .../prop-dialog/VideoSourcesDialog.svelte | 2 +- .../components/simple-props/FileProp.svelte | 2 +- .../simple-props/VideoSourcesItem.svelte | 2 +- .../simple-props/VideoSourcesProp.svelte | 2 +- visual-editor/src/lib/ctx/appContext.ts | 30 ++-------------- visual-editor/src/lib/utils/video.ts | 4 --- 11 files changed, 64 insertions(+), 46 deletions(-) delete mode 100644 visual-editor/src/lib/utils/video.ts diff --git a/.mapping.json b/.mapping.json index 9a3f4b2ed..fbbf8f61e 100644 --- a/.mapping.json +++ b/.mapping.json @@ -23060,7 +23060,6 @@ "visual-editor/src/lib/utils/tanker.ts":"divkit/public/visual-editor/src/lib/utils/tanker.ts", "visual-editor/src/lib/utils/tree.ts":"divkit/public/visual-editor/src/lib/utils/tree.ts", "visual-editor/src/lib/utils/truthy.ts":"divkit/public/visual-editor/src/lib/utils/truthy.ts", - "visual-editor/src/lib/utils/video.ts":"divkit/public/visual-editor/src/lib/utils/video.ts", "visual-editor/src/main.css":"divkit/public/visual-editor/src/main.css", "visual-editor/src/types/divjson.d.ts":"divkit/public/visual-editor/src/types/divjson.d.ts", "visual-editor/src/vite-env.d.ts":"divkit/public/visual-editor/src/vite-env.d.ts", diff --git a/visual-editor/src/App.svelte b/visual-editor/src/App.svelte index e7032345a..9196e5d25 100644 --- a/visual-editor/src/App.svelte +++ b/visual-editor/src/App.svelte @@ -5,7 +5,7 @@ import type { LanguageContext } from './lib/ctx/languageContext'; import { LANGUAGE_CTX } from './lib/ctx/languageContext'; import ContextMenu from './lib/components/ContextMenu.svelte'; - import type { CardLocale, EditorInstance, EditorOptions, FileLimits, FontFaceDesc, GetTranslationKey, GetTranslationSuggest, Layout } from './lib'; + import type { CardLocale, EditorInstance, EditorOptions, FileDialogApi, FileLimits, FontFaceDesc, GetTranslationKey, GetTranslationSuggest, Layout } from './lib'; import LayoutColumn from './lib/components/LayoutColumn.svelte'; import { APP_CTX, type AppContext, type ContextMenuApi, type RendererApi, type ShowErrors } from './lib/ctx/appContext'; import { editorFabric as editorFabricInternal } from './lib/data/editorWrapper'; @@ -70,6 +70,8 @@ export let getTranslationKey: GetTranslationKey | undefined = undefined; + export let fileDialogApi: FileDialogApi | undefined = undefined; + export function setLayout(newLayout: Layout): void { layout = newLayout; } @@ -118,6 +120,8 @@ let selectOptionsDialog: SelectOptionsDialog; let itemsListDialog: ItemsListDialog; + let isCustomFileDialogShown = false; + setContext(LANGUAGE_CTX, { lang, getLanguage(): string { @@ -237,10 +241,20 @@ file2Dialog() { return { show(props) { - file2Dialog.show(props); + if (fileDialogApi?.canShow(props)) { + fileDialogApi.show(props); + isCustomFileDialogShown = true; + } else { + file2Dialog.show(props); + isCustomFileDialogShown = false; + } }, hide() { - file2Dialog.hide(); + if (isCustomFileDialogShown) { + fileDialogApi?.hide(); + } else { + file2Dialog.hide(); + } } }; }, diff --git a/visual-editor/src/lib.ts b/visual-editor/src/lib.ts index 5c60f7f39..978748c0c 100644 --- a/visual-editor/src/lib.ts +++ b/visual-editor/src/lib.ts @@ -1,4 +1,5 @@ import { get, type Unsubscriber } from 'svelte/store'; +import type { VideoSource } from '@divkitframework/divkit/typings/common'; import App from './App.svelte'; import type { Loc } from './lib/utils/stringifyWithLoc'; import type { TypedRange } from './lib/data/editor'; @@ -98,12 +99,42 @@ export type GetTranslationSuggest = (query: string, locale: string) => Promise Promise | undefined>; +export interface FileDialogValue { + url: string; + width?: number; + height?: number; +} + +export type FileDialogCallback = (opts: FileDialogValue) => void; + +export interface FileDialogShowProps { + value: FileDialogValue; + title: string; + subtype: 'image' | 'gif' | 'lottie' | 'video' | 'image_preview'; + direction?: 'left' | 'right'; + hasSize?: boolean; + hasDelete?: boolean; + target: HTMLElement; + disabled?: boolean; + generateFromVideo?: VideoSource[]; + generateFromLottie?: string; + callback: FileDialogCallback; + onHide?(): void; +} + +export interface FileDialogApi { + canShow(props: FileDialogShowProps): boolean; + show(props: FileDialogShowProps): void; + hide(): void; +} + export interface DivProEditorApi { uploadFile?(file: File): Promise; editorFabric?(opts: EditorOptions): EditorInstance; onChange?(): void; getTranslationSuggest?: GetTranslationSuggest; getTranslationKey?: GetTranslationKey; + fileDialog?: FileDialogApi; } export interface Source { @@ -257,7 +288,8 @@ export const DivProEditor = { uploadFile: opts.api?.uploadFile, editorFabric: opts.api?.editorFabric, getTranslationKey: opts.api?.getTranslationKey, - getTranslationSuggest: opts.api?.getTranslationSuggest + getTranslationSuggest: opts.api?.getTranslationSuggest, + fileDialogApi: opts.api?.fileDialog } }); diff --git a/visual-editor/src/lib/components/controls/Text.svelte b/visual-editor/src/lib/components/controls/Text.svelte index 54bb0cb67..9b500d108 100644 --- a/visual-editor/src/lib/components/controls/Text.svelte +++ b/visual-editor/src/lib/components/controls/Text.svelte @@ -11,11 +11,11 @@