import { Provider, getAllowedHosts, tokenStorage, type CompanionPluginOptions, } from '@uppy/companion-client' import { UIPlugin, Uppy } from '@uppy/core' import { ProviderViews } from '@uppy/provider-views' import { h, type ComponentChild } from 'preact' import type { UppyFile, Body, Meta } from '@uppy/utils/lib/UppyFile' import type { AsyncStore, UnknownProviderPlugin, UnknownProviderPluginState, } from '@uppy/core/lib/Uppy.js' import locale from './locale.ts' // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore We don't want TS to generate types for the package.json import packageJson from '../package.json' export type DropboxOptions = CompanionPluginOptions export default class Dropbox extends UIPlugin implements UnknownProviderPlugin { static VERSION = packageJson.version icon: () => h.JSX.Element provider: Provider view!: ProviderViews storage: AsyncStore files: UppyFile[] rootFolderId: string | null = null constructor(uppy: Uppy, opts: DropboxOptions) { super(uppy, opts) this.id = this.opts.id || 'Dropbox' this.type = 'acquirer' this.storage = this.opts.storage || tokenStorage this.files = [] this.icon = () => ( ) this.opts.companionAllowedHosts = getAllowedHosts( this.opts.companionAllowedHosts, this.opts.companionUrl, ) this.provider = new Provider(uppy, { companionUrl: this.opts.companionUrl, companionHeaders: this.opts.companionHeaders, companionKeysParams: this.opts.companionKeysParams, companionCookiesRule: this.opts.companionCookiesRule, provider: 'dropbox', pluginId: this.id, supportsRefreshToken: true, }) this.defaultLocale = locale this.i18nInit() this.title = this.i18n('pluginNameDropbox') this.render = this.render.bind(this) } install(): void { this.view = new ProviderViews(this, { provider: this.provider, loadAllFiles: true, virtualList: true, }) const { target } = this.opts if (target) { this.mount(target, this) } } uninstall(): void { this.view.tearDown() this.unmount() } render(state: unknown): ComponentChild { return this.view.render(state) } }