Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions amplify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ frontend:
- echo "VITE_YIELDS_API_URL=$VITE_YIELDS_API_URL" >> packages/widget/.env
- echo "VITE_API_URL=$VITE_API_URL" >> packages/widget/.env
- echo "VITE_API_KEY=$VITE_API_KEY" >> packages/widget/.env
- echo "VITE_FORCE_BORROW=$VITE_FORCE_BORROW" >> packages/widget/.env

build:
commands:
Expand Down
6 changes: 0 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,5 @@
"husky": "catalog:",
"rev-dep": "catalog:",
"turbo": "catalog:"
},
"pnpm": {
"patchedDependencies": {
"purify-ts": "patches/purify-ts.patch",
"@stakekit/rainbowkit@2.2.11": "patches/@stakekit__rainbowkit@2.2.11.patch"
}
}
}
3 changes: 2 additions & 1 deletion packages/widget/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@ VITE_FORCE_WALLET_CONNECT_ONLY=false
VITE_ENABLE_MSW_MOCK=true
VITE_SHOW_QUERY_DEVTOOLS=true
VITE_FORCE_ADDRESS=
VITE_FORCE_BORROW=
VITE_FORCE_DASHBOARD=
VITE_APP_VARIANT=
VITE_APP_VARIANT=
2 changes: 1 addition & 1 deletion packages/widget/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
"@cosmos-kit/keplr": "catalog:",
"@cosmos-kit/leap": "catalog:",
"@cosmos-kit/walletconnect": "catalog:",
"@effect/atom-react": "catalog:",
"@effect/openapi-generator": "catalog:",
"@effect/platform-node": "catalog:",
"@faker-js/faker": "catalog:",
Expand Down Expand Up @@ -117,7 +118,6 @@
"@vitejs/plugin-react": "catalog:",
"@vitest/browser-playwright": "catalog:",
"@xstate/react": "catalog:",
"@xstate/store": "catalog:",
"autoprefixer": "catalog:",
"babel-plugin-react-compiler": "catalog:",
"bignumber.js": "catalog:",
Expand Down
39 changes: 35 additions & 4 deletions packages/widget/scripts/generate-effect-openapi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@ type JsonPatchOperation = {
};

type SpecConfig = {
format?: "httpclient" | "httpclient-type-only";
name: string;
outputPath: string;
patches: JsonPatchOperation[];
prepareSpec?: (contents: string) => string;
specFileName: string;
url: string;
};
Expand Down Expand Up @@ -72,6 +74,22 @@ const specs: SpecConfig[] = [
},
],
},
{
name: "BorrowApi",
url:
process.env.BORROW_API_SPEC_URL ?? "https://borrow.yield.xyz/docs.json",
specFileName: "borrow-api.json",
outputPath: path.join(widgetRoot, "src/generated/api/borrow.ts"),
// Borrow domain code needs generated runtime schemas as well as the client,
// so this spec intentionally uses the full httpclient format.
format: "httpclient",
patches: [],
prepareSpec: (contents) =>
contents.replaceAll(
'"allOf":[{"$ref":"#/components/schemas/ArgumentSchemaPropertyDto"}]',
'"type":"object"'
),
},
];

const run = async (
Expand Down Expand Up @@ -140,7 +158,8 @@ const generateSpec = async (spec: SpecConfig, tempDir: string) => {
const patchPath = path.join(tempDir, `${spec.specFileName}.patch.json`);

console.log(`Fetching ${spec.name} spec from ${spec.url}`);
await writeFile(specPath, await fetchSpec(spec));
const specContents = await fetchSpec(spec);
await writeFile(specPath, spec.prepareSpec?.(specContents) ?? specContents);
await writeFile(patchPath, `${JSON.stringify(spec.patches, null, 2)}\n`);
await mkdir(path.dirname(spec.outputPath), { recursive: true });

Expand All @@ -153,7 +172,7 @@ const generateSpec = async (spec: SpecConfig, tempDir: string) => {
"--name",
spec.name,
"--format",
"httpclient-type-only",
spec.format ?? "httpclient-type-only",
"--patch",
patchPath,
]);
Expand All @@ -171,9 +190,19 @@ const generateSpec = async (spec: SpecConfig, tempDir: string) => {

const main = async () => {
const tempDir = await mkdtemp(path.join(tmpdir(), "stakekit-openapi-"));
const requestedSpecs = new Set(process.argv.slice(2));
const selectedSpecs = requestedSpecs.size
? specs.filter((spec) => requestedSpecs.has(spec.name))
: specs;

if (!selectedSpecs.length) {
throw new Error(
`No OpenAPI specs matched: ${[...requestedSpecs].join(", ")}`
);
}

try {
for (const spec of specs) {
for (const spec of selectedSpecs) {
await generateSpec(spec, tempDir);
}

Expand All @@ -183,7 +212,9 @@ const main = async () => {
"check",
"--write",
"--unsafe",
...specs.map((spec) => path.relative(widgetRoot, spec.outputPath)),
...selectedSpecs.map((spec) =>
path.relative(widgetRoot, spec.outputPath)
),
]);
} finally {
await rm(tempDir, { force: true, recursive: true });
Expand Down
167 changes: 106 additions & 61 deletions packages/widget/src/Dashboard.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import { Route, Routes } from "react-router";
import { Navigate, Route, Routes } from "react-router";
import { GlobalModals } from "./components/molecules/global-modals";
import { ConnectedCheck } from "./navigation/cheks/connected-check";
// import { RewardsTabPage } from "./pages-dashboard/rewards";
import { PendingCompletePage } from "./pages/complete/pages/pending-complete.page";
import { StakeCompletePage } from "./pages/complete/pages/stake-complete.page";
import { UnstakeCompletePage } from "./pages/complete/pages/unstake-complete.page";
import { EarnPageContextProvider } from "./pages/details/earn-page/state/earn-page-context";
import { EarnPageStateUsageBoundaryProvider } from "./pages/details/earn-page/state/earn-page-state-context";
import { StakeReviewPage } from "./pages/review";
import { PendingReviewPage } from "./pages/review/pages/pending-review.page";
import { UnstakeReviewPage } from "./pages/review/pages/unstake-review.page";
Expand All @@ -16,6 +15,17 @@ import { PendingStepsPage } from "./pages/steps/pages/pending-steps.page";
import { UnstakeStepsPage } from "./pages/steps/pages/unstake-steps.page";
import { ActivityTabPage } from "./pages-dashboard/activity";
import { ActivityDetailsPage } from "./pages-dashboard/activity/activity-details.page";
import { BorrowFormPage, BorrowLayout } from "./pages-dashboard/borrow";
import { BorrowCompletePage } from "./pages-dashboard/borrow/complete";
import { BorrowConnectedWalletRoute } from "./pages-dashboard/borrow/connected-wallet";
import {
BorrowPositionActionPage,
BorrowPositionActionsPage,
BorrowPositionDetailsPage,
} from "./pages-dashboard/borrow/position-details";
import { BorrowReviewPage } from "./pages-dashboard/borrow/review";
import { BorrowStepsPage } from "./pages-dashboard/borrow/steps";
import { useBorrowFeatureEnabled } from "./pages-dashboard/borrow/use-borrow-feature-enabled";
import { DashboardWrapper } from "./pages-dashboard/common/components/wrapper";
import { OverviewPage } from "./pages-dashboard/overview";
import { EarnPageContent } from "./pages-dashboard/overview/earn-page";
Expand All @@ -34,83 +44,118 @@ export const shouldRegisterDashboardEarnFooterButton = (pathname: string) =>

export const Dashboard = () => {
const { current } = useSKLocation();
const borrowFeatureEnabled = useBorrowFeatureEnabled();
const registerEarnFooterButton = shouldRegisterDashboardEarnFooterButton(
current.pathname
);
const borrowRoutes = borrowFeatureEnabled ? (
<>
<Route path="borrow" element={<BorrowLayout />}>
<Route index element={<BorrowFormPage />} />
<Route element={<BorrowConnectedWalletRoute />}>
<Route path="review" element={<BorrowReviewPage />} />
<Route path="steps" element={<BorrowStepsPage />} />
<Route path="complete" element={<BorrowCompletePage />} />
</Route>
</Route>
<Route element={<BorrowConnectedWalletRoute />}>
<Route
path="positions/borrow/:marketId"
element={<BorrowPositionDetailsPage />}
>
<Route index element={<BorrowPositionActionsPage />} />
<Route
path="action/:actionId"
element={<BorrowPositionActionPage />}
/>
<Route path="review" element={<BorrowReviewPage />} />
<Route path="steps" element={<BorrowStepsPage />} />
<Route path="complete" element={<BorrowCompletePage />} />
</Route>
</Route>
</>
) : (
<>
<Route path="borrow/*" element={<Navigate to="/" replace />} />
<Route
path="positions/borrow/:marketId/*"
element={<Navigate to="/manage" replace />}
/>
</>
);

return (
<DashboardProvider>
<EarnPageStateUsageBoundaryProvider>
<EarnPageContextProvider
registerFooterButton={registerEarnFooterButton}
>
<Routes>
<Route element={<DashboardWrapper />}>
{/* Earn Tab */}
<Route element={<OverviewPage />}>
<Route index element={<EarnPageContent />} />
<EarnPageContextProvider registerFooterButton={registerEarnFooterButton}>
<Routes>
<Route element={<DashboardWrapper />}>
{/* Earn Tab */}
<Route element={<OverviewPage />}>
<Route index element={<EarnPageContent />} />

<Route element={<ConnectedCheck />}>
<Route path="review" element={<StakeReviewPage />} />
<Route path="steps" element={<StakeStepsPage />} />
<Route path="complete" element={<StakeCompletePage />} />
</Route>
<Route element={<ConnectedCheck />}>
<Route path="review" element={<StakeReviewPage />} />
<Route path="steps" element={<StakeStepsPage />} />
<Route path="complete" element={<StakeCompletePage />} />
</Route>
</Route>

{/* Manage Tab */}
<Route path="manage" element={<ManagePage />} />
{/* Manage Tab */}
<Route path="manage" element={<ManagePage />} />

{/* Position Details */}
<Route
path="positions/:integrationId/:balanceId"
element={<PositionDetailsPage />}
>
<Route index element={<PositionDetailsStakeActions />} />
{/* Borrow Tab */}
{borrowRoutes}

{/* Position Details */}
<Route
path="positions/:integrationId/:balanceId"
element={<PositionDetailsPage />}
>
<Route index element={<PositionDetailsStakeActions />} />

{/* Staking */}
<Route path="stake">
<Route index element={<PositionDetailsStakeActions />} />
<Route path="review" element={<StakeReviewPage />} />
<Route path="steps" element={<StakeStepsPage />} />
<Route path="complete" element={<StakeCompletePage />} />
</Route>
{/* Staking */}
<Route path="stake">
<Route index element={<PositionDetailsStakeActions />} />
<Route path="review" element={<StakeReviewPage />} />
<Route path="steps" element={<StakeStepsPage />} />
<Route path="complete" element={<StakeCompletePage />} />
</Route>

<Route
path="select-validator/:pendingActionType"
element={<PositionDetailsPage />}
/>
<Route
path="select-validator/:pendingActionType"
element={<PositionDetailsPage />}
/>

{/* Unstaking */}
<Route path="unstake">
<Route index element={<PositionDetailsActions />} />
<Route path="review" element={<UnstakeReviewPage />} />
<Route path="steps" element={<UnstakeStepsPage />} />
<Route path="complete" element={<UnstakeCompletePage />} />
</Route>
{/* Unstaking */}
<Route path="unstake">
<Route index element={<PositionDetailsActions />} />
<Route path="review" element={<UnstakeReviewPage />} />
<Route path="steps" element={<UnstakeStepsPage />} />
<Route path="complete" element={<UnstakeCompletePage />} />
</Route>

{/* Pending Actions */}
<Route path="pending-action">
<Route path="review" element={<PendingReviewPage />} />
<Route path="steps" element={<PendingStepsPage />} />
<Route path="complete" element={<PendingCompletePage />} />
</Route>
{/* Pending Actions */}
<Route path="pending-action">
<Route path="review" element={<PendingReviewPage />} />
<Route path="steps" element={<PendingStepsPage />} />
<Route path="complete" element={<PendingCompletePage />} />
</Route>
</Route>

{/* Rewards Tab */}
{/* <Route path="rewards" element={<RewardsTabPage />} /> */}
{/* Rewards Tab */}
{/* <Route path="rewards" element={<RewardsTabPage />} /> */}

{/* Activity Tab */}
<Route path="activity" element={<ActivityTabPage />}>
<Route index element={<ActivityDetailsPage />} />
<Route
path=":pendingActionType/steps"
element={<ActivityStepsPage />}
/>
</Route>
{/* Activity Tab */}
<Route path="activity" element={<ActivityTabPage />}>
<Route index element={<ActivityDetailsPage />} />
<Route
path=":pendingActionType/steps"
element={<ActivityStepsPage />}
/>
</Route>
</Routes>
</EarnPageContextProvider>
</EarnPageStateUsageBoundaryProvider>
</Route>
</Routes>
</EarnPageContextProvider>

<GlobalModals />
</DashboardProvider>
Expand Down
Loading