@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
JavaScript
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