@scayle/storefront-nuxt
Version:
Nuxt integration for the SCAYLE Commerce Engine and Storefront API
63 lines (62 loc) • 1.86 kB
JavaScript
import { useNuxtApp } from "nuxt/app";
import { useCoreLog } from "../useCoreLog.js";
import { extendPromise } from "../../utils/promise.js";
import { useRpc } from "./useRpc.js";
import { toValue, computed } from "vue";
import { useRpcCall } from "./useRpcCall.js";
export function useUser(options = {}) {
const nuxtApp = useNuxtApp();
const log = useCoreLog("useUser");
const updateUserRpc = useRpcCall("updateShopUser");
const updatePasswordRpc = useRpcCall("updatePassword");
const refreshUserRpc = useRpcCall("refreshUser");
const { immediate = true, lazy = false, key = "useUser" } = options;
const asyncDataPromise = useRpc("getUser", key, void 0, {
immediate,
lazy,
server: false,
dedupe: "defer",
getCachedData: (cacheKey) => {
return toValue(nuxtApp._asyncData[cacheKey]?.data) ?? void 0;
}
});
const { data, refresh, error, status } = asyncDataPromise;
const updateUser = async (payload) => {
log.debug("Update user");
data.value = await updateUserRpc(payload);
};
const updatePassword = async (payload) => {
log.debug("Update password");
const response = await updatePasswordRpc(payload);
if (response) {
data.value = response;
}
};
const user = computed(() => data.value?.user);
const isLoggedIn = computed(() => !!user.value);
const customerType = computed(() => {
if (!isLoggedIn.value) {
return "guest";
}
return user.value?.groups?.includes("new") ? "new" : "existing";
});
const forceRefresh = async () => {
log.debug("Refresh user");
data.value = await refreshUserRpc();
};
return extendPromise(
asyncDataPromise.then(() => ({})),
{
user,
isLoggedIn,
customerType,
refresh,
fetch,
forceRefresh,
updateUser,
updatePassword,
error,
status
}
);
}