From 38026dd2d34c60959b0a7f32be25c059d3b7ed4c Mon Sep 17 00:00:00 2001 From: bilalesi Date: Mon, 8 Sep 2025 13:12:27 +0200 Subject: [PATCH] fix memodel configuration add wallet click on admin role --- src/ui/segments/project/balance.tsx | 67 +++++++++++++++---- .../credits/credits-transfer-modal.tsx | 44 +++++++++--- .../elements/manage-credits.tsx | 7 +- .../workflows/build/memodel/index.tsx | 16 ++++- 4 files changed, 105 insertions(+), 29 deletions(-) diff --git a/src/ui/segments/project/balance.tsx b/src/ui/segments/project/balance.tsx index 35159f5d3..a4c1989d5 100644 --- a/src/ui/segments/project/balance.tsx +++ b/src/ui/segments/project/balance.tsx @@ -1,18 +1,25 @@ import { LoadingOutlined, WarningOutlined } from '@ant-design/icons'; import { useQuery } from '@tanstack/react-query'; import { match, P } from 'ts-pattern'; -import { Tooltip } from 'antd'; +import { useState } from 'react'; +import { CreditsTransferModal } from '@/ui/segments/project/credits/credits-transfer-modal'; +import { Tooltip, TooltipContent, TooltipTrigger } from '@/ui/molecules/tooltip'; import { getProjectAccountBalance } from '@/services/virtual-lab/projects'; import { useDefaultBreakpoint } from '@/ui/hooks/create-break-point'; +import { getUserGroups } from '@/api/virtual-lab-svc/queries/user'; +import { keyBuilder } from '@/ui/use-query-keys/workspace'; import { useWorkspace } from '@/ui/hooks/use-workspace'; import { CoinsIcon } from '@/components/icons/buttons'; -import { keyBuilder } from '@/ui/use-query-keys/workspace'; +import { makeRoles } from '@/hooks/use-user-role'; import { Badge } from '@/ui/molecules/badge'; +import { cn } from '@/utils/css-class'; export function Wallet() { const breakpoint = useDefaultBreakpoint(); const { virtualLabId, projectId } = useWorkspace(); + const [showCreditsManagement, setShowCreditsManagement] = useState(false); + const handleTransferCredits = () => setShowCreditsManagement((prev) => !prev); const { data, isLoading, isError, isSuccess, error } = useQuery({ queryKey: keyBuilder.wallet({ virtualLabId, projectId }), @@ -20,26 +27,58 @@ export function Wallet() { select: (res) => res.balance, }); + const { data: roles, isLoading: loadingRoles } = useQuery({ + queryKey: keyBuilder.roles(), + queryFn: getUserGroups, + }); + + const { isAdmin } = makeRoles(roles, virtualLabId, projectId); + const content = match({ isError, isLoading, isSuccess, data, error }) .with({ isLoading: true }, () => ) .with({ isError: true, error: P.select() }, (err) => ( - - + + + + + {err?.message} )) .with({ isSuccess: true, data: P.select() }, (balance) => <>{balance}) .otherwise(() => null); return ( - - - {content} - + <> + + + + + {content} + + + {!isAdmin && ( + + For more information, please contact the Virtual lab administrators. + + )} + + + ); } diff --git a/src/ui/segments/project/credits/credits-transfer-modal.tsx b/src/ui/segments/project/credits/credits-transfer-modal.tsx index ee9fc140e..1f66fb316 100644 --- a/src/ui/segments/project/credits/credits-transfer-modal.tsx +++ b/src/ui/segments/project/credits/credits-transfer-modal.tsx @@ -1,11 +1,16 @@ 'use client'; import { CloseOutlined } from '@ant-design/icons'; +import { useQuery } from '@tanstack/react-query'; import noop from 'lodash/noop'; import { ManageCreditsStep } from '@/ui/segments/virtual-lab-settings/elements/manage-credits'; +import { getProject } from '@/api/virtual-lab-svc/queries/project'; +import { keyBuilder } from '@/ui/use-query-keys/workspace'; import { useWorkspace } from '@/ui/hooks/use-workspace'; import { Modal } from '@/ui/molecules/modal'; +import { Button } from '@/ui/molecules/button'; +import { cn } from '@/utils/css-class'; type Props = { open: boolean; @@ -13,31 +18,48 @@ type Props = { }; export function CreditsTransferModal({ open, onClose }: Props) { - const { virtualLabId } = useWorkspace(); + const { virtualLabId, projectId } = useWorkspace(); + const { data: project } = useQuery({ + queryKey: keyBuilder.getOne({ virtualLabId, projectId }), + queryFn: () => getProject({ virtualLabId, projectId }), + }); return ( -

Transfer Credits

-

- Transfer credits between your virtual lab and projects. -

+
+
+

{project?.data.project.name}

+

+ Transfer credits between your virtual lab and projects. +

+
+
} - onClose={onClose} size="auto" position="center" animation="scale" maxWidth={700} width={700} className="!bg-primary-9 !fixed !top-1/2 !left-1/2 !z-[1000] !-translate-x-1/2 !-translate-y-1/2 !transform" - closable - closeIcon={} - closeIconClassName="hover:bg-neutral-1/40" + headerClassName={cn('[&>div]:w-full')} > - +
); } diff --git a/src/ui/segments/virtual-lab-settings/elements/manage-credits.tsx b/src/ui/segments/virtual-lab-settings/elements/manage-credits.tsx index 05cfcb149..80f149bf1 100644 --- a/src/ui/segments/virtual-lab-settings/elements/manage-credits.tsx +++ b/src/ui/segments/virtual-lab-settings/elements/manage-credits.tsx @@ -29,6 +29,7 @@ type ManageCreditsStepProps = { virtualLabId: string; onBack: () => void; shouldHaveBack?: boolean; + swapClassname?: string; }; type TransferDirection = 'vlab->proj' | 'proj->vlab'; @@ -70,6 +71,7 @@ export function ManageCreditsStep({ onBack, virtualLabId, shouldHaveBack = true, + swapClassname, }: ManageCreditsStepProps) { const queryClient = useQueryClient(); const [amount, setAmount] = useState(undefined); @@ -237,7 +239,10 @@ export function ManageCreditsStep({ isNil(sessionValue) || isNil(sessionValue.mmodel), () => ) + .with( + { step: BuildStep.MModel, sessionValue: P.when((v) => !isNil(v.mmodel)) }, + () => !isNil(sessionValue.mmodel), + () => + ) .with( { step: BuildStep.EModel }, () => isNil(sessionValue) || isNil(sessionValue.emodel), () => ) + .with( + { step: BuildStep.EModel }, + () => !isNil(sessionValue.emodel), + () => + ) .otherwise(() => null); return content;