mobilizon.chapril.org-mobil.../js/src/composition/apollo/user.ts

107 lines
2.7 KiB
TypeScript

import { IDENTITIES, REGISTER_PERSON } from "@/graphql/actor";
import {
CURRENT_USER_CLIENT,
LOGGED_USER,
SET_USER_SETTINGS,
UPDATE_USER_LOCALE,
USER_SETTINGS,
} from "@/graphql/user";
import { IPerson } from "@/types/actor";
import { ICurrentUser, IUser } from "@/types/current-user.model";
import { ActorType } from "@/types/enums";
import { ApolloCache, FetchResult } from "@apollo/client/core";
import { useMutation, useQuery } from "@vue/apollo-composable";
import { computed } from "vue";
export function useCurrentUserClient() {
const {
result: currentUserResult,
error,
loading,
} = useQuery<{
currentUser: ICurrentUser;
}>(CURRENT_USER_CLIENT);
const currentUser = computed(() => currentUserResult.value?.currentUser);
return { currentUser, error, loading };
}
export function useLoggedUser() {
const { currentUser } = useCurrentUserClient();
const { result, error, onError } = useQuery<{ loggedUser: IUser }>(
LOGGED_USER,
{},
() => ({ enabled: currentUser.value?.id != null })
);
const loggedUser = computed(() => result.value?.loggedUser);
return { loggedUser, error, onError };
}
export function useUserSettings() {
const {
result: userSettingsResult,
error,
loading,
} = useQuery<{ loggedUser: IUser }>(USER_SETTINGS);
const loggedUser = computed(() => userSettingsResult.value?.loggedUser);
return { loggedUser, error, loading };
}
export async function doUpdateSetting(
variables: Record<string, unknown>
): Promise<void> {
useMutation<{ setUserSettings: string }>(SET_USER_SETTINGS, () => ({
variables,
}));
}
export async function updateLocale(locale: string) {
useMutation<{ id: string; locale: string }>(UPDATE_USER_LOCALE, () => ({
variables: {
locale,
},
}));
}
export function registerAccount() {
return useMutation<
{ registerPerson: IPerson },
{
preferredUsername: string;
name: string;
summary: string;
email: string;
}
>(REGISTER_PERSON, () => ({
update: (
store: ApolloCache<{ registerPerson: IPerson }>,
{ data: localData }: FetchResult,
{ context }
) => {
if (context?.userAlreadyActivated) {
const identitiesData = store.readQuery<{ identities: IPerson[] }>({
query: IDENTITIES,
});
if (identitiesData && localData) {
const newPersonData = {
...localData.registerPerson,
type: ActorType.PERSON,
};
store.writeQuery({
query: IDENTITIES,
data: {
...identitiesData,
identities: [...identitiesData.identities, newPersonData],
},
});
}
}
},
}));
}