@innspel/react-native 0.9.2 → 0.9.4

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
@@ -354,6 +354,19 @@ declare function byggTema(vertens?: PartialTheme, palett?: 'dark' | 'light'): Te
354
354
  /** Tokenene som gjelder her. Bruk ALDRI en literal farge eller avstand i stedet. */
355
355
  declare function useTema(): Tema;
356
356
 
357
+ /**
358
+ * Det verten får vite når et innspill er sendt (F26). Sakens nummer, aldri innsenderens
359
+ * identitet — nummeret er det hun alt ser i kvitteringen. `queued` når nettet var borte
360
+ * og innspillet ligger i køen: hun trykket Send, og det teller. «Ja, jeg også» på en kjent
361
+ * feil gir ikke dette kallet — det er Reach, ikke en ny sak.
362
+ */
363
+ interface SubmittedInfo {
364
+ type: 'feil' | 'onske';
365
+ queued: boolean;
366
+ /** Finnes når saken er opprettet hos tjeneren; mangler i køen. */
367
+ id?: string;
368
+ }
369
+
357
370
  interface InnspelKontekst {
358
371
  client: InnspelClient;
359
372
  /** Åpner widgeten. Samme som `client.openFeedback()`. */
@@ -382,7 +395,7 @@ interface InnspelKontekst {
382
395
  * }
383
396
  * ```
384
397
  */
385
- declare function InnspelProvider({ client, children, theme, colorScheme, tenantName, screenshot, imageStepNote, }: {
398
+ declare function InnspelProvider({ client, children, theme, colorScheme, tenantName, screenshot, imageStepNote, onSubmitted, }: {
386
399
  client: InnspelClient;
387
400
  children?: React.ReactNode;
388
401
  /** Vertens egne tokens. Alt som utelates faller tilbake på Innspels tema. */
@@ -403,6 +416,14 @@ declare function InnspelProvider({ client, children, theme, colorScheme, tenantN
403
416
  * brukerne sine; plattformen eier ikke den setningen.
404
417
  */
405
418
  imageStepNote?: ImageStepNote;
419
+ /**
420
+ * Kalles når et innspill er sendt — eller lagt i køen fordi nettet var borte (F26).
421
+ * `type`, `queued`, og `id` når saken finnes hos tjeneren. Ingen identitet: saksnummeret
422
+ * er sakens, og det innsenderen alt ser i kvitteringen. Bruk det til å hente tellingen
423
+ * på «Mine innspill» på nytt, eller til å be om varsler i det riktige øyeblikket —
424
+ * rett etter første innsending, ikke ved oppstart. Kalles ikke for «Ja, jeg også».
425
+ */
426
+ onSubmitted?: (info: SubmittedInfo) => void;
406
427
  }): React.JSX.Element;
407
428
  /**
408
429
  * Klienten og `open` fra nærmeste {@link InnspelProvider}.
@@ -568,9 +589,7 @@ declare const tekst: {
568
589
  readonly lenketTil: (tittel: string) => string;
569
590
  readonly fjernLenke: "Fjern lenken til den kjente feilen";
570
591
  readonly leggVedSkjermbilde: "Legg ved skjermbilde";
571
- readonly leggVedHint: "Bildet tas først når du trykker — du ser det før det sendes.";
572
592
  readonly velgBilde: "Velg bilde";
573
- readonly velgBildeHint: "Fra bildene dine. Du ser det og kan maskere det før det sendes.";
574
593
  readonly skjermbildeUnderGalleri: "Bildet er fra galleriet. Appen maskerer ingenting i det for deg — mal over det som ikke skal med.";
575
594
  readonly bildeFeilet: "kunne ikke hente bildet. Du kan sende uten.";
576
595
  readonly skjermbildeTittel: "Se over bildet";
@@ -630,6 +649,8 @@ declare const tekst: {
630
649
  readonly mineSak: (nr: string) => string;
631
650
  /** «Feil · sak 2041» — sporet først, aldri rå id og aldri kontraktens type (DD-50). */
632
651
  readonly sakHode: (spor: string, nr: string) => string;
652
+ /** F14: svaret kom siden forrige gang denne enheten viste lista. */
653
+ readonly nyttSvar: "Nytt svar";
633
654
  readonly bildeFjernet: "Bildet er fjernet.";
634
655
  readonly svarFra: (leietaker: string) => string;
635
656
  readonly svarFraGenerisk: "Svar";
@@ -706,4 +727,4 @@ declare const lofte: {
706
727
  readonly venterNett: "Sendes automatisk når du er på nett — kvitteringen kommer da.";
707
728
  };
708
729
 
709
- export { type AsyncStorageLike, type CaptureOptions, type CaptureRefFn, type ImageStepNote, type InnspelColors, InnspelPrivate, InnspelProgram, InnspelProvider, type InnspelTheme, type PartialTheme, type PickImageFn, type ScreenshotAdapter, type ScreenshotAdapterOptions, type ScreenshotCapture, type StatusVisning, type Tema, byggTema, createMemoryStorage, createScreenshotAdapter, createStorage, t as darkTokens, light, lofte, screenRules, statusVisning, tekst, useInnspel, useTema, venterVisning };
730
+ export { type AsyncStorageLike, type CaptureOptions, type CaptureRefFn, type ImageStepNote, type InnspelColors, InnspelPrivate, InnspelProgram, InnspelProvider, type InnspelTheme, type PartialTheme, type PickImageFn, type ScreenshotAdapter, type ScreenshotAdapterOptions, type ScreenshotCapture, type StatusVisning, type SubmittedInfo, type Tema, byggTema, createMemoryStorage, createScreenshotAdapter, createStorage, t as darkTokens, light, lofte, screenRules, statusVisning, tekst, useInnspel, useTema, venterVisning };
package/dist/index.d.ts CHANGED
@@ -354,6 +354,19 @@ declare function byggTema(vertens?: PartialTheme, palett?: 'dark' | 'light'): Te
354
354
  /** Tokenene som gjelder her. Bruk ALDRI en literal farge eller avstand i stedet. */
355
355
  declare function useTema(): Tema;
356
356
 
357
+ /**
358
+ * Det verten får vite når et innspill er sendt (F26). Sakens nummer, aldri innsenderens
359
+ * identitet — nummeret er det hun alt ser i kvitteringen. `queued` når nettet var borte
360
+ * og innspillet ligger i køen: hun trykket Send, og det teller. «Ja, jeg også» på en kjent
361
+ * feil gir ikke dette kallet — det er Reach, ikke en ny sak.
362
+ */
363
+ interface SubmittedInfo {
364
+ type: 'feil' | 'onske';
365
+ queued: boolean;
366
+ /** Finnes når saken er opprettet hos tjeneren; mangler i køen. */
367
+ id?: string;
368
+ }
369
+
357
370
  interface InnspelKontekst {
358
371
  client: InnspelClient;
359
372
  /** Åpner widgeten. Samme som `client.openFeedback()`. */
@@ -382,7 +395,7 @@ interface InnspelKontekst {
382
395
  * }
383
396
  * ```
384
397
  */
385
- declare function InnspelProvider({ client, children, theme, colorScheme, tenantName, screenshot, imageStepNote, }: {
398
+ declare function InnspelProvider({ client, children, theme, colorScheme, tenantName, screenshot, imageStepNote, onSubmitted, }: {
386
399
  client: InnspelClient;
387
400
  children?: React.ReactNode;
388
401
  /** Vertens egne tokens. Alt som utelates faller tilbake på Innspels tema. */
@@ -403,6 +416,14 @@ declare function InnspelProvider({ client, children, theme, colorScheme, tenantN
403
416
  * brukerne sine; plattformen eier ikke den setningen.
404
417
  */
405
418
  imageStepNote?: ImageStepNote;
419
+ /**
420
+ * Kalles når et innspill er sendt — eller lagt i køen fordi nettet var borte (F26).
421
+ * `type`, `queued`, og `id` når saken finnes hos tjeneren. Ingen identitet: saksnummeret
422
+ * er sakens, og det innsenderen alt ser i kvitteringen. Bruk det til å hente tellingen
423
+ * på «Mine innspill» på nytt, eller til å be om varsler i det riktige øyeblikket —
424
+ * rett etter første innsending, ikke ved oppstart. Kalles ikke for «Ja, jeg også».
425
+ */
426
+ onSubmitted?: (info: SubmittedInfo) => void;
406
427
  }): React.JSX.Element;
407
428
  /**
408
429
  * Klienten og `open` fra nærmeste {@link InnspelProvider}.
@@ -568,9 +589,7 @@ declare const tekst: {
568
589
  readonly lenketTil: (tittel: string) => string;
569
590
  readonly fjernLenke: "Fjern lenken til den kjente feilen";
570
591
  readonly leggVedSkjermbilde: "Legg ved skjermbilde";
571
- readonly leggVedHint: "Bildet tas først når du trykker — du ser det før det sendes.";
572
592
  readonly velgBilde: "Velg bilde";
573
- readonly velgBildeHint: "Fra bildene dine. Du ser det og kan maskere det før det sendes.";
574
593
  readonly skjermbildeUnderGalleri: "Bildet er fra galleriet. Appen maskerer ingenting i det for deg — mal over det som ikke skal med.";
575
594
  readonly bildeFeilet: "kunne ikke hente bildet. Du kan sende uten.";
576
595
  readonly skjermbildeTittel: "Se over bildet";
@@ -630,6 +649,8 @@ declare const tekst: {
630
649
  readonly mineSak: (nr: string) => string;
631
650
  /** «Feil · sak 2041» — sporet først, aldri rå id og aldri kontraktens type (DD-50). */
632
651
  readonly sakHode: (spor: string, nr: string) => string;
652
+ /** F14: svaret kom siden forrige gang denne enheten viste lista. */
653
+ readonly nyttSvar: "Nytt svar";
633
654
  readonly bildeFjernet: "Bildet er fjernet.";
634
655
  readonly svarFra: (leietaker: string) => string;
635
656
  readonly svarFraGenerisk: "Svar";
@@ -706,4 +727,4 @@ declare const lofte: {
706
727
  readonly venterNett: "Sendes automatisk når du er på nett — kvitteringen kommer da.";
707
728
  };
708
729
 
709
- export { type AsyncStorageLike, type CaptureOptions, type CaptureRefFn, type ImageStepNote, type InnspelColors, InnspelPrivate, InnspelProgram, InnspelProvider, type InnspelTheme, type PartialTheme, type PickImageFn, type ScreenshotAdapter, type ScreenshotAdapterOptions, type ScreenshotCapture, type StatusVisning, type Tema, byggTema, createMemoryStorage, createScreenshotAdapter, createStorage, t as darkTokens, light, lofte, screenRules, statusVisning, tekst, useInnspel, useTema, venterVisning };
730
+ export { type AsyncStorageLike, type CaptureOptions, type CaptureRefFn, type ImageStepNote, type InnspelColors, InnspelPrivate, InnspelProgram, InnspelProvider, type InnspelTheme, type PartialTheme, type PickImageFn, type ScreenshotAdapter, type ScreenshotAdapterOptions, type ScreenshotCapture, type StatusVisning, type SubmittedInfo, type Tema, byggTema, createMemoryStorage, createScreenshotAdapter, createStorage, t as darkTokens, light, lofte, screenRules, statusVisning, tekst, useInnspel, useTema, venterVisning };
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
 
@@ -798,9 +798,7 @@ var tekst = {
798
798
  fjernLenke: "Fjern lenken til den kjente feilen",
799
799
  // 2f — skjermbilde (K4, DD-39, DD-40, DD-42)
800
800
  leggVedSkjermbilde: "Legg ved skjermbilde",
801
- leggVedHint: "Bildet tas f\xF8rst n\xE5r du trykker \u2014 du ser det f\xF8r det sendes.",
802
801
  velgBilde: "Velg bilde",
803
- velgBildeHint: "Fra bildene dine. Du ser det og kan maskere det f\xF8r det sendes.",
804
802
  skjermbildeUnderGalleri: "Bildet er fra galleriet. Appen maskerer ingenting i det for deg \u2014 mal over det som ikke skal med.",
805
803
  bildeFeilet: "kunne ikke hente bildet. Du kan sende uten.",
806
804
  skjermbildeTittel: "Se over bildet",
@@ -864,6 +862,8 @@ var tekst = {
864
862
  mineSak: (nr) => `Sak ${saksnr(nr)}`,
865
863
  /** «Feil · sak 2041» — sporet først, aldri rå id og aldri kontraktens type (DD-50). */
866
864
  sakHode: (spor, nr) => `${stor(spor)} \xB7 sak ${saksnr(nr)}`,
865
+ /** F14: svaret kom siden forrige gang denne enheten viste lista. */
866
+ nyttSvar: "Nytt svar",
867
867
  // Leietakeren fjernet vedlegget. Bare AT — aldri hvorfor, av hvem eller når.
868
868
  bildeFjernet: "Bildet er fjernet.",
869
869
  svarFra: (leietaker) => `Svar fra ${leietaker}`,
@@ -1153,31 +1153,35 @@ function Felt({
1153
1153
  )
1154
1154
  ]
1155
1155
  }
1156
- ) : onSkjermbilde || onVelgBilde ? /* @__PURE__ */ jsxs2(View2, { style: { gap: tema.space.sm }, children: [
1157
- onSkjermbilde ? /* @__PURE__ */ jsx3(
1158
- Btn,
1159
- {
1160
- variant: "secondary",
1161
- testID: "legg-ved-skjermbilde",
1162
- ikon: "camera-outline",
1163
- label: tekst.leggVedSkjermbilde,
1164
- hint: tekst.leggVedHint,
1165
- onPress: onSkjermbilde
1166
- }
1167
- ) : null,
1168
- onVelgBilde ? /* @__PURE__ */ jsx3(
1169
- Btn,
1170
- {
1171
- variant: "secondary",
1172
- testID: "velg-bilde",
1173
- ikon: "images-outline",
1174
- label: tekst.velgBilde,
1175
- hint: tekst.velgBildeHint,
1176
- onPress: onVelgBilde
1177
- }
1178
- ) : null,
1179
- bildeNotat ? /* @__PURE__ */ jsx3(View2, { testID: "bilde-notat", children: /* @__PURE__ */ jsx3(Hint, { children: bildeNotat }) }) : null
1180
- ] }) : null,
1156
+ ) : onSkjermbilde || onVelgBilde ? (
1157
+ // F7 (brukerreisene 2026-09-15): knappene har ingen egen hjelpetekst. Web-widgeten
1158
+ // har aldri hatt det, og Følget sender sin egen setning som `imageStepNote` — med
1159
+ // pakkens hint i tillegg sto det tre tekster under to knapper. Løftet om at bildet
1160
+ // tas ved trykk og kan maskeres står i selve steget (Skjermbilde), der det gjelder.
1161
+ /* @__PURE__ */ jsxs2(View2, { style: { gap: tema.space.sm }, children: [
1162
+ onSkjermbilde ? /* @__PURE__ */ jsx3(
1163
+ Btn,
1164
+ {
1165
+ variant: "secondary",
1166
+ testID: "legg-ved-skjermbilde",
1167
+ ikon: "camera-outline",
1168
+ label: tekst.leggVedSkjermbilde,
1169
+ onPress: onSkjermbilde
1170
+ }
1171
+ ) : null,
1172
+ onVelgBilde ? /* @__PURE__ */ jsx3(
1173
+ Btn,
1174
+ {
1175
+ variant: "secondary",
1176
+ testID: "velg-bilde",
1177
+ ikon: "images-outline",
1178
+ label: tekst.velgBilde,
1179
+ onPress: onVelgBilde
1180
+ }
1181
+ ) : null,
1182
+ bildeNotat ? /* @__PURE__ */ jsx3(View2, { testID: "bilde-notat", children: /* @__PURE__ */ jsx3(Hint, { children: bildeNotat }) }) : null
1183
+ ] })
1184
+ ) : null,
1181
1185
  /* @__PURE__ */ jsxs2(View2, { style: { borderTopWidth: tema.hairline, borderTopColor: tema.color.border, paddingTop: tema.space.sm }, children: [
1182
1186
  /* @__PURE__ */ jsx3(
1183
1187
  Pressable2,
@@ -1514,25 +1518,80 @@ function Kvittering({
1514
1518
  }
1515
1519
 
1516
1520
  // src/widget/MineInnspill.tsx
1517
- import "react";
1521
+ import { useEffect, useState as useState2 } from "react";
1518
1522
  import { ActivityIndicator as ActivityIndicator2, ScrollView as ScrollView3, Text as Text6, View as View6 } from "react-native";
1523
+
1524
+ // src/widget/nyttSvar.ts
1525
+ var N\u00D8KKEL = "innspel:svar-sett";
1526
+ async function merkNyeSvar(rader, storage) {
1527
+ let grense = 0;
1528
+ try {
1529
+ grense = Number.parseInt(await storage.get(N\u00D8KKEL) ?? "", 10) || 0;
1530
+ } catch {
1531
+ grense = 0;
1532
+ }
1533
+ const tid = (r) => r.pending === true ? NaN : Date.parse(r.reply?.at ?? "");
1534
+ const merket = rader.map((rad) => ({ rad, nytt: tid(rad) > grense }));
1535
+ return [...merket.filter((m) => m.nytt), ...merket.filter((m) => !m.nytt)];
1536
+ }
1537
+ async function markerSvarSett(storage, n\u00E5 = Date.now()) {
1538
+ try {
1539
+ await storage.set(N\u00D8KKEL, String(n\u00E5));
1540
+ } catch {
1541
+ }
1542
+ }
1543
+
1544
+ // src/widget/MineInnspill.tsx
1519
1545
  import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
1520
1546
  function MineInnspill({
1521
1547
  rader,
1522
1548
  laster,
1523
1549
  tenantName,
1524
- onNytt
1550
+ onNytt,
1551
+ storage
1525
1552
  }) {
1526
1553
  const tema = useTema();
1554
+ const [visning, setVisning] = useState2(() => rader.map((rad) => ({ rad, nytt: false })));
1555
+ useEffect(() => {
1556
+ let gjelder = true;
1557
+ void merkNyeSvar(rader, storage).then((m) => {
1558
+ if (gjelder) setVisning(m);
1559
+ }).catch(() => {
1560
+ if (gjelder) setVisning(rader.map((rad) => ({ rad, nytt: false })));
1561
+ });
1562
+ return () => {
1563
+ gjelder = false;
1564
+ };
1565
+ }, [storage, rader]);
1566
+ useEffect(() => {
1567
+ if (!laster && rader.length) void markerSvarSett(storage).catch(() => void 0);
1568
+ }, [storage, laster, rader]);
1527
1569
  return /* @__PURE__ */ jsxs6(View6, { style: { flex: 1, gap: tema.space.md }, children: [
1528
1570
  /* @__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) => {
1571
+ 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
1572
  const venter = rad.pending === true;
1531
1573
  const v = venter ? venterVisning : statusVisning(rad.status, rad.type, rad.deadlineAt);
1532
1574
  const nokkel = venter ? rad.clientRef : rad.id;
1533
1575
  const svar = venter ? void 0 : rad.reply;
1534
1576
  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) }),
1577
+ /* @__PURE__ */ jsxs6(View6, { style: { flexDirection: "row", alignItems: "center", gap: tema.space.xs, flexWrap: "wrap" }, children: [
1578
+ /* @__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) }),
1579
+ nytt ? /* @__PURE__ */ jsx7(
1580
+ Text6,
1581
+ {
1582
+ testID: "nytt-svar",
1583
+ style: {
1584
+ color: tema.color.info,
1585
+ backgroundColor: tema.color.infoBg,
1586
+ fontSize: tema.font.tiny,
1587
+ fontWeight: tema.weight.semibold,
1588
+ borderRadius: tema.radius.pill,
1589
+ paddingHorizontal: tema.space.sm
1590
+ },
1591
+ children: tekst.nyttSvar
1592
+ }
1593
+ ) : null
1594
+ ] }),
1536
1595
  /* @__PURE__ */ jsx7(
1537
1596
  Text6,
1538
1597
  {
@@ -1585,7 +1644,7 @@ function MineInnspill({
1585
1644
 
1586
1645
  // src/widget/Skjermbilde.tsx
1587
1646
  import { skaler, strokTilRekter, treffer, trykkTilRekt } from "@innspel/core";
1588
- import { useCallback, useMemo as useMemo3, useRef as useRef2, useState as useState2 } from "react";
1647
+ import { useCallback, useMemo as useMemo3, useRef as useRef2, useState as useState3 } from "react";
1589
1648
  import { Image as Image2, Pressable as Pressable4, StyleSheet, Text as Text7, View as View7 } from "react-native";
1590
1649
  import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
1591
1650
  function Skjermbilde({
@@ -1600,10 +1659,10 @@ function Skjermbilde({
1600
1659
  onLeggVed
1601
1660
  }) {
1602
1661
  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);
1662
+ const [verktoy, setVerktoy] = useState3("pensel");
1663
+ const [allTekst, setAllTekst] = useState3(false);
1664
+ const [egne, setEgne] = useState3([]);
1665
+ const [ramme, setRamme] = useState3(null);
1607
1666
  const strok = useRef2([]);
1608
1667
  const visning = useMemo3(() => {
1609
1668
  if (!ramme) return null;
@@ -1822,33 +1881,34 @@ function Widget({
1822
1881
  apneOpsjoner,
1823
1882
  onLukk,
1824
1883
  tenantName,
1825
- imageStepNote
1884
+ imageStepNote,
1885
+ onSubmitted
1826
1886
  }) {
1827
1887
  const tema = useTema();
1828
1888
  const insets = useContext3(SafeAreaInsetsContext) ?? initialWindowMetrics?.insets ?? { top: 0, bottom: 0, left: 0, right: 0 };
1829
1889
  const skjermbilde = useSkjermbilde();
1830
1890
  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);
1891
+ const [steg, setSteg] = useState4("valg");
1892
+ const [spor, setSpor] = useState4("feil");
1893
+ const [verdi, setVerdi] = useState4("");
1894
+ const [kort, setKort] = useState4([]);
1895
+ const [lasterKort, setLasterKort] = useState4(false);
1896
+ const [lenketTil, setLenketTil] = useState4();
1897
+ const [funn, setFunn] = useState4([]);
1898
+ const [fjernede, setFjernede] = useState4([]);
1899
+ const [sender, setSender] = useState4(false);
1840
1900
  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 });
1901
+ const [feil, setFeil] = useState4();
1902
+ const [kvittering, setKvittering] = useState4();
1903
+ const [mine, setMine] = useState4([]);
1904
+ const [lasterMine, setLasterMine] = useState4(false);
1905
+ const [bilde, setBilde] = useState4();
1906
+ const [automasker, setAutomasker] = useState4([]);
1907
+ const [rotStorrelse, setRotStorrelse] = useState4({ width: 1, height: 1 });
1908
+ const [komponerer, setKomponerer] = useState4(false);
1909
+ const [kilde, setKilde] = useState4("skjerm");
1910
+ const [vedlegg, setVedlegg] = useState4();
1911
+ const [innstillinger, setInnstillinger] = useState4({ ...client.settings });
1852
1912
  const skjermbildeMulig = innstillinger.screenshotsEnabled && skjermbilde?.adapter != null;
1853
1913
  const fangstMulig = skjermbildeMulig && skjermbilde?.adapter?.captureScreen !== false;
1854
1914
  const galleriMulig = skjermbildeMulig && typeof skjermbilde?.adapter?.pick === "function";
@@ -1868,8 +1928,8 @@ function Widget({
1868
1928
  setVedlegg(void 0);
1869
1929
  setKomponerer(false);
1870
1930
  }, []);
1871
- const [mineDirekte, setMineDirekte] = useState3(false);
1872
- const [stegForMine, setStegForMine] = useState3("valg");
1931
+ const [mineDirekte, setMineDirekte] = useState4(false);
1932
+ const [stegForMine, setStegForMine] = useState4("valg");
1873
1933
  const stegRef = useRef3(steg);
1874
1934
  stegRef.current = steg;
1875
1935
  const harUtkast = verdi.trim().length > 0 || vedlegg !== void 0;
@@ -1886,7 +1946,7 @@ function Widget({
1886
1946
  setMineDirekte(false);
1887
1947
  setStegForMine("valg");
1888
1948
  }, [onLukk, nullstill]);
1889
- useEffect(() => {
1949
+ useEffect2(() => {
1890
1950
  if (!synlig) return;
1891
1951
  client.track({ name: "widget_opened" });
1892
1952
  void client.queue.flush().catch(() => void 0);
@@ -1919,7 +1979,7 @@ function Widget({
1919
1979
  },
1920
1980
  [client, hentKort]
1921
1981
  );
1922
- useEffect(() => {
1982
+ useEffect2(() => {
1923
1983
  if (steg === "kjenteFeil" && !lasterKort && kort.length === 0) setSteg("felt");
1924
1984
  }, [steg, lasterKort, kort.length]);
1925
1985
  const endreTekst = useCallback2(
@@ -2024,7 +2084,7 @@ function Widget({
2024
2084
  text: verdi,
2025
2085
  ...vedlegg ? { attachment: vedlegg } : {},
2026
2086
  ...spor === "feil" && lenketTil ? { relatedKnownIssueId: lenketTil.id } : {},
2027
- ...fjernede.length ? { context: fjernetKontekst(client, fjernede) } : {}
2087
+ context: fjernetKontekst(client, fjernede, apneOpsjoner?.screen)
2028
2088
  });
2029
2089
  if (res.status === "queued") {
2030
2090
  setKvittering({ art: "k\xF8", ...res.attachment ? { vedlegg: "forkastet" } : {} });
@@ -2038,6 +2098,7 @@ function Widget({
2038
2098
  });
2039
2099
  }
2040
2100
  setSteg("kvittering");
2101
+ onSubmitted?.(res.status === "queued" ? { type: spor, queued: true } : { type: spor, queued: false, id: res.submission.id });
2041
2102
  } catch (e) {
2042
2103
  if (e instanceof InnspelQueueFullError) setFeil(e.userMessage);
2043
2104
  else if (e instanceof InnspelApiError) setFeil(e.message);
@@ -2045,7 +2106,7 @@ function Widget({
2045
2106
  } finally {
2046
2107
  setSender(false);
2047
2108
  }
2048
- }, [client, spor, verdi, vedlegg, lenketTil, fjernede]);
2109
+ }, [client, spor, verdi, vedlegg, lenketTil, fjernede, apneOpsjoner?.screen, onSubmitted]);
2049
2110
  const jaOgsa = useCallback2(
2050
2111
  async (k) => {
2051
2112
  setSender(true);
@@ -2172,7 +2233,7 @@ function Widget({
2172
2233
  onEndre: endreTekst,
2173
2234
  minTextLength: innstillinger.minTextLength,
2174
2235
  textMaxLength: innstillinger.textMaxLength,
2175
- kontekst: client.context,
2236
+ kontekst: { ...client.context, ...apneOpsjoner?.screen ? { screen: apneOpsjoner.screen } : {} },
2176
2237
  fjernedeFelter: fjernede,
2177
2238
  onFjernKontekst: (f) => setFjernede((x) => [...x, f]),
2178
2239
  ...lenketTil ? { lenketTil, onFjernLenke: () => setLenketTil(void 0) } : {},
@@ -2215,6 +2276,7 @@ function Widget({
2215
2276
  steg === "mine" ? /* @__PURE__ */ jsx9(
2216
2277
  MineInnspill,
2217
2278
  {
2279
+ storage: client.storage,
2218
2280
  rader: mine,
2219
2281
  laster: lasterMine,
2220
2282
  ...tenantName ? { tenantName } : {},
@@ -2231,17 +2293,18 @@ function Widget({
2231
2293
  }
2232
2294
  function useNettstatus(client) {
2233
2295
  const c = client.connectivity;
2234
- const [online, setOnline] = useState3(() => c?.isOnline() ?? true);
2235
- useEffect(() => {
2296
+ const [online, setOnline] = useState4(() => c?.isOnline() ?? true);
2297
+ useEffect2(() => {
2236
2298
  if (!c) return void 0;
2237
2299
  setOnline(c.isOnline());
2238
2300
  return c.subscribe?.((v) => setOnline(v));
2239
2301
  }, [c]);
2240
2302
  return online;
2241
2303
  }
2242
- function fjernetKontekst(client, fjernede) {
2304
+ function fjernetKontekst(client, fjernede, skjerm) {
2243
2305
  const ut = {};
2244
- for (const k of Object.keys(client.context)) {
2306
+ if (skjerm) ut["screen"] = skjerm;
2307
+ for (const k of [...Object.keys(client.context), "screen"]) {
2245
2308
  if (k !== "sdkVersion" && fjernede.includes(k)) ut[k] = void 0;
2246
2309
  }
2247
2310
  return ut;
@@ -2257,10 +2320,11 @@ function InnspelProvider({
2257
2320
  colorScheme = "dark",
2258
2321
  tenantName,
2259
2322
  screenshot,
2260
- imageStepNote
2323
+ imageStepNote,
2324
+ onSubmitted
2261
2325
  }) {
2262
- const [synlig, setSynlig] = useState4(false);
2263
- const [apneOpsjoner, setApneOpsjoner] = useState4();
2326
+ const [synlig, setSynlig] = useState5(false);
2327
+ const [apneOpsjoner, setApneOpsjoner] = useState5();
2264
2328
  const registrert = useRef4(false);
2265
2329
  const rootRef = useRef4(null);
2266
2330
  const privat = useMemo4(createPrivateRegistry, []);
@@ -2292,6 +2356,7 @@ function InnspelProvider({
2292
2356
  ...apneOpsjoner ? { apneOpsjoner } : {},
2293
2357
  ...tenantName ? { tenantName } : {},
2294
2358
  ...imageStepNote ? { imageStepNote } : {},
2359
+ ...onSubmitted ? { onSubmitted } : {},
2295
2360
  onLukk: close
2296
2361
  }
2297
2362
  )
@@ -2308,14 +2373,14 @@ function useInnspel() {
2308
2373
  }
2309
2374
 
2310
2375
  // src/InnspelPrivate.tsx
2311
- import { useEffect as useEffect2, useRef as useRef5 } from "react";
2376
+ import { useEffect as useEffect3, useRef as useRef5 } from "react";
2312
2377
  import { View as View10 } from "react-native";
2313
2378
  import { jsx as jsx11 } from "react/jsx-runtime";
2314
2379
  function InnspelPrivate({ children, style }) {
2315
2380
  const ref = useRef5(null);
2316
2381
  const kontekst = useSkjermbilde();
2317
2382
  const registrer = kontekst?.privat.register;
2318
- useEffect2(() => {
2383
+ useEffect3(() => {
2319
2384
  if (!registrer) return;
2320
2385
  return registrer(ref);
2321
2386
  }, [registrer]);
@@ -2326,7 +2391,7 @@ function InnspelPrivate({ children, style }) {
2326
2391
  import {
2327
2392
  InnspelApiError as InnspelApiError2
2328
2393
  } from "@innspel/core";
2329
- import { useCallback as useCallback4, useEffect as useEffect3, useState as useState6 } from "react";
2394
+ import { useCallback as useCallback4, useEffect as useEffect4, useState as useState7 } from "react";
2330
2395
  import { Modal as Modal4, Pressable as Pressable8, Text as Text12, View as View15 } from "react-native";
2331
2396
 
2332
2397
  // src/program/Aksept.tsx
@@ -2500,7 +2565,7 @@ function Aksept({
2500
2565
  }
2501
2566
 
2502
2567
  // src/program/HvordanGikkDet.tsx
2503
- import { useState as useState5 } from "react";
2568
+ import { useState as useState6 } from "react";
2504
2569
  import { Modal as Modal3, Pressable as Pressable7, Text as Text9, TextInput as TextInput2, View as View12 } from "react-native";
2505
2570
  import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
2506
2571
  var UTFALL = [
@@ -2520,8 +2585,8 @@ function HvordanGikkDet({
2520
2585
  onLukk
2521
2586
  }) {
2522
2587
  const tema = useTema();
2523
- const [valgt, setValgt] = useState5();
2524
- const [setning, setSetning] = useState5("");
2588
+ const [valgt, setValgt] = useState6();
2589
+ const [setning, setSetning] = useState6("");
2525
2590
  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
2591
  View12,
2527
2592
  {
@@ -2745,17 +2810,17 @@ function InnspelProgram({
2745
2810
  }) {
2746
2811
  const { client } = useInnspel();
2747
2812
  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();
2813
+ const [mine, setMine] = useState7();
2814
+ const [deltakelse, setDeltakelse] = useState7();
2815
+ const [viserAksept, setViserAksept] = useState7(false);
2816
+ const [viserGaaUt, setViserGaaUt] = useState7(false);
2817
+ const [avvist, setAvvist] = useState7(false);
2818
+ const [sender, setSender] = useState7(false);
2819
+ const [feil, setFeil] = useState7();
2820
+ const [dialog, setDialog] = useState7();
2821
+ const [svarFeil, setSvarFeil] = useState7();
2822
+ const [lagtBort, setLagtBort] = useState7(/* @__PURE__ */ new Set());
2823
+ const [meldFeilFor, setMeldFeilFor] = useState7();
2759
2824
  const leggBort = useCallback4((id) => setLagtBort((s) => /* @__PURE__ */ new Set([...s, id])), []);
2760
2825
  const lagreSvar = useCallback4(
2761
2826
  async (outcome, text) => {
@@ -2780,7 +2845,7 @@ function InnspelProgram({
2780
2845
  },
2781
2846
  [client, deltakelse, dialog, onMeldFeil]
2782
2847
  );
2783
- useEffect3(() => {
2848
+ useEffect4(() => {
2784
2849
  if (client.isAnonymous) return;
2785
2850
  let levende = true;
2786
2851
  void client.programs.list().then((svar) => {