@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/README.md +17 -0
- package/dist/index.cjs +102 -37
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +25 -4
- package/dist/index.d.ts +25 -4
- package/dist/index.js +156 -91
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
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
|
|
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
|
|
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 ?
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
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:
|
|
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__ */
|
|
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
|
|
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] =
|
|
1604
|
-
const [allTekst, setAllTekst] =
|
|
1605
|
-
const [egne, setEgne] =
|
|
1606
|
-
const [ramme, setRamme] =
|
|
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] =
|
|
1832
|
-
const [spor, setSpor] =
|
|
1833
|
-
const [verdi, setVerdi] =
|
|
1834
|
-
const [kort, setKort] =
|
|
1835
|
-
const [lasterKort, setLasterKort] =
|
|
1836
|
-
const [lenketTil, setLenketTil] =
|
|
1837
|
-
const [funn, setFunn] =
|
|
1838
|
-
const [fjernede, setFjernede] =
|
|
1839
|
-
const [sender, setSender] =
|
|
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] =
|
|
1842
|
-
const [kvittering, setKvittering] =
|
|
1843
|
-
const [mine, setMine] =
|
|
1844
|
-
const [lasterMine, setLasterMine] =
|
|
1845
|
-
const [bilde, setBilde] =
|
|
1846
|
-
const [automasker, setAutomasker] =
|
|
1847
|
-
const [rotStorrelse, setRotStorrelse] =
|
|
1848
|
-
const [komponerer, setKomponerer] =
|
|
1849
|
-
const [kilde, setKilde] =
|
|
1850
|
-
const [vedlegg, setVedlegg] =
|
|
1851
|
-
const [innstillinger, setInnstillinger] =
|
|
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] =
|
|
1872
|
-
const [stegForMine, setStegForMine] =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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] =
|
|
2235
|
-
|
|
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
|
-
|
|
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] =
|
|
2263
|
-
const [apneOpsjoner, setApneOpsjoner] =
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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] =
|
|
2524
|
-
const [setning, setSetning] =
|
|
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] =
|
|
2749
|
-
const [deltakelse, setDeltakelse] =
|
|
2750
|
-
const [viserAksept, setViserAksept] =
|
|
2751
|
-
const [viserGaaUt, setViserGaaUt] =
|
|
2752
|
-
const [avvist, setAvvist] =
|
|
2753
|
-
const [sender, setSender] =
|
|
2754
|
-
const [feil, setFeil] =
|
|
2755
|
-
const [dialog, setDialog] =
|
|
2756
|
-
const [svarFeil, setSvarFeil] =
|
|
2757
|
-
const [lagtBort, setLagtBort] =
|
|
2758
|
-
const [meldFeilFor, setMeldFeilFor] =
|
|
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
|
-
|
|
2848
|
+
useEffect4(() => {
|
|
2784
2849
|
if (client.isAnonymous) return;
|
|
2785
2850
|
let levende = true;
|
|
2786
2851
|
void client.programs.list().then((svar) => {
|