@danikokonn/yarik-frontend-lib 2.0.55 → 2.0.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"SubtaskItem.d.ts","sourceRoot":"","sources":["../../../src/components/SubtaskItem/SubtaskItem.tsx"],"names":[],"mappings":"AAgBA,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAiBlD,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAClC,YAAY,EACZ,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,uBAAuB,GACxB,EAAE,gBAAgB,2CAwIlB"}
1
+ {"version":3,"file":"SubtaskItem.d.ts","sourceRoot":"","sources":["../../../src/components/SubtaskItem/SubtaskItem.tsx"],"names":[],"mappings":"AAgBA,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAmBlD,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAClC,YAAY,EACZ,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,uBAAuB,GACxB,EAAE,gBAAgB,2CAwIlB"}
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import AccessTimeSharpIcon from "@mui/icons-material/AccessTimeSharp";
3
3
  import BlockSharpIcon from "@mui/icons-material/BlockSharp";
4
4
  import CheckCircleOutlineRoundedIcon from "@mui/icons-material/CheckCircleOutlineRounded";
5
+ import CloudOffIcon from "@mui/icons-material/CloudOff";
5
6
  import DoneIcon from "@mui/icons-material/Done";
6
7
  import ErrorOutlineSharpIcon from "@mui/icons-material/ErrorOutlineSharp";
7
8
  import ExpandMore from "@mui/icons-material/ExpandMore";
@@ -10,9 +11,9 @@ import Accordion from "@mui/material/Accordion";
10
11
  import AccordionDetails from "@mui/material/AccordionDetails";
11
12
  import AccordionSummary from "@mui/material/AccordionSummary";
12
13
  import CircularProgress from "@mui/material/CircularProgress";
13
- import { taskStateText } from "../../utils";
14
14
  import moment from "moment";
15
15
  import { useState } from "react";
16
+ import { taskStateText } from "../../utils";
16
17
  const SubtaskState = ({ state }) => {
17
18
  switch (state) {
18
19
  case "success":
@@ -23,6 +24,8 @@ const SubtaskState = ({ state }) => {
23
24
  return _jsx(AccessTimeSharpIcon, {});
24
25
  case "running":
25
26
  return _jsx(CircularProgress, { size: 20 });
27
+ case "connerr":
28
+ return _jsx(CloudOffIcon, {});
26
29
  default:
27
30
  return _jsx(BlockSharpIcon, {});
28
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TaskLoader.d.ts","sourceRoot":"","sources":["../../../src/components/TaskLoader/TaskLoader.tsx"],"names":[],"mappings":"AAgCA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAqBhD,QAAA,MAAM,UAAU,GAAI,qCAAqC,eAAe,4CA2avE,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"TaskLoader.d.ts","sourceRoot":"","sources":["../../../src/components/TaskLoader/TaskLoader.tsx"],"names":[],"mappings":"AAkCA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAuBhD,QAAA,MAAM,UAAU,GAAI,qCAAqC,eAAe,4CAkbvE,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import AccessTimeSharpIcon from "@mui/icons-material/AccessTimeSharp";
3
3
  import BlockSharpIcon from "@mui/icons-material/BlockSharp";
4
4
  import CheckCircleOutlineRoundedIcon from "@mui/icons-material/CheckCircleOutlineRounded";
5
+ import CloudOffIcon from "@mui/icons-material/CloudOff";
5
6
  import ErrorOutlineSharpIcon from "@mui/icons-material/ErrorOutlineSharp";
6
7
  import RestartAltIcon from "@mui/icons-material/RestartAlt";
7
8
  import StopRoundedIcon from "@mui/icons-material/StopRounded";
@@ -12,7 +13,8 @@ import IconButton from "@mui/material/IconButton";
12
13
  import Switch from "@mui/material/Switch";
13
14
  import Typography from "@mui/material/Typography";
14
15
  import { useEffect, useEffectEvent, useRef, useState } from "react";
15
- import { getRequest, postRequest } from "../../http";
16
+ import useSWR from "swr";
17
+ import { postRequest } from "../../http";
16
18
  import { useAirflowContext } from "../../providers/AirflowProvider";
17
19
  import { useDagRunStateContext } from "../../providers/DagStateProvider";
18
20
  import { formatDate, formatDuration, getCSRFToken, taskStateText, useDebounce, } from "../../utils";
@@ -28,13 +30,15 @@ const TaskStateIcon = ({ taskState, }) => {
28
30
  return _jsx(AccessTimeSharpIcon, { fontSize: "large" });
29
31
  case "running":
30
32
  return _jsx(CircularProgress, {});
33
+ case "connerr":
34
+ return _jsx(CloudOffIcon, {});
31
35
  default:
32
36
  return _jsx(BlockSharpIcon, { fontSize: "large" });
33
37
  }
34
38
  };
35
39
  const TaskLoader = ({ style, subTitle, onUnauthorized }) => {
36
40
  const { airflowAvailable, onLostConnection } = useAirflowContext();
37
- const { isActive, dagRun, taskInstances, onUpdateState, fetchState } = useDagRunStateContext();
41
+ const { isActive, dagRun, taskInstances, onUpdateState, fetchState, error } = useDagRunStateContext();
38
42
  const [activeTask, setActiveTask] = useState(taskInstances?.taskInstances.find((ti) => {
39
43
  return ti.state === "running";
40
44
  }) || null);
@@ -81,97 +85,83 @@ const TaskLoader = ({ style, subTitle, onUnauthorized }) => {
81
85
  clearInterval(interval);
82
86
  };
83
87
  }, [isActive, taskInstances]);
84
- useEffect(() => {
85
- const interval = setInterval(() => {
86
- if (!airflowAvailable)
87
- return;
88
- if (!isActive)
88
+ const defaultFetcher = async ([url, dagId, dagRunId, taskId, tryNum, continuationToken,]) => {
89
+ const requestUrl = new URL("http://foo/" + url);
90
+ requestUrl.searchParams.append("dag_id", dagId);
91
+ if (dagRunId)
92
+ requestUrl.searchParams.append("dag_run_id", dagRunId);
93
+ requestUrl.searchParams.append("task_id", taskId);
94
+ requestUrl.searchParams.append("try_num", tryNum.toString());
95
+ if (continuationToken)
96
+ requestUrl.searchParams.append("continuation_token", continuationToken);
97
+ const resultUrl = requestUrl.pathname.substring(1) + requestUrl.search;
98
+ const res = await fetch(resultUrl, { signal: AbortSignal.timeout(10000) });
99
+ if (res.status === 401) {
100
+ onUnauthorized();
101
+ }
102
+ if (!res.ok) {
103
+ throw { ...(await res.json()), status: res.status };
104
+ }
105
+ return res.json();
106
+ };
107
+ const taskIndex = taskInstances != null
108
+ ? taskInstances.taskInstances.findIndex((ti) => activeTask != null && ti.taskId === activeTask.taskId)
109
+ : -1;
110
+ const continuationToken = taskIndex >= 0
111
+ ? logs[taskIndex] != null
112
+ ? logs[taskIndex].continuationToken
113
+ : null
114
+ : null;
115
+ useSWR(airflowAvailable &&
116
+ activeTask != null && [
117
+ "airflow/ti_logs",
118
+ dagRun?.dagId,
119
+ dagRun?.dagRunId,
120
+ activeTask.taskId,
121
+ activeTask.tryNumber,
122
+ continuationToken,
123
+ ], defaultFetcher, {
124
+ refreshInterval: isActive ? 1000 : 0,
125
+ keepPreviousData: true,
126
+ onError: (err) => {
127
+ if (err?.status == 401) {
128
+ onUnauthorized();
129
+ }
130
+ console.log("Error while fetching logs");
131
+ if (err && err.status === 503) {
132
+ onLostConnection();
133
+ }
134
+ },
135
+ onSuccess: (data) => {
136
+ const newLogs = logs.slice();
137
+ if (!data)
89
138
  return;
90
- if (activeTask == null)
139
+ if (data.logs.content.length === 0)
91
140
  return;
92
- const taskIndex = taskInstances != null
93
- ? taskInstances.taskInstances.findIndex((ti) => activeTask != null && ti.taskId === activeTask.taskId)
94
- : -1;
95
- const continuationToken = taskIndex >= 0
96
- ? logs[taskIndex] != null
97
- ? logs[taskIndex].continuationToken
98
- : null
99
- : null;
100
- getRequest({
101
- url: "airflow/ti_logs",
102
- data: {
103
- dag_id: dagRun?.dagId,
104
- dag_run_id: dagRun?.dagRunId,
105
- task_id: activeTask.taskId,
106
- try_num: activeTask.tryNumber,
107
- continuation_token: continuationToken,
108
- },
109
- successHandler: (resp) => {
110
- const newLogs = logs.slice();
111
- if (!resp)
112
- return;
113
- if (resp.logs.content.length === 0)
114
- return;
115
- if (newLogs[taskIndex] != null) {
116
- newLogs[taskIndex].continuationToken = resp.logs.continuationToken;
117
- newLogs[taskIndex].content += resp.logs.content;
118
- }
119
- else {
120
- newLogs[taskIndex] = resp.logs;
121
- }
122
- setLogs(newLogs);
123
- },
124
- errorHandler: (resp) => {
125
- if (resp?.status == 401) {
126
- onUnauthorized();
127
- }
128
- console.log("Error while fetching logs");
129
- if (resp && resp.status === 503) {
130
- onLostConnection();
131
- }
132
- },
133
- });
134
- }, 500);
135
- return () => {
136
- clearInterval(interval);
137
- };
138
- }, [isActive, activeTask, dagRun, taskInstances, logs]);
139
- const handleShowLogs = (taskId, tryNum) => {
141
+ if (newLogs[taskIndex] != null) {
142
+ newLogs[taskIndex].continuationToken = data.logs.continuationToken;
143
+ newLogs[taskIndex].content += data.logs.content;
144
+ }
145
+ else {
146
+ newLogs[taskIndex] = data.logs;
147
+ }
148
+ setLogs(newLogs);
149
+ },
150
+ });
151
+ const handleShowLogs = (taskId) => {
140
152
  if (!airflowAvailable)
141
153
  return;
142
154
  if (activeTask != null && taskId === activeTask.taskId) {
143
155
  setActiveTask(null);
144
156
  return;
145
157
  }
146
- getRequest({
147
- url: "airflow/ti_logs",
148
- data: {
149
- dag_id: dagRun?.dagId,
150
- dag_run_id: dagRun?.dagRunId,
151
- task_id: taskId,
152
- try_num: tryNum,
153
- continuation_token: null,
154
- },
155
- successHandler: (resp) => {
156
- if (!resp)
157
- return;
158
- const newActiveTaskIdx = taskInstances != null
159
- ? taskInstances.taskInstances.findIndex((ti) => ti.taskId === taskId)
160
- : -1;
161
- setActiveTask(taskInstances?.taskInstances[newActiveTaskIdx] || null);
162
- const newLogs = logs.slice();
163
- newLogs[newActiveTaskIdx] = resp.logs;
164
- setLogs(newLogs);
165
- },
166
- errorHandler: (resp) => {
167
- if (resp?.status == 401) {
168
- onUnauthorized();
169
- }
170
- console.log("Error while getting logs for subtask!");
171
- if (resp && resp.status === 503) {
172
- onLostConnection();
173
- }
174
- },
158
+ const newActiveTaskIdx = taskInstances != null
159
+ ? taskInstances.taskInstances.findIndex((ti) => ti.taskId === taskId)
160
+ : -1;
161
+ setActiveTask(taskInstances?.taskInstances[newActiveTaskIdx] || null);
162
+ setLogs((prev) => {
163
+ const newLogs = prev.filter((_, i) => i === newActiveTaskIdx);
164
+ return newLogs;
175
165
  });
176
166
  };
177
167
  const handleRestartLoad = () => {
@@ -275,7 +265,7 @@ const TaskLoader = ({ style, subTitle, onUnauthorized }) => {
275
265
  width: "auto",
276
266
  whiteSpace: "nowrap",
277
267
  overflow: "hidden",
278
- }, children: _jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.5rem" }, children: [_jsx(TaskStateIcon, { taskState: dagRun?.state }), _jsxs("span", { children: [taskStateText(dagRun?.state), dagRun?.state === "success"
268
+ }, children: _jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.5rem" }, children: [_jsx(TaskStateIcon, { taskState: error || !airflowAvailable ? "connerr" : dagRun?.state }), _jsxs("span", { children: [taskStateText(error || !airflowAvailable ? "connerr" : dagRun?.state), dagRun?.state === "success"
279
269
  ? (formatEndDate.startsWith("вт") ? " во " : " в ") +
280
270
  formatEndDate +
281
271
  " за " +
@@ -9,7 +9,7 @@ interface DagRunStateProviderProps {
9
9
  autorunHandler?(dagRun: DagRun | null, autorun: boolean): void;
10
10
  onUnauthorized(): void;
11
11
  }
12
- declare const DagRunStateProvider: ({ children, dagRun: _dagRun, autorun: _autorun, poolingByUser, taskInstances: _taskInstances, autorunHandler, onUnauthorized, }: DagRunStateProviderProps) => import("react/jsx-runtime").JSX.Element;
12
+ declare const DagRunStateProvider: ({ children, dagRun: _dagRun, autorun: _autorun, poolingByUser, autorunHandler, onUnauthorized, }: DagRunStateProviderProps) => import("react/jsx-runtime").JSX.Element;
13
13
  export declare const useDagRunStateContext: () => {
14
14
  isActive: boolean;
15
15
  autorun: boolean;
@@ -17,6 +17,7 @@ export declare const useDagRunStateContext: () => {
17
17
  taskInstances: TaskInstances | null;
18
18
  dagStartedOnce: boolean;
19
19
  onUpdateState(isActive: boolean, dagRun: DagRun | null, taskInstances: TaskInstances | null): void;
20
+ error: boolean;
20
21
  onDagStarted: () => void;
21
22
  activate(): void;
22
23
  fetchState(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"DagStateProvider.d.ts","sourceRoot":"","sources":["../../src/providers/DagStateProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAgCjD,UAAU,wBAAwB;IAChC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,cAAc,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/D,cAAc,IAAI,IAAI,CAAC;CACxB;AAED,QAAA,MAAM,mBAAmB,GAAI,iIAQ1B,wBAAwB,4CAuJ1B,CAAC;AAEF,eAAO,MAAM,qBAAqB;cAtMtB,OAAO;aACR,OAAO;YACR,MAAM,GAAG,IAAI;mBACN,aAAa,GAAG,IAAI;oBACnB,OAAO;4BAEX,OAAO,UACT,MAAM,GAAG,IAAI,iBACN,aAAa,GAAG,IAAI,GAClC,IAAI;kBACO,MAAM,IAAI;gBACZ,IAAI;kBACF,IAAI;wBACE,OAAO,GAAG,IAAI;CA2LnC,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"DagStateProvider.d.ts","sourceRoot":"","sources":["../../src/providers/DagStateProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAkCjD,UAAU,wBAAwB;IAChC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,cAAc,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/D,cAAc,IAAI,IAAI,CAAC;CACxB;AAED,QAAA,MAAM,mBAAmB,GAAI,kGAO1B,wBAAwB,4CAuJ1B,CAAC;AAEF,eAAO,MAAM,qBAAqB;cAvMtB,OAAO;aACR,OAAO;YACR,MAAM,GAAG,IAAI;mBACN,aAAa,GAAG,IAAI;oBACnB,OAAO;4BAEX,OAAO,UACT,MAAM,GAAG,IAAI,iBACN,aAAa,GAAG,IAAI,GAClC,IAAI;WACA,OAAO;kBACA,MAAM,IAAI;gBACZ,IAAI;kBACF,IAAI;wBACE,OAAO,GAAG,IAAI;CA2LnC,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { createContext, useCallback, useContext, useEffect, useState, } from "react";
3
- import { getRequest } from "../http";
2
+ import { createContext, useCallback, useContext, useEffect, useEffectEvent, useState, } from "react";
3
+ import useSWR from "swr";
4
4
  import { useAirflowContext } from "./AirflowProvider";
5
5
  import { useSnackbarContext } from "./SnackBarProvider";
6
6
  const DagRunStateContext = createContext({
@@ -9,121 +9,105 @@ const DagRunStateContext = createContext({
9
9
  dagRun: null,
10
10
  taskInstances: null,
11
11
  dagStartedOnce: false,
12
+ error: false,
12
13
  onUpdateState: () => { },
13
14
  onDagStarted: () => { },
14
15
  fetchState: () => { },
15
16
  activate: () => { },
16
17
  setAutorun: () => { },
17
18
  });
18
- const DagRunStateProvider = ({ children, dagRun: _dagRun, autorun: _autorun, poolingByUser, taskInstances: _taskInstances, autorunHandler, onUnauthorized, }) => {
19
+ const DagRunStateProvider = ({ children, dagRun: _dagRun, autorun: _autorun, poolingByUser, autorunHandler, onUnauthorized, }) => {
19
20
  const { airflowAvailable, dagId, onLostConnection } = useAirflowContext();
20
- const [isActive, setIsActive] = useState(Boolean(_dagRun
21
- ? ["queued", "running"].includes(_dagRun.state)
22
- : dagId && dagId?.length > 0));
23
- const [channelBusy, setChannelBusy] = useState(false);
24
21
  const [autorun, setAutorun] = useState(_autorun || false);
25
- const activate = useCallback(() => {
26
- setIsActive(true);
27
- }, [isActive, setIsActive]);
28
- const [dagRun, setDagRun] = useState(_dagRun || null);
29
- const [taskInstances, setTaskInstances] = useState(_taskInstances || null);
22
+ const [dagRunId, setDagRunId] = useState(_dagRun?.dagRunId);
30
23
  const [dagStartedOnce, setDagStartedOnce] = useState(false);
31
24
  const { enqueueSnackbar } = useSnackbarContext();
32
- // При изменении пропса dagId надо сбросить текущее состояние
33
- useEffect(() => {
34
- setDagRun(null);
35
- setIsActive(true);
36
- setTaskInstances(null);
37
- }, [dagId]);
38
- // Запрос ревалидации
39
- const updateState = () => {
40
- setChannelBusy(true);
41
- getRequest({
42
- url: "airflow/dag_run",
43
- data: {
44
- dag_id: dagId,
45
- dag_run_id: dagRun && dagRun.dagRunId,
46
- by_user: Boolean(poolingByUser),
47
- },
48
- successHandler: (resp) => {
49
- if (resp?.dagRun) {
50
- setDagRun(resp.dagRun);
51
- setTaskInstances(resp.taskInstances);
52
- setIsActive(["queued", "running"].includes(resp.dagRun.state));
53
- }
54
- else {
55
- setIsActive(false);
56
- enqueueSnackbar(`Ошибка при обновлении состояния задачи${(dagId && " ") || ""}${dagId || ""}!`, "error");
57
- }
58
- setChannelBusy(false);
59
- },
60
- errorHandler: (resp) => {
61
- if (resp?.status === 401) {
62
- onUnauthorized();
63
- }
64
- if (resp?.status !== 404) {
65
- enqueueSnackbar(`Ошибка при обновлении состояния задачи${(dagId && " ") || ""}${dagId || ""}!`, "error");
66
- }
67
- if (resp?.status === 503) {
68
- onLostConnection();
69
- }
70
- else {
71
- setIsActive(false);
72
- }
73
- setChannelBusy(false);
74
- },
75
- }).catch((e) => {
76
- if (e?.status === 401) {
77
- onUnauthorized();
78
- }
79
- console.log(e);
80
- setChannelBusy(false);
81
- });
25
+ const defaultFetcher = async ([url, dagId, dagRunId, poolingByUser]) => {
26
+ const requestUrl = new URL("http://foo/" + url);
27
+ requestUrl.searchParams.append("dag_id", dagId);
28
+ if (dagRunId)
29
+ requestUrl.searchParams.append("dag_run_id", dagRunId);
30
+ requestUrl.searchParams.append("by_user", String(poolingByUser));
31
+ const resultUrl = requestUrl.pathname.substring(1) + requestUrl.search;
32
+ const res = await fetch(resultUrl, { signal: AbortSignal.timeout(10000) });
33
+ if (res.status === 401) {
34
+ onUnauthorized();
35
+ }
36
+ if (!res.ok) {
37
+ throw { ...(await res.json()), status: res.status };
38
+ }
39
+ return res.json();
82
40
  };
83
- // Подписка на ревалидацию
84
- useEffect(() => {
85
- const interval = setInterval(() => {
86
- if (!airflowAvailable && !isActive)
87
- setIsActive(true);
88
- if (!airflowAvailable || !isActive || !dagId)
89
- return;
90
- if (channelBusy)
91
- return;
92
- updateState();
93
- }, 1000);
94
- return () => {
95
- clearInterval(interval);
96
- };
97
- }, [airflowAvailable, isActive, dagRun, dagId, autorun, channelBusy]);
98
- // Вроде как ненужный эффект
99
- // useEffect(() => {
100
- // if (dagRun == null) setIsActive(true);
101
- // }, [dagRun]);
102
- // Запуск autorunHandler при завершении dagRun
41
+ const [shouldRevalidate, setShouldRevalidate] = useState(true);
42
+ const activate = useCallback(() => {
43
+ setShouldRevalidate(true);
44
+ }, []);
45
+ const { data, error, mutate } = useSWR(airflowAvailable &&
46
+ dagId && [
47
+ "airflow/dag_run",
48
+ dagId,
49
+ dagRunId ?? null,
50
+ Boolean(poolingByUser),
51
+ ], defaultFetcher, {
52
+ refreshInterval: shouldRevalidate ? 1000 : 0,
53
+ onError: (err) => {
54
+ if (err?.status !== 404) {
55
+ enqueueSnackbar(`Ошибка при обновлении состояния задачи${(dagId && " ") || ""}${dagId || ""}!`, "error");
56
+ }
57
+ if (err?.status === 503) {
58
+ onLostConnection();
59
+ }
60
+ else {
61
+ setShouldRevalidate(false);
62
+ }
63
+ },
64
+ keepPreviousData: true,
65
+ });
66
+ const dagRun = data?.dagRun ?? null;
67
+ const taskInstances = data?.taskInstances ?? null;
68
+ const updDagRunIdId = useEffectEvent((newDagRunId) => {
69
+ if (dagRunId !== newDagRunId) {
70
+ setDagRunId(newDagRunId);
71
+ }
72
+ });
73
+ // Обновлять идентификатор запуска при изменении
103
74
  useEffect(() => {
104
- if (!airflowAvailable)
105
- return;
106
- if (isActive)
107
- return;
108
- if (autorunHandler)
75
+ updDagRunIdId(dagRun?.dagRunId ?? null);
76
+ console.log("effect 1");
77
+ }, [dagRun?.dagRunId ?? null]);
78
+ const autorunAction = useEffectEvent((dagRun) => {
79
+ if (autorunHandler) {
109
80
  autorunHandler(dagRun, autorun);
110
- }, [airflowAvailable, isActive, dagRun, autorun]);
111
- const onUpdateState = (isActive, newDagRun, taskInstances) => {
112
- setIsActive(isActive);
113
- setDagRun(newDagRun);
81
+ }
82
+ });
83
+ // Если задача всё ещё выполняется, то есть смысл в ревалидации
84
+ useEffect(() => {
85
+ if (dagRun) {
86
+ setShouldRevalidate(["queued", "running"].includes(dagRun.state));
87
+ }
88
+ // Запуск действия при success
89
+ if (dagRun?.state === "success") {
90
+ autorunAction(dagRun);
91
+ }
92
+ console.log("effect 2");
93
+ }, [dagRun?.state]);
94
+ const onUpdateState = (isActive, newDagRun, _taskInstances) => {
95
+ setShouldRevalidate(isActive);
96
+ setDagRunId(newDagRun?.dagRunId);
114
97
  if (newDagRun == null)
115
- setIsActive(true);
116
- setTaskInstances(taskInstances);
98
+ mutate();
117
99
  };
118
100
  /**Вызывать сразу после запуска дага*/
119
101
  const onDagStarted = () => {
120
- setIsActive(true);
121
- setDagRun(null);
122
- setTaskInstances(null);
102
+ // setIsActive(true);
103
+ setDagRunId(null);
104
+ // setTaskInstances(null);
105
+ setShouldRevalidate(true);
123
106
  setDagStartedOnce(true);
124
107
  };
108
+ const updateState = () => mutate();
125
109
  return (_jsx(DagRunStateContext.Provider, { value: {
126
- isActive,
110
+ isActive: shouldRevalidate,
127
111
  autorun,
128
112
  dagRun,
129
113
  taskInstances,
@@ -131,6 +115,7 @@ const DagRunStateProvider = ({ children, dagRun: _dagRun, autorun: _autorun, poo
131
115
  onUpdateState,
132
116
  onDagStarted,
133
117
  activate,
118
+ error: Boolean(error),
134
119
  fetchState: updateState,
135
120
  setAutorun: (autorun) => setAutorun(autorun),
136
121
  }, children: children }));
package/dist/utils.d.ts CHANGED
@@ -5,7 +5,7 @@ import { DagState, TaskState } from "./types";
5
5
  export declare function getCSRFToken(): string;
6
6
  export declare function setCSRFToken(newToken: string): void;
7
7
  export declare function prettyDatetime(datetime?: string | null): string;
8
- export declare const taskStateText: (taskState: DagState | TaskState | string | null | undefined) => "Завершена" | "Ошибка" | "В очереди" | "Выполняется" | "Нет состояния";
8
+ export declare const taskStateText: (taskState: DagState | TaskState | string | null | undefined) => "Завершена" | "Ошибка" | "В очереди" | "Выполняется" | "Недоступно" | "Нет состояния";
9
9
  export declare const formatDate: (date: string) => string;
10
10
  export declare const formatDuration: (duration: number) => string;
11
11
  export declare const getSlugTableName: (name: string) => string;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,wBAAwB,CAAC;AAEhC,OAAO,kBAAkB,CAAC;AAG1B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE9C,wBAAgB,YAAY,WAI3B;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,QAI5C;AAED,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,UAMtD;AAED,eAAO,MAAM,aAAa,GACxB,WAAW,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,2EAc5D,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,WAWtC,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,UAAU,MAAM,WAK9C,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,WAyC5C,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,EAAE,OAAO,MAAM,WAkB9D,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,aAAa,MAAM,EACnB,WAAW,MAAM,EACjB,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,UAAU,OAAO,EACjB,aAAa,MAAM,WAWpB,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,aAAa,MAAM,EAAE,WAAW,MAAM,WACR,CAAC;AAEhE,wBAAgB,WAAW,CAAC,IAAI,SAAS,OAAO,EAAE,EAChD,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI,EACjC,KAAK,EAAE,MAAM,aAKD,IAAI,UAUjB;AAED,eAAO,MAAM,yBAAyB,GACpC,UAAU,WAAW,EACrB,eAAe,MAAM,KAOhB,aACN,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,UAAU,WAAW,EACrB,eAAe,MAAM,KAOhB,aACN,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,KAAG,MAMzC,CAAC;AAEF,eAAO,MAAM,UAAU,GACrB,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,OAAO,MAAM,KACZ,MAMF,CAAC;AACF,eAAO,MAAM,UAAU,GAAI,SAAS,MAAM,EAAE,OAAO,MAAM,KAAG,MAM3D,CAAC;AACF,eAAO,MAAM,WAAW,GACtB,SAAS,MAAM,EACf,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,OAAO,MAAM,KACZ,MAMF,CAAC;AACF,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,MAM7C,CAAC;AACF,eAAO,MAAM,aAAa,GACxB,KAAK,MAAM,EAEX,KAAK,GAAG,EACR,QAAQ,OAAO,KACd,MAKF,CAAC;AACF,eAAO,MAAM,WAAW,GAAI,YAAY,MAAM,KAAG,MAKhD,CAAC;AACF,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,MAK3C,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,wBAAwB,CAAC;AAEhC,OAAO,kBAAkB,CAAC;AAG1B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE9C,wBAAgB,YAAY,WAI3B;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,QAI5C;AAED,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,UAMtD;AAED,eAAO,MAAM,aAAa,GACxB,WAAW,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,0FAgB5D,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,WAWtC,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,UAAU,MAAM,WAK9C,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,WAyC5C,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,EAAE,OAAO,MAAM,WAkB9D,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,aAAa,MAAM,EACnB,WAAW,MAAM,EACjB,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,UAAU,OAAO,EACjB,aAAa,MAAM,WAWpB,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,aAAa,MAAM,EAAE,WAAW,MAAM,WACR,CAAC;AAEhE,wBAAgB,WAAW,CAAC,IAAI,SAAS,OAAO,EAAE,EAChD,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI,EACjC,KAAK,EAAE,MAAM,aAKD,IAAI,UAUjB;AAED,eAAO,MAAM,yBAAyB,GACpC,UAAU,WAAW,EACrB,eAAe,MAAM,KAOhB,aACN,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,UAAU,WAAW,EACrB,eAAe,MAAM,KAOhB,aACN,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,KAAG,MAMzC,CAAC;AAEF,eAAO,MAAM,UAAU,GACrB,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,OAAO,MAAM,KACZ,MAMF,CAAC;AACF,eAAO,MAAM,UAAU,GAAI,SAAS,MAAM,EAAE,OAAO,MAAM,KAAG,MAM3D,CAAC;AACF,eAAO,MAAM,WAAW,GACtB,SAAS,MAAM,EACf,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,OAAO,MAAM,KACZ,MAMF,CAAC;AACF,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,MAM7C,CAAC;AACF,eAAO,MAAM,aAAa,GACxB,KAAK,MAAM,EAEX,KAAK,GAAG,EACR,QAAQ,OAAO,KACd,MAKF,CAAC;AACF,eAAO,MAAM,WAAW,GAAI,YAAY,MAAM,KAAG,MAKhD,CAAC;AACF,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,MAK3C,CAAC"}
package/dist/utils.js CHANGED
@@ -28,6 +28,8 @@ export const taskStateText = (taskState) => {
28
28
  return "В очереди";
29
29
  case "running":
30
30
  return "Выполняется";
31
+ case "connerr":
32
+ return "Недоступно";
31
33
  default:
32
34
  return "Нет состояния";
33
35
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@danikokonn/yarik-frontend-lib",
3
- "version": "2.0.55",
3
+ "version": "2.0.56",
4
4
  "license": "Apache-2.0",
5
5
  "description": "",
6
6
  "author": "",