@innspel/react-native 0.9.1 → 0.9.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/README.md CHANGED
@@ -73,6 +73,18 @@ innsenderen får se før hun skriver.
73
73
  Utenfor React — en navigasjonshandler, en krasjlytter — bruker du klienten
74
74
  direkte: `innspel.openFeedback({ screen: 'Dørlista' })`.
75
75
 
76
+ Lukking — X, eller Android-tilbake på første steg — beholder det innsenderen har
77
+ skrevet til widgeten åpnes igjen; bare en fullført innsending nullstiller. Åpner du med
78
+ `track` mens det står et utkast, står hun der hun var. `view: 'mine'` legges over
79
+ utkastet, og «Tilbake» i lista lukker.
80
+
81
+ **Legg provideren rundt appen, ikke inni en `ScrollView`.** Arket er en `Modal`, men
82
+ React Natives trykkhåndtering går gjennom React-treet: en `ScrollView` over provideren
83
+ med `keyboardShouldPersistTaps` på standardverdien tar første trykk mens tastaturet er
84
+ oppe, og bruker det til å lukke tastaturet. Send teller det trykket likevel; de andre
85
+ knappene i arket gjør ikke. Må provideren stå inni en scrollflate, gi den
86
+ `keyboardShouldPersistTaps="handled"`.
87
+
76
88
  ## Token-endepunktet
77
89
 
78
90
  Det eneste du må bygge selv. Se
package/dist/index.cjs CHANGED
@@ -572,10 +572,12 @@ function Btn({
572
572
  accessibilityLabel,
573
573
  grow,
574
574
  testID,
575
- busy
575
+ busy,
576
+ trykkForbiForelder
576
577
  }) {
577
578
  const tema = useTema();
578
579
  const c = tema.color;
580
+ const forbi = useTrykkForbiForelder(onPress, !!disabled, tema.touch / 2);
579
581
  const bakgrunn = variant === "primary" ? c.actionPrimary : variant === "secondary" ? c.surfaceRaised : "transparent";
580
582
  const tekstfarge = variant === "primary" ? c.onActionPrimary : variant === "danger" ? c.danger : c.actionSecondaryText;
581
583
  const kant = variant === "ghost" ? "transparent" : variant === "primary" ? c.actionPrimary : c.actionSecondaryBorder;
@@ -589,6 +591,7 @@ function Btn({
589
591
  accessibilityState: { disabled: !!disabled, busy: !!busy },
590
592
  disabled,
591
593
  onPress,
594
+ ...trykkForbiForelder ? forbi : {},
592
595
  style: {
593
596
  minHeight: tema.touch,
594
597
  borderRadius: tema.radius.md,
@@ -621,6 +624,37 @@ function Btn({
621
624
  hint ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Hint, { children: hint }) : null
622
625
  ] });
623
626
  }
627
+ function useTrykkForbiForelder(onPress, laast, slingring) {
628
+ const start = (0, import_react4.useRef)(null);
629
+ const fikkResponder = (0, import_react4.useRef)(false);
630
+ const siste = (0, import_react4.useRef)({ onPress, laast });
631
+ siste.current = { onPress, laast };
632
+ return (0, import_react4.useMemo)(
633
+ () => ({
634
+ onPressIn: () => {
635
+ fikkResponder.current = true;
636
+ },
637
+ onTouchStart: (e) => {
638
+ start.current = { x: e.nativeEvent.pageX, y: e.nativeEvent.pageY };
639
+ },
640
+ onTouchEnd: (e) => {
641
+ const s = start.current;
642
+ start.current = null;
643
+ const innenfor = s !== null && Math.abs(e.nativeEvent.pageX - s.x) <= slingring && Math.abs(e.nativeEvent.pageY - s.y) <= slingring;
644
+ setTimeout(() => {
645
+ const tatt = fikkResponder.current;
646
+ fikkResponder.current = false;
647
+ if (!tatt && innenfor && !siste.current.laast) siste.current.onPress?.();
648
+ }, 0);
649
+ },
650
+ onTouchCancel: () => {
651
+ start.current = null;
652
+ fikkResponder.current = false;
653
+ }
654
+ }),
655
+ [slingring]
656
+ );
657
+ }
624
658
  function H({ children, sub }) {
625
659
  const tema = useTema();
626
660
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react_native2.View, { style: { gap: tema.space.xs }, children: [
@@ -1255,7 +1289,8 @@ function Felt({
1255
1289
  disabled: forKort || sender,
1256
1290
  busy: sender,
1257
1291
  hint: forKort ? tekst.forKort(minTextLength) : harVedlegg ? tekst.sendHintMedBilde : void 0,
1258
- onPress: onSend
1292
+ onPress: onSend,
1293
+ trykkForbiForelder: true
1259
1294
  }
1260
1295
  ) })
1261
1296
  ] });
@@ -1871,9 +1906,23 @@ function Widget({
1871
1906
  setVedlegg(void 0);
1872
1907
  setKomponerer(false);
1873
1908
  }, []);
1909
+ const [mineDirekte, setMineDirekte] = (0, import_react11.useState)(false);
1910
+ const [stegForMine, setStegForMine] = (0, import_react11.useState)("valg");
1911
+ const stegRef = (0, import_react11.useRef)(steg);
1912
+ stegRef.current = steg;
1913
+ const harUtkast = verdi.trim().length > 0 || vedlegg !== void 0;
1874
1914
  const lukk = (0, import_react11.useCallback)(() => {
1915
+ onLukk();
1916
+ if (stegRef.current === "mine" && mineDirekte) {
1917
+ setSteg(stegForMine);
1918
+ setMineDirekte(false);
1919
+ }
1920
+ }, [onLukk, mineDirekte, stegForMine]);
1921
+ const lukkOgNullstill = (0, import_react11.useCallback)(() => {
1875
1922
  onLukk();
1876
1923
  nullstill();
1924
+ setMineDirekte(false);
1925
+ setStegForMine("valg");
1877
1926
  }, [onLukk, nullstill]);
1878
1927
  (0, import_react11.useEffect)(() => {
1879
1928
  if (!synlig) return;
@@ -1883,8 +1932,8 @@ function Widget({
1883
1932
  if (!client.isAnonymous) {
1884
1933
  void client.subjects.submissions().then(setMine).catch(() => void 0);
1885
1934
  }
1886
- if (apneOpsjoner?.view === "mine" && !client.isAnonymous) void visMine();
1887
- else if (apneOpsjoner?.track) velgSpor(apneOpsjoner.track);
1935
+ if (apneOpsjoner?.view === "mine" && !client.isAnonymous) void visMine(true);
1936
+ else if (apneOpsjoner?.track && !harUtkast) void velgSpor(apneOpsjoner.track);
1888
1937
  }, [synlig]);
1889
1938
  const hentKort = (0, import_react11.useCallback)(async () => {
1890
1939
  setLasterKort(true);
@@ -1982,6 +2031,11 @@ function Widget({
1982
2031
  }, []);
1983
2032
  const gaaTilbake = (0, import_react11.useCallback)(() => {
1984
2033
  setFeil(void 0);
2034
+ if (steg === "mine") {
2035
+ if (mineDirekte) lukk();
2036
+ else setSteg("valg");
2037
+ return;
2038
+ }
1985
2039
  if (steg === "skjermbilde") {
1986
2040
  setBilde(void 0);
1987
2041
  setAutomasker([]);
@@ -1993,7 +2047,12 @@ function Widget({
1993
2047
  return;
1994
2048
  }
1995
2049
  setSteg("valg");
1996
- }, [steg, spor, kort.length]);
2050
+ }, [steg, spor, kort.length, mineDirekte, lukk]);
2051
+ const androidTilbake = (0, import_react11.useCallback)(() => {
2052
+ if (steg === "valg") lukk();
2053
+ else if (steg === "kvittering") lukkOgNullstill();
2054
+ else gaaTilbake();
2055
+ }, [steg, lukk, lukkOgNullstill, gaaTilbake]);
1997
2056
  const send = (0, import_react11.useCallback)(async () => {
1998
2057
  setSender(true);
1999
2058
  setFeil(void 0);
@@ -2040,7 +2099,13 @@ function Widget({
2040
2099
  },
2041
2100
  [client]
2042
2101
  );
2043
- const visMine = (0, import_react11.useCallback)(async () => {
2102
+ const visMine = (0, import_react11.useCallback)(async (direkte = false) => {
2103
+ if (direkte) {
2104
+ if (stegRef.current !== "mine") setStegForMine(stegRef.current);
2105
+ } else {
2106
+ setStegForMine("valg");
2107
+ }
2108
+ setMineDirekte(direkte);
2044
2109
  setSteg("mine");
2045
2110
  setLasterMine(true);
2046
2111
  try {
@@ -2051,13 +2116,18 @@ function Widget({
2051
2116
  setLasterMine(false);
2052
2117
  }
2053
2118
  }, [client]);
2119
+ const nyttFraMine = (0, import_react11.useCallback)(() => {
2120
+ setMineDirekte(false);
2121
+ if (harUtkast) setSteg(stegForMine);
2122
+ else nullstill();
2123
+ }, [harUtkast, stegForMine, nullstill]);
2054
2124
  return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2055
2125
  import_react_native9.Modal,
2056
2126
  {
2057
2127
  visible: synlig,
2058
2128
  transparent: true,
2059
2129
  animationType: "slide",
2060
- onRequestClose: lukk,
2130
+ onRequestClose: androidTilbake,
2061
2131
  accessibilityViewIsModal: true,
2062
2132
  children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
2063
2133
  import_react_native9.KeyboardAvoidingView,
@@ -2095,7 +2165,7 @@ function Widget({
2095
2165
  testID: "lukk",
2096
2166
  accessibilityRole: "button",
2097
2167
  accessibilityLabel: tekst.lukk,
2098
- onPress: lukk,
2168
+ onPress: steg === "kvittering" ? lukkOgNullstill : lukk,
2099
2169
  style: { minWidth: tema.touch, minHeight: tema.touch, alignItems: "center", justifyContent: "center" },
2100
2170
  children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Ikon, { navn: "close-outline", farge: tema.color.textSecondary })
2101
2171
  }
@@ -2113,7 +2183,7 @@ function Widget({
2113
2183
  ikon: "list-outline",
2114
2184
  label: mine.length > 0 ? tekst.mineMedAntall(mine.length) : tekst.mineTittel,
2115
2185
  accessibilityLabel: mine.length > 0 ? tekst.mineEtikett(mine.length) : tekst.mineTittel,
2116
- onPress: visMine
2186
+ onPress: () => void visMine()
2117
2187
  }
2118
2188
  ) : null
2119
2189
  ] }) : null,
@@ -2177,7 +2247,7 @@ function Widget({
2177
2247
  ...kvittering.nr ? { saksnummer: kvittering.nr } : {},
2178
2248
  ...kvittering.vedlegg ? { vedlegg: kvittering.vedlegg } : {},
2179
2249
  ...kvittering.frist ? { frist: kvittering.frist } : {},
2180
- onLukk: lukk
2250
+ onLukk: lukkOgNullstill
2181
2251
  }
2182
2252
  ) : null,
2183
2253
  steg === "mine" ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
@@ -2186,7 +2256,7 @@ function Widget({
2186
2256
  rader: mine,
2187
2257
  laster: lasterMine,
2188
2258
  ...tenantName ? { tenantName } : {},
2189
- onNytt: nullstill
2259
+ onNytt: nyttFraMine
2190
2260
  }
2191
2261
  ) : null
2192
2262
  ]