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 }