Skip to content

Commit bddb1fa

Browse files
authored
#66 fix & settings page additions (#70)
* #66 fix & settings page additions * v3.4.0 bump * update
1 parent a5ffc6f commit bddb1fa

File tree

11 files changed

+89
-43
lines changed

11 files changed

+89
-43
lines changed

README.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -306,10 +306,8 @@ const build = withServerDevTools(await import(BUILD_PATH), config)
306306

307307
## RemixDevTools props
308308

309-
The `RemixDevTools` component accepts the following props:
310-
- `requireUrlFlag`: Requires rdt=true to be present in the URL search to open the Remix Development Tools. Defaults to `false`.
311-
- `plugins`: Allows you to provide additional tabs (plugins) to the Remix Development Tools. Defaults to `[]`.
312-
- `wsPort`: Allows you to specify over which port the client dev tools will communicate with the server dev tools. Defaults to `8080`.
309+
The `RemixDevTools` component accepts the following props:
310+
- `plugins`: Allows you to provide additional tabs (plugins) to the Remix Development Tools. Defaults to `[]`.
313311

314312
### Defining the config
315313

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "remix-development-tools",
33
"description": "Remix development tools - a set of tools for developing/debugging Remix.run apps",
44
"author": "Alem Tuzlak",
5-
"version": "3.3.0",
5+
"version": "3.4.0",
66
"license": "MIT",
77
"keywords": [
88
"remix",

src/RemixDevTools/EmbeddedDevTools.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import { ContentPanel } from "./layout/ContentPanel.js";
88
import { MainPanel } from "./layout/MainPanel.js";
99
import { Tabs } from "./layout/Tabs.js";
1010
import { REMIX_DEV_TOOLS } from "./utils/storage.js";
11-
import { useLocation } from "@remix-run/react";
1211
import { RDTContextProvider } from "./context/RDTContext.js";
1312
import { useState, useEffect } from "react";
13+
import { useLocation } from "@remix-run/react";
1414

1515
export interface EmbeddedDevToolsProps extends RemixDevToolsProps {
1616
mainPanelClassName?: string;
@@ -23,6 +23,8 @@ const Embedded = ({ plugins, mainPanelClassName, className }: EmbeddedDevToolsPr
2323
const { settings } = useSettingsContext();
2424
const { position } = settings;
2525
const leftSideOriented = position.includes("left");
26+
const url = useLocation().search;
27+
if (settings.requireUrlFlag && !url.includes(settings.urlFlag)) return null;
2628
return (
2729
<div id={REMIX_DEV_TOOLS} className={clsx("remix-dev-tools", className)}>
2830
<MainPanel className={mainPanelClassName} isEmbedded isOpen={true}>
@@ -46,12 +48,10 @@ function useHydrated() {
4648
return hydrated;
4749
}
4850

49-
const EmbeddedDevTools = ({ requireUrlFlag, plugins, mainPanelClassName, className }: EmbeddedDevToolsProps) => {
51+
const EmbeddedDevTools = ({ plugins, mainPanelClassName, className }: EmbeddedDevToolsProps) => {
5052
const hydrated = useHydrated();
51-
const url = useLocation().search;
5253

5354
if (!hydrated) return null;
54-
if (requireUrlFlag && !url.includes("rdt=true")) return null;
5555

5656
return (
5757
<RDTContextProvider>

src/RemixDevTools/RemixDevTools.tsx

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,22 @@ import "../input.css";
2323
import { useDevServerConnection } from "./hooks/useDevServerConnection.js";
2424
import { useOpenElementSource } from "./hooks/useOpenElementSource.js";
2525

26-
const DevTools = ({ plugins, wsPort }: RemixDevToolsProps) => {
26+
const DevTools = ({ plugins }: RemixDevToolsProps) => {
2727
useTimelineHandler();
2828
useResetDetachmentCheck();
2929
useBorderedRoutes();
3030
useSetRouteBoundaries();
3131
useSyncStateWhenDetached();
32-
useDevServerConnection(wsPort);
32+
useDevServerConnection();
3333
useOpenElementSource();
34-
34+
const url = useLocation().search;
3535
const { detachedWindowOwner, isDetached, setDetachedWindowOwner } = useDetachedWindowControls();
3636
const { settings } = useSettingsContext();
3737
const { persistOpen } = usePersistOpen();
3838
const { position } = settings;
3939
const [isOpen, setIsOpen] = useState(isDetached || settings.defaultOpen || persistOpen);
4040
const leftSideOriented = position.includes("left");
41-
41+
if (settings.requireUrlFlag && !url.includes(settings.urlFlag)) return null;
4242
// If the dev tools are detached, we don't want to render the main panel
4343
if (detachedWindowOwner) {
4444
return (
@@ -81,24 +81,18 @@ function useHydrated() {
8181
}
8282

8383
export interface RemixDevToolsProps {
84-
// Whether the dev tools require a url flag to be shown
85-
requireUrlFlag?: boolean;
8684
// Additional tabs to add to the dev tools
8785
plugins?: Tab[];
88-
// The port to use for the dev tools websocket that communicates with the backend dev tools
89-
wsPort?: number;
9086
}
9187

92-
const RemixDevTools = ({ requireUrlFlag, plugins, wsPort }: RemixDevToolsProps) => {
88+
const RemixDevTools = ({ plugins }: RemixDevToolsProps) => {
9389
const hydrated = useHydrated();
94-
const url = useLocation().search;
9590

9691
if (!hydrated) return null;
97-
if (requireUrlFlag && !url.includes("rdt=true")) return null;
9892

9993
return (
10094
<RDTContextProvider>
101-
<DevTools wsPort={wsPort} plugins={plugins} />
95+
<DevTools plugins={plugins} />
10296
</RDTContextProvider>
10397
);
10498
};

src/RemixDevTools/context/rdtReducer.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ export type RemixDevToolsState = {
8585
isHoveringRoute: boolean;
8686
routeViewMode: "list" | "tree";
8787
panelLocation: "top" | "bottom";
88+
withServerDevTools: boolean;
89+
wsPort: number;
90+
requireUrlFlag: boolean;
91+
urlFlag: string;
8892
};
8993
htmlErrors: HTMLError[];
9094
server?: ServerInfo;
@@ -114,6 +118,10 @@ export const initialState: RemixDevToolsState = {
114118
isHoveringRoute: false,
115119
routeViewMode: "tree",
116120
panelLocation: "bottom",
121+
withServerDevTools: true,
122+
wsPort: 8080,
123+
requireUrlFlag: false,
124+
urlFlag: "rdt",
117125
},
118126
htmlErrors: [],
119127
persistOpen: false,

src/RemixDevTools/hooks/useAttachListener.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const getAttachment = (target: ListenerAttachmentTarget) => {
1212
return typeof document != "undefined" ? document.body : null;
1313
}
1414
};
15+
1516
/**
1617
* Helper hook that listens to the document scroll event and triggers a callback function
1718
* @param fn Function to be called when the event happens

src/RemixDevTools/hooks/useDevServerConnection.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { useWebSocket } from "../../external/react-use-websocket/use-websocket.j
33
import { useEffect } from "react";
44
import { tryParseJson } from "../utils/sanitize.js";
55
import { ActionEvent, LoaderEvent, isRdtEventArray } from "../../dev-server/event-queue.js";
6-
import { useDetachedWindowControls, useServerInfo } from "../context/useRDTContext.js";
6+
import { useDetachedWindowControls, useServerInfo, useSettingsContext } from "../context/useRDTContext.js";
77
import { ServerInfo } from "../context/rdtReducer.js";
88
import { cutArrayToLastN } from "../utils/common.js";
99
import { ReadyState } from "../../external/react-use-websocket/constants.js";
@@ -49,13 +49,14 @@ const updateRouteInfo = (
4949
};
5050
};
5151

52-
const useDevServerConnection = (wsPort: number | undefined = 8080) => {
52+
const useDevServerConnection = () => {
5353
const navigation = useNavigation();
54+
const { settings } = useSettingsContext();
5455
const { server, setServerInfo } = useServerInfo();
55-
const { detachedWindow } = useDetachedWindowControls();
56-
56+
const { detachedWindowOwner, isDetached } = useDetachedWindowControls();
57+
const shouldConnect = isDetached ? detachedWindowOwner && settings.withServerDevTools : settings.withServerDevTools;
5758
const methods = useWebSocket(
58-
`ws://localhost:${wsPort}`,
59+
`ws://localhost:${settings.wsPort}`,
5960
{
6061
onMessage: (e) => {
6162
// Do not do anything with
@@ -73,7 +74,7 @@ const useDevServerConnection = (wsPort: number | undefined = 8080) => {
7374
}
7475
},
7576
},
76-
wsPort !== undefined || detachedWindow
77+
shouldConnect
7778
);
7879

7980
// Pull the event queue from the server when the page is idle

src/RemixDevTools/tabs/SettingsTab.tsx

Lines changed: 53 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
import { useState } from "react";
2-
import { Checkbox } from '../components/Checkbox.js';
3-
import { Input } from '../components/Input.js';
4-
import { SelectWithOptions } from '../components/Select.js';
5-
import { Stack } from '../components/Stack.js';
6-
import { useSettingsContext } from '../context/useRDTContext.js';
7-
import { RouteBoundaryOptions } from '../context/rdtReducer.js';
8-
import { uppercaseFirstLetter } from '../utils/string.js';
2+
import { Checkbox } from "../components/Checkbox.js";
3+
import { Input } from "../components/Input.js";
4+
import { SelectWithOptions } from "../components/Select.js";
5+
import { Stack } from "../components/Stack.js";
6+
import { useSettingsContext } from "../context/useRDTContext.js";
7+
import { RouteBoundaryOptions } from "../context/rdtReducer.js";
8+
import { uppercaseFirstLetter } from "../utils/string.js";
99

1010
export const SettingsTab = () => {
1111
const { settings, setSettings } = useSettingsContext();
1212
const [minHeight, setMinHeight] = useState(settings.minHeight.toString());
1313
const [maxHeight, setMaxHeight] = useState(settings.maxHeight.toString());
1414
const [expansionLevel, setExpansionLevel] = useState(settings.expansionLevel.toString());
15+
const [wsPort, setWsPort] = useState(settings.wsPort.toString());
1516
return (
1617
<Stack className="rdt-mb-4">
1718
<h1>
@@ -26,6 +27,14 @@ export const SettingsTab = () => {
2627
>
2728
Open dev tools by default
2829
</Checkbox>
30+
<Checkbox
31+
id="requireUrlFlag"
32+
hint="Allows you to only show rdt when there is a flag in the URL search params set."
33+
onChange={() => setSettings({ requireUrlFlag: !settings.requireUrlFlag })}
34+
value={settings.requireUrlFlag}
35+
>
36+
Show dev tools only when URL flag is set
37+
</Checkbox>
2938
<Checkbox
3039
id="hideUntilHover"
3140
hint="The dev tools trigger will be hidden on the page until you hover over it."
@@ -34,8 +43,45 @@ export const SettingsTab = () => {
3443
>
3544
Hide the trigger until hovered
3645
</Checkbox>
46+
<Checkbox
47+
id="withServerDevTools"
48+
hint="Tell the dev tools if they should try to connect to their server counterpart, if you don't have that set up you can just disable this."
49+
onChange={() => setSettings({ withServerDevTools: !settings.withServerDevTools })}
50+
value={settings.withServerDevTools}
51+
>
52+
Connect to server dev tools
53+
</Checkbox>
3754
<hr className="rdt-mt-2 rdt-border-gray-700" />
3855
<Stack gap="lg">
56+
{settings.requireUrlFlag && (
57+
<Input
58+
name="urlFlag"
59+
id="urlFlag"
60+
label="URL flag to use"
61+
hint={`This allows you to change the URL search param flag that will be used to show the dev tools when "Show dev tools only when URL flag is set" is set to true`}
62+
value={settings.urlFlag}
63+
onChange={(e) => setSettings({ urlFlag: e.target.value ?? "" })}
64+
onBlur={(e) => {
65+
setSettings({ urlFlag: e.target.value.trim() });
66+
}}
67+
/>
68+
)}
69+
{settings.withServerDevTools && (
70+
<Input
71+
name="wsPort"
72+
id="wsPort"
73+
label="Server dev tools WS port (default: 8080)"
74+
hint="This allows you to change the port the client dev tools will try to connect to."
75+
value={wsPort}
76+
onChange={(e) => setWsPort(e.target.value ?? "")}
77+
onBlur={(e) => {
78+
const value = parseInt(e.target.value);
79+
if (value && !isNaN(value) && value >= 0) {
80+
setSettings({ wsPort: value });
81+
}
82+
}}
83+
/>
84+
)}
3985
<Input
4086
name="expansionLevel"
4187
id="expansionLevel"

src/dev-server/init.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ const installDevToolsGlobals = (config?: DevToolsServerConfig) => {
4141
ws.on("connection", (client) => {
4242
client.on("message", (message) => {
4343
const data = tryParseJson(message.toString());
44+
4445
if (!isWsEventType(data)) return;
4546
if (data.type === "open-source") {
4647
const source = data.data.source;
@@ -78,6 +79,9 @@ const installDevToolsGlobals = (config?: DevToolsServerConfig) => {
7879

7980
["SIGINT", "SIGTERM"].forEach((event) => {
8081
process.on(event, () => {
82+
ws.clients.forEach((client) => {
83+
client.close();
84+
});
8185
ws.close();
8286
});
8387
});

src/test-apps/cjs-app/app/root.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,4 +88,4 @@ export const action = async () => {
8888
);
8989
}
9090

91-
export default withDevTools(App);
91+
export default withDevTools(App );

0 commit comments

Comments
 (0)