Untitled

 avatar
unknown
typescript
a year ago
1.3 kB
7
Indexable
import { useState, useEffect } from 'react';

interface ApiResponse {
  id: string;
  view_seconds: number[][];
}

interface UseUniqViewSecondsResult {
  data: number[];
  loading: boolean;
  error: Error | null;
}

const processViewSeconds = (viewSeconds: number[][]): number[] => {
  // Flatten the array -> remove duplicates -> sort in ascending order
  return [...new Set(viewSeconds.flat())].sort((a, b) => a - b);
};

const useUniqViewSeconds = (url: string): UseUniqViewSecondsResult => {
  const [data, setData] = useState<number[]>([]);
  const [loading, setLoading] = useState<boolean>(true);
  const [error, setError] = useState<Error | null>(null);

  useEffect(() => {
    const fetchData = async () => {
      setLoading(true);
      try {
        const response = await fetch(url);
        if (!response.ok) {
          throw new Error('Network response was not ok');
        }
        const result: ApiResponse = await response.json();
        const uniqViewSeconds = processViewSeconds(result.view_seconds);
        setData(uniqViewSeconds);
      } catch (err) {
        setError(err as Error);
      } finally {
        setLoading(false);
      }
    };

    fetchData();
  }, [url]);

  return { data, loading, error };
};

export default useUniqViewSeconds;
Editor is loading...
Leave a Comment