@govuk-one-login/frontend-ui 1.3.13 → 1.4.0

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.
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const WaitInteractions = (() => {
4
+ var _a;
4
5
  const content = {
5
6
  initial: {
6
7
  spinnerState: "pending",
@@ -8,20 +9,81 @@ const WaitInteractions = (() => {
8
9
  complete: { spinnerState: "completed" },
9
10
  };
10
11
  const state = {
11
- spinnerState: content.initial.spinnerState,
12
+ spinnerState: (_a = content === null || content === void 0 ? void 0 : content.initial) === null || _a === void 0 ? void 0 : _a.spinnerState,
12
13
  done: false,
13
14
  virtualDom: [],
15
+ abortController: null,
14
16
  };
15
17
  const timers = {};
18
+ let { container, ariaLiveContainer, domRequirementsMet, initTime, abortController, config, } = {
19
+ };
20
+ const handleAbort = () => {
21
+ abortController === null || abortController === void 0 ? void 0 : abortController.abort();
22
+ };
23
+ const initialiseAbortController = () => {
24
+ abortController = new AbortController();
25
+ window.removeEventListener("beforeunload", handleAbort);
26
+ window.addEventListener("beforeunload", handleAbort);
27
+ };
28
+ const updateAccordingToTimeElapsed = () => {
29
+ const now = Date.now();
30
+ const elapsedMilliseconds = now - initTime;
31
+ if (elapsedMilliseconds >= config.msBeforeAbort) {
32
+ reflectError();
33
+ }
34
+ else if ((elapsedMilliseconds >=
35
+ config.msBeforeInformingOfLongWait)) {
36
+ reflectLongWait();
37
+ }
38
+ };
16
39
  const createVirtualDom = () => {
40
+ var _a, _b, _c, _d, _e, _f;
17
41
  const initialState = [
42
+ {
43
+ nodeName: "h1",
44
+ text: state.heading,
45
+ classes: ["govuk-heading-l"],
46
+ },
18
47
  {
19
48
  nodeName: "div",
20
49
  id: "spinner",
21
50
  classes: ["spinner", "spinner__pending", "centre", state.spinnerState],
22
51
  },
52
+ {
53
+ nodeName: "p",
54
+ text: state.spinnerStateText,
55
+ classes: ["centre", "spinner-state-text", "govuk-body"],
56
+ },
57
+ {
58
+ nodeName: "button",
59
+ text: (_a = content === null || content === void 0 ? void 0 : content.continueButton) === null || _a === void 0 ? void 0 : _a.text,
60
+ buttonDisabled: state.buttonDisabled,
61
+ classes: ["govuk-button", "govuk-!-margin-top-4"],
62
+ },
23
63
  ];
24
- return initialState;
64
+ const domErrorState = [
65
+ {
66
+ nodeName: "h1",
67
+ text: state.heading,
68
+ classes: ["govuk-heading-l"],
69
+ },
70
+ {
71
+ nodeName: "p",
72
+ text: state.messageText,
73
+ classes: ["govuk-body"],
74
+ },
75
+ {
76
+ nodeName: "h2",
77
+ text: (_b = content === null || content === void 0 ? void 0 : content.error) === null || _b === void 0 ? void 0 : _b.whatYouCanDo.heading,
78
+ classes: ["govuk-heading-m"],
79
+ },
80
+ {
81
+ nodeName: "p",
82
+ innerHTML: `${(_c = content === null || content === void 0 ? void 0 : content.error) === null || _c === void 0 ? void 0 : _c.whatYouCanDo.message.text1}<a href="${(_d = content === null || content === void 0 ? void 0 : content.error) === null || _d === void 0 ? void 0 : _d.whatYouCanDo.message.link.href}">${(_e = content === null || content === void 0 ? void 0 : content.error) === null || _e === void 0 ? void 0 : _e.whatYouCanDo.message.link.text}</a>${(_f = content === null || content === void 0 ? void 0 : content.error) === null || _f === void 0 ? void 0 : _f.whatYouCanDo.message.text2}`,
83
+ classes: ["govuk-body"],
84
+ },
85
+ ];
86
+ return state.error ? domErrorState : initialState;
25
87
  };
26
88
  const vDomHasChanged = (currentVDom, nextVDom) => {
27
89
  return JSON.stringify(currentVDom) !== JSON.stringify(nextVDom);
@@ -31,6 +93,7 @@ const WaitInteractions = (() => {
31
93
  const vDomChanged = vDomHasChanged(state.virtualDom, createVirtualDom());
32
94
  const container = document.getElementById("spinner-container");
33
95
  if (vDomChanged) {
96
+ document.title = state.heading;
34
97
  state.virtualDom = createVirtualDom();
35
98
  const elements = (_a = state === null || state === void 0 ? void 0 : state.virtualDom) === null || _a === void 0 ? void 0 : _a.map(convert);
36
99
  container === null || container === void 0 ? void 0 : container.replaceChildren(...elements);
@@ -41,16 +104,35 @@ const WaitInteractions = (() => {
41
104
  if (state.done) {
42
105
  clearInterval(timers.updateDomTimer);
43
106
  }
107
+ if (state.ariaButtonEnabledMessage !== "") {
108
+ updateAriaAlert(config === null || config === void 0 ? void 0 : config.ariaButtonEnabledMessage);
109
+ }
44
110
  };
45
111
  const reflectCompletion = () => {
112
+ var _a, _b;
46
113
  state.spinnerState = "spinner__ready";
47
- state.spinnerStateText = content.complete.spinnerState;
114
+ state.spinnerStateText = (_a = content === null || content === void 0 ? void 0 : content.complete) === null || _a === void 0 ? void 0 : _a.spinnerState;
115
+ state.buttonDisabled = false;
116
+ state.ariaButtonEnabledMessage =
117
+ (_b = content === null || content === void 0 ? void 0 : content.complete) === null || _b === void 0 ? void 0 : _b.ariaButtonEnabledMessage;
48
118
  state.done = true;
119
+ sessionStorage.removeItem("spinnerInitTime");
49
120
  };
50
121
  const reflectError = () => {
122
+ var _a, _b, _c;
123
+ state.heading = (_a = content === null || content === void 0 ? void 0 : content.error) === null || _a === void 0 ? void 0 : _a.heading;
124
+ state.messageText = (_b = content === null || content === void 0 ? void 0 : content.error) === null || _b === void 0 ? void 0 : _b.messageText;
51
125
  state.spinnerState = "spinner__failed";
52
126
  state.done = true;
53
127
  state.error = true;
128
+ sessionStorage.removeItem("spinnerInitTime");
129
+ (_c = state === null || state === void 0 ? void 0 : state.abortController) === null || _c === void 0 ? void 0 : _c.abort();
130
+ };
131
+ const reflectLongWait = () => {
132
+ var _a;
133
+ if (state.spinnerState !== "ready") {
134
+ state.spinnerStateText = (_a = content === null || content === void 0 ? void 0 : content.longWait) === null || _a === void 0 ? void 0 : _a.spinnerStateText;
135
+ }
54
136
  };
55
137
  const convert = (node) => {
56
138
  const el = document.createElement(node.nodeName);
@@ -62,20 +144,46 @@ const WaitInteractions = (() => {
62
144
  el.id = node.id;
63
145
  if (node.classes)
64
146
  el.classList.add(...node.classes);
147
+ if (node.buttonDisabled)
148
+ el.setAttribute("disabled", node.buttonDisabled);
65
149
  return el;
66
150
  };
151
+ const updateAriaAlert = (messageText) => {
152
+ while (ariaLiveContainer === null || ariaLiveContainer === void 0 ? void 0 : ariaLiveContainer.firstChild) {
153
+ ariaLiveContainer.removeChild(ariaLiveContainer.firstChild);
154
+ }
155
+ /* Create new message and append it to the live region */
156
+ const messageNode = document.createTextNode(messageText);
157
+ ariaLiveContainer === null || ariaLiveContainer === void 0 ? void 0 : ariaLiveContainer.appendChild(messageNode);
158
+ };
67
159
  const notInErrorOrDoneState = () => {
68
160
  return !(state.done || state.error);
69
161
  };
70
162
  const requestIDProcessingStatus = async () => {
71
163
  var _a;
164
+ const signal = abortController.signal;
72
165
  const apiRoute = (_a = document === null || document === void 0 ? void 0 : document.getElementById("spinner-container")) === null || _a === void 0 ? void 0 : _a.dataset.apiRoute;
73
166
  try {
74
- const response = await fetch(apiRoute);
167
+ const response = await fetch(apiRoute, { signal });
75
168
  if (response.status !== 200) {
76
169
  throw new Error(`Status code ${response.status} received`);
77
170
  }
78
171
  const data = await response.json();
172
+ if (data.status === "COMPLETED" ||
173
+ data.status === "INTERVENTION") {
174
+ reflectCompletion();
175
+ }
176
+ else if (data.status === "ERROR") {
177
+ reflectError();
178
+ }
179
+ else if (notInErrorOrDoneState()) {
180
+ setTimeout(async () => {
181
+ if (Date.now() - initTime >= config.msBeforeAbort) {
182
+ return;
183
+ }
184
+ await requestIDProcessingStatus();
185
+ }, config.msBetweenRequests);
186
+ }
79
187
  if (data.status === "Clear to proceed") {
80
188
  reflectCompletion();
81
189
  }
@@ -88,8 +196,36 @@ const WaitInteractions = (() => {
88
196
  catch (e) {
89
197
  console.log(e);
90
198
  reflectError();
199
+ if (e.name !== "AbortError") {
200
+ console.error("Error in requestIdProcessingStatus:", e);
201
+ reflectError();
202
+ }
91
203
  }
92
204
  };
205
+ const initTimer = () => {
206
+ let spinnerInitTime = sessionStorage.getItem("spinnerInitTime");
207
+ if (spinnerInitTime === null) {
208
+ spinnerInitTime = Date.now();
209
+ sessionStorage.setItem("spinnerInitTime", spinnerInitTime.toString());
210
+ }
211
+ else {
212
+ spinnerInitTime = parseInt(spinnerInitTime, 10);
213
+ }
214
+ initTime = spinnerInitTime;
215
+ updateAccordingToTimeElapsed();
216
+ setInterval(() => {
217
+ updateAccordingToTimeElapsed();
218
+ updateDom();
219
+ }, config === null || config === void 0 ? void 0 : config.msBetweenDomUpdate);
220
+ };
221
+ const initialiseContainers = () => {
222
+ const spinnerContainer = document.createElement("div");
223
+ const ariaLiveContainer = document.createElement("div");
224
+ ariaLiveContainer.setAttribute("aria-live", "assertive");
225
+ ariaLiveContainer.classList.add("govuk-visually-hidden");
226
+ ariaLiveContainer.appendChild(document.createTextNode(""));
227
+ container === null || container === void 0 ? void 0 : container.replaceChildren(spinnerContainer, ariaLiveContainer);
228
+ };
93
229
  return {
94
230
  state: state,
95
231
  init: () => {
@@ -101,6 +237,13 @@ const WaitInteractions = (() => {
101
237
  requestIDProcessingStatus().then(() => {
102
238
  updateDom();
103
239
  });
240
+ if (domRequirementsMet) {
241
+ initTimer();
242
+ initialiseContainers();
243
+ initialiseAbortController();
244
+ updateDom();
245
+ requestIDProcessingStatus();
246
+ }
104
247
  },
105
248
  };
106
249
  })();
@@ -1 +1 @@
1
- {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../../frontend-src/typescript/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,EAEN,MAAM,gBAAgB,CAAC;AAExB,eAAO,MAAM,gBAAgB;;;CA2HzB,CAAC"}
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../../frontend-src/typescript/spinner.ts"],"names":[],"mappings":"AAGA,OAAO,EAOL,KAAK,EAEN,MAAM,gBAAgB,CAAC;AAExB,eAAO,MAAM,gBAAgB;;;CA+RzB,CAAC"}
@@ -2,6 +2,7 @@ export interface virtualDom {
2
2
  nodeName?: string;
3
3
  id?: string;
4
4
  classes?: string[];
5
+ text?: string;
5
6
  }
6
7
  export type error = {
7
8
  spinnerState: string;
@@ -10,21 +11,49 @@ export type error = {
10
11
  state: {
11
12
  error: boolean;
12
13
  };
14
+ name: string;
13
15
  };
14
16
  export type apiRoute = RequestInfo | URL;
15
17
  export type content = {
16
- initial: {
18
+ longWait?: {
19
+ spinnerStateText: string;
20
+ };
21
+ initial?: {
17
22
  spinnerState: string | virtualDom;
18
23
  };
19
- complete: {
24
+ complete?: {
20
25
  spinnerState: string;
26
+ ariaButtonEnabledMessage?: string;
27
+ };
28
+ continueButton?: {
29
+ text: string;
30
+ };
31
+ error?: {
32
+ heading?: string;
33
+ messageText?: string;
34
+ whatYouCanDo: {
35
+ heading: string;
36
+ message: {
37
+ text1: string;
38
+ link: {
39
+ href: string;
40
+ text: string;
41
+ };
42
+ text2: string;
43
+ };
44
+ };
21
45
  };
22
46
  };
23
47
  export type timers = {
24
48
  updateDomTimer?: unknown | number;
25
49
  abortUnresponsiveRequest?: unknown | number;
50
+ abort?: unknown | never;
26
51
  };
27
52
  export type state = {
53
+ abortController: null | {
54
+ abort: any;
55
+ };
56
+ abort?: unknown;
28
57
  error?: boolean | error;
29
58
  spinnerState?: string;
30
59
  done?: boolean;
@@ -33,6 +62,10 @@ export type state = {
33
62
  timers: timers;
34
63
  };
35
64
  spinnerStateText?: string;
65
+ buttonDisabled?: boolean;
66
+ heading?: object | string | undefined;
67
+ messageText?: string;
68
+ ariaButtonEnabledMessage?: string;
36
69
  };
37
70
  export type node = {
38
71
  text: object;
@@ -42,10 +75,34 @@ export type node = {
42
75
  nodeName: keyof HTMLElementTagNameMap;
43
76
  textContent: unknown | HTMLElement | string;
44
77
  el: unknown | HTMLElement | string;
78
+ buttonDisabled: boolean | string;
45
79
  };
46
80
  export type initialState = {
47
- nodeName: string;
48
- id: string;
49
- classes: (string | undefined)[];
81
+ nodeName?: string;
82
+ id?: string;
83
+ classes?: (string | undefined)[];
84
+ text?: object | string;
85
+ buttonDisabled?: state;
50
86
  }[];
87
+ export type spinnerInitial = {
88
+ container?: HTMLElement;
89
+ apiUrl?: string;
90
+ msBeforeInformingOfLongWait?: number;
91
+ msBeforeAbort?: number;
92
+ msBetweenRequests?: number;
93
+ msBeforeDomUpdate?: number;
94
+ ariaLiveContainer?: HTMLElement;
95
+ domRequirementsMet?: boolean;
96
+ initTime?: number | undefined;
97
+ updateDomTimer?: number | undefined | any;
98
+ abortController?: any | object;
99
+ config?: {
100
+ msBeforeAbort: number;
101
+ msBeforeInformingOfLongWait: number;
102
+ msBetweenRequests: number;
103
+ ariaButtonEnabledMessage: string;
104
+ msBetweenDomUpdate: number;
105
+ };
106
+ msBetweenDomUpdate?: number;
107
+ };
51
108
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../frontend-src/utils/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,MAAM,KAAK,GAAG;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,KAAK,EAAE,CAAC;IACpB,KAAK,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,GAAG,CAAC;AAEzC,MAAM,MAAM,OAAO,GAAG;IACpB,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,GAAG,UAAU,CAAC;KACnC,CAAC;IACF,QAAQ,EAAE;QACR,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAClC,wBAAwB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAClB,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,WAAW,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,qBAAqB,CAAC;IACtC,WAAW,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;IAC5C,EAAE,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;CACjC,EAAE,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../frontend-src/utils/types.ts"],"names":[],"mappings":"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"}
@@ -2,15 +2,17 @@
2
2
  {% set govukRebrand = true %}
3
3
  {% endif %}
4
4
 
5
+ {% set isPageDataSensitive = false %}
6
+
5
7
  {% extends "govuk/template.njk" %}
6
8
  {% from "frontend-ui/build/components/cookie-banner/macro.njk" import frontendUiCookieBanner %}
7
9
  {% from "frontend-ui/build/components/phase-banner/macro.njk" import frontendUiPhaseBanner %}
8
10
  {% from "frontend-ui/build/components/header/macro.njk" import frontendUiHeader %}
9
11
  {% from "frontend-ui/build/components/footer/macro.njk" import frontendUiFooter %}
10
12
  {% from "frontend-ui/build/components/language-select/macro.njk" import frontendUiLanguageSelect %}
13
+ {% from "frontend-analytics/components/ga4-opl/macro.njk" import frontendAnalyticsGa4OnPageLoad %}
11
14
  {% from "govuk/components/back-link/macro.njk" import govukBackLink %}
12
15
  {% from "govuk/components/error-summary/macro.njk" import govukErrorSummary %}
13
- {% from basePath ~ "/views/shared/ga4/on-page-load-macro.njk" import ga4OnPageLoad %}
14
16
  {% from "govuk/components/notification-banner/macro.njk" import govukNotificationBanner %}
15
17
 
16
18
  {# Set language values for govuk/template.njk #}
@@ -88,7 +90,8 @@
88
90
  {% if (displayBanner) %}
89
91
  {{ govukNotificationBanner({
90
92
  html: bannerMessage,
91
- type: bannerType
93
+ type: bannerType,
94
+ titleText: bannerTitleText
92
95
  }) }}
93
96
  {% endif %}
94
97
 
@@ -141,14 +144,16 @@
141
144
  ga4ContainerId: "{{ ga4ContainerId }}",
142
145
  uaContainerId: "{{ uaContainerId }}"
143
146
  }, {
147
+ isDataSensitive: false,
148
+ isPageDataSensitive: {{ isPageDataSensitive }},
144
149
  enableGa4Tracking: {{isGa4Enabled}},
145
150
  enableUaTracking: {{isUaEnabled}},
146
151
  cookieDomain: "{{analyticsCookieDomain}}"
147
152
  });
148
153
  </script>
149
- {{ ga4OnPageLoad({
150
- cspNonce: cspNonce,
151
- isPageDynamic: isPageDynamic,
154
+ {{ frontendAnalyticsGa4OnPageLoad({
155
+ nonce: cspNonce,
156
+ dynamic: isPageDynamic,
152
157
  englishPageTitle: pageTitleKey | translateToEnglish }) }}
153
158
 
154
- {% endblock %}
159
+ {% endblock %}
@@ -84,7 +84,8 @@
84
84
  {% if (displayBanner) %}
85
85
  {{ govukNotificationBanner({
86
86
  html: bannerMessage,
87
- type: bannerType
87
+ type: bannerType,
88
+ titleText: bannerTitleText
88
89
  }) }}
89
90
  {% endif %}
90
91
  {% block content %}{% endblock %}
@@ -157,7 +158,7 @@
157
158
  });
158
159
  </script>
159
160
  <script type="text/javascript" nonce='{{scriptNonce}}'>
160
- if (document.getElementById('back-button'))
161
+ if (document.getElementById('back-button'))
161
162
  document
162
163
  .getElementById('back-button')
163
164
  .addEventListener('click', (e) => {
@@ -172,4 +173,4 @@
172
173
  import {setFingerprintCookie} from "/public/scripts/index.js";
173
174
  await setFingerprintCookie("{{analyticsCookieDomain}}");
174
175
  </script>
175
- {% endblock %}
176
+ {% endblock %}
@@ -1,4 +1,5 @@
1
1
  const WaitInteractions = (() => {
2
+ var _a;
2
3
  const content = {
3
4
  initial: {
4
5
  spinnerState: "pending",
@@ -6,20 +7,81 @@ const WaitInteractions = (() => {
6
7
  complete: { spinnerState: "completed" },
7
8
  };
8
9
  const state = {
9
- spinnerState: content.initial.spinnerState,
10
+ spinnerState: (_a = content === null || content === void 0 ? void 0 : content.initial) === null || _a === void 0 ? void 0 : _a.spinnerState,
10
11
  done: false,
11
12
  virtualDom: [],
13
+ abortController: null,
12
14
  };
13
15
  const timers = {};
16
+ let { container, ariaLiveContainer, domRequirementsMet, initTime, abortController, config, } = {
17
+ };
18
+ const handleAbort = () => {
19
+ abortController === null || abortController === void 0 ? void 0 : abortController.abort();
20
+ };
21
+ const initialiseAbortController = () => {
22
+ abortController = new AbortController();
23
+ window.removeEventListener("beforeunload", handleAbort);
24
+ window.addEventListener("beforeunload", handleAbort);
25
+ };
26
+ const updateAccordingToTimeElapsed = () => {
27
+ const now = Date.now();
28
+ const elapsedMilliseconds = now - initTime;
29
+ if (elapsedMilliseconds >= config.msBeforeAbort) {
30
+ reflectError();
31
+ }
32
+ else if ((elapsedMilliseconds >=
33
+ config.msBeforeInformingOfLongWait)) {
34
+ reflectLongWait();
35
+ }
36
+ };
14
37
  const createVirtualDom = () => {
38
+ var _a, _b, _c, _d, _e, _f;
15
39
  const initialState = [
40
+ {
41
+ nodeName: "h1",
42
+ text: state.heading,
43
+ classes: ["govuk-heading-l"],
44
+ },
16
45
  {
17
46
  nodeName: "div",
18
47
  id: "spinner",
19
48
  classes: ["spinner", "spinner__pending", "centre", state.spinnerState],
20
49
  },
50
+ {
51
+ nodeName: "p",
52
+ text: state.spinnerStateText,
53
+ classes: ["centre", "spinner-state-text", "govuk-body"],
54
+ },
55
+ {
56
+ nodeName: "button",
57
+ text: (_a = content === null || content === void 0 ? void 0 : content.continueButton) === null || _a === void 0 ? void 0 : _a.text,
58
+ buttonDisabled: state.buttonDisabled,
59
+ classes: ["govuk-button", "govuk-!-margin-top-4"],
60
+ },
21
61
  ];
22
- return initialState;
62
+ const domErrorState = [
63
+ {
64
+ nodeName: "h1",
65
+ text: state.heading,
66
+ classes: ["govuk-heading-l"],
67
+ },
68
+ {
69
+ nodeName: "p",
70
+ text: state.messageText,
71
+ classes: ["govuk-body"],
72
+ },
73
+ {
74
+ nodeName: "h2",
75
+ text: (_b = content === null || content === void 0 ? void 0 : content.error) === null || _b === void 0 ? void 0 : _b.whatYouCanDo.heading,
76
+ classes: ["govuk-heading-m"],
77
+ },
78
+ {
79
+ nodeName: "p",
80
+ innerHTML: `${(_c = content === null || content === void 0 ? void 0 : content.error) === null || _c === void 0 ? void 0 : _c.whatYouCanDo.message.text1}<a href="${(_d = content === null || content === void 0 ? void 0 : content.error) === null || _d === void 0 ? void 0 : _d.whatYouCanDo.message.link.href}">${(_e = content === null || content === void 0 ? void 0 : content.error) === null || _e === void 0 ? void 0 : _e.whatYouCanDo.message.link.text}</a>${(_f = content === null || content === void 0 ? void 0 : content.error) === null || _f === void 0 ? void 0 : _f.whatYouCanDo.message.text2}`,
81
+ classes: ["govuk-body"],
82
+ },
83
+ ];
84
+ return state.error ? domErrorState : initialState;
23
85
  };
24
86
  const vDomHasChanged = (currentVDom, nextVDom) => {
25
87
  return JSON.stringify(currentVDom) !== JSON.stringify(nextVDom);
@@ -29,6 +91,7 @@ const WaitInteractions = (() => {
29
91
  const vDomChanged = vDomHasChanged(state.virtualDom, createVirtualDom());
30
92
  const container = document.getElementById("spinner-container");
31
93
  if (vDomChanged) {
94
+ document.title = state.heading;
32
95
  state.virtualDom = createVirtualDom();
33
96
  const elements = (_a = state === null || state === void 0 ? void 0 : state.virtualDom) === null || _a === void 0 ? void 0 : _a.map(convert);
34
97
  container === null || container === void 0 ? void 0 : container.replaceChildren(...elements);
@@ -39,16 +102,35 @@ const WaitInteractions = (() => {
39
102
  if (state.done) {
40
103
  clearInterval(timers.updateDomTimer);
41
104
  }
105
+ if (state.ariaButtonEnabledMessage !== "") {
106
+ updateAriaAlert(config === null || config === void 0 ? void 0 : config.ariaButtonEnabledMessage);
107
+ }
42
108
  };
43
109
  const reflectCompletion = () => {
110
+ var _a, _b;
44
111
  state.spinnerState = "spinner__ready";
45
- state.spinnerStateText = content.complete.spinnerState;
112
+ state.spinnerStateText = (_a = content === null || content === void 0 ? void 0 : content.complete) === null || _a === void 0 ? void 0 : _a.spinnerState;
113
+ state.buttonDisabled = false;
114
+ state.ariaButtonEnabledMessage =
115
+ (_b = content === null || content === void 0 ? void 0 : content.complete) === null || _b === void 0 ? void 0 : _b.ariaButtonEnabledMessage;
46
116
  state.done = true;
117
+ sessionStorage.removeItem("spinnerInitTime");
47
118
  };
48
119
  const reflectError = () => {
120
+ var _a, _b, _c;
121
+ state.heading = (_a = content === null || content === void 0 ? void 0 : content.error) === null || _a === void 0 ? void 0 : _a.heading;
122
+ state.messageText = (_b = content === null || content === void 0 ? void 0 : content.error) === null || _b === void 0 ? void 0 : _b.messageText;
49
123
  state.spinnerState = "spinner__failed";
50
124
  state.done = true;
51
125
  state.error = true;
126
+ sessionStorage.removeItem("spinnerInitTime");
127
+ (_c = state === null || state === void 0 ? void 0 : state.abortController) === null || _c === void 0 ? void 0 : _c.abort();
128
+ };
129
+ const reflectLongWait = () => {
130
+ var _a;
131
+ if (state.spinnerState !== "ready") {
132
+ state.spinnerStateText = (_a = content === null || content === void 0 ? void 0 : content.longWait) === null || _a === void 0 ? void 0 : _a.spinnerStateText;
133
+ }
52
134
  };
53
135
  const convert = (node) => {
54
136
  const el = document.createElement(node.nodeName);
@@ -60,20 +142,46 @@ const WaitInteractions = (() => {
60
142
  el.id = node.id;
61
143
  if (node.classes)
62
144
  el.classList.add(...node.classes);
145
+ if (node.buttonDisabled)
146
+ el.setAttribute("disabled", node.buttonDisabled);
63
147
  return el;
64
148
  };
149
+ const updateAriaAlert = (messageText) => {
150
+ while (ariaLiveContainer === null || ariaLiveContainer === void 0 ? void 0 : ariaLiveContainer.firstChild) {
151
+ ariaLiveContainer.removeChild(ariaLiveContainer.firstChild);
152
+ }
153
+ /* Create new message and append it to the live region */
154
+ const messageNode = document.createTextNode(messageText);
155
+ ariaLiveContainer === null || ariaLiveContainer === void 0 ? void 0 : ariaLiveContainer.appendChild(messageNode);
156
+ };
65
157
  const notInErrorOrDoneState = () => {
66
158
  return !(state.done || state.error);
67
159
  };
68
160
  const requestIDProcessingStatus = async () => {
69
161
  var _a;
162
+ const signal = abortController.signal;
70
163
  const apiRoute = (_a = document === null || document === void 0 ? void 0 : document.getElementById("spinner-container")) === null || _a === void 0 ? void 0 : _a.dataset.apiRoute;
71
164
  try {
72
- const response = await fetch(apiRoute);
165
+ const response = await fetch(apiRoute, { signal });
73
166
  if (response.status !== 200) {
74
167
  throw new Error(`Status code ${response.status} received`);
75
168
  }
76
169
  const data = await response.json();
170
+ if (data.status === "COMPLETED" ||
171
+ data.status === "INTERVENTION") {
172
+ reflectCompletion();
173
+ }
174
+ else if (data.status === "ERROR") {
175
+ reflectError();
176
+ }
177
+ else if (notInErrorOrDoneState()) {
178
+ setTimeout(async () => {
179
+ if (Date.now() - initTime >= config.msBeforeAbort) {
180
+ return;
181
+ }
182
+ await requestIDProcessingStatus();
183
+ }, config.msBetweenRequests);
184
+ }
77
185
  if (data.status === "Clear to proceed") {
78
186
  reflectCompletion();
79
187
  }
@@ -86,8 +194,36 @@ const WaitInteractions = (() => {
86
194
  catch (e) {
87
195
  console.log(e);
88
196
  reflectError();
197
+ if (e.name !== "AbortError") {
198
+ console.error("Error in requestIdProcessingStatus:", e);
199
+ reflectError();
200
+ }
89
201
  }
90
202
  };
203
+ const initTimer = () => {
204
+ let spinnerInitTime = sessionStorage.getItem("spinnerInitTime");
205
+ if (spinnerInitTime === null) {
206
+ spinnerInitTime = Date.now();
207
+ sessionStorage.setItem("spinnerInitTime", spinnerInitTime.toString());
208
+ }
209
+ else {
210
+ spinnerInitTime = parseInt(spinnerInitTime, 10);
211
+ }
212
+ initTime = spinnerInitTime;
213
+ updateAccordingToTimeElapsed();
214
+ setInterval(() => {
215
+ updateAccordingToTimeElapsed();
216
+ updateDom();
217
+ }, config === null || config === void 0 ? void 0 : config.msBetweenDomUpdate);
218
+ };
219
+ const initialiseContainers = () => {
220
+ const spinnerContainer = document.createElement("div");
221
+ const ariaLiveContainer = document.createElement("div");
222
+ ariaLiveContainer.setAttribute("aria-live", "assertive");
223
+ ariaLiveContainer.classList.add("govuk-visually-hidden");
224
+ ariaLiveContainer.appendChild(document.createTextNode(""));
225
+ container === null || container === void 0 ? void 0 : container.replaceChildren(spinnerContainer, ariaLiveContainer);
226
+ };
91
227
  return {
92
228
  state: state,
93
229
  init: () => {
@@ -99,6 +235,13 @@ const WaitInteractions = (() => {
99
235
  requestIDProcessingStatus().then(() => {
100
236
  updateDom();
101
237
  });
238
+ if (domRequirementsMet) {
239
+ initTimer();
240
+ initialiseContainers();
241
+ initialiseAbortController();
242
+ updateDom();
243
+ requestIDProcessingStatus();
244
+ }
102
245
  },
103
246
  };
104
247
  })();
@@ -1 +1 @@
1
- {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../../frontend-src/typescript/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,EAEN,MAAM,gBAAgB,CAAC;AAExB,eAAO,MAAM,gBAAgB;;;CA2HzB,CAAC"}
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../../frontend-src/typescript/spinner.ts"],"names":[],"mappings":"AAGA,OAAO,EAOL,KAAK,EAEN,MAAM,gBAAgB,CAAC;AAExB,eAAO,MAAM,gBAAgB;;;CA+RzB,CAAC"}
@@ -2,6 +2,7 @@ export interface virtualDom {
2
2
  nodeName?: string;
3
3
  id?: string;
4
4
  classes?: string[];
5
+ text?: string;
5
6
  }
6
7
  export type error = {
7
8
  spinnerState: string;
@@ -10,21 +11,49 @@ export type error = {
10
11
  state: {
11
12
  error: boolean;
12
13
  };
14
+ name: string;
13
15
  };
14
16
  export type apiRoute = RequestInfo | URL;
15
17
  export type content = {
16
- initial: {
18
+ longWait?: {
19
+ spinnerStateText: string;
20
+ };
21
+ initial?: {
17
22
  spinnerState: string | virtualDom;
18
23
  };
19
- complete: {
24
+ complete?: {
20
25
  spinnerState: string;
26
+ ariaButtonEnabledMessage?: string;
27
+ };
28
+ continueButton?: {
29
+ text: string;
30
+ };
31
+ error?: {
32
+ heading?: string;
33
+ messageText?: string;
34
+ whatYouCanDo: {
35
+ heading: string;
36
+ message: {
37
+ text1: string;
38
+ link: {
39
+ href: string;
40
+ text: string;
41
+ };
42
+ text2: string;
43
+ };
44
+ };
21
45
  };
22
46
  };
23
47
  export type timers = {
24
48
  updateDomTimer?: unknown | number;
25
49
  abortUnresponsiveRequest?: unknown | number;
50
+ abort?: unknown | never;
26
51
  };
27
52
  export type state = {
53
+ abortController: null | {
54
+ abort: any;
55
+ };
56
+ abort?: unknown;
28
57
  error?: boolean | error;
29
58
  spinnerState?: string;
30
59
  done?: boolean;
@@ -33,6 +62,10 @@ export type state = {
33
62
  timers: timers;
34
63
  };
35
64
  spinnerStateText?: string;
65
+ buttonDisabled?: boolean;
66
+ heading?: object | string | undefined;
67
+ messageText?: string;
68
+ ariaButtonEnabledMessage?: string;
36
69
  };
37
70
  export type node = {
38
71
  text: object;
@@ -42,10 +75,34 @@ export type node = {
42
75
  nodeName: keyof HTMLElementTagNameMap;
43
76
  textContent: unknown | HTMLElement | string;
44
77
  el: unknown | HTMLElement | string;
78
+ buttonDisabled: boolean | string;
45
79
  };
46
80
  export type initialState = {
47
- nodeName: string;
48
- id: string;
49
- classes: (string | undefined)[];
81
+ nodeName?: string;
82
+ id?: string;
83
+ classes?: (string | undefined)[];
84
+ text?: object | string;
85
+ buttonDisabled?: state;
50
86
  }[];
87
+ export type spinnerInitial = {
88
+ container?: HTMLElement;
89
+ apiUrl?: string;
90
+ msBeforeInformingOfLongWait?: number;
91
+ msBeforeAbort?: number;
92
+ msBetweenRequests?: number;
93
+ msBeforeDomUpdate?: number;
94
+ ariaLiveContainer?: HTMLElement;
95
+ domRequirementsMet?: boolean;
96
+ initTime?: number | undefined;
97
+ updateDomTimer?: number | undefined | any;
98
+ abortController?: any | object;
99
+ config?: {
100
+ msBeforeAbort: number;
101
+ msBeforeInformingOfLongWait: number;
102
+ msBetweenRequests: number;
103
+ ariaButtonEnabledMessage: string;
104
+ msBetweenDomUpdate: number;
105
+ };
106
+ msBetweenDomUpdate?: number;
107
+ };
51
108
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../frontend-src/utils/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,MAAM,KAAK,GAAG;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,KAAK,EAAE,CAAC;IACpB,KAAK,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,GAAG,CAAC;AAEzC,MAAM,MAAM,OAAO,GAAG;IACpB,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,GAAG,UAAU,CAAC;KACnC,CAAC;IACF,QAAQ,EAAE;QACR,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAClC,wBAAwB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAClB,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,WAAW,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,qBAAqB,CAAC;IACtC,WAAW,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;IAC5C,EAAE,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;CACjC,EAAE,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../frontend-src/utils/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@govuk-one-login/frontend-ui",
3
- "version": "1.3.13",
3
+ "version": "1.4.0",
4
4
  "description": "",
5
5
  "main": "build/cjs/backend/index.cjs",
6
6
  "module": "build/esm/backend/index.js",
@@ -56,6 +56,7 @@
56
56
  },
57
57
  "types": "./build/esm/backend/index.d.ts",
58
58
  "optionalDependencies": {
59
- "hmpo-components": "^7.1.0"
59
+ "hmpo-components": "^7.1.0",
60
+ "@govuk-one-login/frontend-analytics": "^4.0.0"
60
61
  }
61
62
  }