UNPKG

@eternalheart/ngx-file-preview

Version:

A powerful Angular file preview component library supporting multiple file formats including images, videos, PDFs, Office documents, text files and more.

137 lines 15.3 kB
import { ApplicationRef, createComponent, inject, Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { PreviewModalComponent } from '../components'; import { ThemeService } from "./theme.service"; import { I18nUtils } from "../i18n/i18n.utils"; import * as i0 from "@angular/core"; export const INITIAL_PREVIEW_STATE = { isVisible: false, currentIndex: 0, files: [] }; export class PreviewService { constructor() { this.appRef = inject(ApplicationRef); this.lang = 'zh'; this.loading = new BehaviorSubject(false); // endregion // region 状态管理 this.stateSubject = new BehaviorSubject(INITIAL_PREVIEW_STATE); } /** * 初始化 * @param injector * @param envInjector */ init(injector, envInjector) { this.envInjector = envInjector; this.injector = injector; } /** * 设置语言 * @param lang */ setLang(lang) { this.lang = lang; } /** * 获取实际的lang parser */ getLangParser() { return I18nUtils.get(this.lang); } get state() { return this.stateSubject.getValue(); } getStateObservable() { return this.stateSubject.asObservable(); } previous() { const state = this.state; const newIndex = Math.max(0, state.currentIndex - 1); this.updatePreviewState(true, state.files, newIndex); } next() { const state = this.state; const newIndex = Math.min(state.files.length - 1, state.currentIndex + 1); this.updatePreviewState(true, state.files, newIndex); } updatePreviewState(isVisible, files, index) { const currentFile = files[index]; this.stateSubject.next({ isVisible, currentFile, currentIndex: index, files }); } /** * 设置加载中状态 * @param loading */ setLoading(loading) { this.loading.next(loading); } getLoadingObservable() { return this.loading.asObservable(); } get modalElement() { return this.modalRef?.location.nativeElement; } open(options) { const { files, index = 0 } = options; if (this.modalRef) { this.cleanupModal(); } try { this.modalRef = createComponent(PreviewModalComponent, { environmentInjector: this.envInjector, elementInjector: this.injector, }); Object.assign(this.modalRef.instance, options); this.injector.get(ThemeService).bindElement(this.modalRef.location.nativeElement); document.body.appendChild(this.modalRef.location.nativeElement); this.modalRef.changeDetectorRef.detectChanges(); this.updatePreviewState(true, files, index); this.appRef.attachView(this.modalRef.hostView); } catch (error) { console.error('Error creating preview-list modal:', error); this.cleanupModal(); } } close() { if (document.fullscreenElement) { document?.exitFullscreen(); } this.updatePreviewState(false, [], 0); this.cleanupModal(); } cleanupModal() { if (!this.modalRef) return; try { // 从 DOM 中移除模态框 const element = this.modalRef.location.nativeElement; if (element.parentNode) { element.parentNode.removeChild(element); } // 从 ApplicationRef 中分离视图 this.appRef.detachView(this.modalRef.hostView); // 销毁组件 this.modalRef.destroy(); } catch (error) { console.error('Error cleaning up modal:', error); } finally { this.modalRef = undefined; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PreviewService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PreviewService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PreviewService, decorators: [{ type: Injectable }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtZmlsZS1wcmV2aWV3L3NyYy9saWIvc2VydmljZXMvcHJldmlldy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxjQUFjLEVBRWQsZUFBZSxFQUVmLE1BQU0sRUFDTixVQUFVLEVBRVgsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNyQyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQzs7QUFFN0MsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUc7SUFDbkMsU0FBUyxFQUFFLEtBQUs7SUFDaEIsWUFBWSxFQUFFLENBQUM7SUFDZixLQUFLLEVBQUUsRUFBRTtDQUNWLENBQUE7QUFVRCxNQUFNLE9BQU8sY0FBYztJQUQzQjtRQVFVLFdBQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDL0IsU0FBSSxHQUFXLElBQUksQ0FBQztRQUNwQixZQUFPLEdBQTZCLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBMkJ2RSxZQUFZO1FBQ1osY0FBYztRQUNMLGlCQUFZLEdBQUcsSUFBSSxlQUFlLENBQWUscUJBQXFCLENBQUMsQ0FBQztLQXdHbEY7SUFuSUM7Ozs7T0FJRztJQUNILElBQUksQ0FBQyxRQUFrQixFQUFFLFdBQWdDO1FBQ3ZELElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxPQUFPLENBQUMsSUFBWTtRQUNsQixJQUFJ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LEtBQUssQ0FBQyxDQUFDO1FBQ25ELENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDOytHQXpJVSxjQUFjO21IQUFkLGNBQWM7OzRGQUFkLGNBQWM7a0JBRDFCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBcHBsaWNhdGlvblJlZixcbiAgQ29tcG9uZW50UmVmLFxuICBjcmVhdGVDb21wb25lbnQsXG4gIEVudmlyb25tZW50SW5qZWN0b3IsXG4gIGluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0b3Jcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1ByZXZpZXdGaWxlLCBQcmV2aWV3T3B0aW9uc30gZnJvbSAnLi4vdHlwZXMvcHJldmlldy50eXBlcyc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1ByZXZpZXdNb2RhbENvbXBvbmVudH0gZnJvbSAnLi4vY29tcG9uZW50cyc7XG5pbXBvcnQge1RoZW1lU2VydmljZX0gZnJvbSBcIi4vdGhlbWUuc2VydmljZVwiO1xuaW1wb3J0IHtJMThuVXRpbHN9IGZyb20gXCIuLi9pMThuL2kxOG4udXRpbHNcIjtcblxuZXhwb3J0IGNvbnN0IElOSVRJQUxfUFJFVklFV19TVEFURSA9IHtcbiAgaXNWaXNpYmxlOiBmYWxzZSxcbiAgY3VycmVudEluZGV4OiAwLFxuICBmaWxlczogW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmV2aWV3U3RhdGUge1xuICBpc1Zpc2libGU6IGJvb2xlYW47XG4gIGN1cnJlbnRGaWxlPzogUHJldmlld0ZpbGU7XG4gIGN1cnJlbnRJbmRleDogbnVtYmVyO1xuICBmaWxlczogUHJldmlld0ZpbGVbXTtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFByZXZpZXdTZXJ2aWNlIHtcbiAgLy8gcmVnaW9uIOacjeWKoeeuoeeQhlxuICAvKipcbiAgICog5Yid5aeL5YyWIOmcgOimgeWwhuaJgOaciXNlcnZpY2Xms6jlhaXliLBtb2RhbFxuICAgKi9cbiAgcHJpdmF0ZSBpbmplY3RvciE6IEluamVjdG9yO1xuICBwcml2YXRlIGVudkluamVjdG9yITogRW52aXJvbm1lbnRJbmplY3RvcjtcbiAgcHJpdmF0ZSBhcHBSZWYgPSBpbmplY3QoQXBwbGljYXRpb25SZWYpXG4gIHByaXZhdGUgbGFuZzogc3RyaW5nID0gJ3poJztcbiAgcHJpdmF0ZSBsb2FkaW5nOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICAvKipcbiAgICog5Yid5aeL5YyWXG4gICAqIEBwYXJhbSBpbmplY3RvclxuICAgKiBAcGFyYW0gZW52SW5qZWN0b3JcbiAgICovXG4gIGluaXQoaW5qZWN0b3I6IEluamVjdG9yLCBlbnZJbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3Rvcikge1xuICAgIHRoaXMuZW52SW5qZWN0b3IgPSBlbnZJbmplY3RvcjtcbiAgICB0aGlzLmluamVjdG9yID0gaW5qZWN0b3I7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u6K+t6KiAXG4gICAqIEBwYXJhbSBsYW5nXG4gICAqL1xuICBzZXRMYW5nKGxhbmc6IHN0cmluZykge1xuICAgIHRoaXMubGFuZyA9IGxhbmc7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5a6e6ZmF55qEbGFuZyBwYXJzZXJcbiAgICovXG4gIGdldExhbmdQYXJzZXIoKSB7XG4gICAgcmV0dXJuIEkxOG5VdGlscy5nZXQodGhpcy5sYW5nKVxuICB9XG5cbiAgLy8gZW5kcmVnaW9uXG4gIC8vIHJlZ2lvbiDnirbmgIHnrqHnkIZcbiAgcmVhZG9ubHkgc3RhdGVTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQcmV2aWV3U3RhdGU+KElOSVRJQUxfUFJFVklFV19TVEFURSk7XG5cbiAgZ2V0IHN0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlU3ViamVjdC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgZ2V0U3RhdGVPYnNlcnZhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByZXZpb3VzKCkge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBuZXdJbmRleCA9IE1hdGgubWF4KDAsIHN0YXRlLmN1cnJlbnRJbmRleCAtIDEpO1xuICAgIHRoaXMudXBkYXRlUHJldmlld1N0YXRlKHRydWUsIHN0YXRlLmZpbGVzLCBuZXdJbmRleCk7XG4gIH1cblxuICBuZXh0KCkge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBuZXdJbmRleCA9IE1hdGgubWluKHN0YXRlLmZpbGVzLmxlbmd0aCAtIDEsIHN0YXRlLmN1cnJlbnRJbmRleCArIDEpO1xuICAgIHRoaXMudXBkYXRlUHJldmlld1N0YXRlKHRydWUsIHN0YXRlLmZpbGVzLCBuZXdJbmRleCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVByZXZpZXdTdGF0ZShpc1Zpc2libGU6IGJvb2xlYW4sIGZpbGVzOiBQcmV2aWV3RmlsZVtdLCBpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgY3VycmVudEZpbGUgPSBmaWxlc1tpbmRleF07XG4gICAgdGhpcy5zdGF0ZVN1YmplY3QubmV4dCh7XG4gICAgICBpc1Zpc2libGUsXG4gICAgICBjdXJyZW50RmlsZSxcbiAgICAgIGN1cnJlbnRJbmRleDogaW5kZXgsXG4gICAgICBmaWxlc1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruWKoOi9veS4reeKtuaAgVxuICAgKiBAcGFyYW0gbG9hZGluZ1xuICAgKi9cbiAgc2V0TG9hZGluZyhsb2FkaW5nOiBib29sZWFuKSB7XG4gICAgdGhpcy5sb2FkaW5nLm5leHQobG9hZGluZyk7XG4gIH1cblxuICBnZXRMb2FkaW5nT2JzZXJ2YWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLy8gZW5kcmVnaW9uXG4gIC8vIHJlZ2lvbiBNb2RhbOeuoeeQhlxuICBwcml2YXRlIG1vZGFsUmVmPzogQ29tcG9uZW50UmVmPFByZXZpZXdNb2RhbENvbXBvbmVudD47XG5cbiAgZ2V0IG1vZGFsRWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RhbFJlZj8ubG9jYXRpb24ubmF0aXZlRWxlbWVudFxuICB9XG5cbiAgb3BlbihvcHRpb25zOiBQcmV2aWV3T3B0aW9ucykge1xuICAgIGNvbnN0IHtmaWxlcywgaW5kZXggPSAwfSA9IG9wdGlvbnM7XG4gICAgaWYgKHRoaXMubW9kYWxSZWYpIHtcbiAgICAgIHRoaXMuY2xlYW51cE1vZGFsKClcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubW9kYWxSZWYgPSBjcmVhdGVDb21wb25lbnQoUHJldmlld01vZGFsQ29tcG9uZW50LCB7XG4gICAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IHRoaXMuZW52SW5qZWN0b3IsXG4gICAgICAgIGVsZW1lbnRJbmplY3RvcjogdGhpcy5pbmplY3RvcixcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm1vZGFsUmVmLmluc3RhbmNlLCBvcHRpb25zKVxuICAgICAgdGhpcy5pbmplY3Rvci5nZXQoVGhlbWVTZXJ2aWNlKS5iaW5kRWxlbWVudCh0aGlzLm1vZGFsUmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMubW9kYWxSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XG4gICAgICB0aGlzLm1vZGFsUmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHRoaXMudXBkYXRlUHJldmlld1N0YXRlKHRydWUsIGZpbGVzLCBpbmRleCk7XG4gICAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KHRoaXMubW9kYWxSZWYuaG9zdFZpZXcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBjcmVhdGluZyBwcmV2aWV3LWxpc3QgbW9kYWw6JywgZXJyb3IpO1xuICAgICAgdGhpcy5jbGVhbnVwTW9kYWwoKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICBpZiAoZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQpIHtcbiAgICAgIGRvY3VtZW50Py5leGl0RnVsbHNjcmVlbigpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVByZXZpZXdTdGF0ZShmYWxzZSwgW10sIDApO1xuICAgIHRoaXMuY2xlYW51cE1vZGFsKCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBNb2RhbCgpIHtcbiAgICBpZiAoIXRoaXMubW9kYWxSZWYpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgLy8g5LuOIERPTSDkuK3np7vpmaTmqKHmgIHmoYZcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLm1vZGFsUmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIC8vIOS7jiBBcHBsaWNhdGlvblJlZiDkuK3liIbnprvop4blm75cbiAgICAgIHRoaXMuYXBwUmVmLmRldGFjaFZpZXcodGhpcy5tb2RhbFJlZi5ob3N0Vmlldyk7XG4gICAgICAvLyDplIDmr4Hnu4Tku7ZcbiAgICAgIHRoaXMubW9kYWxSZWYuZGVzdHJveSgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBjbGVhbmluZyB1cCBtb2RhbDonLCBlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMubW9kYWxSZWYgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLy8gZW5kcmVnaW9uXG5cblxufVxuIl19