Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit 37b7dfe

Browse files
author
Kerry
authored
use ExternalLink components for external links (#10758)
* use ExternalLink components for external links * test * strict
1 parent 42e6c98 commit 37b7dfe

File tree

13 files changed

+281
-47
lines changed

13 files changed

+281
-47
lines changed

src/components/structures/RoomStatusBar.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import AccessibleButton from "../views/elements/AccessibleButton";
3030
import InlineSpinner from "../views/elements/InlineSpinner";
3131
import MatrixClientContext from "../../contexts/MatrixClientContext";
3232
import { RoomStatusBarUnsentMessages } from "./RoomStatusBarUnsentMessages";
33+
import ExternalLink from "../views/elements/ExternalLink";
3334

3435
const STATUS_BAR_HIDDEN = 0;
3536
const STATUS_BAR_EXPANDED = 1;
@@ -213,9 +214,9 @@ export default class RoomStatusBar extends React.PureComponent<IProps, IState> {
213214
{},
214215
{
215216
consentLink: (sub) => (
216-
<a href={consentError!.data?.consent_uri} target="_blank" rel="noreferrer noopener">
217+
<ExternalLink href={consentError!.data?.consent_uri} target="_blank" rel="noreferrer noopener">
217218
{sub}
218-
</a>
219+
</ExternalLink>
219220
),
220221
},
221222
);

src/components/structures/SpaceRoomView.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ import MainSplit from "./MainSplit";
7777
import RightPanel from "./RightPanel";
7878
import SpaceHierarchy, { showRoom } from "./SpaceHierarchy";
7979
import { RoomPermalinkCreator } from "../../utils/permalinks/Permalinks";
80+
import ExternalLink from "../views/elements/ExternalLink";
8081

8182
interface IProps {
8283
space: Room;
@@ -593,9 +594,9 @@ const SpaceSetupPrivateInvite: React.FC<{
593594
{
594595
b: (sub) => <b>{sub}</b>,
595596
link: () => (
596-
<a href="https://app.element.io/" rel="noreferrer noopener" target="_blank">
597+
<ExternalLink href="https://app.element.io/" rel="noreferrer noopener" target="_blank">
597598
app.element.io
598-
</a>
599+
</ExternalLink>
599600
),
600601
},
601602
)}

src/components/views/dialogs/AnalyticsLearnMoreDialog.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import DialogButtons from "../elements/DialogButtons";
2222
import Modal, { ComponentProps } from "../../../Modal";
2323
import SdkConfig from "../../../SdkConfig";
2424
import { getPolicyUrl } from "../../../toasts/AnalyticsToast";
25+
import ExternalLink from "../elements/ExternalLink";
2526

2627
export enum ButtonClicked {
2728
Primary,
@@ -55,10 +56,10 @@ export const AnalyticsLearnMoreDialog: React.FC<IProps> = ({
5556
{
5657
PrivacyPolicyUrl: (sub) => {
5758
return (
58-
<a href={privacyPolicyUrl} rel="norefferer noopener" target="_blank">
59+
<ExternalLink href={privacyPolicyUrl} rel="norefferer noopener" target="_blank">
5960
{sub}
6061
<span className="mx_AnalyticsPolicyLink" />
61-
</a>
62+
</ExternalLink>
6263
);
6364
},
6465
},

src/components/views/dialogs/FeedbackDialog.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import InfoDialog from "./InfoDialog";
2727
import { submitFeedback } from "../../../rageshake/submit-rageshake";
2828
import { useStateToggle } from "../../../hooks/useStateToggle";
2929
import StyledCheckbox from "../elements/StyledCheckbox";
30+
import ExternalLink from "../elements/ExternalLink";
3031

3132
interface IProps {
3233
feature?: string;
@@ -130,16 +131,20 @@ const FeedbackDialog: React.FC<IProps> = (props: IProps) => {
130131
{
131132
existingIssuesLink: (sub) => {
132133
return (
133-
<a target="_blank" rel="noreferrer noopener" href={existingIssuesUrl}>
134+
<ExternalLink
135+
target="_blank"
136+
rel="noreferrer noopener"
137+
href={existingIssuesUrl}
138+
>
134139
{sub}
135-
</a>
140+
</ExternalLink>
136141
);
137142
},
138143
newIssueLink: (sub) => {
139144
return (
140-
<a target="_blank" rel="noreferrer noopener" href={newIssueUrl}>
145+
<ExternalLink target="_blank" rel="noreferrer noopener" href={newIssueUrl}>
141146
{sub}
142-
</a>
147+
</ExternalLink>
143148
);
144149
},
145150
},

src/components/views/dialogs/ServerPickerDialog.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import StyledRadioButton from "../elements/StyledRadioButton";
2828
import TextWithTooltip from "../elements/TextWithTooltip";
2929
import withValidation, { IFieldState, IValidationResult } from "../elements/Validation";
3030
import { ValidatedServerConfig } from "../../../utils/ValidatedServerConfig";
31+
import ExternalLink from "../elements/ExternalLink";
3132

3233
interface IProps {
3334
title?: string;
@@ -236,9 +237,13 @@ export default class ServerPickerDialog extends React.PureComponent<IProps, ISta
236237
</AccessibleButton>
237238

238239
<h2>{_t("Learn more")}</h2>
239-
<a href="https://matrix.org/faq/#what-is-a-homeserver%3F" target="_blank" rel="noreferrer noopener">
240+
<ExternalLink
241+
href="https://matrix.org/faq/#what-is-a-homeserver%3F"
242+
target="_blank"
243+
rel="noreferrer noopener"
244+
>
240245
{_t("About homeservers")}
241-
</a>
246+
</ExternalLink>
242247
</form>
243248
</BaseDialog>
244249
);

src/components/views/dialogs/TermsDialog.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { _t, pickBestLanguage } from "../../../languageHandler";
2222
import DialogButtons from "../elements/DialogButtons";
2323
import BaseDialog from "./BaseDialog";
2424
import { ServicePolicyPair } from "../../../Terms";
25+
import ExternalLink from "../elements/ExternalLink";
2526

2627
interface ITermsCheckboxProps {
2728
onChange: (url: string, checked: boolean) => void;
@@ -148,9 +149,9 @@ export default class TermsDialog extends React.PureComponent<ITermsDialogProps,
148149
<td className="mx_TermsDialog_summary">{summary}</td>
149150
<td>
150151
{termDoc[termsLang].name}
151-
<a rel="noreferrer noopener" target="_blank" href={termDoc[termsLang].url}>
152+
<ExternalLink rel="noreferrer noopener" target="_blank" href={termDoc[termsLang].url}>
152153
<span className="mx_TermsDialog_link" />
153-
</a>
154+
</ExternalLink>
154155
</td>
155156
<td>
156157
<TermsCheckbox

src/components/views/settings/EventIndexPanel.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import EventIndexPeg from "../../../indexing/EventIndexPeg";
2626
import { SettingLevel } from "../../../settings/SettingLevel";
2727
import SeshatResetDialog from "../dialogs/SeshatResetDialog";
2828
import InlineSpinner from "../elements/InlineSpinner";
29+
import ExternalLink from "../elements/ExternalLink";
2930

3031
interface IState {
3132
enabling: boolean;
@@ -197,9 +198,9 @@ export default class EventIndexPanel extends React.Component<{}, IState> {
197198
},
198199
{
199200
nativeLink: (sub) => (
200-
<a href={nativeLink} target="_blank" rel="noreferrer noopener">
201+
<ExternalLink href={nativeLink} target="_blank" rel="noreferrer noopener">
201202
{sub}
202-
</a>
203+
</ExternalLink>
203204
),
204205
},
205206
)}
@@ -217,9 +218,13 @@ export default class EventIndexPanel extends React.Component<{}, IState> {
217218
},
218219
{
219220
desktopLink: (sub) => (
220-
<a href="https://element.io/get-started" target="_blank" rel="noreferrer noopener">
221+
<ExternalLink
222+
href="https://element.io/get-started"
223+
target="_blank"
224+
rel="noreferrer noopener"
225+
>
221226
{sub}
222-
</a>
227+
</ExternalLink>
223228
),
224229
},
225230
)}

src/components/views/settings/tabs/user/HelpUserSettingsTab.tsx

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import { Action } from "../../../../../dispatcher/actions";
3131
import { UserTab } from "../../../dialogs/UserTab";
3232
import dis from "../../../../../dispatcher/dispatcher";
3333
import CopyableText from "../../../elements/CopyableText";
34+
import ExternalLink from "../../../elements/ExternalLink";
3435

3536
interface IProps {
3637
closeSettingsFn: () => void;
@@ -114,9 +115,9 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState>
114115
for (const tocEntry of tocLinks) {
115116
legalLinks.push(
116117
<div key={tocEntry.url}>
117-
<a href={tocEntry.url} rel="noreferrer noopener" target="_blank">
118+
<ExternalLink href={tocEntry.url} rel="noreferrer noopener" target="_blank">
118119
{tocEntry.text}
119-
</a>
120+
</ExternalLink>
120121
</div>,
121122
);
122123
}
@@ -143,27 +144,31 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState>
143144
{},
144145
{
145146
photo: (sub) => (
146-
<a
147+
<ExternalLink
147148
href="themes/element/img/backgrounds/lake.jpg"
148149
rel="noreferrer noopener"
149150
target="_blank"
150151
>
151152
{sub}
152-
</a>
153+
</ExternalLink>
153154
),
154155
author: (sub) => (
155-
<a href="https://www.flickr.com/golan" rel="noreferrer noopener" target="_blank">
156+
<ExternalLink
157+
href="https://www.flickr.com/golan"
158+
rel="noreferrer noopener"
159+
target="_blank"
160+
>
156161
{sub}
157-
</a>
162+
</ExternalLink>
158163
),
159164
terms: (sub) => (
160-
<a
165+
<ExternalLink
161166
href="https://creativecommons.org/licenses/by-sa/4.0/"
162167
rel="noreferrer noopener"
163168
target="_blank"
164169
>
165170
{sub}
166-
</a>
171+
</ExternalLink>
167172
),
168173
},
169174
)}
@@ -175,27 +180,27 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState>
175180
{},
176181
{
177182
colr: (sub) => (
178-
<a
183+
<ExternalLink
179184
href="https://github.com/matrix-org/twemoji-colr"
180185
rel="noreferrer noopener"
181186
target="_blank"
182187
>
183188
{sub}
184-
</a>
189+
</ExternalLink>
185190
),
186191
author: (sub) => (
187-
<a href="https://mozilla.org" rel="noreferrer noopener" target="_blank">
192+
<ExternalLink href="https://mozilla.org" rel="noreferrer noopener" target="_blank">
188193
{sub}
189-
</a>
194+
</ExternalLink>
190195
),
191196
terms: (sub) => (
192-
<a
197+
<ExternalLink
193198
href="https://www.apache.org/licenses/LICENSE-2.0"
194199
rel="noreferrer noopener"
195200
target="_blank"
196201
>
197202
{sub}
198-
</a>
203+
</ExternalLink>
199204
),
200205
},
201206
)}
@@ -208,23 +213,31 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState>
208213
{},
209214
{
210215
twemoji: (sub) => (
211-
<a href="https://twemoji.twitter.com/" rel="noreferrer noopener" target="_blank">
216+
<ExternalLink
217+
href="https://twemoji.twitter.com/"
218+
rel="noreferrer noopener"
219+
target="_blank"
220+
>
212221
{sub}
213-
</a>
222+
</ExternalLink>
214223
),
215224
author: (sub) => (
216-
<a href="https://twemoji.twitter.com/" rel="noreferrer noopener" target="_blank">
225+
<ExternalLink
226+
href="https://twemoji.twitter.com/"
227+
rel="noreferrer noopener"
228+
target="_blank"
229+
>
217230
{sub}
218-
</a>
231+
</ExternalLink>
219232
),
220233
terms: (sub) => (
221-
<a
234+
<ExternalLink
222235
href="https://creativecommons.org/licenses/by/4.0/"
223236
rel="noreferrer noopener"
224237
target="_blank"
225238
>
226239
{sub}
227-
</a>
240+
</ExternalLink>
228241
),
229242
},
230243
)}
@@ -256,9 +269,9 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState>
256269
},
257270
{
258271
a: (sub) => (
259-
<a href="https://element.io/help" rel="noreferrer noopener" target="_blank">
272+
<ExternalLink href="https://element.io/help" rel="noreferrer noopener" target="_blank">
260273
{sub}
261-
</a>
274+
</ExternalLink>
262275
),
263276
},
264277
);
@@ -273,9 +286,9 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState>
273286
},
274287
{
275288
a: (sub) => (
276-
<a href="https://element.io/help" rel="noreferrer noopener" target="_blank">
289+
<ExternalLink href="https://element.io/help" rel="noreferrer noopener" target="_blank">
277290
{sub}
278-
</a>
291+
</ExternalLink>
279292
),
280293
},
281294
)}
@@ -321,13 +334,13 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState>
321334
{},
322335
{
323336
a: (sub) => (
324-
<a
337+
<ExternalLink
325338
href="https://matrix.org/security-disclosure-policy/"
326339
rel="noreferrer noopener"
327340
target="_blank"
328341
>
329342
{sub}
330-
</a>
343+
</ExternalLink>
331344
),
332345
},
333346
)}

src/utils/ErrorUtils.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { MatrixError, ConnectionError } from "matrix-js-sdk/src/http-api";
2020
import { _t, _td, Tags, TranslatedString } from "../languageHandler";
2121
import SdkConfig from "../SdkConfig";
2222
import { ValidatedServerConfig } from "./ValidatedServerConfig";
23+
import ExternalLink from "../components/views/elements/ExternalLink";
2324

2425
export const resourceLimitStrings = {
2526
"monthly_active_user": _td("This homeserver has hit its Monthly Active User limit."),
@@ -183,9 +184,9 @@ export function messageForConnectionError(
183184
{},
184185
{
185186
a: (sub) => (
186-
<a target="_blank" rel="noreferrer noopener" href={serverConfig.hsUrl}>
187+
<ExternalLink target="_blank" rel="noreferrer noopener" href={serverConfig.hsUrl}>
187188
{sub}
188-
</a>
189+
</ExternalLink>
189190
),
190191
},
191192
)}

0 commit comments

Comments
 (0)