Add instance fetching hooks

This commit is contained in:
Alex Gleason 2024-10-11 00:46:48 -05:00
parent c3655d085c
commit 158392c627
No known key found for this signature in database
GPG Key ID: 7211D1F99744FBB7
4 changed files with 49 additions and 2 deletions

View File

@ -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<InstanceV1>({
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 };
}

View File

@ -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<Instance>({
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 };
}

View File

@ -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]);
}

View File

@ -305,5 +305,6 @@ const instanceSchema = z.preprocess((data: any) => {
}));
type Instance = z.infer<typeof instanceSchema>;
type InstanceV1 = z.infer<typeof instanceV1Schema>;
export { instanceSchema, Instance };
export { instanceSchema, Instance, instanceV1Schema, InstanceV1 };