@@ -8,14 +8,16 @@ import {type NodeProps} from "@xyflow/react";
88import { useCallback , useState } from "react" ;
99import { AppNode , assertIsEnhancedNodeData , assertIsGetDataNodeData } from "../../types/workflow" ;
1010import { BaseNode } from "./BaseNode" ;
11- import { FormControl , InputLabel , MenuItem , Select , TextField } from "@mui/material" ;
11+ import { FormControl , InputLabel , MenuItem , Select } from "@mui/material" ;
1212
1313import { runTask } from "./BaseNode/utils" ;
1414import { BaseDialog } from "../BaseDialog" ;
1515import { LogsDialog } from "../LogsDialog" ;
1616import { FetchDataType , TaskNodeIcons } from "../../constants" ;
1717import { parseUrl } from "../../utils" ;
18- import { useDebouncedState } from "../../hooks/useDebouncedState" ;
18+ import { DebouncedTextField } from "../DebouncedTextField" ;
19+ import { useTimerTrigger } from "../../hooks/useTimerTrigger" ;
20+ import { TimerTriggerPort } from "./TimerNode/TimerTriggerPort" ;
1921
2022const DATA_TYPE_LABEL = "Data Type" ;
2123
@@ -27,24 +29,25 @@ export function GetDataNode ({data, id, type}: NodeProps<AppNode>) {
2729 const [ error , setError ] = useState < string | null > ( null ) ;
2830 const [ openSettings , setOpenSettings ] = useState ( false ) ;
2931 const [ openLogs , setOpenLogs ] = useState ( false ) ;
32+ const { input, url, title, dataType, onResultUpdate, onConfigChange} = data ;
3033
3134 const handleRun = useCallback ( ( ) => {
3235 setError ( null ) ;
33- data . onResultUpdate ( id ) ;
36+ onResultUpdate ( id ) ;
3437
3538 runTask ( async ( ) => {
3639 try {
37- const url = parseUrl ( data . url ) ;
40+ const parsedUrl = parseUrl ( url ) ;
3841
39- const response = await fetch ( url ) ;
42+ const response = await fetch ( parsedUrl ) ;
4043
4144 if ( ! response . ok ) {
4245 throw new Error ( `HTTP ${ response . status } : ${ response . statusText } ` ) ;
4346 }
4447
4548 let getData ;
4649
47- switch ( data . dataType ) {
50+ switch ( dataType ) {
4851 case "json" :
4952 getData = await response . json ( ) ;
5053 break ;
@@ -61,25 +64,19 @@ export function GetDataNode ({data, id, type}: NodeProps<AppNode>) {
6164 getData = await response . text ( ) ;
6265 }
6366
64- data . onResultUpdate ( id , getData ) ;
67+ onResultUpdate ( id , getData ) ;
6568 } catch ( error ) {
6669 setError ( `Error fetching data: ${ error instanceof Error ? error . message : 'Unknown error' } ` ) ;
6770
68- data . onResultUpdate ( id ) ;
71+ onResultUpdate ( id ) ;
6972 }
7073
7174 } , setIsRunning ) ;
7275 } , [ data , id ] ) ;
7376
74- const [ url , setUrl ] = useDebouncedState ( {
75- callback : ( value : string ) => {
76- data . onConfigChange ( id , { url : value } ) ;
77- } ,
78- delay : 300 ,
79- initialValue : data . url
80- } ) ;
77+ useTimerTrigger ( input ?. timerTrigger , handleRun ) ;
8178
82- const hasMissingConfig = ! data . url || ! data . dataType ;
79+ const hasMissingConfig = ! url || ! dataType ;
8380
8481 return (
8582 < >
@@ -89,7 +86,10 @@ export function GetDataNode ({data, id, type}: NodeProps<AppNode>) {
8986 ports = { {
9087 output : true
9188 } }
92- title = { data . title }
89+ extraPorts = {
90+ < TimerTriggerPort />
91+ }
92+ title = { title }
9393 settings = { { callback : ( ) => setOpenSettings ( true ) , highlight : hasMissingConfig } }
9494 run = { handleRun }
9595 running = { isRunning }
@@ -99,33 +99,33 @@ export function GetDataNode ({data, id, type}: NodeProps<AppNode>) {
9999 < LogsDialog
100100 open = { openLogs }
101101 onClose = { ( ) => setOpenLogs ( false ) }
102- title = { data . title }
102+ title = { title }
103103 error = { error }
104104 />
105105
106106 < BaseDialog
107107 open = { openSettings }
108108 onClose = { ( ) => setOpenSettings ( false ) }
109- title = { data . title }
109+ title = { title }
110110 >
111- < TextField
111+ < DebouncedTextField
112112 label = "URL"
113113 variant = "outlined"
114114 fullWidth
115115 value = { url }
116- onChange = { ( e ) => {
117- setUrl ( e . target . value ) ;
116+ onChange = { ( value ) => {
117+ onConfigChange ( id , { url : value } ) ;
118118 } }
119- sx = { { mt : 2 } }
119+ sx = { { mb : 2 } }
120120 />
121121 < FormControl fullWidth size = "small" sx = { { mb : 2 , mt : 1 } } >
122122 < InputLabel id = "data-type-label" > { DATA_TYPE_LABEL } </ InputLabel >
123123 < Select
124124 labelId = "data-type-label"
125125 label = { DATA_TYPE_LABEL }
126- value = { data . dataType || "" }
126+ value = { dataType || "" }
127127 onChange = { e => {
128- data . onConfigChange ( id , { dataType : e . target . value } ) ;
128+ onConfigChange ( id , { dataType : e . target . value } ) ;
129129 } }
130130 >
131131 < MenuItem value = "" disabled >
0 commit comments