diff --git a/web-app/src/components/IdleTimeoutModal.vue b/web-app/src/components/IdleTimeoutModal.vue new file mode 100644 index 0000000..e214421 --- /dev/null +++ b/web-app/src/components/IdleTimeoutModal.vue @@ -0,0 +1,53 @@ + + + + + + You've been inactive for a while, so to ensure the safety of your + personal information, you will be logged out in + {{ timePhrase }} + unless you click below to remain logged in. + + + + Stay Logged In + + + diff --git a/web-app/src/components/common/ModalWrapper.vue b/web-app/src/components/common/ModalWrapper.vue index 1829d1d..ffe87b4 100644 --- a/web-app/src/components/common/ModalWrapper.vue +++ b/web-app/src/components/common/ModalWrapper.vue @@ -23,24 +23,20 @@ function close(returnValue?: string) { dialog.value?.close(returnValue) } -defineExpose({ show, close }) +function isOpen(): boolean { + return dialog.value?.open ?? false +} + +defineExpose({ show, close, isOpen }) - + - Close + Close diff --git a/web-app/src/pages/UserAccountLayout.vue b/web-app/src/pages/UserAccountLayout.vue index 383f8a2..567e5be 100644 --- a/web-app/src/pages/UserAccountLayout.vue +++ b/web-app/src/pages/UserAccountLayout.vue @@ -7,14 +7,23 @@ pages. import { AuthApiClient } from '@/api/auth' import { getSelectedProfile } from '@/api/profile' import { secondsUntilExpired } from '@/api/token-util' +import IdleTimeoutModal from '@/components/IdleTimeoutModal.vue' import { useAuthStore } from '@/stores/auth-store' -import { onMounted, ref, type Ref } from 'vue' +import { useIdleObserver } from '@idle-observer/vue3' +import { onMounted, ref, useTemplateRef, type Ref } from 'vue' import { useRoute, useRouter } from 'vue-router' const route = useRoute() const router = useRouter() const authStore = useAuthStore() +const IDLE_TIMEOUT_SECONDS = 300 +const idleTimeoutModal = useTemplateRef("idleTimeoutModal") +useIdleObserver({ + timeout: IDLE_TIMEOUT_SECONDS * 1000, + onIdle: () => idleTimeoutModal.value?.start() +}) + const authCheckTimer: Ref = ref(undefined) onMounted(async () => { @@ -61,31 +70,24 @@ async function checkAuth() { - + Finnow - + - + + +
+ You've been inactive for a while, so to ensure the safety of your + personal information, you will be logged out in + {{ timePhrase }} + unless you click below to remain logged in. +