Skip to content

Commit

Permalink
feat: added user & login methods
Browse files Browse the repository at this point in the history
  • Loading branch information
Intevel committed Mar 23, 2022
1 parent e3cb334 commit 9e3fdd3
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 0 deletions.
35 changes: 35 additions & 0 deletions src/runtime/composables/useDirectus.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import type { FetchError, FetchOptions } from "ohmyfetch";
import { useNuxtApp } from "#app";
import { useDirectusUrl } from "./useDirectusUrl";
import { useDirectusToken } from "./useDirectusToken";

export const useDirectus = () => {
const nuxt = useNuxtApp();
const baseURL = useDirectusUrl();
const token = useDirectusToken();

return async <T>(
url: string,
fetchOptions: FetchOptions = {}
): Promise<T> => {
const headers: HeadersInit = {};

if (token && token.value) {
headers.Authorization = `Bearer ${token.value}`;
}

try {
return await $fetch<T>(url, {
baseURL,
...fetchOptions,
headers: {
...headers,
...fetchOptions.headers,
},
});
} catch (err: any) {
// nuxt.hooks.callHook("direcuts:error" as any, e);
throw err;
}
};
};
73 changes: 73 additions & 0 deletions src/runtime/composables/useDirectusAuth.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import type { Ref } from "vue";
import type {
DirectusAuthResponse,
DirectusAuthCredentials,
DirectusUser,
} from "../types";
import { useDirectus } from "./useDirectus";
import { useDirectusUser } from "./useDirectusUser";
import { useDirectusUrl } from "./useDirectusUrl";
import { useDirectusToken } from "./useDirectusToken";

export const useDirectusAuth = () => {
const url = useDirectusUrl();
const directus = useDirectus();
const user = useDirectusUser();
const token = useDirectusToken();

const setToken = (value: string | null) => {
token.value = value;
};

const setUser = (value: DirectusUser) => {
user.value = value;
};

const fetchUser = async (): Promise<Ref<DirectusUser>> => {
if (token.value && !user.value) {
try {
user.value = await directus("/users/me");
} catch (e) {
setToken(null);
}
}

return user;
};

/**
* Login
*
* @param {DirectusAuthCredentials} data - User authentication credentials
* @param {string} data.email - The email or username of the user
* @param {string} data.password - The password of the user
* @returns Promise<DirectusAuthResponse>
*/
const login = async (
data: DirectusAuthCredentials
): Promise<DirectusAuthResponse> => {
setToken(null);

const response: DirectusAuthResponse = await directus("/auth/login", {
method: "POST",
body: data,
});

setToken(response.data.access_token);

const user = await fetchUser();

return {
user,
access_token: response.data.access_token,
expires: response.data.expires,
};
};

return {
setToken,
setUser,
fetchUser,
login,
};
};
6 changes: 6 additions & 0 deletions src/runtime/composables/useDirectusUser.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import type { Ref } from "vue";
import { useState } from "#app";
import type { DirectusUser } from "../types";

export const useDirectusUser = (): Ref<DirectusUser> =>
useState<DirectusUser>("directus.user");

0 comments on commit 9e3fdd3

Please sign in to comment.