dify/web
yyh e95b7b57c9
fix: prevent popup blocker from blocking async window.open
Add useAsyncWindowOpen hook to handle async URL fetching with placeholder window pattern. This prevents browser popup blockers (especially Safari) from blocking windows opened after async operations.

- Create reusable useAsyncWindowOpen hook with placeholder window pattern
- Fix billing subscription management popup (cloud-plan-item)
- Fix app card explore popup
- Fix app publisher explore popup

Fixes #29389
Ref: #29390
2025-12-10 12:10:47 +08:00
..
.husky chore: update TypeScript type-check command and add native-preview dependency for faster performance (#29179) 2025-12-05 14:42:37 +08:00
.storybook chore: add more stories (#27403) 2025-10-29 14:33:43 +08:00
.vscode feat: knowledge pipeline (#25360) 2025-09-18 12:49:10 +08:00
__mocks__ chore: add provider context mock (#29201) 2025-12-08 17:23:45 +08:00
__tests__ frontend auto testing rules (#28679) 2025-11-26 15:18:07 +08:00
app fix: prevent popup blocker from blocking async window.open 2025-12-10 12:10:47 +08:00
assets feat: introduce trigger functionality (#27644) 2025-11-12 17:59:37 +08:00
bin
config feat: add ReactScan component for enhanced development scanning (#29086) 2025-12-03 18:19:12 +08:00
context Refactor datasets service toward TanStack Query (#29008) 2025-12-09 13:48:23 +08:00
docker fix: resolve CSRF token cookie name mismatch in browser (#28228) (#28378) 2025-11-20 11:40:35 +08:00
hooks fix: prevent popup blocker from blocking async window.open 2025-12-10 12:10:47 +08:00
i18n chore(i18n): translate i18n files and update type definitions (#29329) 2025-12-09 15:57:35 +08:00
i18n-config chore: refactor i18n scripts and remove extra keys (#28618) 2025-11-25 13:23:19 +08:00
models feat: multimodal support (image) (#27793) 2025-12-09 11:44:50 +08:00
public fix: Downgrade @monaco-editor/loader to v1.5.0 (#27282) 2025-10-22 20:18:24 +08:00
scripts Bugfix: Windows compatibility issue with 'cp' command not found when running pnpm start. (#25670) (#25672) 2025-10-26 11:53:56 +08:00
service feat: make billing management entry prominent and enable current plan portal (#29321) 2025-12-09 15:43:51 +08:00
testing chore: add provider context mock (#29201) 2025-12-08 17:23:45 +08:00
themes feat: multimodal support (image) (#27793) 2025-12-09 11:44:50 +08:00
types fix: resolve CSRF token cookie name mismatch in browser (#28228) (#28378) 2025-11-20 11:40:35 +08:00
utils fix(web): resolve no-unused-vars lint warning in index.spec.ts (#29273) 2025-12-08 16:55:53 +08:00
.dockerignore Enhance Code Consistency Across Repository with `.editorconfig` (#19023) 2025-04-29 18:04:33 +08:00
.env.example doc: add doc for env config when site and backend are in different domains (#28318) 2025-11-18 17:29:54 +08:00
.gitignore Introduce Plugins (#13836) 2025-02-17 17:05:13 +08:00
.oxlintrc.json Fix/disable no unsafe optional chaining (#25553) 2025-09-12 10:03:34 +08:00
Dockerfile docker: use `COPY --chown` in api Dockerfile to avoid adding layers by explicit `chown` calls (#28756) 2025-11-28 11:33:06 +08:00
README.md frontend auto testing rules (#28679) 2025-11-26 15:18:07 +08:00
eslint.config.mjs chore(web): run oxlint before eslint (#29224) 2025-12-07 11:36:33 +08:00
global.d.ts refactor: update install status handling in plugin installation process (#27594) 2025-10-29 18:31:02 +08:00
jest.config.ts fix: happy-dom version (#26764) 2025-10-11 18:59:31 +08:00
jest.setup.ts feat/TanStack-Form (#18346) 2025-04-18 15:54:22 +08:00
knip.config.ts feat: add Knip configuration for dead code detection and remove unused icon components (#26758) 2025-10-14 19:06:31 +08:00
middleware.ts integrate Amplitude analytics into the application (#29049) 2025-12-03 14:22:12 +08:00
next.config.js feat: introduce trigger functionality (#27644) 2025-11-12 17:59:37 +08:00
package.json chore(deps): update @lexical packages to version 0.38.2 in package.json and pnpm-lock.yaml (#29260) 2025-12-08 11:48:49 +08:00
pnpm-lock.yaml chore(deps): update @lexical packages to version 0.38.2 in package.json and pnpm-lock.yaml (#29260) 2025-12-08 11:48:49 +08:00
postcss.config.js
tailwind-common-config.ts feat: knowledge pipeline (#25360) 2025-09-18 12:49:10 +08:00
tailwind.config.js Introduce Plugins (#13836) 2025-02-17 17:05:13 +08:00
tsconfig.json frontend auto testing rules (#28679) 2025-11-26 15:18:07 +08:00
typography.js Chore: frontend infrastructure upgrade (#16420) 2025-03-21 17:41:03 +08:00

README.md

Dify Frontend

This is a Next.js project bootstrapped with create-next-app.

Getting Started

Run by source code

Before starting the web frontend service, please make sure the following environment is ready.

First, install the dependencies:

pnpm install

Then, configure the environment variables. Create a file named .env.local in the current directory and copy the contents from .env.example. Modify the values of these environment variables according to your requirements:

cp .env.example .env.local
# For production release, change this to PRODUCTION
NEXT_PUBLIC_DEPLOY_ENV=DEVELOPMENT
# The deployment edition, SELF_HOSTED
NEXT_PUBLIC_EDITION=SELF_HOSTED
# The base URL of console application, refers to the Console base URL of WEB service if console domain is
# different from api or web app domain.
# example: http://cloud.dify.ai/console/api
NEXT_PUBLIC_API_PREFIX=http://localhost:5001/console/api
NEXT_PUBLIC_COOKIE_DOMAIN=
# The URL for Web APP, refers to the Web App base URL of WEB service if web app domain is different from
# console or api domain.
# example: http://udify.app/api
NEXT_PUBLIC_PUBLIC_API_PREFIX=http://localhost:5001/api

# SENTRY
NEXT_PUBLIC_SENTRY_DSN=

[!IMPORTANT]

  1. When the frontend and backend run on different subdomains, set NEXT_PUBLIC_COOKIE_DOMAIN=1. The frontend and backend must be under the same top-level domain in order to share authentication cookies.
  2. It's necessary to set NEXT_PUBLIC_API_PREFIX and NEXT_PUBLIC_PUBLIC_API_PREFIX to the correct backend API URL.

Finally, run the development server:

pnpm run dev

Open http://localhost:3000 with your browser to see the result.

You can start editing the file under folder app. The page auto-updates as you edit the file.

Deploy

Deploy on server

First, build the app for production:

pnpm run build

Then, start the server:

pnpm run start

If you want to customize the host and port:

pnpm run start --port=3001 --host=0.0.0.0

If you want to customize the number of instances launched by PM2, you can configure PM2_INSTANCES in docker-compose.yaml or Dockerfile.

Storybook

This project uses Storybook for UI component development.

To start the storybook server, run:

pnpm storybook

Open http://localhost:6006 with your browser to see the result.

Lint Code

If your IDE is VSCode, rename web/.vscode/settings.example.json to web/.vscode/settings.json for lint code setting.

Test

We use Jest and React Testing Library for Unit Testing.

📖 Complete Testing Guide: See web/testing/testing.md for detailed testing specifications, best practices, and examples.

Run test:

pnpm run test

Example Code

If you are not familiar with writing tests, refer to:

Analyze Component Complexity

Before writing tests, use the script to analyze component complexity:

pnpm analyze-component app/components/your-component/index.tsx

This will help you determine the testing strategy. See web/testing/testing.md for details.

Documentation

Visit https://docs.dify.ai/getting-started/readme to view the full documentation.

Community

The Dify community can be found on Discord community, where you can ask questions, voice ideas, and share your projects.