diff --git a/src/app/modals/session-expired-modal/session-expired-modal.module.ts b/src/app/modals/session-expired-modal/session-expired-modal.module.ts
new file mode 100644
index 000000000..a3ae0ec15
--- /dev/null
+++ b/src/app/modals/session-expired-modal/session-expired-modal.module.ts
@@ -0,0 +1,11 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { IonicModule } from '@ionic/angular';
+import { SessionExpiredModalPage } from './session-expired-modal.page';
+
+@NgModule({
+ declarations: [SessionExpiredModalPage],
+ imports: [CommonModule, IonicModule],
+ exports: [SessionExpiredModalPage],
+})
+export class SessionExpiredModalPageModule {}
diff --git a/src/app/modals/session-expired-modal/session-expired-modal.page.html b/src/app/modals/session-expired-modal/session-expired-modal.page.html
new file mode 100644
index 000000000..5f49a1686
--- /dev/null
+++ b/src/app/modals/session-expired-modal/session-expired-modal.page.html
@@ -0,0 +1,8 @@
+
+
+
+
Sessão expirada
+
{{ message }}
+
OK
+
+
diff --git a/src/app/modals/session-expired-modal/session-expired-modal.page.scss b/src/app/modals/session-expired-modal/session-expired-modal.page.scss
new file mode 100644
index 000000000..16e0c6505
--- /dev/null
+++ b/src/app/modals/session-expired-modal/session-expired-modal.page.scss
@@ -0,0 +1,39 @@
+.session-expired-content {
+ --background: transparent;
+}
+
+.session-expired-inner {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ min-height: 100%;
+ max-width: 400px;
+ margin: 0 auto;
+ text-align: center;
+}
+
+.session-expired-icon {
+ width: 48px;
+ height: 48px;
+ margin-bottom: 16px;
+}
+
+.session-expired-title {
+ margin: 0 0 12px;
+ font-size: 1.25rem;
+ font-weight: 600;
+}
+
+.session-expired-text {
+ margin: 0 0 24px;
+ line-height: 1.4;
+ font-size: 1rem;
+ color: var(--ion-color-medium-shade, #666);
+}
+
+.session-expired-btn {
+ width: 100%;
+ max-width: 280px;
+ margin: 0;
+}
diff --git a/src/app/services/session-expired-modal.service.ts b/src/app/services/session-expired-modal.service.ts
new file mode 100644
index 000000000..4586893fa
--- /dev/null
+++ b/src/app/services/session-expired-modal.service.ts
@@ -0,0 +1,43 @@
+import { Injectable } from '@angular/core';
+import { ModalController } from '@ionic/angular';
+import { SessionExpiredModalPage } from 'src/app/modals/session-expired-modal/session-expired-modal.page';
+
+@Injectable({
+ providedIn: 'root',
+})
+export class SessionExpiredModalService {
+ private open = false;
+
+ constructor(private modalCtrl: ModalController) {}
+
+ async present(message: string, onOk: () => void): Promise {
+ if (this.open) {
+ return;
+ }
+ this.open = true;
+ const modal = await this.modalCtrl.create({
+ component: SessionExpiredModalPage,
+ componentProps: {
+ message,
+ onConfirm: () => {
+ this.open = false;
+ modal.dismiss();
+ document.querySelectorAll('ion-modal').forEach((e: any) => e.remove());
+ document.querySelectorAll('.popover-viewport').forEach((e: any) => e.remove());
+ document.querySelectorAll('.loading-blocker').forEach((e: any) => e.remove());
+
+ onOk();
+ },
+ },
+ backdropDismiss: true,
+ canDismiss: false,
+ keyboardClose: false,
+ showBackdrop: true,
+ cssClass: 'session-expired-modal-blocking keep-this',
+ });
+ await modal.present();
+ modal.onDidDismiss().then(() => {
+ this.open = false;
+ });
+ }
+}