github.com/pluralsh/plural-cli@v0.9.5/pkg/ui/web/src/hooks/useWails.ts (about)

     1  import {
     2    Dispatch,
     3    useCallback,
     4    useEffect,
     5    useState,
     6  } from 'react'
     7  
     8  import { Binding, ClientBindingFactory } from '../services/wails'
     9  
    10  type Error = any // TODO: figure out the type
    11  
    12  interface QueryResponse<T> {
    13    data?: T
    14    error: Error
    15    loading: boolean
    16    refetch: Dispatch<void>
    17  }
    18  
    19  type OperationVariables = Record<string, any>;
    20  
    21  interface QueryOptions<TVariables = OperationVariables> {
    22    variables?: TVariables
    23  }
    24  
    25  function useWailsQuery<TResult = unknown, TVariables extends OperationVariables = OperationVariables>(binding: Binding,
    26    options?: QueryOptions<TVariables>): QueryResponse<TResult> {
    27    const bindingFn = ClientBindingFactory<TResult>(binding)
    28    const [loading, setLoading] = useState(false)
    29    const [data, setData] = useState<TResult>()
    30    const [error, setError] = useState()
    31  
    32    const fetch = useCallback(() => {
    33      setLoading(true)
    34      setError(undefined)
    35      setData(undefined)
    36  
    37      bindingFn(options?.variables ?? {}).then(res => setData(res))
    38        .catch(err => setError(err))
    39        .finally(() => setLoading(false))
    40    }, [bindingFn, options?.variables])
    41  
    42    const refetch = useCallback(() => {
    43      if (loading) return
    44  
    45      fetch()
    46    }, [fetch, loading])
    47  
    48    useEffect(() => fetch(), [fetch])
    49  
    50    return {
    51      data,
    52      loading,
    53      error,
    54      refetch,
    55    } as QueryResponse<TResult>
    56  }
    57  
    58  interface UpdateReponse<T> {
    59    error: Error
    60    loading: boolean
    61    update: Dispatch<void>
    62    data?: T
    63  }
    64  
    65  function useWailsUpdate<TResult = void, TVariables extends OperationVariables = OperationVariables>(binding: Binding,
    66    options?: QueryOptions<TVariables>): UpdateReponse<TResult> {
    67    const bindingFn = ClientBindingFactory<TResult>(binding)
    68    const [loading, setLoading] = useState(false)
    69    const [data, setData] = useState<TResult>()
    70    const [error, setError] = useState()
    71  
    72    const update = useCallback(() => {
    73      setLoading(true)
    74  
    75      bindingFn(options?.variables ?? {})
    76        .then(data => setData(data))
    77        .catch(err => setError(err))
    78        .finally(() => setLoading(false))
    79    }, [bindingFn, options?.variables])
    80  
    81    return {
    82      error,
    83      loading,
    84      update,
    85      data,
    86    }
    87  }
    88  
    89  export { useWailsQuery, useWailsUpdate }