From c5532e7efbd505c2000ccd53fdacb412e99c6603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ari=20Perkki=C3=B6?= Date: Mon, 23 Sep 2024 12:13:00 +0300 Subject: [PATCH 1/2] feat(astro): override components to support `Dialog` --- .gitignore | 1 + .../content/docs/guides/images/ui-dialog.png | Bin 0 -> 67647 bytes .../docs/guides/overriding-components.mdx | 11 ++++- e2e/configs/override-components.ts | 16 +++++++ e2e/package.json | 5 +- e2e/playwright.config.ts | 39 +++++++++++---- e2e/src/components/Dialog.tsx | 19 ++++++++ e2e/src/components/TopBar.astro | 21 ++++++++ e2e/test/dialog.override-components.test.ts | 26 ++++++++++ e2e/test/topbar.override-components.test.ts | 12 +++++ e2e/tsconfig.json | 2 +- .../components/WorkspacePanelWrapper.tsx | 3 +- packages/astro/src/default/env-default.d.ts | 3 +- .../src/vite-plugins/override-components.ts | 15 +++++- packages/react/package.json | 6 +++ packages/react/src/Panels/WorkspacePanel.tsx | 22 +++++---- packages/react/src/core/ContextMenu.tsx | 38 ++------------- packages/react/src/core/Dialog.tsx | 45 ++++++++++++++++++ packages/react/src/index.ts | 1 + pnpm-lock.yaml | 12 +++-- 20 files changed, 234 insertions(+), 63 deletions(-) create mode 100644 docs/tutorialkit.dev/src/content/docs/guides/images/ui-dialog.png create mode 100644 e2e/configs/override-components.ts create mode 100644 e2e/src/components/Dialog.tsx create mode 100644 e2e/src/components/TopBar.astro create mode 100644 e2e/test/dialog.override-components.test.ts create mode 100644 e2e/test/topbar.override-components.test.ts create mode 100644 packages/react/src/core/Dialog.tsx diff --git a/.gitignore b/.gitignore index 130572d6d..a903f1ee8 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ lerna-debug.log* node_modules dist dist-ssr +e2e/dist-* *.local !.vscode/extensions.json .idea diff --git a/docs/tutorialkit.dev/src/content/docs/guides/images/ui-dialog.png b/docs/tutorialkit.dev/src/content/docs/guides/images/ui-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..d18a10a6c85effd47af68d96c1aeebb9c6599ada GIT binary patch literal 67647 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 JDpA9r{|7Nx1HS+O literal 0 HcmV?d00001 diff --git a/docs/tutorialkit.dev/src/content/docs/guides/overriding-components.mdx b/docs/tutorialkit.dev/src/content/docs/guides/overriding-components.mdx index 1c94dfdf3..c5bc4b305 100644 --- a/docs/tutorialkit.dev/src/content/docs/guides/overriding-components.mdx +++ b/docs/tutorialkit.dev/src/content/docs/guides/overriding-components.mdx @@ -3,6 +3,7 @@ title: 'Overriding Components' description: "Override TutorialKit's default components to fit your needs." --- import { Image } from 'astro:assets'; +import uiDialog from './images/ui-dialog.png'; import uiTopBar from './images/ui-top-bar.png'; TutorialKit's default components are customizable with [theming](/reference/theming/) options. @@ -64,4 +65,12 @@ When overriding `TopBar` you can place TutorialKit's default components using fo -``` \ No newline at end of file +``` + +### Dialog + +TutorialKit's Dialog + +Component for overriding confirmation dialogs. This component has to be a React component. + +It will receive same props that `@tutorialkit/react/dialog` supports. diff --git a/e2e/configs/override-components.ts b/e2e/configs/override-components.ts new file mode 100644 index 000000000..120234dcf --- /dev/null +++ b/e2e/configs/override-components.ts @@ -0,0 +1,16 @@ +import tutorialkit from '@tutorialkit/astro'; +import { defineConfig } from 'astro/config'; + +export default defineConfig({ + devToolbar: { enabled: false }, + server: { port: 4330 }, + outDir: './dist-override-components', + integrations: [ + tutorialkit({ + components: { + Dialog: './src/components/Dialog.tsx', + TopBar: './src/components/TopBar.astro', + }, + }), + ], +}); diff --git a/e2e/package.json b/e2e/package.json index b94f67b62..5f4e5a297 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -5,6 +5,8 @@ "scripts": { "dev": "astro dev", "preview": "astro build && astro preview", + "dev:override-components": "astro dev --config ./configs/override-components.ts", + "preview:override-components": "astro build --config ./configs/override-components.ts && astro preview --config ./configs/override-components.ts", "test": "playwright test", "test:ui": "pnpm run test --ui" }, @@ -18,8 +20,9 @@ "@tutorialkit/runtime": "workspace:*", "@tutorialkit/theme": "workspace:*", "@tutorialkit/types": "workspace:*", - "@types/react": "^18.3.3", "@types/node": "^22.2.0", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", "@unocss/reset": "^0.59.4", "@unocss/transformer-directives": "^0.62.0", "astro": "^4.15.0", diff --git a/e2e/playwright.config.ts b/e2e/playwright.config.ts index 3c09769fe..a9654578e 100644 --- a/e2e/playwright.config.ts +++ b/e2e/playwright.config.ts @@ -1,17 +1,36 @@ import { defineConfig } from '@playwright/test'; export default defineConfig({ + projects: [ + { + name: 'Default', + testMatch: 'test/*.test.ts', + testIgnore: 'test/*.override-components.test.ts', + use: { baseURL: 'http://localhost:4329' }, + }, + { + name: 'Override Components', + testMatch: 'test/*.override-components.test.ts', + use: { baseURL: 'http://localhost:4330' }, + }, + ], + webServer: [ + { + command: 'pnpm preview', + url: 'http://localhost:4329', + reuseExistingServer: !process.env.CI, + stdout: 'ignore', + stderr: 'pipe', + }, + { + command: 'pnpm preview:override-components', + url: 'http://localhost:4330', + reuseExistingServer: !process.env.CI, + stdout: 'ignore', + stderr: 'pipe', + }, + ], expect: { timeout: process.env.CI ? 30_000 : 10_000, }, - use: { - baseURL: 'http://localhost:4329', - }, - webServer: { - command: 'pnpm preview', - url: 'http://localhost:4329', - reuseExistingServer: !process.env.CI, - stdout: 'ignore', - stderr: 'pipe', - }, }); diff --git a/e2e/src/components/Dialog.tsx b/e2e/src/components/Dialog.tsx new file mode 100644 index 000000000..21a5d366f --- /dev/null +++ b/e2e/src/components/Dialog.tsx @@ -0,0 +1,19 @@ +import type DialogType from '@tutorialkit/react/dialog'; +import type { ComponentProps } from 'react'; +import { createPortal } from 'react-dom'; + +export default function Dialog({ title, confirmText, onClose, children }: ComponentProps) { + return createPortal( +
+

Custom Dialog

+

{title}

+ + {children} + + +
, + document.body, + ); +} diff --git a/e2e/src/components/TopBar.astro b/e2e/src/components/TopBar.astro new file mode 100644 index 000000000..099610741 --- /dev/null +++ b/e2e/src/components/TopBar.astro @@ -0,0 +1,21 @@ + diff --git a/e2e/test/dialog.override-components.test.ts b/e2e/test/dialog.override-components.test.ts new file mode 100644 index 000000000..9c38473c5 --- /dev/null +++ b/e2e/test/dialog.override-components.test.ts @@ -0,0 +1,26 @@ +import { test, expect } from '@playwright/test'; + +const BASE_URL = '/tests/file-tree'; + +test('developer can override dialog in File Tree', async ({ page }) => { + await page.goto(`${BASE_URL}/allow-edits-glob`); + await expect(page.getByRole('heading', { level: 1, name: 'File Tree test - Allow Edits Glob' })).toBeVisible(); + + await page.getByRole('button', { name: 'first-level' }).click({ button: 'right' }); + await page.getByRole('menuitem', { name: `Create file` }).click(); + + await page.locator('*:focus').fill('new-file.js'); + await page.locator('*:focus').press('Enter'); + + const dialog = page.getByRole('dialog'); + await expect(dialog.getByRole('heading', { level: 2, name: 'Custom Dialog' })).toBeVisible(); + + // default elements should also be visible + await expect(dialog.getByText('Created files and folders must match following patterns:')).toBeVisible(); + await expect(dialog.getByRole('listitem').nth(0)).toHaveText('/*'); + await expect(dialog.getByRole('listitem').nth(1)).toHaveText('/first-level/allowed-filename-only.js'); + await expect(dialog.getByRole('listitem').nth(2)).toHaveText('**/second-level/**'); + + await dialog.getByRole('button', { name: 'OK' }).click(); + await expect(dialog).not.toBeVisible(); +}); diff --git a/e2e/test/topbar.override-components.test.ts b/e2e/test/topbar.override-components.test.ts new file mode 100644 index 000000000..cb34ba1cf --- /dev/null +++ b/e2e/test/topbar.override-components.test.ts @@ -0,0 +1,12 @@ +import { test, expect } from '@playwright/test'; + +test('developer can override TopBar', async ({ page }) => { + await page.goto('/'); + + const nav = page.getByRole('navigation'); + await expect(nav.getByText('Custom Top Bar Mounted')).toBeVisible(); + + // default elements should also be visible + await expect(nav.getByRole('button', { name: 'Open in StackBlitz' })).toBeVisible(); + await expect(nav.getByRole('button', { name: 'Toggle Theme' })).toBeVisible(); +}); diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json index 272d33e8c..085bc8331 100644 --- a/e2e/tsconfig.json +++ b/e2e/tsconfig.json @@ -8,6 +8,6 @@ "@*": ["src/*"] } }, - "include": ["src", "./*.ts"], + "include": ["src", "./*.ts", "configs/astro.config.override-components.ts"], "exclude": ["node_modules", "dist"] } diff --git a/packages/astro/src/default/components/WorkspacePanelWrapper.tsx b/packages/astro/src/default/components/WorkspacePanelWrapper.tsx index d33cfd84b..1fdbc4a47 100644 --- a/packages/astro/src/default/components/WorkspacePanelWrapper.tsx +++ b/packages/astro/src/default/components/WorkspacePanelWrapper.tsx @@ -2,6 +2,7 @@ import { useStore } from '@nanostores/react'; import { WorkspacePanel } from '@tutorialkit/react'; import type { Lesson } from '@tutorialkit/types'; import { useEffect } from 'react'; +import { Dialog } from 'tutorialkit:override-components'; import { themeStore } from '../stores/theme-store.js'; import { tutorialStore } from './webcontainer.js'; @@ -20,5 +21,5 @@ export function WorkspacePanelWrapper({ lesson }: Props) { tutorialStore.setLesson(lesson, { ssr: import.meta.env.SSR }); } - return ; + return ; } diff --git a/packages/astro/src/default/env-default.d.ts b/packages/astro/src/default/env-default.d.ts index f61727d18..101487bff 100644 --- a/packages/astro/src/default/env-default.d.ts +++ b/packages/astro/src/default/env-default.d.ts @@ -9,8 +9,9 @@ interface WebContainerConfig { declare module 'tutorialkit:override-components' { const topBar: typeof import('./src/default/components/TopBar.astro').default; + const dialog: typeof import('@tutorialkit/react/dialog').default; - export { topBar as TopBar }; + export { topBar as TopBar, dialog as Dialog }; } declare const __ENTERPRISE__: boolean; diff --git a/packages/astro/src/vite-plugins/override-components.ts b/packages/astro/src/vite-plugins/override-components.ts index 15ad4515f..0d5b7c03d 100644 --- a/packages/astro/src/vite-plugins/override-components.ts +++ b/packages/astro/src/vite-plugins/override-components.ts @@ -17,6 +17,7 @@ * tutorialkit({ * components: { * TopBar: './CustomTopBar.astro', + * Dialog: './CustomDialog.tsx', * }, * }), * ], @@ -29,8 +30,9 @@ export interface OverrideComponentsOptions { /** * Component for overriding the top bar. * - * This component has 3 slots that are used to pass TutorialKit's default components: + * This component has slots that are used to pass TutorialKit's default components: * - `logo`: Logo of the application + * - `open-in-stackblitz-link`: Link for opening current lesson in StackBlitz * - `theme-switch`: Switch for changing the theme * - `login-button`: For StackBlitz Enterprise user, the login button * @@ -38,11 +40,20 @@ export interface OverrideComponentsOptions { * * ```jsx * + * * * * ``` */ TopBar?: string; + + /** + * Component for overriding confirmation dialogs. + * + * This component has to be a React component. + * It will receive same props that `@tutorialkit/react/dialog` supports. + */ + Dialog?: string; } interface Options { @@ -66,9 +77,11 @@ export function overrideComponents({ components, defaultRoutes }: Options): Vite async load(id) { if (id === resolvedId) { const topBar = components?.TopBar || resolveDefaultTopBar(defaultRoutes); + const dialog = components?.Dialog || '@tutorialkit/react/dialog'; return ` export { default as TopBar } from '${topBar}'; + export { default as Dialog } from '${dialog}'; `; } diff --git a/packages/react/package.json b/packages/react/package.json index 0d5b8dda8..624cdc2e0 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -44,6 +44,12 @@ "default": "./dist/core/Terminal/index.js" } }, + "./dialog": { + "import": { + "types": "./dist/core/Dialog.d.ts", + "default": "./dist/core/Dialog.js" + } + }, "./package.json": "./package.json" }, "files": [ diff --git a/packages/react/src/Panels/WorkspacePanel.tsx b/packages/react/src/Panels/WorkspacePanel.tsx index 7665b0ef8..1ed82a0ef 100644 --- a/packages/react/src/Panels/WorkspacePanel.tsx +++ b/packages/react/src/Panels/WorkspacePanel.tsx @@ -3,6 +3,7 @@ import type { TutorialStore } from '@tutorialkit/runtime'; import type { I18n } from '@tutorialkit/types'; import { useCallback, useEffect, useRef, useState, type ComponentProps } from 'react'; import { Panel, PanelGroup, PanelResizeHandle, type ImperativePanelHandle } from 'react-resizable-panels'; +import { DialogProvider } from '../core/Dialog.js'; import type { Theme } from '../core/types.js'; import resizePanelStyles from '../styles/resize-panel.module.css'; import { classNames } from '../utils/classnames.js'; @@ -17,9 +18,10 @@ type FileTreeChangeEvent = Parameters['value']>; } -interface PanelProps extends Props { +interface PanelProps extends Omit { hasEditor: boolean; hasPreviews: boolean; hideTerminalPanel: boolean; @@ -33,7 +35,7 @@ interface TerminalProps extends PanelProps { /** * This component is the orchestrator between various interactive components. */ -export function WorkspacePanel({ tutorialStore, theme }: Props) { +export function WorkspacePanel({ tutorialStore, theme, dialog }: Props) { /** * Re-render when lesson changes. * The `tutorialStore.hasEditor()` and other methods below access @@ -50,13 +52,15 @@ export function WorkspacePanel({ tutorialStore, theme }: Props) { return ( - + + + ('idle'); const inputRef = useRef(null); + const Dialog = useDialog(); if (!allowEditPatterns?.length) { return children; @@ -183,38 +183,6 @@ function MenuItem({ icon, children, ...props }: { icon: string } & ComponentProp ); } -function Dialog({ - title, - confirmText, - onClose, - children, -}: { - title: string; - confirmText: string; - onClose: () => void; - children: ReactNode; -}) { - return ( - !open && onClose()}> - - - - -
- {title} - -
{children}
- - - - -
-
-
-
- ); -} - function AllowPatternsList({ allowEditPatterns }: Required>) { return (
    1 && 'list-disc ml-4')}> diff --git a/packages/react/src/core/Dialog.tsx b/packages/react/src/core/Dialog.tsx new file mode 100644 index 000000000..47a61de36 --- /dev/null +++ b/packages/react/src/core/Dialog.tsx @@ -0,0 +1,45 @@ +import * as RadixDialog from '@radix-ui/react-dialog'; +import { type ReactNode, createContext, useContext } from 'react'; +import { Button } from '../Button.js'; + +interface Props { + /** Title of the dialog */ + title: string; + + /** Text for the confirmation button */ + confirmText: string; + + /** Callback invoked when dialog is closed */ + onClose: () => void; + + children: ReactNode; +} + +const context = createContext(Dialog); +export const DialogProvider = context.Provider; + +export function useDialog() { + return useContext(context); +} + +export default function Dialog({ title, confirmText, onClose, children }: Props) { + return ( + !open && onClose()}> + + + + +
    + {title} + +
    {children}
    + + + + +
    +
    +
    +
    + ); +} diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index 33dbbc256..80a5735aa 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -5,5 +5,6 @@ export * from './Panels/EditorPanel.js'; export * from './Panels/PreviewPanel.js'; export * from './Panels/TerminalPanel.js'; export * from './Panels/WorkspacePanel.js'; +export { default as Dialog } from './core/Dialog.js'; export type * from './core/types.js'; export * from './utils/classnames.js'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ef15b05c..12a266017 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -184,6 +184,9 @@ importers: '@types/react': specifier: ^18.3.3 version: 18.3.3 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 '@unocss/reset': specifier: ^0.59.4 version: 0.59.4 @@ -4003,7 +4006,7 @@ packages: '@unocss/core': 0.59.4 '@unocss/reset': 0.59.4 '@unocss/vite': 0.59.4(vite@5.4.2) - vite: 5.4.2(@types/node@22.4.2)(sass@1.77.6) + vite: 5.4.2(@types/node@22.4.2) transitivePeerDependencies: - rollup @@ -4202,7 +4205,7 @@ packages: chokidar: 3.6.0 fast-glob: 3.3.2 magic-string: 0.30.11 - vite: 5.4.2(@types/node@22.4.2)(sass@1.77.6) + vite: 5.4.2(@types/node@22.4.2) transitivePeerDependencies: - rollup @@ -6733,6 +6736,7 @@ packages: /immutable@4.3.6: resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} + dev: true /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -8825,6 +8829,7 @@ packages: chokidar: 3.6.0 immutable: 4.3.6 source-map-js: 1.2.0 + dev: true /sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} @@ -9633,7 +9638,7 @@ packages: '@unocss/transformer-directives': 0.59.4 '@unocss/transformer-variant-group': 0.59.4 '@unocss/vite': 0.59.4(vite@5.4.2) - vite: 5.4.2(@types/node@22.4.2)(sass@1.77.6) + vite: 5.4.2(@types/node@22.4.2) transitivePeerDependencies: - postcss - rollup @@ -9979,6 +9984,7 @@ packages: sass: 1.77.6 optionalDependencies: fsevents: 2.3.3 + dev: true /vitefu@0.2.5(vite@5.4.2): resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} From c6e6383da3297eac5bffb2e137625f592ec623dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ari=20Perkki=C3=B6?= Date: Tue, 24 Sep 2024 12:57:52 +0300 Subject: [PATCH 2/2] fix: code review --- .../docs/guides/overriding-components.mdx | 20 +++++++++++++++++-- .../src/vite-plugins/override-components.ts | 2 +- packages/react/src/core/Dialog.tsx | 1 + 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/docs/tutorialkit.dev/src/content/docs/guides/overriding-components.mdx b/docs/tutorialkit.dev/src/content/docs/guides/overriding-components.mdx index c5bc4b305..52c09114f 100644 --- a/docs/tutorialkit.dev/src/content/docs/guides/overriding-components.mdx +++ b/docs/tutorialkit.dev/src/content/docs/guides/overriding-components.mdx @@ -71,6 +71,22 @@ When overriding `TopBar` you can place TutorialKit's default components using fo TutorialKit's Dialog -Component for overriding confirmation dialogs. This component has to be a React component. +Component for overriding confirmation dialogs. This component has to be a React component and be the default export of that module. -It will receive same props that `@tutorialkit/react/dialog` supports. +It will receive same props that `@tutorialkit/react/dialog` supports: + +```ts +interface Props { + /** Title of the dialog */ + title: string; + + /** Text for the confirmation button */ + confirmText: string; + + /** Callback invoked when dialog is closed */ + onClose: () => void; + + /** Content of the dialog */ + children: ReactNode; +} +``` \ No newline at end of file diff --git a/packages/astro/src/vite-plugins/override-components.ts b/packages/astro/src/vite-plugins/override-components.ts index 0d5b7c03d..b71a2ea8a 100644 --- a/packages/astro/src/vite-plugins/override-components.ts +++ b/packages/astro/src/vite-plugins/override-components.ts @@ -50,7 +50,7 @@ export interface OverrideComponentsOptions { /** * Component for overriding confirmation dialogs. * - * This component has to be a React component. + * This component has to be a React component and be the default export of that module. * It will receive same props that `@tutorialkit/react/dialog` supports. */ Dialog?: string; diff --git a/packages/react/src/core/Dialog.tsx b/packages/react/src/core/Dialog.tsx index 47a61de36..d83e3e1c9 100644 --- a/packages/react/src/core/Dialog.tsx +++ b/packages/react/src/core/Dialog.tsx @@ -12,6 +12,7 @@ interface Props { /** Callback invoked when dialog is closed */ onClose: () => void; + /** Content of the dialog */ children: ReactNode; }