@propbinder/mobile-design 0.2.50 → 0.2.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/propbinder-mobile-design.mjs +26206 -0
- package/fesm2022/propbinder-mobile-design.mjs.map +1 -0
- package/index.d.ts +8193 -0
- package/package.json +39 -3
- package/ng-package.json +0 -24
- package/src/animations/page-transitions.ts +0 -165
- package/src/components/action-list-item/ds-mobile-action-list-item.ts +0 -102
- package/src/components/action-list-item/index.ts +0 -2
- package/src/components/app-icon/ds-app-icon.ts +0 -133
- package/src/components/app-icon/index.ts +0 -2
- package/src/components/attachment-preview/ds-mobile-attachment-preview.css +0 -139
- package/src/components/attachment-preview/ds-mobile-attachment-preview.ts +0 -164
- package/src/components/attachment-preview/index.ts +0 -1
- package/src/components/avatar-with-badge/ds-avatar-with-badge.ts +0 -142
- package/src/components/avatar-with-badge/index.ts +0 -2
- package/src/components/booking-modal/ds-mobile-booking-confirmation-wrapper.ts +0 -71
- package/src/components/booking-modal/ds-mobile-booking-modal.service.ts +0 -121
- package/src/components/booking-modal/ds-mobile-booking-modal.ts +0 -598
- package/src/components/booking-modal/ds-mobile-booking-summary.ts +0 -161
- package/src/components/booking-modal/index.ts +0 -4
- package/src/components/bottom-sheet/ds-mobile-actions-bottom-sheet.ts +0 -266
- package/src/components/bottom-sheet/ds-mobile-bottom-sheet-header.ts +0 -146
- package/src/components/bottom-sheet/ds-mobile-bottom-sheet-wrapper.ts +0 -156
- package/src/components/bottom-sheet/ds-mobile-bottom-sheet.css +0 -101
- package/src/components/bottom-sheet/ds-mobile-bottom-sheet.service.ts +0 -169
- package/src/components/bottom-sheet/ds-mobile-confirmation-sheet.ts +0 -211
- package/src/components/bottom-sheet/ds-mobile-post-create-bottom-sheet.ts +0 -578
- package/src/components/bottom-sheet/ds-mobile-profile-actions-sheet.ts +0 -614
- package/src/components/bottom-sheet/index.ts +0 -8
- package/src/components/bottom-sheet/modal-shadow-fix.ts +0 -42
- package/src/components/card-inline/ds-mobile-card-inline.ts +0 -301
- package/src/components/card-inline/index.ts +0 -2
- package/src/components/card-inline-banner/ds-mobile-card-inline-banner.ts +0 -118
- package/src/components/card-inline-banner/index.ts +0 -1
- package/src/components/card-inline-contact/ds-mobile-card-inline-contact.ts +0 -120
- package/src/components/card-inline-contact/index.ts +0 -1
- package/src/components/card-inline-file/ds-mobile-card-inline-file.ts +0 -141
- package/src/components/card-inline-file/index.ts +0 -1
- package/src/components/chat-modal/ds-mobile-chat-modal.css +0 -159
- package/src/components/chat-modal/ds-mobile-chat-modal.service.ts +0 -105
- package/src/components/chat-modal/ds-mobile-chat-modal.ts +0 -918
- package/src/components/chat-modal/index.ts +0 -8
- package/src/components/comment/ds-mobile-comment.ts +0 -568
- package/src/components/comment/index.ts +0 -2
- package/src/components/contact-list-item/ds-mobile-contact-list-item.ts +0 -182
- package/src/components/contact-list-item/index.ts +0 -2
- package/src/components/content/ds-mobile-content.ts +0 -139
- package/src/components/content/index.ts +0 -2
- package/src/components/dropdown/ds-mobile-dropdown.css +0 -199
- package/src/components/dropdown/ds-mobile-dropdown.ts +0 -340
- package/src/components/dropdown/index.ts +0 -2
- package/src/components/ds-mobile-tabs.css +0 -407
- package/src/components/ds-mobile-tabs.ts +0 -216
- package/src/components/empty-state/ds-mobile-empty-state.ts +0 -120
- package/src/components/empty-state/index.ts +0 -2
- package/src/components/fab/ds-mobile-fab.ts +0 -315
- package/src/components/fab/index.ts +0 -1
- package/src/components/facility-creation-modal/ds-mobile-facility-creation-confirmation-wrapper.ts +0 -121
- package/src/components/facility-creation-modal/ds-mobile-facility-creation-modal.css +0 -189
- package/src/components/facility-creation-modal/ds-mobile-facility-creation-modal.service.ts +0 -135
- package/src/components/facility-creation-modal/ds-mobile-facility-creation-modal.ts +0 -656
- package/src/components/facility-creation-modal/index.ts +0 -9
- package/src/components/facility-creation-modal/sheets/ds-mobile-access-sheet.ts +0 -105
- package/src/components/facility-creation-modal/sheets/ds-mobile-price-sheet.ts +0 -188
- package/src/components/facility-creation-modal/sheets/ds-mobile-when-can-book-sheet.ts +0 -460
- package/src/components/facility-creation-modal/sheets/ds-mobile-who-can-book-sheet.ts +0 -134
- package/src/components/facility-detail-modal/ds-mobile-facility-detail-modal.service.ts +0 -69
- package/src/components/facility-detail-modal/ds-mobile-facility-detail-modal.ts +0 -379
- package/src/components/facility-detail-modal/index.ts +0 -2
- package/src/components/file-attachment/ds-mobile-file-attachment.ts +0 -164
- package/src/components/file-attachment/index.ts +0 -2
- package/src/components/handbook-detail-modal/ds-mobile-handbook-detail-modal.css +0 -214
- package/src/components/handbook-detail-modal/ds-mobile-handbook-detail-modal.service.ts +0 -84
- package/src/components/handbook-detail-modal/ds-mobile-handbook-detail-modal.ts +0 -424
- package/src/components/handbook-detail-modal/index.ts +0 -3
- package/src/components/handbook-folder/ds-mobile-handbook-folder-mini.ts +0 -175
- package/src/components/handbook-folder/ds-mobile-handbook-folder.ts +0 -533
- package/src/components/handbook-folder/index.ts +0 -4
- package/src/components/header-content/ds-mobile-header-content.ts +0 -222
- package/src/components/header-content/index.ts +0 -2
- package/src/components/illustration/ds-mobile-illustration.ts +0 -124
- package/src/components/illustration/index.ts +0 -2
- package/src/components/index.ts +0 -124
- package/src/components/inline-photo/ds-mobile-inline-photo.ts +0 -361
- package/src/components/inline-photo/index.ts +0 -1
- package/src/components/inline-tabs/ds-mobile-inline-tabs.ts +0 -132
- package/src/components/inline-tabs/index.ts +0 -2
- package/src/components/interactive-list-item-booking/ds-mobile-interactive-list-item-booking.ts +0 -350
- package/src/components/interactive-list-item-booking/index.ts +0 -1
- package/src/components/interactive-list-item-inquiry/ds-mobile-interactive-list-item-inquiry.ts +0 -321
- package/src/components/interactive-list-item-inquiry/index.ts +0 -2
- package/src/components/interactive-list-item-message/ds-mobile-interactive-list-item-message.ts +0 -237
- package/src/components/interactive-list-item-message/index.ts +0 -2
- package/src/components/interactive-list-item-post/ds-mobile-interactive-list-item-post.ts +0 -549
- package/src/components/interactive-list-item-post/ds-mobile-post-pdf-attachment.ts +0 -124
- package/src/components/interactive-list-item-post/index.ts +0 -13
- package/src/components/lightbox/ds-mobile-lightbox-footer.ts +0 -315
- package/src/components/lightbox/ds-mobile-lightbox-header.ts +0 -202
- package/src/components/lightbox/ds-mobile-lightbox-image.ts +0 -484
- package/src/components/lightbox/ds-mobile-lightbox-pdf.css +0 -377
- package/src/components/lightbox/ds-mobile-lightbox-pdf.ts +0 -374
- package/src/components/lightbox/ds-mobile-lightbox.css +0 -587
- package/src/components/lightbox/ds-mobile-lightbox.service.ts +0 -296
- package/src/components/lightbox/ds-mobile-lightbox.ts +0 -529
- package/src/components/lightbox/index.ts +0 -22
- package/src/components/list-item/ds-mobile-list-item.ts +0 -603
- package/src/components/list-item/index.ts +0 -2
- package/src/components/list-item-static/ds-mobile-list-item-static.ts +0 -133
- package/src/components/list-item-static/index.ts +0 -2
- package/src/components/loader-overlay/ds-mobile-loader-overlay.css +0 -49
- package/src/components/loader-overlay/ds-mobile-loader-overlay.ts +0 -77
- package/src/components/loader-overlay/index.ts +0 -1
- package/src/components/logo/ds-logo.ts +0 -95
- package/src/components/logo/index.ts +0 -2
- package/src/components/message-bubble/ds-mobile-message-bubble.ts +0 -633
- package/src/components/message-bubble/index.ts +0 -7
- package/src/components/message-composer/ds-mobile-message-composer.ts +0 -1146
- package/src/components/message-composer/index.ts +0 -7
- package/src/components/modal/ds-mobile-modal.css +0 -163
- package/src/components/modal/ds-mobile-modal.service.ts +0 -329
- package/src/components/modal/index.ts +0 -8
- package/src/components/modal-base/ds-mobile-modal-base.css +0 -378
- package/src/components/modal-base/ds-mobile-modal-base.ts +0 -261
- package/src/components/modal-base/index.ts +0 -2
- package/src/components/new-inquiry-modal/ds-mobile-new-inquiry-modal.css +0 -112
- package/src/components/new-inquiry-modal/ds-mobile-new-inquiry-modal.service.ts +0 -93
- package/src/components/new-inquiry-modal/ds-mobile-new-inquiry-modal.ts +0 -442
- package/src/components/new-inquiry-modal/index.ts +0 -4
- package/src/components/offline-banner/ds-mobile-offline-banner.ts +0 -135
- package/src/components/offline-banner/index.ts +0 -1
- package/src/components/page-details/ds-mobile-page-details.css +0 -83
- package/src/components/page-details/ds-mobile-page-details.ts +0 -282
- package/src/components/page-details/index.ts +0 -2
- package/src/components/page-main/ds-mobile-page-main.css +0 -68
- package/src/components/page-main/ds-mobile-page-main.ts +0 -421
- package/src/components/page-main/index.ts +0 -2
- package/src/components/post-composer/ds-mobile-post-composer.ts +0 -140
- package/src/components/post-composer/index.ts +0 -2
- package/src/components/post-detail-modal/ds-mobile-post-detail-modal.css +0 -390
- package/src/components/post-detail-modal/ds-mobile-post-detail-modal.service.ts +0 -108
- package/src/components/post-detail-modal/ds-mobile-post-detail-modal.ts +0 -722
- package/src/components/post-detail-modal/index.ts +0 -9
- package/src/components/property-banner/ds-mobile-property-banner.ts +0 -95
- package/src/components/property-banner/index.ts +0 -2
- package/src/components/section/ds-mobile-section.ts +0 -263
- package/src/components/section/index.ts +0 -2
- package/src/components/shared/directives/index.ts +0 -2
- package/src/components/shared/directives/long-press.directive.ts +0 -212
- package/src/components/shared/index.ts +0 -3
- package/src/components/shared/mobile-modal-base.ts +0 -457
- package/src/components/shared/mobile-page-base.ts +0 -204
- package/src/components/swiper/ds-mobile-swiper-with-nav.ts +0 -160
- package/src/components/swiper/ds-mobile-swiper.ts +0 -327
- package/src/components/swiper/index.ts +0 -3
- package/src/components/system-message-banner/ds-mobile-system-message-banner.ts +0 -129
- package/src/components/system-message-banner/index.ts +0 -2
- package/src/components/tab-bar/ds-mobile-tab-bar.css +0 -533
- package/src/components/tab-bar/ds-mobile-tab-bar.ts +0 -735
- package/src/components/tab-bar/index.ts +0 -2
- package/src/components/tabs/ds-mobile-tabs.css +0 -25
- package/src/components/tabs/ds-mobile-tabs.ts +0 -89
- package/src/components/tabs/index.ts +0 -2
- package/src/components/text-input/ds-text-input.ts +0 -287
- package/src/components/text-input/index.ts +0 -2
- package/src/examples/booking.page.ts +0 -434
- package/src/examples/community.page.ts +0 -776
- package/src/examples/handbook.page.ts +0 -324
- package/src/examples/home.page.ts +0 -347
- package/src/examples/index.ts +0 -12
- package/src/examples/inquiries.example.ts +0 -273
- package/src/examples/inquiry-detail.example.css +0 -189
- package/src/examples/inquiry-detail.example.ts +0 -415
- package/src/examples/mobile-tabs-example.component.ts +0 -208
- package/src/examples/post-create.page.ts +0 -311
- package/src/examples/post-detail.page.ts +0 -296
- package/src/examples/sign-in.page.ts +0 -291
- package/src/examples/whitelabel-demo-modal.component.ts +0 -1094
- package/src/examples/whitelabel-demo-modal.service.ts +0 -77
- package/src/models/index.ts +0 -7
- package/src/models/post.model.ts +0 -41
- package/src/pages/community.page.ts +0 -769
- package/src/pages/handbook.page.ts +0 -388
- package/src/pages/home.page.ts +0 -303
- package/src/pages/index.ts +0 -11
- package/src/pages/inquiries.example.ts +0 -273
- package/src/pages/inquiry-detail.example.css +0 -189
- package/src/pages/inquiry-detail.example.ts +0 -415
- package/src/pages/mobile-tabs-example.component.ts +0 -179
- package/src/pages/post-create.page.ts +0 -311
- package/src/pages/post-detail.page.ts +0 -296
- package/src/pages/sign-in.page.ts +0 -291
- package/src/pages/whitelabel-demo-modal.component.ts +0 -1094
- package/src/pages/whitelabel-demo-modal.service.ts +0 -77
- package/src/public-api.ts +0 -6
- package/src/services/base-modal.service.ts +0 -101
- package/src/services/index.ts +0 -11
- package/src/services/posts.service.ts +0 -542
- package/src/services/tracking-permission.service.ts +0 -88
- package/src/services/user.service.ts +0 -60
- package/src/services/whitelabel.service.ts +0 -675
- package/tsconfig.lib.json +0 -17
- package/tsconfig.lib.prod.json +0 -9
- package/tsconfig.spec.json +0 -13
- /package/{src/assets → assets}/fonts/Brockmann-Bold.otf +0 -0
- /package/{src/assets → assets}/fonts/Brockmann-BoldItalic.otf +0 -0
- /package/{src/assets → assets}/fonts/Brockmann-Medium.otf +0 -0
- /package/{src/assets → assets}/fonts/Brockmann-MediumItalic.otf +0 -0
- /package/{src/assets → assets}/fonts/Brockmann-Regular.otf +0 -0
- /package/{src/assets → assets}/fonts/Brockmann-RegularItalic.otf +0 -0
- /package/{src/assets → assets}/fonts/Brockmann-SemiBold.otf +0 -0
- /package/{src/assets → assets}/fonts/Brockmann-SemiBoldItalic.otf +0 -0
- /package/{src/assets → assets}/fonts/Brockmann_desktop_license.pdf +0 -0
- /package/{src/assets → assets}/fonts/brockmann-medium-webfont.woff2 +0 -0
- /package/{src/assets → assets}/fonts/brockmann-mediumitalic-webfont.woff2 +0 -0
- /package/{src/assets → assets}/fonts/brockmann-regular-webfont.woff2 +0 -0
- /package/{src/assets → assets}/fonts/brockmann-regularitalic-webfont.woff2 +0 -0
- /package/{src/assets → assets}/fonts/brockmann-semibold-webfont.woff2 +0 -0
- /package/{src/assets → assets}/fonts/brockmann-semibolditalic-webfont.woff2 +0 -0
- /package/{src/styles → styles}/ionic.css +0 -0
- /package/{src/components/shared → styles}/mobile-common.css +0 -0
- /package/{src/components/shared → styles}/mobile-page-base.css +0 -0
|
@@ -1,374 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Component,
|
|
3
|
-
OnInit,
|
|
4
|
-
CUSTOM_ELEMENTS_SCHEMA
|
|
5
|
-
} from '@angular/core';
|
|
6
|
-
import { CommonModule } from '@angular/common';
|
|
7
|
-
import {
|
|
8
|
-
IonContent,
|
|
9
|
-
IonSpinner
|
|
10
|
-
} from '@ionic/angular/standalone';
|
|
11
|
-
import { Filesystem, Directory } from '@capacitor/filesystem';
|
|
12
|
-
import { Browser } from '@capacitor/browser';
|
|
13
|
-
import { Share } from '@capacitor/share';
|
|
14
|
-
import { DsAvatarComponent } from '@propbinder/design-system';
|
|
15
|
-
import { DsButtonComponent } from '@propbinder/design-system';
|
|
16
|
-
import { DsMobileLightboxHeaderComponent } from './ds-mobile-lightbox-header';
|
|
17
|
-
import { DsMobileLightboxFooterComponent } from './ds-mobile-lightbox-footer';
|
|
18
|
-
import type { LightboxPdf, LightboxAuthor } from './ds-mobile-lightbox.service';
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* DsMobileLightboxPdfComponent
|
|
22
|
-
*
|
|
23
|
-
* PDF viewer component that displays PDF info and allows users to open PDFs in the native device viewer.
|
|
24
|
-
* Shows a lightbox with PDF details first, then user can choose to open in native viewer.
|
|
25
|
-
*
|
|
26
|
-
* This component is typically not used directly - use DsMobileLightboxService instead.
|
|
27
|
-
*
|
|
28
|
-
* Features:
|
|
29
|
-
* - PDF info preview (title, size, icon)
|
|
30
|
-
* - User-initiated native PDF viewing (iOS/Android)
|
|
31
|
-
* - Download and cache support
|
|
32
|
-
* - Share functionality
|
|
33
|
-
* - Loading states
|
|
34
|
-
*
|
|
35
|
-
* @example
|
|
36
|
-
* ```typescript
|
|
37
|
-
* // Don't instantiate directly - use the service:
|
|
38
|
-
* constructor(private lightbox: DsMobileLightboxService) {}
|
|
39
|
-
*
|
|
40
|
-
* openPdf() {
|
|
41
|
-
* this.lightbox.openPdf({
|
|
42
|
-
* pdf: { type: 'pdf', src: 'document.pdf', title: 'My Document' }
|
|
43
|
-
* });
|
|
44
|
-
* }
|
|
45
|
-
* ```
|
|
46
|
-
*/
|
|
47
|
-
@Component({
|
|
48
|
-
selector: 'ds-mobile-lightbox-pdf',
|
|
49
|
-
standalone: true,
|
|
50
|
-
imports: [
|
|
51
|
-
CommonModule,
|
|
52
|
-
IonContent,
|
|
53
|
-
IonSpinner,
|
|
54
|
-
DsAvatarComponent,
|
|
55
|
-
DsButtonComponent,
|
|
56
|
-
DsMobileLightboxHeaderComponent,
|
|
57
|
-
DsMobileLightboxFooterComponent
|
|
58
|
-
],
|
|
59
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
60
|
-
template: `
|
|
61
|
-
<ion-content
|
|
62
|
-
[fullscreen]="true"
|
|
63
|
-
class="lightbox-content pdf-viewer">
|
|
64
|
-
|
|
65
|
-
<div class="lightbox-wrapper">
|
|
66
|
-
<!-- Header with author info and close button -->
|
|
67
|
-
<ds-mobile-lightbox-header
|
|
68
|
-
[author]="author"
|
|
69
|
-
(closeClick)="close()"
|
|
70
|
-
/>
|
|
71
|
-
|
|
72
|
-
<!-- PDF Info & Actions -->
|
|
73
|
-
<div class="pdf-container">
|
|
74
|
-
@if (isLoading) {
|
|
75
|
-
<div class="loading-state">
|
|
76
|
-
<ion-spinner name="crescent"></ion-spinner>
|
|
77
|
-
<p>Loading PDF...</p>
|
|
78
|
-
</div>
|
|
79
|
-
} @else if (hasError) {
|
|
80
|
-
<div class="error-state">
|
|
81
|
-
<svg width="64" height="64" viewBox="0 0 24 24" fill="none">
|
|
82
|
-
<path d="M12 8V12M12 16H12.01M21 12C21 16.9706 16.9706 21 12 21C7.02944 21 3 16.9706 3 12C3 7.02944 7.02944 3 12 3C16.9706 3 21 7.02944 21 12Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
83
|
-
</svg>
|
|
84
|
-
<h3>Failed to Load PDF</h3>
|
|
85
|
-
<p>{{ errorMessage }}</p>
|
|
86
|
-
<button class="retry-button" (click)="openPdfInNativeViewer()">
|
|
87
|
-
Try Again
|
|
88
|
-
</button>
|
|
89
|
-
</div>
|
|
90
|
-
} @else {
|
|
91
|
-
<div class="pdf-content">
|
|
92
|
-
<!-- PDF Icon -->
|
|
93
|
-
<ds-avatar
|
|
94
|
-
type="icon"
|
|
95
|
-
iconName="remixFileTextLine"
|
|
96
|
-
size="xl"
|
|
97
|
-
/>
|
|
98
|
-
|
|
99
|
-
<!-- PDF Title (same as attachment fileName) -->
|
|
100
|
-
<h2 class="pdf-title">{{ getDisplayTitle() }}</h2>
|
|
101
|
-
|
|
102
|
-
<!-- PDF Metadata (same format as attachment: PDF · fileSize) -->
|
|
103
|
-
<div class="pdf-meta">
|
|
104
|
-
PDF · {{ pdf.fileSize ? formatFileSize(pdf.fileSize) : '' }}
|
|
105
|
-
</div>
|
|
106
|
-
|
|
107
|
-
<!-- Open Button -->
|
|
108
|
-
<ds-button
|
|
109
|
-
variant="secondary"
|
|
110
|
-
size="lg"
|
|
111
|
-
(clicked)="openPdfInNativeViewer()"
|
|
112
|
-
class="open-pdf-button">
|
|
113
|
-
Open Preview
|
|
114
|
-
</ds-button>
|
|
115
|
-
</div>
|
|
116
|
-
}
|
|
117
|
-
</div>
|
|
118
|
-
|
|
119
|
-
<!-- Bottom actions -->
|
|
120
|
-
<ds-mobile-lightbox-footer
|
|
121
|
-
[isLiked]="false"
|
|
122
|
-
[likeCount]="0"
|
|
123
|
-
[commentCount]="0"
|
|
124
|
-
(likeClick)="onLikeToggle()"
|
|
125
|
-
(commentClick)="onReply()"
|
|
126
|
-
(shareClick)="onShare()"
|
|
127
|
-
/>
|
|
128
|
-
</div>
|
|
129
|
-
</ion-content>
|
|
130
|
-
`,
|
|
131
|
-
styleUrl: './ds-mobile-lightbox-pdf.css'
|
|
132
|
-
})
|
|
133
|
-
export class DsMobileLightboxPdfComponent implements OnInit {
|
|
134
|
-
// Inputs (passed from service as regular properties)
|
|
135
|
-
pdf!: LightboxPdf;
|
|
136
|
-
author?: LightboxAuthor;
|
|
137
|
-
onCloseRequested?: () => void;
|
|
138
|
-
|
|
139
|
-
// State
|
|
140
|
-
isLoading = false;
|
|
141
|
-
hasError = false;
|
|
142
|
-
errorMessage = '';
|
|
143
|
-
cachedFilePath?: string;
|
|
144
|
-
|
|
145
|
-
constructor() {}
|
|
146
|
-
|
|
147
|
-
ngOnInit(): void {
|
|
148
|
-
console.log('[PDF Lightbox] Initializing with PDF:', this.pdf);
|
|
149
|
-
|
|
150
|
-
// Don't automatically open - let user click the "Open" button
|
|
151
|
-
// this.openPdfInNativeViewer();
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* Open the PDF in the native device viewer
|
|
156
|
-
*/
|
|
157
|
-
async openPdfInNativeViewer(): Promise<void> {
|
|
158
|
-
if (!this.pdf?.src) {
|
|
159
|
-
console.error('[PDF Lightbox] No PDF source provided');
|
|
160
|
-
this.hasError = true;
|
|
161
|
-
this.errorMessage = 'No PDF file provided';
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
this.isLoading = true;
|
|
166
|
-
this.hasError = false;
|
|
167
|
-
this.errorMessage = '';
|
|
168
|
-
|
|
169
|
-
try {
|
|
170
|
-
console.log('[PDF Lightbox] Opening PDF:', this.pdf.src);
|
|
171
|
-
|
|
172
|
-
// Check if it's already a full URL
|
|
173
|
-
let pdfUrl: string;
|
|
174
|
-
|
|
175
|
-
if (this.pdf.src.startsWith('http://') || this.pdf.src.startsWith('https://')) {
|
|
176
|
-
// Already a full URL
|
|
177
|
-
pdfUrl = this.pdf.src;
|
|
178
|
-
} else {
|
|
179
|
-
// Relative path - construct full URL
|
|
180
|
-
// Use current origin (which includes the dev server URL in Capacitor)
|
|
181
|
-
// Remove leading slash if present to avoid double slashes
|
|
182
|
-
const cleanPath = this.pdf.src.startsWith('/') ? this.pdf.src.slice(1) : this.pdf.src;
|
|
183
|
-
pdfUrl = `${window.location.origin}/${cleanPath}`;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
console.log('[PDF Lightbox] Opening PDF at URL:', pdfUrl);
|
|
187
|
-
|
|
188
|
-
// Use Browser to open the PDF
|
|
189
|
-
await Browser.open({
|
|
190
|
-
url: pdfUrl,
|
|
191
|
-
presentationStyle: 'fullscreen'
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
this.isLoading = false;
|
|
195
|
-
|
|
196
|
-
// Close the modal after opening browser
|
|
197
|
-
setTimeout(() => {
|
|
198
|
-
this.close();
|
|
199
|
-
}, 500);
|
|
200
|
-
} catch (error: any) {
|
|
201
|
-
console.error('[PDF Lightbox] Error opening PDF:', error);
|
|
202
|
-
this.isLoading = false;
|
|
203
|
-
this.hasError = true;
|
|
204
|
-
this.errorMessage = error?.message || 'Failed to open PDF';
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Download a remote PDF and open it
|
|
210
|
-
*/
|
|
211
|
-
private async downloadAndOpenPdf(): Promise<void> {
|
|
212
|
-
try {
|
|
213
|
-
console.log('[PDF Lightbox] Downloading PDF from:', this.pdf.src);
|
|
214
|
-
|
|
215
|
-
// Fetch the PDF
|
|
216
|
-
const response = await fetch(this.pdf.src);
|
|
217
|
-
if (!response.ok) {
|
|
218
|
-
throw new Error(`Failed to download PDF: ${response.statusText}`);
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
const blob = await response.blob();
|
|
222
|
-
const base64Data = await this.blobToBase64(blob);
|
|
223
|
-
|
|
224
|
-
// Generate a filename
|
|
225
|
-
const fileName = this.pdf.title
|
|
226
|
-
? `${this.pdf.title.replace(/[^a-z0-9]/gi, '_')}.pdf`
|
|
227
|
-
: 'document.pdf';
|
|
228
|
-
|
|
229
|
-
// Save to cache directory
|
|
230
|
-
const result = await Filesystem.writeFile({
|
|
231
|
-
path: fileName,
|
|
232
|
-
data: base64Data,
|
|
233
|
-
directory: Directory.Cache
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
console.log('[PDF Lightbox] PDF saved to cache:', result.uri);
|
|
237
|
-
this.cachedFilePath = result.uri;
|
|
238
|
-
|
|
239
|
-
// Open using Browser
|
|
240
|
-
await Browser.open({
|
|
241
|
-
url: result.uri,
|
|
242
|
-
presentationStyle: 'fullscreen'
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
console.log('[PDF Lightbox] PDF opened successfully');
|
|
246
|
-
} catch (error) {
|
|
247
|
-
console.error('[PDF Lightbox] Error downloading/opening PDF:', error);
|
|
248
|
-
throw error;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Open a local PDF file
|
|
254
|
-
*/
|
|
255
|
-
private async openLocalPdf(): Promise<void> {
|
|
256
|
-
try {
|
|
257
|
-
// Remove leading slash if present to avoid double slashes
|
|
258
|
-
const cleanPath = this.pdf.src.startsWith('/') ? this.pdf.src.slice(1) : this.pdf.src;
|
|
259
|
-
const fullUrl = window.location.origin + '/' + cleanPath;
|
|
260
|
-
|
|
261
|
-
await Browser.open({
|
|
262
|
-
url: fullUrl,
|
|
263
|
-
presentationStyle: 'fullscreen'
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
console.log('[PDF Lightbox] Local PDF opened successfully');
|
|
267
|
-
} catch (error) {
|
|
268
|
-
console.error('[PDF Lightbox] Error opening local PDF:', error);
|
|
269
|
-
throw error;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
/**
|
|
274
|
-
* Convert Blob to base64 string
|
|
275
|
-
*/
|
|
276
|
-
private blobToBase64(blob: Blob): Promise<string> {
|
|
277
|
-
return new Promise((resolve, reject) => {
|
|
278
|
-
const reader = new FileReader();
|
|
279
|
-
reader.onloadend = () => {
|
|
280
|
-
const base64String = reader.result as string;
|
|
281
|
-
// Remove the data URL prefix
|
|
282
|
-
const base64Data = base64String.split(',')[1];
|
|
283
|
-
resolve(base64Data);
|
|
284
|
-
};
|
|
285
|
-
reader.onerror = reject;
|
|
286
|
-
reader.readAsDataURL(blob);
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
/**
|
|
291
|
-
* Get display title with file extension
|
|
292
|
-
* If title is provided, ensure it has .pdf extension
|
|
293
|
-
* Otherwise, extract filename from src
|
|
294
|
-
*/
|
|
295
|
-
getDisplayTitle(): string {
|
|
296
|
-
if (this.pdf.title) {
|
|
297
|
-
// If title doesn't end with .pdf, add it
|
|
298
|
-
return this.pdf.title.endsWith('.pdf') ? this.pdf.title : `${this.pdf.title}.pdf`;
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
// Extract filename from src
|
|
302
|
-
if (this.pdf.src) {
|
|
303
|
-
const filename = this.pdf.src.split('/').pop() || 'PDF Document.pdf';
|
|
304
|
-
return filename;
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
return 'PDF Document.pdf';
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
/**
|
|
311
|
-
* Format file size for display
|
|
312
|
-
*/
|
|
313
|
-
formatFileSize(bytes: number): string {
|
|
314
|
-
if (bytes === 0) return '0 Bytes';
|
|
315
|
-
|
|
316
|
-
const k = 1024;
|
|
317
|
-
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
|
|
318
|
-
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
319
|
-
|
|
320
|
-
return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
/**
|
|
324
|
-
* Share the PDF
|
|
325
|
-
*/
|
|
326
|
-
async onShare(): Promise<void> {
|
|
327
|
-
console.log('[PDF Lightbox] Share button clicked');
|
|
328
|
-
|
|
329
|
-
if (!this.pdf?.src) return;
|
|
330
|
-
|
|
331
|
-
try {
|
|
332
|
-
await Share.share({
|
|
333
|
-
title: this.pdf.title || 'PDF Document',
|
|
334
|
-
text: this.pdf.description || '',
|
|
335
|
-
url: this.pdf.src,
|
|
336
|
-
dialogTitle: 'Share PDF'
|
|
337
|
-
});
|
|
338
|
-
|
|
339
|
-
console.log('[PDF Lightbox] PDF shared successfully');
|
|
340
|
-
} catch (error) {
|
|
341
|
-
console.error('[PDF Lightbox] Error sharing PDF:', error);
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
/**
|
|
346
|
-
* Close the PDF viewer
|
|
347
|
-
*/
|
|
348
|
-
close(): void {
|
|
349
|
-
if (this.onCloseRequested) {
|
|
350
|
-
this.onCloseRequested();
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
/**
|
|
355
|
-
* Handle like toggle
|
|
356
|
-
*/
|
|
357
|
-
onLikeToggle(): void {
|
|
358
|
-
console.log('[PDF Lightbox] Like toggled');
|
|
359
|
-
// TODO: Implement like logic for PDFs if needed
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
/**
|
|
363
|
-
* Handle reply/comment
|
|
364
|
-
* Close the lightbox and signal to open post detail with comment focus
|
|
365
|
-
*/
|
|
366
|
-
onReply(): void {
|
|
367
|
-
console.log('[PDF Lightbox] Reply button clicked');
|
|
368
|
-
if (this.onCloseRequested) {
|
|
369
|
-
this.onCloseRequested();
|
|
370
|
-
// The calling code should handle opening the post detail modal
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
|