Skip to content

Api 3.9.0 ​

Api module provides a set of composable functions to work with the network requests. This composable has direct integration with Http module.

useQuery ​

Executes given promise function immediately and set the result to data ref.

ts
interface Query<Data = any> {
  loading: Ref<boolean>
  data: Ref<Data | undefined>
  execute(options?: {
    /**
     * controls whether the response should be assigned to the data ref
     * @default true
     */
    assign?: boolean
    /**
     * controls whether the loading state should not be set before fetching
     * @default false
     */
    silent?: boolean
  }): Promise<Data>
}

interface UseQueryOptions {
  /**
   * controls whether the query should execute immediately
   * @default true
   */
  immediate?: boolean
  /**
   * watch the given source(s) and re-execute the query
   */
  watch?: WatchSource | WatchSource[]
}

function useQuery<Data = any>(
  req: (http: Http) => Promise<Data>,
  options?: UseQueryOptions
): Query<Data>
ts
import { useQuery } from '@globalbrain/sefirot/lib/composables/Api'

const { data, loading } = useQuery((http) => {
  return http.get('/api/users')
})

useGet ​

Alias to useMutation. Use this method when you want to execute a request on user interaction, but not mutating data. Good example is when downloading a file.

ts
type Get<
  Data = any,
  Args extends any[] = any[]
> = Mutation<Data, Args>

function useGet<Data = any, Args extends any[] = any[]>(
  req: (http: Http, ...args: Args) => Promise<Data>
): Get<Data, Args>
ts
import { useGet } from '@globalbrain/sefirot/lib/composables/Api.vue'

const { execute: download } = useGet((http, path: string) => {
  return http.download(`/api/users/${path}`)
})

download('avatar.png')

useMutation ​

Creates a composable that can execute given promise function at later time.

ts
interface Mutation<Data = any, Args extends any[] = any[]> {
  loading: Ref<boolean>
  data: Ref<Data | undefined>
  execute(...args: Args): Promise<Data>
}

function useMutation<Data = any, Args extends any[] = any[]>(
  req: (http: Http, ...args: Args) => Promise<Data>
): Mutation<Data, Args>
ts
import { useMutation } from '@globalbrain/sefirot/lib/composables/Api.vue'

const { execute: createUser } = useMutation((http, name: string) => {
  return http.post(`/api/users`, {
    name
  })
})

updateUser(1, 'Jane Doe')