@innspel/react-native 0.9.2 → 0.9.3

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/dist/index.d.cts CHANGED
@@ -630,6 +630,8 @@ declare const tekst: {
630
630
  readonly mineSak: (nr: string) => string;
631
631
  /** «Feil · sak 2041» — sporet først, aldri rå id og aldri kontraktens type (DD-50). */
632
632
  readonly sakHode: (spor: string, nr: string) => string;
633
+ /** F14: svaret kom siden forrige gang denne enheten viste lista. */
634
+ readonly nyttSvar: "Nytt svar";
633
635
  readonly bildeFjernet: "Bildet er fjernet.";
634
636
  readonly svarFra: (leietaker: string) => string;
635
637
  readonly svarFraGenerisk: "Svar";
package/dist/index.d.ts CHANGED
@@ -630,6 +630,8 @@ declare const tekst: {
630
630
  readonly mineSak: (nr: string) => string;
631
631
  /** «Feil · sak 2041» — sporet først, aldri rå id og aldri kontraktens type (DD-50). */
632
632
  readonly sakHode: (spor: string, nr: string) => string;
633
+ /** F14: svaret kom siden forrige gang denne enheten viste lista. */
634
+ readonly nyttSvar: "Nytt svar";
633
635
  readonly bildeFjernet: "Bildet er fjernet.";
634
636
  readonly svarFra: (leietaker: string) => string;
635
637
  readonly svarFraGenerisk: "Svar";
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/InnspelProvider.tsx
2
- import { createContext as createContext3, useCallback as useCallback3, useContext as useContext4, useMemo as useMemo4, useRef as useRef4, useState as useState4 } from "react";
2
+ import { createContext as createContext3, useCallback as useCallback3, useContext as useContext4, useMemo as useMemo4, useRef as useRef4, useState as useState5 } from "react";
3
3
  import { View as View9 } from "react-native";
4
4
 
5
5
  // src/skjermbilde.ts
@@ -355,7 +355,7 @@ import {
355
355
  InnspelApiError,
356
356
  InnspelQueueFullError
357
357
  } from "@innspel/core";
358
- import { useCallback as useCallback2, useContext as useContext3, useEffect, useRef as useRef3, useState as useState3 } from "react";
358
+ import { useCallback as useCallback2, useContext as useContext3, useEffect as useEffect2, useRef as useRef3, useState as useState4 } from "react";
359
359
  import { KeyboardAvoidingView, Modal, Pressable as Pressable5, View as View8 } from "react-native";
360
360
  import { initialWindowMetrics, SafeAreaInsetsContext } from "react-native-safe-area-context";
361
361
 
@@ -864,6 +864,8 @@ var tekst = {
864
864
  mineSak: (nr) => `Sak ${saksnr(nr)}`,
865
865
  /** «Feil · sak 2041» — sporet først, aldri rå id og aldri kontraktens type (DD-50). */
866
866
  sakHode: (spor, nr) => `${stor(spor)} \xB7 sak ${saksnr(nr)}`,
867
+ /** F14: svaret kom siden forrige gang denne enheten viste lista. */
868
+ nyttSvar: "Nytt svar",
867
869
  // Leietakeren fjernet vedlegget. Bare AT — aldri hvorfor, av hvem eller når.
868
870
  bildeFjernet: "Bildet er fjernet.",
869
871
  svarFra: (leietaker) => `Svar fra ${leietaker}`,
@@ -1514,25 +1516,80 @@ function Kvittering({
1514
1516
  }
1515
1517
 
1516
1518
  // src/widget/MineInnspill.tsx
1517
- import "react";
1519
+ import { useEffect, useState as useState2 } from "react";
1518
1520
  import { ActivityIndicator as ActivityIndicator2, ScrollView as ScrollView3, Text as Text6, View as View6 } from "react-native";
1521
+
1522
+ // src/widget/nyttSvar.ts
1523
+ var N\u00D8KKEL = "innspel:svar-sett";
1524
+ async function merkNyeSvar(rader, storage) {
1525
+ let grense = 0;
1526
+ try {
1527
+ grense = Number.parseInt(await storage.get(N\u00D8KKEL) ?? "", 10) || 0;
1528
+ } catch {
1529
+ grense = 0;
1530
+ }
1531
+ const tid = (r) => r.pending === true ? NaN : Date.parse(r.reply?.at ?? "");
1532
+ const merket = rader.map((rad) => ({ rad, nytt: tid(rad) > grense }));
1533
+ return [...merket.filter((m) => m.nytt), ...merket.filter((m) => !m.nytt)];
1534
+ }
1535
+ async function markerSvarSett(storage, n\u00E5 = Date.now()) {
1536
+ try {
1537
+ await storage.set(N\u00D8KKEL, String(n\u00E5));
1538
+ } catch {
1539
+ }
1540
+ }
1541
+
1542
+ // src/widget/MineInnspill.tsx
1519
1543
  import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
1520
1544
  function MineInnspill({
1521
1545
  rader,
1522
1546
  laster,
1523
1547
  tenantName,
1524
- onNytt
1548
+ onNytt,
1549
+ storage
1525
1550
  }) {
1526
1551
  const tema = useTema();
1552
+ const [visning, setVisning] = useState2(() => rader.map((rad) => ({ rad, nytt: false })));
1553
+ useEffect(() => {
1554
+ let gjelder = true;
1555
+ void merkNyeSvar(rader, storage).then((m) => {
1556
+ if (gjelder) setVisning(m);
1557
+ }).catch(() => {
1558
+ if (gjelder) setVisning(rader.map((rad) => ({ rad, nytt: false })));
1559
+ });
1560
+ return () => {
1561
+ gjelder = false;
1562
+ };
1563
+ }, [storage, rader]);
1564
+ useEffect(() => {
1565
+ if (!laster && rader.length) void markerSvarSett(storage).catch(() => void 0);
1566
+ }, [storage, laster, rader]);
1527
1567
  return /* @__PURE__ */ jsxs6(View6, { style: { flex: 1, gap: tema.space.md }, children: [
1528
1568
  /* @__PURE__ */ jsx7(H, { sub: tekst.mineUnder, children: tekst.mineTittel }),
1529
- laster ? /* @__PURE__ */ jsx7(ActivityIndicator2, { accessibilityLabel: "Henter innspillene dine", color: tema.color.textSecondary }) : rader.length === 0 ? /* @__PURE__ */ jsx7(Hint, { children: tekst.mineTom }) : /* @__PURE__ */ jsx7(ScrollView3, { style: { flex: 1 }, contentContainerStyle: { gap: tema.space.sm }, children: rader.map((rad) => {
1569
+ laster ? /* @__PURE__ */ jsx7(ActivityIndicator2, { accessibilityLabel: "Henter innspillene dine", color: tema.color.textSecondary }) : rader.length === 0 ? /* @__PURE__ */ jsx7(Hint, { children: tekst.mineTom }) : /* @__PURE__ */ jsx7(ScrollView3, { style: { flex: 1 }, contentContainerStyle: { gap: tema.space.sm }, children: visning.map(({ rad, nytt }) => {
1530
1570
  const venter = rad.pending === true;
1531
1571
  const v = venter ? venterVisning : statusVisning(rad.status, rad.type, rad.deadlineAt);
1532
1572
  const nokkel = venter ? rad.clientRef : rad.id;
1533
1573
  const svar = venter ? void 0 : rad.reply;
1534
1574
  return /* @__PURE__ */ jsxs6(Card, { dashed: venter, children: [
1535
- /* @__PURE__ */ jsx7(Hint, { children: venter ? `${tekst.mineIkkeSendt} \xB7 ${rad.type === "onske" ? tekst.onske : tekst.feil}` : tekst.sakHode(rad.type === "onske" ? tekst.onske : tekst.feil, rad.id) }),
1575
+ /* @__PURE__ */ jsxs6(View6, { style: { flexDirection: "row", alignItems: "center", gap: tema.space.xs, flexWrap: "wrap" }, children: [
1576
+ /* @__PURE__ */ jsx7(Hint, { children: venter ? `${tekst.mineIkkeSendt} \xB7 ${rad.type === "onske" ? tekst.onske : tekst.feil}` : tekst.sakHode(rad.type === "onske" ? tekst.onske : tekst.feil, rad.id) }),
1577
+ nytt ? /* @__PURE__ */ jsx7(
1578
+ Text6,
1579
+ {
1580
+ testID: "nytt-svar",
1581
+ style: {
1582
+ color: tema.color.info,
1583
+ backgroundColor: tema.color.infoBg,
1584
+ fontSize: tema.font.tiny,
1585
+ fontWeight: tema.weight.semibold,
1586
+ borderRadius: tema.radius.pill,
1587
+ paddingHorizontal: tema.space.sm
1588
+ },
1589
+ children: tekst.nyttSvar
1590
+ }
1591
+ ) : null
1592
+ ] }),
1536
1593
  /* @__PURE__ */ jsx7(
1537
1594
  Text6,
1538
1595
  {
@@ -1585,7 +1642,7 @@ function MineInnspill({
1585
1642
 
1586
1643
  // src/widget/Skjermbilde.tsx
1587
1644
  import { skaler, strokTilRekter, treffer, trykkTilRekt } from "@innspel/core";
1588
- import { useCallback, useMemo as useMemo3, useRef as useRef2, useState as useState2 } from "react";
1645
+ import { useCallback, useMemo as useMemo3, useRef as useRef2, useState as useState3 } from "react";
1589
1646
  import { Image as Image2, Pressable as Pressable4, StyleSheet, Text as Text7, View as View7 } from "react-native";
1590
1647
  import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
1591
1648
  function Skjermbilde({
@@ -1600,10 +1657,10 @@ function Skjermbilde({
1600
1657
  onLeggVed
1601
1658
  }) {
1602
1659
  const tema = useTema();
1603
- const [verktoy, setVerktoy] = useState2("pensel");
1604
- const [allTekst, setAllTekst] = useState2(false);
1605
- const [egne, setEgne] = useState2([]);
1606
- const [ramme, setRamme] = useState2(null);
1660
+ const [verktoy, setVerktoy] = useState3("pensel");
1661
+ const [allTekst, setAllTekst] = useState3(false);
1662
+ const [egne, setEgne] = useState3([]);
1663
+ const [ramme, setRamme] = useState3(null);
1607
1664
  const strok = useRef2([]);
1608
1665
  const visning = useMemo3(() => {
1609
1666
  if (!ramme) return null;
@@ -1828,27 +1885,27 @@ function Widget({
1828
1885
  const insets = useContext3(SafeAreaInsetsContext) ?? initialWindowMetrics?.insets ?? { top: 0, bottom: 0, left: 0, right: 0 };
1829
1886
  const skjermbilde = useSkjermbilde();
1830
1887
  const previewRef = useRef3(null);
1831
- const [steg, setSteg] = useState3("valg");
1832
- const [spor, setSpor] = useState3("feil");
1833
- const [verdi, setVerdi] = useState3("");
1834
- const [kort, setKort] = useState3([]);
1835
- const [lasterKort, setLasterKort] = useState3(false);
1836
- const [lenketTil, setLenketTil] = useState3();
1837
- const [funn, setFunn] = useState3([]);
1838
- const [fjernede, setFjernede] = useState3([]);
1839
- const [sender, setSender] = useState3(false);
1888
+ const [steg, setSteg] = useState4("valg");
1889
+ const [spor, setSpor] = useState4("feil");
1890
+ const [verdi, setVerdi] = useState4("");
1891
+ const [kort, setKort] = useState4([]);
1892
+ const [lasterKort, setLasterKort] = useState4(false);
1893
+ const [lenketTil, setLenketTil] = useState4();
1894
+ const [funn, setFunn] = useState4([]);
1895
+ const [fjernede, setFjernede] = useState4([]);
1896
+ const [sender, setSender] = useState4(false);
1840
1897
  const online = useNettstatus(client);
1841
- const [feil, setFeil] = useState3();
1842
- const [kvittering, setKvittering] = useState3();
1843
- const [mine, setMine] = useState3([]);
1844
- const [lasterMine, setLasterMine] = useState3(false);
1845
- const [bilde, setBilde] = useState3();
1846
- const [automasker, setAutomasker] = useState3([]);
1847
- const [rotStorrelse, setRotStorrelse] = useState3({ width: 1, height: 1 });
1848
- const [komponerer, setKomponerer] = useState3(false);
1849
- const [kilde, setKilde] = useState3("skjerm");
1850
- const [vedlegg, setVedlegg] = useState3();
1851
- const [innstillinger, setInnstillinger] = useState3({ ...client.settings });
1898
+ const [feil, setFeil] = useState4();
1899
+ const [kvittering, setKvittering] = useState4();
1900
+ const [mine, setMine] = useState4([]);
1901
+ const [lasterMine, setLasterMine] = useState4(false);
1902
+ const [bilde, setBilde] = useState4();
1903
+ const [automasker, setAutomasker] = useState4([]);
1904
+ const [rotStorrelse, setRotStorrelse] = useState4({ width: 1, height: 1 });
1905
+ const [komponerer, setKomponerer] = useState4(false);
1906
+ const [kilde, setKilde] = useState4("skjerm");
1907
+ const [vedlegg, setVedlegg] = useState4();
1908
+ const [innstillinger, setInnstillinger] = useState4({ ...client.settings });
1852
1909
  const skjermbildeMulig = innstillinger.screenshotsEnabled && skjermbilde?.adapter != null;
1853
1910
  const fangstMulig = skjermbildeMulig && skjermbilde?.adapter?.captureScreen !== false;
1854
1911
  const galleriMulig = skjermbildeMulig && typeof skjermbilde?.adapter?.pick === "function";
@@ -1868,8 +1925,8 @@ function Widget({
1868
1925
  setVedlegg(void 0);
1869
1926
  setKomponerer(false);
1870
1927
  }, []);
1871
- const [mineDirekte, setMineDirekte] = useState3(false);
1872
- const [stegForMine, setStegForMine] = useState3("valg");
1928
+ const [mineDirekte, setMineDirekte] = useState4(false);
1929
+ const [stegForMine, setStegForMine] = useState4("valg");
1873
1930
  const stegRef = useRef3(steg);
1874
1931
  stegRef.current = steg;
1875
1932
  const harUtkast = verdi.trim().length > 0 || vedlegg !== void 0;
@@ -1886,7 +1943,7 @@ function Widget({
1886
1943
  setMineDirekte(false);
1887
1944
  setStegForMine("valg");
1888
1945
  }, [onLukk, nullstill]);
1889
- useEffect(() => {
1946
+ useEffect2(() => {
1890
1947
  if (!synlig) return;
1891
1948
  client.track({ name: "widget_opened" });
1892
1949
  void client.queue.flush().catch(() => void 0);
@@ -1919,7 +1976,7 @@ function Widget({
1919
1976
  },
1920
1977
  [client, hentKort]
1921
1978
  );
1922
- useEffect(() => {
1979
+ useEffect2(() => {
1923
1980
  if (steg === "kjenteFeil" && !lasterKort && kort.length === 0) setSteg("felt");
1924
1981
  }, [steg, lasterKort, kort.length]);
1925
1982
  const endreTekst = useCallback2(
@@ -2024,7 +2081,7 @@ function Widget({
2024
2081
  text: verdi,
2025
2082
  ...vedlegg ? { attachment: vedlegg } : {},
2026
2083
  ...spor === "feil" && lenketTil ? { relatedKnownIssueId: lenketTil.id } : {},
2027
- ...fjernede.length ? { context: fjernetKontekst(client, fjernede) } : {}
2084
+ context: fjernetKontekst(client, fjernede, apneOpsjoner?.screen)
2028
2085
  });
2029
2086
  if (res.status === "queued") {
2030
2087
  setKvittering({ art: "k\xF8", ...res.attachment ? { vedlegg: "forkastet" } : {} });
@@ -2045,7 +2102,7 @@ function Widget({
2045
2102
  } finally {
2046
2103
  setSender(false);
2047
2104
  }
2048
- }, [client, spor, verdi, vedlegg, lenketTil, fjernede]);
2105
+ }, [client, spor, verdi, vedlegg, lenketTil, fjernede, apneOpsjoner?.screen]);
2049
2106
  const jaOgsa = useCallback2(
2050
2107
  async (k) => {
2051
2108
  setSender(true);
@@ -2172,7 +2229,7 @@ function Widget({
2172
2229
  onEndre: endreTekst,
2173
2230
  minTextLength: innstillinger.minTextLength,
2174
2231
  textMaxLength: innstillinger.textMaxLength,
2175
- kontekst: client.context,
2232
+ kontekst: { ...client.context, ...apneOpsjoner?.screen ? { screen: apneOpsjoner.screen } : {} },
2176
2233
  fjernedeFelter: fjernede,
2177
2234
  onFjernKontekst: (f) => setFjernede((x) => [...x, f]),
2178
2235
  ...lenketTil ? { lenketTil, onFjernLenke: () => setLenketTil(void 0) } : {},
@@ -2215,6 +2272,7 @@ function Widget({
2215
2272
  steg === "mine" ? /* @__PURE__ */ jsx9(
2216
2273
  MineInnspill,
2217
2274
  {
2275
+ storage: client.storage,
2218
2276
  rader: mine,
2219
2277
  laster: lasterMine,
2220
2278
  ...tenantName ? { tenantName } : {},
@@ -2231,17 +2289,18 @@ function Widget({
2231
2289
  }
2232
2290
  function useNettstatus(client) {
2233
2291
  const c = client.connectivity;
2234
- const [online, setOnline] = useState3(() => c?.isOnline() ?? true);
2235
- useEffect(() => {
2292
+ const [online, setOnline] = useState4(() => c?.isOnline() ?? true);
2293
+ useEffect2(() => {
2236
2294
  if (!c) return void 0;
2237
2295
  setOnline(c.isOnline());
2238
2296
  return c.subscribe?.((v) => setOnline(v));
2239
2297
  }, [c]);
2240
2298
  return online;
2241
2299
  }
2242
- function fjernetKontekst(client, fjernede) {
2300
+ function fjernetKontekst(client, fjernede, skjerm) {
2243
2301
  const ut = {};
2244
- for (const k of Object.keys(client.context)) {
2302
+ if (skjerm) ut["screen"] = skjerm;
2303
+ for (const k of [...Object.keys(client.context), "screen"]) {
2245
2304
  if (k !== "sdkVersion" && fjernede.includes(k)) ut[k] = void 0;
2246
2305
  }
2247
2306
  return ut;
@@ -2259,8 +2318,8 @@ function InnspelProvider({
2259
2318
  screenshot,
2260
2319
  imageStepNote
2261
2320
  }) {
2262
- const [synlig, setSynlig] = useState4(false);
2263
- const [apneOpsjoner, setApneOpsjoner] = useState4();
2321
+ const [synlig, setSynlig] = useState5(false);
2322
+ const [apneOpsjoner, setApneOpsjoner] = useState5();
2264
2323
  const registrert = useRef4(false);
2265
2324
  const rootRef = useRef4(null);
2266
2325
  const privat = useMemo4(createPrivateRegistry, []);
@@ -2308,14 +2367,14 @@ function useInnspel() {
2308
2367
  }
2309
2368
 
2310
2369
  // src/InnspelPrivate.tsx
2311
- import { useEffect as useEffect2, useRef as useRef5 } from "react";
2370
+ import { useEffect as useEffect3, useRef as useRef5 } from "react";
2312
2371
  import { View as View10 } from "react-native";
2313
2372
  import { jsx as jsx11 } from "react/jsx-runtime";
2314
2373
  function InnspelPrivate({ children, style }) {
2315
2374
  const ref = useRef5(null);
2316
2375
  const kontekst = useSkjermbilde();
2317
2376
  const registrer = kontekst?.privat.register;
2318
- useEffect2(() => {
2377
+ useEffect3(() => {
2319
2378
  if (!registrer) return;
2320
2379
  return registrer(ref);
2321
2380
  }, [registrer]);
@@ -2326,7 +2385,7 @@ function InnspelPrivate({ children, style }) {
2326
2385
  import {
2327
2386
  InnspelApiError as InnspelApiError2
2328
2387
  } from "@innspel/core";
2329
- import { useCallback as useCallback4, useEffect as useEffect3, useState as useState6 } from "react";
2388
+ import { useCallback as useCallback4, useEffect as useEffect4, useState as useState7 } from "react";
2330
2389
  import { Modal as Modal4, Pressable as Pressable8, Text as Text12, View as View15 } from "react-native";
2331
2390
 
2332
2391
  // src/program/Aksept.tsx
@@ -2500,7 +2559,7 @@ function Aksept({
2500
2559
  }
2501
2560
 
2502
2561
  // src/program/HvordanGikkDet.tsx
2503
- import { useState as useState5 } from "react";
2562
+ import { useState as useState6 } from "react";
2504
2563
  import { Modal as Modal3, Pressable as Pressable7, Text as Text9, TextInput as TextInput2, View as View12 } from "react-native";
2505
2564
  import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
2506
2565
  var UTFALL = [
@@ -2520,8 +2579,8 @@ function HvordanGikkDet({
2520
2579
  onLukk
2521
2580
  }) {
2522
2581
  const tema = useTema();
2523
- const [valgt, setValgt] = useState5();
2524
- const [setning, setSetning] = useState5("");
2582
+ const [valgt, setValgt] = useState6();
2583
+ const [setning, setSetning] = useState6("");
2525
2584
  return /* @__PURE__ */ jsx13(Modal3, { visible: true, transparent: true, animationType: "fade", onRequestClose: onLukk, accessibilityViewIsModal: true, children: /* @__PURE__ */ jsx13(View12, { style: { flex: 1, backgroundColor: tema.color.scrim, justifyContent: "flex-end", padding: tema.space.md }, children: /* @__PURE__ */ jsxs11(
2526
2585
  View12,
2527
2586
  {
@@ -2745,17 +2804,17 @@ function InnspelProgram({
2745
2804
  }) {
2746
2805
  const { client } = useInnspel();
2747
2806
  const tema = useTema();
2748
- const [mine, setMine] = useState6();
2749
- const [deltakelse, setDeltakelse] = useState6();
2750
- const [viserAksept, setViserAksept] = useState6(false);
2751
- const [viserGaaUt, setViserGaaUt] = useState6(false);
2752
- const [avvist, setAvvist] = useState6(false);
2753
- const [sender, setSender] = useState6(false);
2754
- const [feil, setFeil] = useState6();
2755
- const [dialog, setDialog] = useState6();
2756
- const [svarFeil, setSvarFeil] = useState6();
2757
- const [lagtBort, setLagtBort] = useState6(/* @__PURE__ */ new Set());
2758
- const [meldFeilFor, setMeldFeilFor] = useState6();
2807
+ const [mine, setMine] = useState7();
2808
+ const [deltakelse, setDeltakelse] = useState7();
2809
+ const [viserAksept, setViserAksept] = useState7(false);
2810
+ const [viserGaaUt, setViserGaaUt] = useState7(false);
2811
+ const [avvist, setAvvist] = useState7(false);
2812
+ const [sender, setSender] = useState7(false);
2813
+ const [feil, setFeil] = useState7();
2814
+ const [dialog, setDialog] = useState7();
2815
+ const [svarFeil, setSvarFeil] = useState7();
2816
+ const [lagtBort, setLagtBort] = useState7(/* @__PURE__ */ new Set());
2817
+ const [meldFeilFor, setMeldFeilFor] = useState7();
2759
2818
  const leggBort = useCallback4((id) => setLagtBort((s) => /* @__PURE__ */ new Set([...s, id])), []);
2760
2819
  const lagreSvar = useCallback4(
2761
2820
  async (outcome, text) => {
@@ -2780,7 +2839,7 @@ function InnspelProgram({
2780
2839
  },
2781
2840
  [client, deltakelse, dialog, onMeldFeil]
2782
2841
  );
2783
- useEffect3(() => {
2842
+ useEffect4(() => {
2784
2843
  if (client.isAnonymous) return;
2785
2844
  let levende = true;
2786
2845
  void client.programs.list().then((svar) => {