Submit
Path:
~
/
/
usr
/
share
/
grafana
/
public
/
app
/
plugins
/
datasource
/
graphite
/
state
/
File Content:
context.tsx
import { AnyAction } from '@reduxjs/toolkit'; import React, { createContext, Dispatch, PropsWithChildren, useContext, useEffect, useMemo, useState } from 'react'; import { usePrevious } from 'react-use'; import { QueryEditorProps } from '@grafana/data'; import { getTemplateSrv } from 'app/features/templating/template_srv'; import { GraphiteDatasource } from '../datasource'; import { GraphiteOptions, GraphiteQuery } from '../types'; import { actions } from './actions'; import { createStore, GraphiteQueryEditorState } from './store'; const DispatchContext = createContext<Dispatch<AnyAction>>({} as Dispatch<AnyAction>); const GraphiteStateContext = createContext<GraphiteQueryEditorState>({} as GraphiteQueryEditorState); export const useDispatch = () => { return useContext(DispatchContext); }; export const useGraphiteState = () => { return useContext(GraphiteStateContext); }; export type GraphiteQueryEditorProps = QueryEditorProps<GraphiteDatasource, GraphiteQuery, GraphiteOptions>; export const GraphiteQueryEditorContext = ({ datasource, onRunQuery, onChange, query, queries, range, children, }: PropsWithChildren<GraphiteQueryEditorProps>) => { const [state, setState] = useState<GraphiteQueryEditorState>(); const [needsRefresh, setNeedsRefresh] = useState<boolean>(false); const dispatch = useMemo(() => { return createStore((state) => { setState(state); }); }, []); // synchronise changes provided in props with editor's state const previousRange = usePrevious(range); useEffect(() => { if (JSON.stringify(previousRange?.raw) !== JSON.stringify(range?.raw)) { dispatch(actions.timeRangeChanged(range)); } }, [dispatch, range, previousRange]); useEffect( () => { if (state) { dispatch(actions.queriesChanged(queries)); } }, // adding state to dependencies causes infinite loops // eslint-disable-next-line react-hooks/exhaustive-deps [JSON.stringify(queries)] ); useEffect( () => { if (state && state.target?.target !== query.target) { dispatch(actions.queryChanged(query)); } }, // adding state to dependencies causes infinite loops // eslint-disable-next-line react-hooks/exhaustive-deps [dispatch, query] ); useEffect( () => { if (needsRefresh && state) { setNeedsRefresh(false); onChange({ ...query, target: state.target.target, targetFull: state.target.targetFull }); onRunQuery(); } }, // adding state to dependencies causes infinite loops // eslint-disable-next-line react-hooks/exhaustive-deps [needsRefresh, JSON.stringify(query)] ); if (!state) { dispatch( actions.init({ target: query, datasource: datasource, range: range, templateSrv: getTemplateSrv(), // list of queries is passed only when the editor is in Dashboards or Alerting. This is to allow interpolation // of sub-queries which are stored in "targetFull" property. This is used by alerting in the backend. queries: queries || [], refresh: () => { // do not run onChange/onRunQuery straight away to ensure the internal state gets updated first // to avoid race conditions (onChange could update props before the reducer action finishes) setNeedsRefresh(true); }, }) ); return null; } else { return ( <GraphiteStateContext.Provider value={state}> <DispatchContext.Provider value={dispatch}>{children}</DispatchContext.Provider> </GraphiteStateContext.Provider> ); } };
Edit
Rename
Chmod
Delete
FILE
FOLDER
INFO
Name
Size
Permission
Action
actions.ts
1872 bytes
0644
context.tsx
3640 bytes
0644
helpers.ts
6712 bytes
0644
providers.ts
7210 bytes
0644
store.ts
5855 bytes
0644
N4ST4R_ID | Naxtarrr