diff --git a/.changeset/bright-routers-smile.md b/.changeset/bright-routers-smile.md new file mode 100644 index 0000000000..30b4553e54 --- /dev/null +++ b/.changeset/bright-routers-smile.md @@ -0,0 +1,5 @@ +--- +'@tanstack/router-devtools-core': patch +--- + +Apply and update React toggle button props in the router devtools. diff --git a/e2e/react-router/basic/src/main.tsx b/e2e/react-router/basic/src/main.tsx index 36e5106654..ddb20fffc2 100644 --- a/e2e/react-router/basic/src/main.tsx +++ b/e2e/react-router/basic/src/main.tsx @@ -1,4 +1,5 @@ import ReactDOM from 'react-dom/client' +import { useState } from 'react' import { ErrorComponent, Link, @@ -9,7 +10,7 @@ import { createRouter, redirect, } from '@tanstack/react-router' -import { TanStackRouterDevtools } from '@tanstack/react-router-devtools' +import { TanStackRouterDevtoolsInProd as TanStackRouterDevtools } from '@tanstack/react-router-devtools' import { NotFoundError, fetchPost, fetchPosts } from './posts' import './styles.css' import type { ErrorComponentProps } from '@tanstack/react-router' @@ -27,6 +28,9 @@ const rootRoute = createRootRoute({ }) function RootComponent() { + const [usesUpdatedDevtoolsProps, setUsesUpdatedDevtoolsProps] = + useState(false) + return ( <>
@@ -88,7 +92,20 @@ function RootComponent() {
- + + ) } diff --git a/e2e/react-router/basic/tests/app.spec.ts b/e2e/react-router/basic/tests/app.spec.ts index ec0e24d8a4..c5328836f7 100644 --- a/e2e/react-router/basic/tests/app.spec.ts +++ b/e2e/react-router/basic/tests/app.spec.ts @@ -62,3 +62,20 @@ test('Link in SVG does not trigger a full page reload', async ({ page }) => { expect(fullPageLoad).toBeFalsy() }) + +test('Applies and updates React props on the devtools toggle button', async ({ + page, +}) => { + const initialToggleButton = page.getByRole('button', { + name: 'Custom Router Devtools', + }) + + await expect(initialToggleButton).toHaveClass(/initial-devtools-toggle/) + + await page.getByRole('button', { name: 'Update devtools props' }).click() + + const updatedToggleButton = page.getByRole('button', { + name: 'Updated Router Devtools', + }) + await expect(updatedToggleButton).toHaveClass(/updated-devtools-toggle/) +}) diff --git a/packages/router-devtools-core/src/FloatingTanStackRouterDevtools.tsx b/packages/router-devtools-core/src/FloatingTanStackRouterDevtools.tsx index 2af93a98b9..7415d8e483 100644 --- a/packages/router-devtools-core/src/FloatingTanStackRouterDevtools.tsx +++ b/packages/router-devtools-core/src/FloatingTanStackRouterDevtools.tsx @@ -1,6 +1,6 @@ import { clsx as cx } from 'clsx' -import { createEffect, createMemo, createSignal } from 'solid-js' +import { Show, createEffect, createMemo, createSignal } from 'solid-js' import { Dynamic } from 'solid-js/web' import { DevtoolsOnCloseContext } from './context' @@ -32,9 +32,7 @@ export interface FloatingDevtoolsOptions { /** * Use this to add props to the toggle button. For example, you can add class, style (merge and override default style), onClick (extend default handler), etc. */ - toggleButtonProps?: any & { - ref?: any - } + toggleButtonProps?: Accessor /** * The position of the TanStack Router logo to open and close the devtools panel. * Defaults to 'bottom-left'. @@ -61,7 +59,7 @@ export function FloatingTanStackRouterDevtools({ initialIsOpen, panelProps = {}, closeButtonProps = {}, - toggleButtonProps = {}, + toggleButtonProps = () => undefined, position = 'bottom-left', containerElement: Container = 'footer', router, @@ -193,12 +191,6 @@ export function FloatingTanStackRouterDevtools({ ...otherCloseButtonProps } = closeButtonProps - const { - onClick: onToggleClick, - class: toggleButtonClassName, - ...otherToggleButtonProps - } = toggleButtonProps - // Do not render on the server if (!isMounted()) return null @@ -224,15 +216,6 @@ export function FloatingTanStackRouterDevtools({ } }) - const buttonStyle = createMemo(() => { - return cx( - styles().mainCloseBtn, - styles().mainCloseBtnPosition(position), - styles().mainCloseBtnAnimation(!!isOpen()), - toggleButtonClassName, - ) - }) - return ( - + ) }} - class={buttonStyle()} - > -
-
- -
-
- -
-
-
-
-
TanStack Router
- +
) } diff --git a/packages/router-devtools-core/src/TanStackRouterDevtoolsCore.tsx b/packages/router-devtools-core/src/TanStackRouterDevtoolsCore.tsx index 883d8c6d52..0040195507 100644 --- a/packages/router-devtools-core/src/TanStackRouterDevtoolsCore.tsx +++ b/packages/router-devtools-core/src/TanStackRouterDevtoolsCore.tsx @@ -58,7 +58,7 @@ export class TanStackRouterDevtoolsCore { #panelProps: any #closeButtonProps: any - #toggleButtonProps: any + #toggleButtonProps: Signal #containerElement?: string | any #isMounted = false @@ -74,7 +74,7 @@ export class TanStackRouterDevtoolsCore { this.#panelProps = config.panelProps this.#closeButtonProps = config.closeButtonProps - this.#toggleButtonProps = config.toggleButtonProps + this.#toggleButtonProps = createSignal(config.toggleButtonProps) this.#containerElement = config.containerElement } @@ -92,7 +92,7 @@ export class TanStackRouterDevtoolsCore { const panelProps = this.#panelProps const closeButtonProps = this.#closeButtonProps - const toggleButtonProps = this.#toggleButtonProps + const [toggleButtonProps] = this.#toggleButtonProps const containerElement = this.#containerElement let Devtools @@ -157,5 +157,9 @@ export class TanStackRouterDevtoolsCore { if (options.containerElement !== undefined) { this.#containerElement = options.containerElement } + + if ('toggleButtonProps' in options) { + this.#toggleButtonProps[1](options.toggleButtonProps) + } } }