@sowell/quasar-app-extension-auth 1.11.1 → 1.11.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sowell/quasar-app-extension-auth",
3
- "version": "1.11.1",
3
+ "version": "1.11.2",
4
4
  "description": "A Quasar app extension to manage Authentication",
5
5
  "main": "src/index.js",
6
6
  "repository": "https://github.com/sowell-ai/quasar.extension.auth",
@@ -122,7 +122,7 @@
122
122
  </q-input>
123
123
  </div>
124
124
  </q-card-section>
125
- <q-space class="mobile" />
125
+ <q-space v-if="!keyboardOpen" class="mobile" />
126
126
  <q-card-actions class="q-ml-lg q-mr-lg q-mb-lg row justify-center">
127
127
  <q-btn
128
128
  data-testid="submit-btn"
@@ -148,6 +148,7 @@
148
148
  import { computed, defineComponent, ref } from "vue"
149
149
  import { useI18n } from "vue-i18n"
150
150
  import prompts from "app/quasar.extensions.json"
151
+ import { useKeyboardOpen } from "../../composables/useKeyboardOpen"
151
152
  import {
152
153
  ionMailOutline,
153
154
  ionPaperPlaneOutline,
@@ -182,6 +183,7 @@ export default defineComponent({
182
183
  "@sowell/auth": { USE_SSO },
183
184
  } = prompts
184
185
  const email = ref("")
186
+ const { keyboardOpen } = useKeyboardOpen()
185
187
  const sendEmail = () => {
186
188
  emit("resetPassword", email.value)
187
189
  }
@@ -203,6 +205,7 @@ export default defineComponent({
203
205
 
204
206
  return {
205
207
  email,
208
+ keyboardOpen,
206
209
  sendEmail,
207
210
  emit,
208
211
  USE_SSO,
@@ -0,0 +1,55 @@
1
+ import { ref, onMounted, onBeforeUnmount } from "vue"
2
+
3
+ // Ecart minimal (px CSS) entre la fenetre de mise en page et la zone visible
4
+ // pour conclure qu'un clavier virtuel est ouvert. Les barres d'URL ou de
5
+ // navigation qui se replient restent largement en dessous.
6
+ export const KEYBOARD_GAP_THRESHOLD = 150
7
+
8
+ interface ViewportHost {
9
+ innerHeight: number
10
+ visualViewport?: {
11
+ height: number
12
+ addEventListener: (type: "resize", listener: () => void) => void
13
+ removeEventListener: (type: "resize", listener: () => void) => void
14
+ } | null
15
+ }
16
+
17
+ // Android 15+ edge-to-edge (WebView >= 140) : le clavier ne reduit que
18
+ // visualViewport, innerHeight reste inchange. Sur iOS (Keyboard.resize native)
19
+ // ou Android classique la WebView entiere retrecit : l'ecart reste nul et on
20
+ // ne detecte rien, la mise en page suit deja le clavier.
21
+ export const isKeyboardOpen = (host: ViewportHost): boolean => {
22
+ const viewport = host.visualViewport
23
+ if (!viewport) return false
24
+ return host.innerHeight - viewport.height > KEYBOARD_GAP_THRESHOLD
25
+ }
26
+
27
+ // Appelle `onChange` a chaque variation de l'etat (et une fois a l'initialisation),
28
+ // rend la fonction de nettoyage. Sans visualViewport : etat false, rien a ecouter.
29
+ export const observeKeyboard = (
30
+ host: ViewportHost,
31
+ onChange: (open: boolean) => void
32
+ ): (() => void) => {
33
+ const update = () => onChange(isKeyboardOpen(host))
34
+ update()
35
+ const viewport = host.visualViewport
36
+ if (!viewport) return () => undefined
37
+ viewport.addEventListener("resize", update)
38
+ return () => viewport.removeEventListener("resize", update)
39
+ }
40
+
41
+ export const useKeyboardOpen = () => {
42
+ const keyboardOpen = ref(false)
43
+ let stop: (() => void) | undefined
44
+ onMounted(() => {
45
+ if (typeof window === "undefined") return
46
+ stop = observeKeyboard(window, (open) => {
47
+ keyboardOpen.value = open
48
+ })
49
+ })
50
+ onBeforeUnmount(() => {
51
+ stop?.()
52
+ stop = undefined
53
+ })
54
+ return { keyboardOpen }
55
+ }