diff --git a/src/api/hooks/instance/useInstanceV1.ts b/src/api/hooks/instance/useInstanceV1.ts new file mode 100644 index 000000000..b15e7eed9 --- /dev/null +++ b/src/api/hooks/instance/useInstanceV1.ts @@ -0,0 +1,20 @@ +import { useQuery } from '@tanstack/react-query'; + +import { useApi } from 'soapbox/hooks'; +import { InstanceV1, instanceV1Schema } from 'soapbox/schemas/instance'; + +/** Get the Instance for the current backend. */ +export function useInstanceV1() { + const api = useApi(); + + const { data: instance, ...rest } = useQuery({ + queryKey: ['instance', api.baseUrl, 'v1'], + queryFn: async () => { + const response = await api.get('/api/v1/instance'); + const data = await response.json(); + return instanceV1Schema.parse(data); + }, + }); + + return { instance, ...rest }; +} diff --git a/src/api/hooks/instance/useInstanceV2.ts b/src/api/hooks/instance/useInstanceV2.ts new file mode 100644 index 000000000..ed4954160 --- /dev/null +++ b/src/api/hooks/instance/useInstanceV2.ts @@ -0,0 +1,22 @@ +import { useQuery } from '@tanstack/react-query'; + +import { useApi, useFeatures } from 'soapbox/hooks'; +import { Instance, instanceSchema } from 'soapbox/schemas/instance'; + +/** Get the Instance for the current backend. */ +export function useInstanceV2() { + const api = useApi(); + const features = useFeatures(); + + const { data: instance, ...rest } = useQuery({ + queryKey: ['instance', api.baseUrl, 'v2'], + queryFn: async () => { + const response = await api.get('/api/v2/instance'); + const data = await response.json(); + return instanceSchema.parse(data); + }, + enabled: features.instanceV2, + }); + + return { instance, ...rest }; +} diff --git a/src/hooks/useApi.ts b/src/hooks/useApi.ts index 5a4babb02..23fd16875 100644 --- a/src/hooks/useApi.ts +++ b/src/hooks/useApi.ts @@ -1,3 +1,5 @@ +import { useMemo } from 'react'; + import { MastodonClient } from 'soapbox/api/MastodonClient'; import { useAppSelector } from './useAppSelector'; @@ -8,5 +10,7 @@ export function useApi(): MastodonClient { const accessToken = useAppSelector((state) => account ? state.auth.users.get(account.url)?.access_token : undefined); const baseUrl = account ? new URL(account.url).origin : location.origin; - return new MastodonClient(baseUrl, accessToken); + return useMemo(() => { + return new MastodonClient(baseUrl, accessToken); + }, [baseUrl, accessToken]); } \ No newline at end of file diff --git a/src/schemas/instance.ts b/src/schemas/instance.ts index 081f2f493..9c9fb717c 100644 --- a/src/schemas/instance.ts +++ b/src/schemas/instance.ts @@ -305,5 +305,6 @@ const instanceSchema = z.preprocess((data: any) => { })); type Instance = z.infer; +type InstanceV1 = z.infer; -export { instanceSchema, Instance }; +export { instanceSchema, Instance, instanceV1Schema, InstanceV1 };