From 1a2fce7055830ac8690bf807b01073c4b4b1dea3 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Thu, 15 Jan 2026 21:49:46 +0800 Subject: [PATCH 1/3] ci: eslint annotation (#31056) --- .github/workflows/style.yml | 13 ++++++++++++- web/package.json | 7 ++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/.github/workflows/style.yml b/.github/workflows/style.yml index 6c5d6f4135..b96db5a390 100644 --- a/.github/workflows/style.yml +++ b/.github/workflows/style.yml @@ -65,6 +65,9 @@ jobs: defaults: run: working-directory: ./web + permissions: + checks: write + pull-requests: read steps: - name: Checkout code @@ -103,7 +106,15 @@ jobs: if: steps.changed-files.outputs.any_changed == 'true' working-directory: ./web run: | - pnpm run lint + pnpm run lint:report + continue-on-error: true + + - name: Annotate Code + if: steps.changed-files.outputs.any_changed == 'true' + uses: DerLev/eslint-annotations@51347b3a0abfb503fc8734d5ae31c4b151297fae + with: + eslint-report: web/eslint_report.json + github-token: ${{ secrets.GITHUB_TOKEN }} - name: Web type check if: steps.changed-files.outputs.any_changed == 'true' diff --git a/web/package.json b/web/package.json index 000862204b..5ca90c75ea 100644 --- a/web/package.json +++ b/web/package.json @@ -28,9 +28,10 @@ "build:docker": "next build && node scripts/optimize-standalone.js", "start": "node ./scripts/copy-and-start.mjs", "lint": "eslint --cache --cache-location node_modules/.cache/eslint/.eslint-cache", - "lint:fix": "eslint --cache --cache-location node_modules/.cache/eslint/.eslint-cache --fix", - "lint:quiet": "eslint --cache --cache-location node_modules/.cache/eslint/.eslint-cache --quiet", - "lint:complexity": "eslint --cache --cache-location node_modules/.cache/eslint/.eslint-cache --rule 'complexity: [error, {max: 15}]' --quiet", + "lint:fix": "pnpm lint --fix", + "lint:quiet": "pnpm lint --quiet", + "lint:complexity": "pnpm lint --rule 'complexity: [error, {max: 15}]' --quiet", + "lint:report": "pnpm lint --output-file eslint_report.json --format json", "type-check": "tsc --noEmit", "type-check:tsgo": "tsgo --noEmit", "prepare": "cd ../ && node -e \"if (process.env.NODE_ENV !== 'production'){process.exit(1)} \" || husky ./web/.husky", From b06c7c8f33c76f4803978c659e5e56b0529d676c Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Thu, 15 Jan 2026 23:04:26 +0800 Subject: [PATCH 2/3] ci: disable limit annotation (#31072) --- .github/workflows/style.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/style.yml b/.github/workflows/style.yml index b96db5a390..86b66bf9df 100644 --- a/.github/workflows/style.yml +++ b/.github/workflows/style.yml @@ -109,12 +109,12 @@ jobs: pnpm run lint:report continue-on-error: true - - name: Annotate Code - if: steps.changed-files.outputs.any_changed == 'true' - uses: DerLev/eslint-annotations@51347b3a0abfb503fc8734d5ae31c4b151297fae - with: - eslint-report: web/eslint_report.json - github-token: ${{ secrets.GITHUB_TOKEN }} + # - name: Annotate Code + # if: steps.changed-files.outputs.any_changed == 'true' && github.event_name == 'pull_request' + # uses: DerLev/eslint-annotations@51347b3a0abfb503fc8734d5ae31c4b151297fae + # with: + # eslint-report: web/eslint_report.json + # github-token: ${{ secrets.GITHUB_TOKEN }} - name: Web type check if: steps.changed-files.outputs.any_changed == 'true' From c98870c3f457a94e7cfa39857ccf7ee2a8d8f7a4 Mon Sep 17 00:00:00 2001 From: byteforge Date: Thu, 15 Jan 2026 18:52:53 -0500 Subject: [PATCH 3/3] refactor: always preserve marketplace search state in URL (#31069) Co-authored-by: Stephen Zhou <38493346+hyoban@users.noreply.github.com> --- .../components/plugins/marketplace/atoms.ts | 25 +++---------------- .../plugins/marketplace/hydration-client.tsx | 15 ----------- .../components/plugins/marketplace/index.tsx | 20 ++++++--------- .../plugins/plugin-page/context.tsx | 2 +- 4 files changed, 12 insertions(+), 50 deletions(-) delete mode 100644 web/app/components/plugins/marketplace/hydration-client.tsx diff --git a/web/app/components/plugins/marketplace/atoms.ts b/web/app/components/plugins/marketplace/atoms.ts index 6ca9bd1c05..b13d30407e 100644 --- a/web/app/components/plugins/marketplace/atoms.ts +++ b/web/app/components/plugins/marketplace/atoms.ts @@ -1,4 +1,3 @@ -import type { ActivePluginType } from './constants' import type { PluginsSort, SearchParamsFromCollection } from './types' import { atom, useAtom, useAtomValue, useSetAtom } from 'jotai' import { useQueryState } from 'nuqs' @@ -17,32 +16,14 @@ export function useSetMarketplaceSort() { return useSetAtom(marketplaceSortAtom) } -/** - * Preserve the state for marketplace - */ -export const preserveSearchStateInQueryAtom = atom(false) - -const searchPluginTextAtom = atom('') -const activePluginTypeAtom = atom('all') -const filterPluginTagsAtom = atom([]) - export function useSearchPluginText() { - const preserveSearchStateInQuery = useAtomValue(preserveSearchStateInQueryAtom) - const queryState = useQueryState('q', marketplaceSearchParamsParsers.q) - const atomState = useAtom(searchPluginTextAtom) - return preserveSearchStateInQuery ? queryState : atomState + return useQueryState('q', marketplaceSearchParamsParsers.q) } export function useActivePluginType() { - const preserveSearchStateInQuery = useAtomValue(preserveSearchStateInQueryAtom) - const queryState = useQueryState('category', marketplaceSearchParamsParsers.category) - const atomState = useAtom(activePluginTypeAtom) - return preserveSearchStateInQuery ? queryState : atomState + return useQueryState('category', marketplaceSearchParamsParsers.category) } export function useFilterPluginTags() { - const preserveSearchStateInQuery = useAtomValue(preserveSearchStateInQueryAtom) - const queryState = useQueryState('tags', marketplaceSearchParamsParsers.tags) - const atomState = useAtom(filterPluginTagsAtom) - return preserveSearchStateInQuery ? queryState : atomState + return useQueryState('tags', marketplaceSearchParamsParsers.tags) } /** diff --git a/web/app/components/plugins/marketplace/hydration-client.tsx b/web/app/components/plugins/marketplace/hydration-client.tsx deleted file mode 100644 index 5698db711f..0000000000 --- a/web/app/components/plugins/marketplace/hydration-client.tsx +++ /dev/null @@ -1,15 +0,0 @@ -'use client' - -import { useHydrateAtoms } from 'jotai/utils' -import { preserveSearchStateInQueryAtom } from './atoms' - -export function HydrateMarketplaceAtoms({ - preserveSearchStateInQuery, - children, -}: { - preserveSearchStateInQuery: boolean - children: React.ReactNode -}) { - useHydrateAtoms([[preserveSearchStateInQueryAtom, preserveSearchStateInQuery]]) - return <>{children} -} diff --git a/web/app/components/plugins/marketplace/index.tsx b/web/app/components/plugins/marketplace/index.tsx index 1f32ee4d29..0eb2488cef 100644 --- a/web/app/components/plugins/marketplace/index.tsx +++ b/web/app/components/plugins/marketplace/index.tsx @@ -1,7 +1,6 @@ import type { SearchParams } from 'nuqs' import { TanstackQueryInitializer } from '@/context/query-client' import Description from './description' -import { HydrateMarketplaceAtoms } from './hydration-client' import { HydrateQueryClient } from './hydration-server' import ListWrapper from './list/list-wrapper' import StickySearchAndSwitchWrapper from './sticky-search-and-switch-wrapper' @@ -10,8 +9,7 @@ type MarketplaceProps = { showInstallButton?: boolean pluginTypeSwitchClassName?: string /** - * Pass the search params from the request to prefetch data on the server - * and preserve the search params in the URL. + * Pass the search params from the request to prefetch data on the server. */ searchParams?: Promise } @@ -24,15 +22,13 @@ const Marketplace = async ({ return ( - - - - - + + + ) diff --git a/web/app/components/plugins/plugin-page/context.tsx b/web/app/components/plugins/plugin-page/context.tsx index fea78ae181..abc4408d62 100644 --- a/web/app/components/plugins/plugin-page/context.tsx +++ b/web/app/components/plugins/plugin-page/context.tsx @@ -68,7 +68,7 @@ export const PluginPageContextProvider = ({ const options = useMemo(() => { return enable_marketplace ? tabs : tabs.filter(tab => tab.value !== PLUGIN_PAGE_TABS_MAP.marketplace) }, [tabs, enable_marketplace]) - const [activeTab, setActiveTab] = useQueryState('category', { + const [activeTab, setActiveTab] = useQueryState('tab', { defaultValue: options[0].value, })