From 52095e37ec48087ee032e89113c00d19e85b1c46 Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Wed, 18 Mar 2026 14:37:45 +0100 Subject: [PATCH] Add loader to publication post --- ...ication-file-get-by-document-id.service.ts | 4 +-- ...n-files-delete-by-path-use-case.service.ts | 11 +++++-- src/app/infra/http/http.service.ts | 19 +++++++++++- .../interceptors/token.interceptors.ts | 2 +- ...lication-file-remote-repository.service.ts | 7 +++-- .../publication-remote-repository.service.ts | 16 ++++++++++ .../view-publications.page.ts | 10 ++++++- src/app/services/publications.service.ts | 30 +++++++++---------- .../upload/publication-from-mv.service.ts | 4 ++- .../view-publications.page.html | 6 +++- .../view-publications.page.scss | 18 ++++++++++- .../view-publications.page.ts | 13 +++++++- src/app/shared/swiper/swiper.page.scss | 2 +- src/app/shared/swiper/swiper.page.ts | 20 +++++++++++-- 14 files changed, 131 insertions(+), 31 deletions(-) diff --git a/src/app/core/actions/use-case/publication-file-get-by-document-id.service.ts b/src/app/core/actions/use-case/publication-file-get-by-document-id.service.ts index cb1ceba87..4c8d352da 100644 --- a/src/app/core/actions/use-case/publication-file-get-by-document-id.service.ts +++ b/src/app/core/actions/use-case/publication-file-get-by-document-id.service.ts @@ -58,7 +58,7 @@ export class PublicationFileGetByDocumentIdService { } } - for (const file of serverFiles) { + for (const file of serverFiles.data || []) { const findLocally = await this.local.findOne({ name: file.name }); if (findLocally.isOk() && findLocally.value == null) { @@ -81,7 +81,7 @@ export class PublicationFileGetByDocumentIdService { } for (const localFile of localResult.value) { - const found = httpResult.value.data.filter((e) => e.name === localFile.name); + const found = httpResult.value.data.data.filter((e) => e.name === localFile.name); if (found.length === 0 && localFile.name) { remove.push(localFile); await this.local.delete(localFile.id); diff --git a/src/app/core/actions/use-case/publication-files-delete-by-path-use-case.service.ts b/src/app/core/actions/use-case/publication-files-delete-by-path-use-case.service.ts index 8355eae69..9f9249705 100644 --- a/src/app/core/actions/use-case/publication-files-delete-by-path-use-case.service.ts +++ b/src/app/core/actions/use-case/publication-files-delete-by-path-use-case.service.ts @@ -4,6 +4,7 @@ import { IPublicationDocument, PublicationDocumentEntitySchema } from '../entity import { zodSafeValidation } from 'src/app/utils/zodValidation'; import { MessageUpdateInput } from '../../chat/usecase/message/message-update-by-id-use-case.service'; import { Logger } from 'src/app/services/logger/main/service'; +import { PublicationFileLocalRepositoryService } from 'src/app/module/actions/data/repository/publication-file-local-repository.service'; @Injectable({ providedIn: 'root' @@ -11,15 +12,21 @@ import { Logger } from 'src/app/services/logger/main/service'; export class PublicationFilesDeleteByPathUseCaseService { constructor( - private remote: PublicationFileRepositoryService + private remote: PublicationFileRepositoryService, + private local: PublicationFileLocalRepositoryService ) { } - execute(file: IPublicationDocument) { + async execute(file: IPublicationDocument) { const validation = zodSafeValidation(PublicationDocumentEntitySchema, file) if(validation.isOk()) { + const result = await this.local.findOne({ path: file.path }) + if(result.isOk()) { + await this.local.delete(result.value.id); + } + } else { Logger.error('failed to update message, validation failed', { zodErrorList: validation.error.errors, diff --git a/src/app/infra/http/http.service.ts b/src/app/infra/http/http.service.ts index 2a040d698..6eba9803d 100644 --- a/src/app/infra/http/http.service.ts +++ b/src/app/infra/http/http.service.ts @@ -12,11 +12,15 @@ import { TracingType } from 'src/app/services/monitoring/opentelemetry/tracer'; }) export class HttpService { + pendingRequests = new Set(); private responseSubject = new BehaviorSubject, HttpErrorResponse>>(null); constructor(private http: HttpClient) { } private async handleRequest(fux: Function, tracing?: TracingType, url?: string, method?: string): Promise, HttpErrorResponse>> { + const requestKey = `${method}:${url.replace(":", "")}`; + this.pendingRequests.add(requestKey); + try { var response = await fux(tracing) as HttpResponse @@ -24,7 +28,7 @@ export class HttpService { data: response.body, status: response.status, headers: response.headers, - url: response.url || url, + url: response.url || url, method: method || '', } this.responseSubject.next(ok(data)) @@ -32,9 +36,22 @@ export class HttpService { } catch (e) { this.responseSubject.next(err(e)) return err(e as HttpErrorResponse); + } finally { + this.pendingRequests.delete(requestKey); } } + hasPendingRequest(method: string, path: string): boolean { + for (const key of this.pendingRequests) { + const [reqMethod, reqUrl] = key.split(':'); + + if (reqMethod == method && reqUrl.toLowerCase().includes(path.toLowerCase())) { + return true; + } + } + return false; + } + async post(url: string, body: any, tracing?: TracingType): Promise, HttpErrorResponse>> { return await this.handleRequest(async () => await this.http.post(url, body, { observe: 'response' }).toPromise(), tracing, url, 'POST') } diff --git a/src/app/infra/monitoring/interceptors/token.interceptors.ts b/src/app/infra/monitoring/interceptors/token.interceptors.ts index a79e6c035..8f3b3409d 100644 --- a/src/app/infra/monitoring/interceptors/token.interceptors.ts +++ b/src/app/infra/monitoring/interceptors/token.interceptors.ts @@ -115,7 +115,7 @@ export class TokenInterceptor implements HttpInterceptor { } return this.http - .post(`${environment.apiURL}Users/RefreshToken`, { + .post(`${environment.apiURLStage}Users/RefreshToken`, { authorization: SessionStore.user.Authorization, refreshToken: SessionStore.user.RefreshToken, channelId diff --git a/src/app/module/actions/data/repository/publication-file-remote-repository.service.ts b/src/app/module/actions/data/repository/publication-file-remote-repository.service.ts index d6199f9de..c8cf8abce 100644 --- a/src/app/module/actions/data/repository/publication-file-remote-repository.service.ts +++ b/src/app/module/actions/data/repository/publication-file-remote-repository.service.ts @@ -4,6 +4,7 @@ import { PublicationListByProcessIdOutPut } from 'src/app/core/actions/use-case/ import { ApiResponse } from 'src/app/infra/http/type'; import { HttpService } from 'src/app/services/http.service'; import { environment } from 'src/environments/environment'; +import { HttpService as HttpServiceInfra } from 'src/app/infra/http/http.service'; @Injectable({ providedIn: 'root' @@ -13,7 +14,9 @@ export class PublicationFileRemoteRepositoryService { private baseUrl = `${environment.apiURLStage.slice(0, -1)}/PresidentialActions`; // Your base URL constructor( - private http: HttpService + private http: HttpService, + private httpServiceInfra: HttpServiceInfra, + ) { } async listByProcessId(processId: string) { @@ -22,6 +25,6 @@ export class PublicationFileRemoteRepositoryService { } async FileListByDocumentId(input: PublicationFileGetByDocumentIdInput) { - return await this.http.get>(`${this.baseUrl}/Posts/${input.documentId}/file`); + return await this.httpServiceInfra.get>(`${this.baseUrl}/Posts/${input.documentId}/file`); } } diff --git a/src/app/module/actions/data/repository/publication-remote-repository.service.ts b/src/app/module/actions/data/repository/publication-remote-repository.service.ts index 3172b86c9..a90ac62a2 100644 --- a/src/app/module/actions/data/repository/publication-remote-repository.service.ts +++ b/src/app/module/actions/data/repository/publication-remote-repository.service.ts @@ -28,4 +28,20 @@ export class PublicationRemoteRepositoryService { async updatePublication(input: PublicationUpdateInputDto) { return await this.http.put>(`${this.baseUrl}/${input.processId}/Posts/${input.documentId}`, input); } + + + isUpdatingPublication(publicationId: string, processId: string): boolean { + return this.http.hasPendingRequest( + 'PUT', + `/PresidentialActions/${processId}/Posts/${publicationId}` + ); + } + + isFechingFilesPublication(publicationId: string): boolean { + console.log('isFechingFilesPublication', `/PresidentialActions/Posts/${publicationId}/Posts`); + return this.http.hasPendingRequest( + 'GET', + `/PresidentialActions/Posts/${publicationId}/file` + ); + } } diff --git a/src/app/pages/publications/view-publications/view-publications.page.ts b/src/app/pages/publications/view-publications/view-publications.page.ts index 5bf638483..f0e4ba16f 100644 --- a/src/app/pages/publications/view-publications/view-publications.page.ts +++ b/src/app/pages/publications/view-publications/view-publications.page.ts @@ -18,6 +18,9 @@ import { StopvideoService } from "src/app/services/stopvideo.service" import { App } from '@capacitor/app'; import { ActiveTabService } from 'src/app/services/active-tab.service'; import { PublicationHolderService } from 'src/app/services/publication/publication-holder.service' +import { HttpService } from 'src/app/infra/http/http.service'; +import { environment } from 'src/environments/environment'; +import { PublicationRemoteRepositoryService } from 'src/app/module/actions/data/repository/publication-remote-repository.service'; @Component({ selector: 'app-view-publications', @@ -74,7 +77,9 @@ export class ViewPublicationsPage implements OnInit { public stopvideoService: StopvideoService, public platform: Platform, public activeTabService: ActiveTabService, - public PublicationHolderService: PublicationHolderService) { + public PublicationHolderService: PublicationHolderService, + private http: HttpService, + private publicationRemoteRepository: PublicationRemoteRepositoryService) { this.createPublicationList() @@ -102,6 +107,9 @@ export class ViewPublicationsPage implements OnInit { } + isUploadingPublicationById(publicationId: string) { + return this.publicationRemoteRepository.isUpdatingPublication(publicationId, this.folderId); + } onVisibilityChange = (e: boolean) => { if (!e) { diff --git a/src/app/services/publications.service.ts b/src/app/services/publications.service.ts index 7eec20649..fdf721524 100644 --- a/src/app/services/publications.service.ts +++ b/src/app/services/publications.service.ts @@ -232,25 +232,25 @@ GetIdsPublicationNext(id:any){ return this.http.post(`${geturl}`, body, options) } - UpdatePublication(folderId:any,body:any){ - const geturl = environment.apiURL + 'presidentialActions/'+folderId+'/posts'; - let params = new HttpParams(); - params = params.set("folderId", folderId); - let options = { - headers: this.headers, - /* params: params */ - }; + // UpdatePublication(folderId:any,body:any){ + // const geturl = environment.apiURL + 'presidentialActions/'+folderId+'/posts'; + // let params = new HttpParams(); + // params = params.set("folderId", folderId); + // let options = { + // headers: this.headers, + // /* params: params */ + // }; - body.Files = body.Files.map( e => ({ - FileBase64: e.FileBase64, - FileExtension: e.FileExtension, - OriginalFileName: e.OriginalFileName || 'foto' - })) + // body.Files = body.Files.map( e => ({ + // FileBase64: e.FileBase64, + // FileExtension: e.FileExtension, + // OriginalFileName: e.OriginalFileName || 'foto' + // })) - return this.http.put(`${geturl}`, body, options) - } + // return this.http.put(`${geturl}`, body, options) + // } DeletePublication(folderId:any,publicationId:any){ var baseUrl = `${environment.apiURLStage.slice(0, -1)}/PresidentialActions`; diff --git a/src/app/shared/publication/upload/publication-from-mv.service.ts b/src/app/shared/publication/upload/publication-from-mv.service.ts index ee7599e52..377b8f5c8 100644 --- a/src/app/shared/publication/upload/publication-from-mv.service.ts +++ b/src/app/shared/publication/upload/publication-from-mv.service.ts @@ -10,6 +10,7 @@ import { v4 as uuidv4 } from 'uuid' import { Result } from 'neverthrow'; import { IPublicationFormModelEntity } from '../new-publication/interface/interface'; import { ModalController, Platform } from '@ionic/angular'; +import { PublicationRemoteRepositoryService } from 'src/app/module/actions/data/repository/publication-remote-repository.service'; enum ActionType { newRapid = "1", @@ -37,6 +38,7 @@ export class PublicationFromMvService { public PublicationFolderService: PublicationFolderService, public publicationFolderService: PublicationFolderService, private platform: Platform, + private publicationRemoteRepository: PublicationRemoteRepositoryService ) {} clear() { @@ -121,7 +123,7 @@ export class PublicationFromMvService { try { - const response = await this.publications.UpdatePublication(publication.ProcessId, publication).toPromise() + await this.publicationRemoteRepository.updatePublication(publication); if (this.form.cancel == false) { this.httpErroHandle.httpsSucessMessagge('Editar publicação') diff --git a/src/app/shared/publication/view-publications/view-publications.page.html b/src/app/shared/publication/view-publications/view-publications.page.html index 8ae9b1ca4..b02b68c38 100644 --- a/src/app/shared/publication/view-publications/view-publications.page.html +++ b/src/app/shared/publication/view-publications/view-publications.page.html @@ -56,7 +56,11 @@
{{publication.title}}
-
{{publication.datePublication | date: 'dd-MM-yyyy HH:mm'}}
+
+

+ {{publication.datePublication | date: 'dd-MM-yyyy HH:mm'}} +

+
{ if(!e) { diff --git a/src/app/shared/swiper/swiper.page.scss b/src/app/shared/swiper/swiper.page.scss index bb934f0e1..eee89a170 100644 --- a/src/app/shared/swiper/swiper.page.scss +++ b/src/app/shared/swiper/swiper.page.scss @@ -170,7 +170,7 @@ video { } .post-title-time { width: 100%; - overflow: auto; + overflow: hidden; margin-top: 10px; } .post-title { diff --git a/src/app/shared/swiper/swiper.page.ts b/src/app/shared/swiper/swiper.page.ts index ece1a77ae..6f6999722 100644 --- a/src/app/shared/swiper/swiper.page.ts +++ b/src/app/shared/swiper/swiper.page.ts @@ -40,7 +40,7 @@ export class SwiperPage implements OnInit { ngOnInit() { this.local.find({documentId: this.documentId}).then(async e => { - if(e.isOk() && e.value.length == 0) { + if(e.isOk() && e.value.length == 0) { // has no files in local console.log('===============================================0') var result = await this.publicationFileGetByDocumentIdService.execute({ documentId: this.documentId, @@ -51,11 +51,13 @@ export class SwiperPage implements OnInit { if(result.isOk()) { this.publicationList = result.value.added; this.makeLoad(); + this.updateSwiper(); } - } else if(e.isOk()) { + } else if(e.isOk()) { // has files in local console.log('===============================================1') this.publicationList = e.value; this.makeLoad(); + this.updateSwiper(); var a = e.value.find(e => e.datePublication != this.datePublication) if(a) { @@ -69,6 +71,7 @@ export class SwiperPage implements OnInit { var newList = await this.local.find({documentId: this.documentId}) if(newList.isOk()) { this.publicationList = newList.value; + this.updateSwiper(); } this.makeLoad(); } @@ -188,6 +191,19 @@ export class SwiperPage implements OnInit { } } + + updateSwiper() { + setTimeout(() => { + if (this.swiperRef?.nativeElement?.swiper) { + const swiper = this.swiperRef.nativeElement.swiper; + swiper.update(); // Recalculate slides + swiper.updateSlides(); // Rebuild slides + swiper.updateProgress(); // Fix progress + swiper.updateSize(); // Fix dimensions + } + }, 0); + } + }