11'use client' ;
22
33import { useEffect , useState } from 'react' ;
4- import { useParams , useSearchParams } from 'next/navigation' ;
4+ import { useParams , useRouter , useSearchParams } from 'next/navigation' ;
55import PageLayout from '@/components/layout/page-layout' ;
66import { useTranslation } from '@/hooks/use-translation' ;
77import { Tabs , TabsContent , TabsList , TabsTrigger } from '@/components/ui/tabs' ;
88import { Skeleton } from '@/components/ui/skeleton' ;
99import { Info , Terminal } from 'lucide-react' ;
10- import { useGetExtensionQuery } from '@/redux/services/extensions/extensionsApi' ;
10+ import { useGetExtensionQuery , useRunExtensionMutation } from '@/redux/services/extensions/extensionsApi' ;
1111import OverviewTab from './components/OverviewTab' ;
1212import ExecutionsTab from './components/LogsTab' ;
13+ import { Button } from '@/components/ui/button' ;
14+ import ExtensionInput from '@/app/extensions/components/extension-input' ;
1315
1416export default function ExtensionDetailsPage ( ) {
1517 const { t } = useTranslation ( ) ;
1618 const params = useParams ( ) ;
1719 const search = useSearchParams ( ) ;
20+ const router = useRouter ( ) ;
1821 const id = ( params ?. id as string ) || '' ;
1922
2023 const { data : extension , isLoading } = useGetExtensionQuery ( { id } ) ;
2124 const [ tab , setTab ] = useState < string > ( 'overview' ) ;
25+ const [ runModalOpen , setRunModalOpen ] = useState ( false ) ;
26+ const [ runExtension , { isLoading : isRunning } ] = useRunExtensionMutation ( ) ;
2227
2328 useEffect ( ( ) => {
2429 const exec = search ?. get ( 'exec' ) ;
@@ -46,6 +51,19 @@ export default function ExtensionDetailsPage() {
4651 </ div >
4752 ) }
4853 </ div >
54+ < div >
55+ { isLoading ? (
56+ < Skeleton className = "h-9 w-28" />
57+ ) : (
58+ < Button
59+ className = "min-w-[112px]"
60+ onClick = { ( ) => setRunModalOpen ( true ) }
61+ disabled = { ! extension || isRunning }
62+ >
63+ { extension ?. extension_type === 'install' ? ( t ( 'extensions.install' ) || 'Install' ) : ( t ( 'extensions.run' ) || 'Run' ) }
64+ </ Button >
65+ ) }
66+ </ div >
4967 </ div >
5068
5169 < div className = "mt-6" >
@@ -70,6 +88,17 @@ export default function ExtensionDetailsPage() {
7088 </ TabsContent >
7189 </ Tabs >
7290 </ div >
91+ < ExtensionInput
92+ open = { runModalOpen }
93+ onOpenChange = { setRunModalOpen }
94+ extension = { extension }
95+ onSubmit = { async ( values ) => {
96+ if ( ! extension ) return ;
97+ const exec = await runExtension ( { extensionId : extension . extension_id , body : { variables : values } } ) . unwrap ( ) ;
98+ setRunModalOpen ( false ) ;
99+ router . push ( `/extensions/${ extension . id } ?exec=${ exec . id } &openLogs=1` ) ;
100+ } }
101+ />
73102 </ PageLayout >
74103 ) ;
75104}
0 commit comments