mirror of https://github.com/usememos/memos.git
81 lines
2.8 KiB
TypeScript
81 lines
2.8 KiB
TypeScript
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
import { instanceServiceClient } from "@/connect";
|
|
import { InstanceSetting, InstanceSetting_Key } from "@/types/proto/api/v1/instance_service_pb";
|
|
|
|
// Query keys factory
|
|
export const instanceKeys = {
|
|
all: ["instance"] as const,
|
|
profile: () => [...instanceKeys.all, "profile"] as const,
|
|
settings: () => [...instanceKeys.all, "settings"] as const,
|
|
setting: (key: InstanceSetting_Key) => [...instanceKeys.settings(), key] as const,
|
|
};
|
|
|
|
// Build setting name from key
|
|
const buildInstanceSettingName = (key: InstanceSetting_Key): string => {
|
|
const keyName = InstanceSetting_Key[key];
|
|
return `instance/settings/${keyName}`;
|
|
};
|
|
|
|
// Hook to fetch instance profile
|
|
export function useInstanceProfile() {
|
|
return useQuery({
|
|
queryKey: instanceKeys.profile(),
|
|
queryFn: async () => {
|
|
const profile = await instanceServiceClient.getInstanceProfile({});
|
|
return profile;
|
|
},
|
|
staleTime: 1000 * 60 * 10, // 10 minutes - instance profile rarely changes
|
|
});
|
|
}
|
|
|
|
// Hook to fetch a specific instance setting
|
|
export function useInstanceSetting(key: InstanceSetting_Key) {
|
|
return useQuery({
|
|
queryKey: instanceKeys.setting(key),
|
|
queryFn: async () => {
|
|
const setting = await instanceServiceClient.getInstanceSetting({
|
|
name: buildInstanceSettingName(key),
|
|
});
|
|
return setting;
|
|
},
|
|
staleTime: 1000 * 60 * 5, // 5 minutes
|
|
});
|
|
}
|
|
|
|
// Hook to update instance setting
|
|
export function useUpdateInstanceSetting() {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: async (setting: InstanceSetting) => {
|
|
await instanceServiceClient.updateInstanceSetting({ setting });
|
|
return setting;
|
|
},
|
|
onSuccess: (setting) => {
|
|
// Extract key from setting name and invalidate
|
|
const keyMatch = setting.name.match(/instance\/settings\/(\w+)/);
|
|
if (keyMatch) {
|
|
const keyName = keyMatch[1] as keyof typeof InstanceSetting_Key;
|
|
const key = InstanceSetting_Key[keyName];
|
|
if (key !== undefined) {
|
|
queryClient.setQueryData(instanceKeys.setting(key), setting);
|
|
}
|
|
}
|
|
queryClient.invalidateQueries({ queryKey: instanceKeys.settings() });
|
|
},
|
|
});
|
|
}
|
|
|
|
// Derived hooks for common settings
|
|
export function useGeneralSetting() {
|
|
const { data: setting, ...rest } = useInstanceSetting(InstanceSetting_Key.GENERAL);
|
|
const generalSetting = setting?.value.case === "generalSetting" ? setting.value.value : undefined;
|
|
return { data: generalSetting, ...rest };
|
|
}
|
|
|
|
export function useMemoRelatedSetting() {
|
|
const { data: setting, ...rest } = useInstanceSetting(InstanceSetting_Key.MEMO_RELATED);
|
|
const memoRelatedSetting = setting?.value.case === "memoRelatedSetting" ? setting.value.value : undefined;
|
|
return { data: memoRelatedSetting, ...rest };
|
|
}
|