Skip to content

Commit 941da82

Browse files
authored
Merge pull request pterodactyl#2205 from Sir3lit/pagetitles2
Page Titles v2 - Using React Helmet
2 parents 9387be3 + 658c2b1 commit 941da82

File tree

13 files changed

+98
-12
lines changed

13 files changed

+98
-12
lines changed

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
"react": "^16.13.1",
2525
"react-dom": "npm:@hot-loader/react-dom",
2626
"react-fast-compare": "^3.2.0",
27+
"react-google-recaptcha": "^2.0.1",
28+
"react-helmet": "^6.1.0",
2729
"react-ga": "^3.1.2",
2830
"react-hot-loader": "^4.12.21",
2931
"react-i18next": "^11.2.1",
@@ -61,6 +63,7 @@
6163
"@types/query-string": "^6.3.0",
6264
"@types/react": "^16.9.41",
6365
"@types/react-dom": "^16.9.8",
66+
"@types/react-helmet": "^6.0.0",
6467
"@types/react-redux": "^7.1.1",
6568
"@types/react-router": "^5.1.3",
6669
"@types/react-router-dom": "^5.1.3",

resources/scripts/components/dashboard/AccountApiContainer.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React, { useEffect, useState } from 'react';
2+
import { Helmet } from 'react-helmet';
23
import ContentBox from '@/components/elements/ContentBox';
34
import CreateApiKeyForm from '@/components/dashboard/forms/CreateApiKeyForm';
45
import getApiKeys, { ApiKey } from '@/api/account/getApiKeys';
@@ -7,7 +8,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
78
import { faKey, faTrashAlt } from '@fortawesome/free-solid-svg-icons';
89
import ConfirmationModal from '@/components/elements/ConfirmationModal';
910
import deleteApiKey from '@/api/account/deleteApiKey';
10-
import { Actions, useStoreActions } from 'easy-peasy';
11+
import { Actions, useStoreActions, useStoreState } from 'easy-peasy';
1112
import { ApplicationStore } from '@/state';
1213
import FlashMessageRender from '@/components/FlashMessageRender';
1314
import { httpErrorToHuman } from '@/api/http';
@@ -21,6 +22,7 @@ export default () => {
2122
const [ keys, setKeys ] = useState<ApiKey[]>([]);
2223
const [ loading, setLoading ] = useState(true);
2324
const { addError, clearFlashes } = useStoreActions((actions: Actions<ApplicationStore>) => actions.flashes);
25+
const name = useStoreState((state: ApplicationStore) => state.settings.data!.name);
2426

2527
useEffect(() => {
2628
clearFlashes('account');
@@ -49,6 +51,9 @@ export default () => {
4951

5052
return (
5153
<PageContentBlock>
54+
<Helmet>
55+
<title> {name} | API</title>
56+
</Helmet>
5257
<FlashMessageRender byKey={'account'} css={tw`mb-4`}/>
5358
<div css={tw`flex`}>
5459
<ContentBox title={'Create API Key'} css={tw`flex-1`}>

resources/scripts/components/dashboard/AccountOverviewContainer.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import * as React from 'react';
2+
import { Helmet } from 'react-helmet';
3+
import { ApplicationStore } from '@/state';
24
import ContentBox from '@/components/elements/ContentBox';
35
import UpdatePasswordForm from '@/components/dashboard/forms/UpdatePasswordForm';
46
import UpdateEmailAddressForm from '@/components/dashboard/forms/UpdateEmailAddressForm';
@@ -7,6 +9,7 @@ import PageContentBlock from '@/components/elements/PageContentBlock';
79
import tw from 'twin.macro';
810
import { breakpoint } from '@/theme';
911
import styled from 'styled-components/macro';
12+
import { useStoreState } from 'easy-peasy';
1013

1114
const Container = styled.div`
1215
${tw`flex flex-wrap my-10`};
@@ -25,8 +28,12 @@ const Container = styled.div`
2528
`;
2629

2730
export default () => {
31+
const name = useStoreState((state: ApplicationStore) => state.settings.data!.name);
2832
return (
2933
<PageContentBlock>
34+
<Helmet>
35+
<title> {name} | Account Overview</title>
36+
</Helmet>
3037
<Container>
3138
<ContentBox title={'Update Password'} showFlashes={'account:password'}>
3239
<UpdatePasswordForm/>

resources/scripts/components/dashboard/DashboardContainer.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import React, { useEffect, useState } from 'react';
2+
import { Helmet } from 'react-helmet';
23
import { Server } from '@/api/server/getServer';
4+
import { ApplicationStore } from '@/state';
35
import getServers from '@/api/getServers';
46
import ServerRow from '@/components/dashboard/ServerRow';
57
import Spinner from '@/components/elements/Spinner';
@@ -18,6 +20,7 @@ export default () => {
1820
const [ page, setPage ] = useState(1);
1921
const { rootAdmin } = useStoreState(state => state.user.data!);
2022
const [ showOnlyAdmin, setShowOnlyAdmin ] = usePersistedState('show_all_servers', false);
23+
const name = useStoreState((state: ApplicationStore) => state.settings.data!.name);
2124

2225
const { data: servers, error } = useSWR<PaginatedResult<Server>>(
2326
[ '/api/client/servers', showOnlyAdmin, page ],
@@ -31,6 +34,9 @@ export default () => {
3134

3235
return (
3336
<PageContentBlock showFlashKey={'dashboard'}>
37+
<Helmet>
38+
<title> {name} | Dashboard</title>
39+
</Helmet>
3440
{rootAdmin &&
3541
<div css={tw`mb-2 flex justify-end items-center`}>
3642
<p css={tw`uppercase text-xs text-neutral-400 mr-2`}>

resources/scripts/components/server/ServerConsole.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React, { lazy, useEffect, useState } from 'react';
2+
import { Helmet } from 'react-helmet';
23
import { ServerContext } from '@/state/server';
34
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
45
import { faCircle, faHdd, faMemory, faMicrochip, faServer } from '@fortawesome/free-solid-svg-icons';
@@ -61,6 +62,9 @@ export default () => {
6162

6263
return (
6364
<PageContentBlock css={tw`flex`}>
65+
<Helmet>
66+
<title> {server.name} | Console </title>
67+
</Helmet>
6468
<div css={tw`w-1/4`}>
6569
<TitledGreyBox title={server.name} icon={faServer}>
6670
<p css={tw`text-xs uppercase`}>

resources/scripts/components/server/backups/BackupContainer.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React, { useEffect, useState } from 'react';
2+
import { Helmet } from 'react-helmet';
23
import Spinner from '@/components/elements/Spinner';
34
import getServerBackups from '@/api/server/backups/getServerBackups';
45
import useServer from '@/plugins/useServer';
@@ -13,7 +14,7 @@ import PageContentBlock from '@/components/elements/PageContentBlock';
1314
import tw from 'twin.macro';
1415

1516
export default () => {
16-
const { uuid, featureLimits } = useServer();
17+
const { uuid, featureLimits, name: serverName } = useServer();
1718
const { addError, clearFlashes } = useFlash();
1819
const [ loading, setLoading ] = useState(true);
1920

@@ -37,6 +38,9 @@ export default () => {
3738

3839
return (
3940
<PageContentBlock>
41+
<Helmet>
42+
<title> {serverName} | Backups</title>
43+
</Helmet>
4044
<FlashMessageRender byKey={'backups'} css={tw`mb-4`}/>
4145
{!backups.length ?
4246
<p css={tw`text-center text-sm text-neutral-400`}>

resources/scripts/components/server/databases/DatabasesContainer.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React, { useEffect, useState } from 'react';
2+
import { Helmet } from 'react-helmet';
23
import getServerDatabases from '@/api/server/getServerDatabases';
34
import { ServerContext } from '@/state/server';
45
import { httpErrorToHuman } from '@/api/http';
@@ -14,7 +15,7 @@ import tw from 'twin.macro';
1415
import Fade from '@/components/elements/Fade';
1516

1617
export default () => {
17-
const { uuid, featureLimits } = useServer();
18+
const { uuid, featureLimits, name: serverName } = useServer();
1819
const { addError, clearFlashes } = useFlash();
1920
const [ loading, setLoading ] = useState(true);
2021

@@ -36,6 +37,9 @@ export default () => {
3637

3738
return (
3839
<PageContentBlock>
40+
<Helmet>
41+
<title> {serverName} | Databases </title>
42+
</Helmet>
3943
<FlashMessageRender byKey={'databases'} css={tw`mb-4`}/>
4044
{(!databases.length && loading) ?
4145
<Spinner size={'large'} centered/>

resources/scripts/components/server/files/FileManagerContainer.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React, { useEffect } from 'react';
2+
import { Helmet } from 'react-helmet';
23
import { httpErrorToHuman } from '@/api/http';
34
import { CSSTransition } from 'react-transition-group';
45
import Spinner from '@/components/elements/Spinner';
@@ -23,9 +24,10 @@ const sortFiles = (files: FileObject[]): FileObject[] => {
2324
};
2425

2526
export default () => {
26-
const { id } = useServer();
27+
const { id, name: serverName } = useServer();
2728
const { hash } = useLocation();
2829
const { data: files, error, mutate } = useFileManagerSwr();
30+
2931
const setDirectory = ServerContext.useStoreActions(actions => actions.files.setDirectory);
3032
const setSelectedFiles = ServerContext.useStoreActions(actions => actions.files.setSelectedFiles);
3133

@@ -42,6 +44,9 @@ export default () => {
4244

4345
return (
4446
<PageContentBlock showFlashKey={'files'}>
47+
<Helmet>
48+
<title> {serverName} | File Manager </title>
49+
</Helmet>
4550
<FileManagerBreadcrumbs/>
4651
{
4752
!files ?

resources/scripts/components/server/network/NetworkContainer.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React, { useEffect, useState } from 'react';
2+
import { Helmet } from 'react-helmet';
23
import tw from 'twin.macro';
34
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
45
import { faNetworkWired } from '@fortawesome/free-solid-svg-icons';
@@ -23,7 +24,7 @@ const Code = styled.code`${tw`font-mono py-1 px-2 bg-neutral-900 rounded text-sm
2324
const Label = styled.label`${tw`uppercase text-xs mt-1 text-neutral-400 block px-1 select-none transition-colors duration-150`}`;
2425

2526
const NetworkContainer = () => {
26-
const { uuid, allocations } = useServer();
27+
const { uuid, allocations, name: serverName } = useServer();
2728
const { clearFlashes, clearAndAddHttpError } = useFlash();
2829
const [ loading, setLoading ] = useState<false | number>(false);
2930
const { data, error, mutate } = useSWR<Allocation[]>(uuid, key => getServerAllocations(key), { initialData: allocations });
@@ -61,6 +62,9 @@ const NetworkContainer = () => {
6162

6263
return (
6364
<PageContentBlock showFlashKey={'server:network'}>
65+
<Helmet>
66+
<title> {serverName} | Network </title>
67+
</Helmet>
6468
{!data ?
6569
<Spinner size={'large'} centered/>
6670
:

resources/scripts/components/server/schedules/ScheduleContainer.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React, { useEffect, useState } from 'react';
2+
import { Helmet } from 'react-helmet';
23
import getServerSchedules from '@/api/server/schedules/getServerSchedules';
34
import { ServerContext } from '@/state/server';
45
import Spinner from '@/components/elements/Spinner';
@@ -16,7 +17,7 @@ import GreyRowBox from '@/components/elements/GreyRowBox';
1617
import Button from '@/components/elements/Button';
1718

1819
export default ({ match, history }: RouteComponentProps) => {
19-
const { uuid } = useServer();
20+
const { uuid, name: serverName } = useServer();
2021
const { clearFlashes, addError } = useFlash();
2122
const [ loading, setLoading ] = useState(true);
2223
const [ visible, setVisible ] = useState(false);
@@ -37,6 +38,9 @@ export default ({ match, history }: RouteComponentProps) => {
3738

3839
return (
3940
<PageContentBlock>
41+
<Helmet>
42+
<title> {serverName} | Schedules </title>
43+
</Helmet>
4044
<FlashMessageRender byKey={'schedules'} css={tw`mb-4`}/>
4145
{(!schedules.length && loading) ?
4246
<Spinner size={'large'} centered/>

0 commit comments

Comments
 (0)