Skip to content

Commit 437124a

Browse files
authored
Show support links on loading and error screens. (#2702)
* Show support links on loading and error screens. * Update css * Update comment * Update label to include verb
1 parent ad5aebf commit 437124a

File tree

4 files changed

+65
-14
lines changed

4 files changed

+65
-14
lines changed

src/frontend/src/components/displayError.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { ERROR_SUPPORT_URL } from "$src/config";
12
import { TemplateElement } from "$src/utils/lit-html";
23
import { nonNullish } from "@dfinity/utils";
34
import { html, render } from "lit-html";
@@ -40,6 +41,13 @@ ${options.detail}</pre
4041
>
4142
${options.primaryButton}
4243
</button>
44+
<a
45+
href="${ERROR_SUPPORT_URL}"
46+
target="_blank"
47+
class="c-button c-button--secondary"
48+
>
49+
Go to support
50+
</a>
4351
</div>`,
4452
});
4553

src/frontend/src/components/loader.ts

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,40 @@
1+
import { ERROR_SUPPORT_URL } from "$src/config";
12
import { html, render } from "lit-html";
23
import loaderUrl from "./loader.svg";
34

4-
const loader = () => html` <div id="loader" class="c-loader">
5-
<img class="c-loader__image" src=${loaderUrl} alt="loading" />
6-
</div>`;
5+
// Duration in milliseconds a user considers as taking forever
6+
const TAKING_FOREVER = 10000;
7+
8+
const loader = (takingForever = false) =>
9+
html` <div id="loader" class="c-loader">
10+
<img class="c-loader__image" src=${loaderUrl} alt="loading" />
11+
${takingForever &&
12+
html`<a
13+
href="${ERROR_SUPPORT_URL}"
14+
target="_blank"
15+
rel="noopener noreferrer"
16+
class="c-loader__link"
17+
>Check ongoing issues</a
18+
>`}
19+
</div>`;
720

821
const startLoader = () => {
922
const container = document.getElementById("loaderContainer") as HTMLElement;
1023
render(loader(), container);
11-
};
1224

13-
const endLoader = () => {
14-
const container = document.getElementById("loaderContainer") as HTMLElement;
15-
render(html``, container);
25+
const takingForeverTimeout = setTimeout(
26+
() => render(loader(true), container),
27+
TAKING_FOREVER
28+
);
29+
30+
return () => {
31+
clearTimeout(takingForeverTimeout);
32+
render(html``, container);
33+
};
1634
};
1735

1836
export const withLoader = async <A>(action: () => Promise<A>): Promise<A> => {
19-
startLoader();
37+
const endLoader = startLoader();
2038
try {
2139
return await action();
2240
} finally {

src/frontend/src/config.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,7 @@ export const OFFICIAL_II_URL = "https://" + OFFICIAL_II_URL_NO_PROTOCOL;
1010
export const LEGACY_II_URL = "https://identity.ic0.app";
1111

1212
export const PORTAL_II_URL = "https://internetcomputer.org/internet-identity";
13+
14+
// Default support page URL for when error is shown to user
15+
export const ERROR_SUPPORT_URL =
16+
"https://identitysupport.dfinity.org/hc/en-us/articles/32301362727188";

src/frontend/src/styles/main.css

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1718,12 +1718,6 @@ by all browsers (FF is missing) */
17181718
fill: currentColor;
17191719
}
17201720

1721-
.c-button--secondary {
1722-
background: var(--rc-button-secondary);
1723-
color: var(--rc-onButton-secondary);
1724-
border: var(--rs-line) solid var(--rc-line-interaction);
1725-
}
1726-
17271721
.c-button--textOnly {
17281722
background: transparent;
17291723
color: var(--rc-interaction-text);
@@ -1737,10 +1731,23 @@ by all browsers (FF is missing) */
17371731

17381732
.c-button:not([disabled]):focus,
17391733
.c-button:not([disabled]):hover {
1734+
color: var(--rc-onButton);
17401735
opacity: 0.9;
17411736
box-shadow: 0 0 0 2px #ffffff, 0 0 3px 5px var(--rc-interaction);
17421737
outline: 2px dotted transparent;
17431738
outline-offset: 2px;
1739+
text-decoration: none;
1740+
}
1741+
1742+
.c-button--secondary {
1743+
background: var(--rc-button-secondary);
1744+
color: var(--rc-onButton-secondary);
1745+
border: var(--rs-line) solid var(--rc-line-interaction);
1746+
}
1747+
1748+
.c-button--secondary:not([disabled]):hover,
1749+
.c-button--secondary:not([disabled]):focus {
1750+
color: var(--rc-onButton-secondary);
17441751
}
17451752

17461753
/* Copy pasted from the focus and hover, but with different opacity to show action */
@@ -3144,6 +3151,20 @@ input[type="checkbox"] {
31443151
animation-timing-function: ease-in-out;
31453152
}
31463153

3154+
.c-loader__link {
3155+
color: var(--rc-surface);
3156+
display: block;
3157+
position: absolute;
3158+
top: 50%;
3159+
left: 50%;
3160+
transform: translate(-50%, 72px);
3161+
}
3162+
3163+
.c-loader__link:hover,
3164+
.c-loader__link:focus {
3165+
color: var(--rc-surface);
3166+
}
3167+
31473168
/* Wrap QR codes in a white square (for legibility) and prettify a bit */
31483169
.c-qrcode canvas {
31493170
display: block;

0 commit comments

Comments
 (0)