Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Setup network specific handling and use preloaded queries #347

Merged
merged 27 commits into from
Oct 21, 2024
Merged
Show file tree
Hide file tree
Changes from 25 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
fb31039
Bump html-webpack-plugin from 5.6.0 to 5.6.2
dependabot[bot] Oct 18, 2024
de92479
Bump @typescript-eslint/eslint-plugin from 8.9.0 to 8.10.0
dependabot[bot] Oct 18, 2024
a8a9b65
Bump sass from 1.80.1 to 1.80.2
dependabot[bot] Oct 18, 2024
88e1fb5
Merge pull request #326 from tgstation/dependabot/npm_and_yarn/html-w…
tgstation-server-ci[bot] Oct 18, 2024
3c610e3
Merge pull request #327 from tgstation/dependabot/npm_and_yarn/typesc…
tgstation-server-ci[bot] Oct 18, 2024
4e8eac8
Merge pull request #329 from tgstation/dependabot/npm_and_yarn/sass-1…
tgstation-server-ci[bot] Oct 18, 2024
6f068eb
Bump @typescript-eslint/parser from 8.9.0 to 8.10.0
dependabot[bot] Oct 18, 2024
7849e31
Merge pull request #328 from tgstation/dependabot/npm_and_yarn/typesc…
tgstation-server-ci[bot] Oct 18, 2024
1bb5855
Setup network specific error handling
Cyberboss Oct 20, 2024
f0fa755
Fix date diffing for uptime monitoring
Cyberboss Oct 20, 2024
b9302bd
6.4.3
Cyberboss Oct 20, 2024
01d59db
Bump @types/node from 22.7.6 to 22.7.7
dependabot[bot] Oct 21, 2024
11f249d
Bump sass from 1.80.2 to 1.80.3
dependabot[bot] Oct 21, 2024
ae4581b
Merge pull request #336 from tgstation/dependabot/npm_and_yarn/types/…
tgstation-server-ci[bot] Oct 21, 2024
2932b5f
Merge pull request #337 from tgstation/dependabot/npm_and_yarn/sass-1…
tgstation-server-ci[bot] Oct 21, 2024
92b327d
Bump eslint and @types/eslint
dependabot[bot] Oct 21, 2024
c6bb28f
Migrate away from eslintrc
Cyberboss Oct 21, 2024
96e1af7
Merge pull request #338 from tgstation/dependabot/npm_and_yarn/multi-…
tgstation-server-ci[bot] Oct 21, 2024
875d02b
Setup query preloading
Cyberboss Oct 21, 2024
eab2268
Merge branch 'graphql' of https://github.com/tgstation/tgstation-serv…
Cyberboss Oct 21, 2024
82ca85f
Remove debug code
Cyberboss Oct 21, 2024
211299e
Merge branch 'next' of https://github.com/tgstation/tgstation-server-…
Cyberboss Oct 21, 2024
7edecb2
Fix build
Cyberboss Oct 21, 2024
97284db
Update API version
Cyberboss Oct 21, 2024
781ccca
Fix home stories
Cyberboss Oct 21, 2024
4176674
Trim down this path
Cyberboss Oct 21, 2024
991e9e4
Make the server info page
Cyberboss Oct 21, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .storybook/MockRelayEnvironment.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import { makeDecorator } from "@storybook/preview-api";
import { RelayEnvironmentProvider } from "react-relay";
import { GraphQLTaggedNode, OperationType } from "relay-runtime";
import { GraphQLTaggedNode, OperationType, VariablesOf } from "relay-runtime";
import { createMockEnvironment, MockPayloadGenerator } from "relay-test-utils";
import { OperationMockResolver } from "relay-test-utils/lib/RelayModernMockEnvironment";
import { PartialDeep } from "type-fest";
Expand Down Expand Up @@ -45,7 +45,7 @@ export type WithRelayParameters<TQuery extends OperationType, TResolvers = objec
/**
* Optional. Variables to pass to the query.
*/
variables?: TQuery["variables"];
variables?: VariablesOf<TQuery>;

/**
* Optional. Mock resolver object pass to the relay-test-utils MockPayloadGenerator.generate function.
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "tgstation-server-webpanel",
"private": true,
"version": "7.0.0",
"tgs_graphql_api_version": "0.2.0",
"tgs_graphql_api_version": "0.3.0",
"tgs_rest_api_version": "10.10.0",
"homepage": "https://tgstation.github.io/tgstation-server-webpanel",
"repository": {
Expand Down
44 changes: 21 additions & 23 deletions src/components/App.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { lazy, StrictMode, Suspense, useEffect, useState } from "react";
import { lazy, Suspense, useEffect, useState } from "react";
import { IntlProvider } from "react-intl";

import ConfigProvider from "../context/config/ConfigProvider";
Expand Down Expand Up @@ -71,29 +71,27 @@ const App = (props: IProps) => {
});

return (
<StrictMode>
<ConfigProvider>
{translations ? (
<IntlProvider
locale={translations.locale}
messages={translations.messages}
defaultLocale="en">
<Suspense
fallback={
<div className="grid lg:grid-cols-11 md:grid-cols-8">
<div className="lg:col-start-3 lg:col-end-9 md:col-start-2 md:col-end-8">
<Loading message="loading.loading" />
</div>
<ConfigProvider>
{translations ? (
<IntlProvider
locale={translations.locale}
messages={translations.messages}
defaultLocale="en">
<Suspense
fallback={
<div className="grid lg:grid-cols-11 md:grid-cols-8">
<div className="lg:col-start-3 lg:col-end-9 md:col-start-2 md:col-end-8">
<Loading message="loading.loading" />
</div>
}>
<Environment />
</Suspense>
</IntlProvider>
) : (
<Loading />
)}
</ConfigProvider>
</StrictMode>
</div>
}>
<Environment />
</Suspense>
</IntlProvider>
) : (
<Loading />
)}
</ConfigProvider>
);
};

Expand Down
19 changes: 10 additions & 9 deletions src/components/core/Environment/Environment.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ import Router from "../Router/Router";

import Pkg from "@/../package.json";
import useConfig from "@/context/config/useConfig";
import SetCredentialsContext from "@/context/credentials/SetCredentialsContext";
import ErrorsProvider from "@/context/errors/ErrorsProvider";
import SessionProvider from "@/context/session/SessionProvider";
import CreateRelayEnvironment from "@/lib/CreateRelayEnvironment";
import CreateTgsRelayEnvironment from "@/lib/CreateTgsRelayEnvironment";

const Environment = () => {
const version = Pkg.version;
Expand All @@ -22,19 +23,19 @@ const Environment = () => {
const config = useConfig();

const { relayEnviroment, setCredentials } = useMemo(
() => CreateRelayEnvironment(config.ApiPath.value),
() => CreateTgsRelayEnvironment(config.ApiPath.value),
[config.ApiPath.value]
);

return (
<RelayEnvironmentProvider environment={relayEnviroment}>
<SessionProvider setCredentials={credentials => setCredentials(credentials, false)}>
<ErrorsProvider>
<Router
setTemporaryCredentials={credentials => setCredentials(credentials, true)}
/>
</ErrorsProvider>
</SessionProvider>
<SetCredentialsContext.Provider value={{ setCredentials }}>
<SessionProvider>
<ErrorsProvider>
<Router />
</ErrorsProvider>
</SessionProvider>
</SetCredentialsContext.Provider>
</RelayEnvironmentProvider>
);
};
Expand Down
24 changes: 8 additions & 16 deletions src/components/core/Router/Router.tsx
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
import { lazy, Suspense } from "react";
import { useRelayEnvironment } from "react-relay";
import { createBrowserRouter, RouterProvider } from "react-router-dom";

import HomeRoutes from "../../routed/Home/HomeRoutes";

import ProtectedRoute from "./ProtectedRoute/ProtectedRoute";
import RethrowRouteError from "./RethrowRouteError/RethrowRouteError";

import HomeRouteLoader from "@/components/routed/Home/HomeRouteLoader";
import Loading from "@/components/utils/Loading/Loading";
import { ICredentials } from "@/lib/Credentials";
import devDelay from "@/lib/devDelay";

const Home = lazy(
async () =>
await devDelay(() => import("@/components/routed/Home/Home"), "Component Load: Home")
);

const Layout = lazy(
async () =>
await devDelay(() => import("@/components/core/Layout/Layout"), "Component Load: Layout")
Expand All @@ -33,11 +29,8 @@ const NotFound = lazy(
)
);

interface IProps {
setTemporaryCredentials: (credentials: ICredentials) => void;
}

const Router = (props: IProps) => {
const Router = () => {
const relayEnviroment = useRelayEnvironment();
const router = createBrowserRouter([
{
path: "/",
Expand All @@ -46,16 +39,15 @@ const Router = (props: IProps) => {
children: [
{
path: "login",
element: <Login setTemporaryCredentials={props.setTemporaryCredentials} />
element: <Login />
},
...HomeRoutes.filter(route => route.unprotected),
{
element: <ProtectedRoute />,
children: [
{
path: "",
element: <Home />
},
HomeRouteLoader(relayEnviroment, {
path: ""
}),
...HomeRoutes.filter(route => !route.unprotected),
{
path: "*",
Expand Down
44 changes: 30 additions & 14 deletions src/components/routed/Home/Home.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,32 +1,47 @@
import { Meta, StoryObj } from "@storybook/react";
import { Suspense } from "react";
import { loadQuery, useRelayEnvironment } from "react-relay";

import { HomeCardPermissionsQuery } from "./graphql/__generated__/HomeCardPermissionsQuery.graphql";
import HomeCardPermissions from "./graphql/HomeCardPermissions";
import Home from "./Home";

import { WithRelayParameters } from "@/../.storybook/MockRelayEnvironment";
import SessionContext from "@/context/session/SessionContext";
import { DefaultUserPasswordCredentials, UserPasswordCredentials } from "@/lib/Credentials";
import { UserPasswordCredentials } from "@/lib/Credentials";

interface IArgs {
defaultCredentials: boolean;
}

const variables = {
userID: "fdsa"
};

const TestComponent = (props: IArgs) => {
const session = {
currentSession: {
bearer: "asdf",
userId: "fdsa",
originalCredentials: props.defaultCredentials
? new DefaultUserPasswordCredentials()
: new UserPasswordCredentials("asdf", "asdf")
},
setSession: () => {}
};
const queryRef = loadQuery<HomeCardPermissionsQuery>(
useRelayEnvironment(),
HomeCardPermissions,
variables
);

return (
<SessionContext.Provider value={session}>
<Home />
<SessionContext.Provider
value={{
currentSession: {
bearer: "asdf",
userID: "fdsa",
originalCredentials: new UserPasswordCredentials(
"asdf",
"asdf",
props.defaultCredentials
)
},
setSession: () => {}
}}>
<Suspense>
<Home queryRef={queryRef} />
</Suspense>
</SessionContext.Provider>
);
};
Expand All @@ -48,7 +63,8 @@ const CreateRelay = (fieldsEnabled: boolean): WithRelayParameters<HomeCardPermis
canRead: fieldsEnabled
}
})
}
},
variables
});

const config: Meta<typeof TestComponent> = {
Expand Down
22 changes: 15 additions & 7 deletions src/components/routed/Home/Home.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { FormattedMessage } from "react-intl";
import { useLazyLoadQuery } from "react-relay";
import { PreloadedQuery, usePreloadedQuery } from "react-relay";

import { HomeCardPermissionsQuery } from "./graphql/__generated__/HomeCardPermissionsQuery.graphql";
import HomeCardPermissions from "./graphql/HomeCardPermissions";
Expand All @@ -9,14 +9,20 @@ import HomeRoutes from "./HomeRoutes";
import { Alert, AlertDescription } from "@/components/ui/alert";
import useSession from "@/context/session/useSession";

const Home = () => {
interface IProps {
queryRef?: PreloadedQuery<HomeCardPermissionsQuery> | null;
}

const Home = (props: IProps) => {
const session = useSession();
const usingDefaultCredentials =
!!session.currentSession?.originalCredentials.defaultCredentials;

const data = useLazyLoadQuery<HomeCardPermissionsQuery>(HomeCardPermissions, {
userID: session.currentSession!.userId
});
if (!props.queryRef) {
throw new Error("HomeCardPermissionsQuery ref was null");
}

const data = usePreloadedQuery<HomeCardPermissionsQuery>(HomeCardPermissions, props.queryRef);

return (
<>
Expand All @@ -29,8 +35,10 @@ const Home = () => {
) : null}
<div className="flex flex-row flex-wrap justify-center">
{HomeRoutes.map(route => (
<div className="basis-full sm:basis-1/2 md:basis-1/3 lg:basis-1/4">
<HomeCard key={route.localeNameId} {...route} queryData={data} />
<div
key={route.localeNameId}
className="basis-full sm:basis-1/2 md:basis-1/3 lg:basis-1/4">
<HomeCard {...route} queryData={data} />
</div>
))}
</div>
Expand Down
36 changes: 36 additions & 0 deletions src/components/routed/Home/HomeRouteLoader.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { lazy } from "react";
import { Environment } from "react-relay";
import { RouteObject } from "react-router-dom";

import { HomeCardPermissionsQuery } from "./graphql/__generated__/HomeCardPermissionsQuery.graphql";
import HomeCardPermissions from "./graphql/HomeCardPermissions";

import useSession from "@/context/session/useSession";
import devDelay from "@/lib/devDelay";
import RouteQueryLoader from "@/lib/RouteQueryLoader";

const Home = lazy(
async () =>
await devDelay(() => import("@/components/routed/Home/Home"), "Component Load: Home")
);

const HomeRouteLoader = (relayEnvironment: Environment, partialRoute: RouteObject): RouteObject => {
const session = useSession();
return RouteQueryLoader<HomeCardPermissionsQuery>(
relayEnvironment,
HomeCardPermissions,
() => {
if (!session.currentSession) {
return null;
}

return {
userID: session.currentSession.userID
};
},
partialRoute,
queryRef => <Home queryRef={queryRef} />
);
};

export default HomeRouteLoader;
18 changes: 14 additions & 4 deletions src/components/routed/Login/Login.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
} from "./OAuthOptions/graphql/__generated__/GetOAuthProvidersQuery.graphql";

import { MockRelayEnvironment, WithRelayParameters } from "@/../.storybook/MockRelayEnvironment";
import SetCredentialsContext from "@/context/credentials/SetCredentialsContext";
import ErrorsProvider from "@/context/errors/ErrorsProvider";
import useErrors from "@/context/errors/useErrors";
import SessionProvider from "@/context/session/SessionProvider";
Expand Down Expand Up @@ -96,15 +97,24 @@ const InnerTestComponent = (args: IExtraArgs) => {
}
}, [args, errors]);

return <Login {...args} />;
return <Login />;
};

const TestComponent = (args: IExtraArgs) => {
return (
<ErrorsProvider>
<SessionProvider setCredentials={() => {}}>
<InnerTestComponent {...args} />
</SessionProvider>
<SetCredentialsContext.Provider
value={{
setCredentials: (credentials, temporary) => {
if (temporary) {
args.setTemporaryCredentials(credentials);
}
}
}}>
<SessionProvider>
<InnerTestComponent {...args} />
</SessionProvider>
</SetCredentialsContext.Provider>
</ErrorsProvider>
);
};
Expand Down
Loading