,
)
React.useEffect(() => {
const handleChangeFocusedFile = (fileUri: { fileUri: string }) => {
const model = Object.values(modelsRecord).find(m =>
isSameFilePath(m.full_path, fileUri.fileUri),
)
if (model) {
setSelectedModel(model.name)
}
}
const handleSavedFile = () => {
queryClient.invalidateQueries()
}
const offChangeFocusedFile = on(
'changeFocusedFile',
handleChangeFocusedFile,
)
const offSavedFile = on('savedFile', handleSavedFile)
// If your event bus returns an "off" function, call it on cleanup
return () => {
if (offChangeFocusedFile) offChangeFocusedFile()
if (offSavedFile) offSavedFile()
}
}, [on, queryClient, modelsRecord])
if (modelsError) {
return Error: {modelsError.message}
}
if (
isLoadingModels ||
models === undefined ||
modelsRecord === false ||
selectedModel === undefined
) {
return Loading models...
}
if (!Array.isArray(models)) {
return Error: Models data is not in the expected format
}
return (
)
}
export function LineageComponentFromWeb({
selectedModel,
models,
}: {
selectedModel: string
models: Record
}): JSX.Element {
const vscode = useVSCode()
function handleClickModel(id: string): void {
const decodedId = decodeURIComponent(id)
const model = Object.values(models).find(m => m.fqn === decodedId)
if (!model) {
throw new Error('Model not found')
}
if (!model.full_path) {
return
}
vscode('openFile', { filePath: model.full_path })
}
function handleError(error: any): void {
console.error(error)
}
const model = models[selectedModel]
if (!model) {
return Error: Model not found
}
const sqlmModel = new ModelSQLMeshModel()
sqlmModel.update({
...model,
name: model.name as ModelName,
fqn: model.fqn as ModelEncodedFQN,
path: model.path as ModelPath,
full_path: model.full_path as ModelFullPath,
})
return (
)
}