- import { useCallback } from 'react'
- import { useTranslation } from 'react-i18next'
- import { useStore } from '../store'
- import { getVarType, toNodeAvailableVars } from '@/app/components/workflow/nodes/_base/components/variable/utils'
- import type {
- Node,
- NodeOutPutVar,
- ValueSelector,
- Var,
- } from '@/app/components/workflow/types'
- import { useIsChatMode } from './use-workflow'
- import { useStoreApi } from 'reactflow'
-
- export const useWorkflowVariables = () => {
- const { t } = useTranslation()
- const environmentVariables = useStore(s => s.environmentVariables)
- const conversationVariables = useStore(s => s.conversationVariables)
-
- const getNodeAvailableVars = useCallback(({
- parentNode,
- beforeNodes,
- isChatMode,
- filterVar,
- hideEnv,
- hideChatVar,
- }: {
- parentNode?: Node | null
- beforeNodes: Node[]
- isChatMode: boolean
- filterVar: (payload: Var, selector: ValueSelector) => boolean
- hideEnv?: boolean
- hideChatVar?: boolean
- }): NodeOutPutVar[] => {
- return toNodeAvailableVars({
- parentNode,
- t,
- beforeNodes,
- isChatMode,
- environmentVariables: hideEnv ? [] : environmentVariables,
- conversationVariables: (isChatMode && !hideChatVar) ? conversationVariables : [],
- filterVar,
- })
- }, [conversationVariables, environmentVariables, t])
-
- const getCurrentVariableType = useCallback(({
- parentNode,
- valueSelector,
- isIterationItem,
- isLoopItem,
- availableNodes,
- isChatMode,
- isConstant,
- }: {
- valueSelector: ValueSelector
- parentNode?: Node | null
- isIterationItem?: boolean
- isLoopItem?: boolean
- availableNodes: any[]
- isChatMode: boolean
- isConstant?: boolean
- }) => {
- return getVarType({
- parentNode,
- valueSelector,
- isIterationItem,
- isLoopItem,
- availableNodes,
- isChatMode,
- isConstant,
- environmentVariables,
- conversationVariables,
- })
- }, [conversationVariables, environmentVariables])
-
- return {
- getNodeAvailableVars,
- getCurrentVariableType,
- }
- }
-
- export const useWorkflowVariableType = () => {
- const store = useStoreApi()
- const {
- getNodes,
- } = store.getState()
- const { getCurrentVariableType } = useWorkflowVariables()
-
- const isChatMode = useIsChatMode()
-
- const getVarType = ({
- nodeId,
- valueSelector,
- }: {
- nodeId: string,
- valueSelector: ValueSelector,
- }) => {
- const node = getNodes().find(n => n.id === nodeId)
- const isInIteration = !!node?.data.isInIteration
- const iterationNode = isInIteration ? getNodes().find(n => n.id === node.parentId) : null
- const availableNodes = [node]
-
- const type = getCurrentVariableType({
- parentNode: iterationNode,
- valueSelector,
- availableNodes,
- isChatMode,
- isConstant: false,
- })
- return type
- }
-
- return getVarType
- }
|