You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							94 lines
						
					
					
						
							2.4 KiB
						
					
					
				
			
		
		
	
	
							94 lines
						
					
					
						
							2.4 KiB
						
					
					
				import cardApi from '~/vgpu/api/card';
 | 
						|
import { onMounted, ref, watch, watchEffect } from 'vue';
 | 
						|
import { timeParse } from '@/utils';
 | 
						|
 | 
						|
const useInstantVector = (configs, parseQuery = (query) => query, times) => {
 | 
						|
  const data = ref(configs);
 | 
						|
 | 
						|
  const fetchInstantData = async () => {
 | 
						|
    const reqs = configs.map(
 | 
						|
      async ({ query, totalQuery, percentQuery, cntQuery }, index) => {
 | 
						|
        if (parseQuery(query).includes('undefined')) {
 | 
						|
          return;
 | 
						|
        }
 | 
						|
        if (query) {
 | 
						|
          const usedData = await cardApi.getInstantVector({
 | 
						|
            query: parseQuery(query),
 | 
						|
          });
 | 
						|
 | 
						|
          const used = usedData.data.length ? usedData.data[0]?.value : 0;
 | 
						|
          data.value[index].count = used;
 | 
						|
          data.value[index].used = used;
 | 
						|
        }
 | 
						|
 | 
						|
        if (totalQuery) {
 | 
						|
          const totalData = await cardApi.getInstantVector({
 | 
						|
            query: parseQuery(totalQuery),
 | 
						|
          });
 | 
						|
          if (totalData.data[0]) {
 | 
						|
            data.value[index].total = totalData.data[0].value;
 | 
						|
          }
 | 
						|
        }
 | 
						|
        if (data.value[index].total !== 0) {
 | 
						|
            data.value[index].percent = data.value[index].used / data.value[index].total * 100;
 | 
						|
        }
 | 
						|
        if (percentQuery) {
 | 
						|
          const percentData = await cardApi.getRangeVector({
 | 
						|
            query: parseQuery(percentQuery),
 | 
						|
            range: {
 | 
						|
                start: timeParse(times?.value[0]),
 | 
						|
                end: timeParse(times?.value[1]),
 | 
						|
              step: '1m',
 | 
						|
            },
 | 
						|
          });
 | 
						|
 | 
						|
          data.value[index].data = percentData.data[0]?.values;
 | 
						|
        }
 | 
						|
      },
 | 
						|
    );
 | 
						|
 | 
						|
    Promise.all(reqs);
 | 
						|
  };
 | 
						|
 | 
						|
  const fetchRangeData = async () => {
 | 
						|
    const reqs = configs.map(
 | 
						|
      async ({ query, totalQuery, percentQuery }, index) => {
 | 
						|
        if (parseQuery(query).includes('undefined')) {
 | 
						|
          return;
 | 
						|
        }
 | 
						|
 | 
						|
        if (percentQuery) {
 | 
						|
          const percentData = await cardApi.getRangeVector({
 | 
						|
            query: parseQuery(percentQuery),
 | 
						|
            range: {
 | 
						|
                start: timeParse(times.value[0]),
 | 
						|
                end: timeParse(times.value[1]),
 | 
						|
              step: '1m',
 | 
						|
            },
 | 
						|
          });
 | 
						|
 | 
						|
          data.value[index].data = percentData.data[0]?.values;
 | 
						|
        }
 | 
						|
      },
 | 
						|
    );
 | 
						|
 | 
						|
    Promise.all(reqs);
 | 
						|
  };
 | 
						|
 | 
						|
  watchEffect(() => {
 | 
						|
    fetchInstantData();
 | 
						|
  });
 | 
						|
 | 
						|
  watch(
 | 
						|
    times,
 | 
						|
    () => {
 | 
						|
      fetchRangeData();
 | 
						|
    },
 | 
						|
    // { immediate: true },
 | 
						|
  );
 | 
						|
 | 
						|
  return data;
 | 
						|
};
 | 
						|
 | 
						|
export default useInstantVector;
 |