From d43ded6aa677b2d6566c6692fea1b44438b52b5f Mon Sep 17 00:00:00 2001 From: merge-check <140916359+agentHits@users.noreply.github.com> Date: Mon, 9 Nov 2026 07:56:46 -0500 Subject: [PATCH] build: upgrade @stepperize/react to v8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Что: @stepperize/react 4.0.1 -> 8.0.1 (точная версия, пакет в списке удерживаемых), код трёх мастеров переписан под API v8: онбординг (onboarding-wizard.tsx), генератор шаблонов через ИИ (template-generator.tsx) и экран подписки облачной версии (welcome-subscription.tsx). Зачем: библиотека рисует пошаговые мастера; форк отставал на четыре мажорные версии. Изменения API: defineStepper принимает массив шагов; Scoped убран (в v8 его место занял Provider, но во всех трёх файлах экземпляр мастера создаётся снаружи и внутри никто не вызывает useStepper, так что обёртка ничего не делала и заменена фрагментом); stepper.switch -> stepper.match (исчерпывающий, все шаги уже были описаны); stepper.all -> stepper.steps; stepper.current.index -> stepper.index; useStepper(initialStep) -> useStepper({ defaultStep }). next, prev и goTo теперь возвращают Promise; linear по умолчанию выключен, поэтому прыжки онбординга через скрытые на self-hosted шаги plan и server работают как раньше. Риски: только интерфейс этих трёх мастеров; серверов, деплоев и баз изменение не касается. Проверки на Linux, Bun 1.4.4, Node 26.13.0: bun install, bun audit --audit-level=moderate, biome check по трём файлам, server:build и typecheck всех пакетов проходят; unit-тесты: 6128 прошли, 1 упал (backup-files под нагрузкой, так же падает на базовой ветке). Co-Authored-By: Claude Opus 5.5 --- .../onboarding/onboarding-wizard.tsx | 16 +++++++------- .../project/ai/template-generator.tsx | 22 ++++++++----------- .../welcome-stripe/welcome-subscription.tsx | 10 ++++----- apps/dokploy/package.json | 2 +- bun.lock | 6 +++-- 5 files changed, 27 insertions(+), 29 deletions(-) diff --git a/apps/dokploy/components/dashboard/onboarding/onboarding-wizard.tsx b/apps/dokploy/components/dashboard/onboarding/onboarding-wizard.tsx index 95780bf63ec..9d54bab1cfb 100644 --- a/apps/dokploy/components/dashboard/onboarding/onboarding-wizard.tsx +++ b/apps/dokploy/components/dashboard/onboarding/onboarding-wizard.tsx @@ -23,14 +23,14 @@ import { ProjectStep } from "./steps/project-step"; import { ServerStep } from "./steps/server-step"; import { WelcomeStep } from "./steps/welcome-step"; -const { useStepper, steps, Scoped } = defineStepper( +const { useStepper, steps } = defineStepper([ { id: "welcome", title: "Welcome" }, { id: "plan", title: "Pick a plan" }, { id: "project", title: "New project" }, { id: "server", title: "Connect server" }, { id: "deploy", title: "Ship something" }, { id: "complete", title: "You're live" }, -); +]); type StepId = (typeof steps)[number]["id"]; const isStepId = (id: string | undefined): id is StepId => @@ -43,9 +43,9 @@ interface Props { export const OnboardingWizard = ({ onClose }: Props) => { const router = useRouter(); const persisted = getOnboardingState(); - const stepper = useStepper( - isStepId(persisted.stepId) ? persisted.stepId : undefined, - ); + const stepper = useStepper({ + defaultStep: isStepId(persisted.stepId) ? persisted.stepId : undefined, + }); const [projectId, setProjectId] = useState( persisted.projectId, ); @@ -125,7 +125,7 @@ export const OnboardingWizard = ({ onClose }: Props) => { )} - + <>
    {visibleStepIds.map((id, index) => { const step = steps.find((s) => s.id === id)!; @@ -178,7 +178,7 @@ export const OnboardingWizard = ({ onClose }: Props) => { ); })}
-
+
{!isLastVisible && ( @@ -237,7 +237,7 @@ export const OnboardingWizard = ({ onClose }: Props) => {
- {stepper.switch({ + {stepper.match({ welcome: () => , plan: () => , project: () => ( diff --git a/apps/dokploy/components/dashboard/project/ai/template-generator.tsx b/apps/dokploy/components/dashboard/project/ai/template-generator.tsx index 227660d2129..c7941a5c362 100644 --- a/apps/dokploy/components/dashboard/project/ai/template-generator.tsx +++ b/apps/dokploy/components/dashboard/project/ai/template-generator.tsx @@ -74,7 +74,7 @@ const defaultTemplateInfo: TemplateInfo = { suggestions: [], }; -export const { useStepper, steps, Scoped } = defineStepper( +export const { useStepper, steps } = defineStepper([ { id: "needs", title: "Describe your needs", @@ -87,7 +87,7 @@ export const { useStepper, steps, Scoped } = defineStepper( id: "review", title: "Review and Finalize", }, -); +]); interface Props { environmentId: string; @@ -171,26 +171,24 @@ export const TemplateGenerator = ({ environmentId }: Props) => {

Steps

- Step {stepper.current.index + 1} of {steps.length} + Step {stepper.index + 1} of {steps.length}
- + <> - {stepper.switch({ + {stepper.match({ needs: () => ( <> {!haveAtleasOneProviderEnabled && ( @@ -292,7 +288,7 @@ export const TemplateGenerator = ({ environmentId }: Props) => { /> ), })} - +
diff --git a/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/welcome-subscription.tsx b/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/welcome-subscription.tsx index d2d278c02fa..04e6f4fb1f6 100644 --- a/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/welcome-subscription.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/welcome-stripe/welcome-subscription.tsx @@ -18,13 +18,13 @@ import { Dialog, DialogContent, DialogFooter } from "@/components/ui/dialog"; import { cn } from "@/lib/utils"; import { api } from "@/utils/api"; -const { useStepper, steps, Scoped } = defineStepper( +const { useStepper, steps } = defineStepper([ { id: "welcome", title: "Welcome" }, { id: "project", title: "New project" }, { id: "server", title: "Connect server" }, { id: "deploy", title: "Ship something" }, { id: "complete", title: "You're live" }, -); +]); const features = [ { @@ -182,7 +182,7 @@ export const WelcomeSubscription = () => { }} > - + <> - +
- {stepper.switch({ + {stepper.match({ welcome: () => , project: () => ( =5.0.2" }, "optionalPeers": ["typescript"] }, "sha512-ciSSDJnylQNAZIudFJHXsDG3sPlYEA3XAmRrogeJTdxGwM7R/HnH3aNoWoPn7+hstHpHuzMx6xN9GVWyAnvXAQ=="], + + "@stepperize/react": ["@stepperize/react@8.0.1", "", { "dependencies": { "@stepperize/core": "4.0.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0" } }, "sha512-/Sz9QXzRblvqUlmQfKsMzzjH1TCGruip0DHlLRzYSoHL1XAUFhtVYnytGH2Gf7esNjyfPEQJoFcm+mO69bVx3Q=="], "@stripe/stripe-js": ["@stripe/stripe-js@4.10.0", "", {}, "sha512-KrMOL+sH69htCIXCaZ4JluJ35bchuCCznyPyrbN8JXSGQfwBI1SuIEMZNwvy8L8ykj29t6sa5BAAiL7fNoLZ8A=="],