switch to nx monorepo

This commit is contained in:
Philipinho
2024-01-09 18:58:26 +01:00
parent e1bb2632b8
commit 093e634c0b
273 changed files with 11419 additions and 31 deletions

View File

@ -0,0 +1,5 @@
import { atomWithStorage } from "jotai/utils";
import { ICurrentUserResponse } from "@/features/user/types/user.types";
export const currentUserAtom = atomWithStorage<ICurrentUserResponse | null>("currentUser", null);

View File

@ -0,0 +1,12 @@
import { useQuery, UseQueryResult } from "@tanstack/react-query";
import { getUserInfo } from "@/features/user/services/user-service";
import { ICurrentUserResponse } from "@/features/user/types/user.types";
export default function useCurrentUser(): UseQueryResult<ICurrentUserResponse> {
return useQuery({
queryKey: ["currentUser"],
queryFn: async () => {
return await getUserInfo();
},
});
}

View File

@ -0,0 +1,30 @@
import api from '@/lib/api-client';
import { ICurrentUserResponse, IUser } from '@/features/user/types/user.types';
export async function getMe(): Promise<IUser> {
const req = await api.get<IUser>('/user/me');
return req.data as IUser;
}
export async function getUserInfo(): Promise<ICurrentUserResponse> {
const req = await api.get<ICurrentUserResponse>('/user/info');
return req.data as ICurrentUserResponse;
}
export async function updateUser(data: Partial<IUser>): Promise<IUser> {
const req = await api.post<IUser>('/user/update', data);
return req.data as IUser;
}
export async function uploadAvatar(file: File) {
const formData = new FormData();
formData.append('avatar', file);
const req = await api.post('/attachments/upload/avatar', formData, {
headers: {
'Content-Type': 'multipart/form-data',
}
});
return req.data;
}

View File

@ -0,0 +1,21 @@
import { IWorkspace } from "@/features/workspace/types/workspace.types";
export interface IUser {
id: string;
name: string;
email: string;
emailVerifiedAt: Date;
avatarUrl: string;
timezone: string;
settings: any;
lastLoginAt: string;
lastLoginIp: string;
createdAt: Date;
updatedAt: Date;
workspaceRole?: string;
}
export interface ICurrentUserResponse {
user: IUser,
workspace: IWorkspace
}

View File

@ -0,0 +1,23 @@
import { useAtom } from 'jotai';
import { currentUserAtom } from '@/features/user/atoms/current-user-atom';
import React, { useEffect } from 'react';
import useCurrentUser from '@/features/user/hooks/use-current-user';
export function UserProvider({ children }: React.PropsWithChildren) {
const [, setCurrentUser] = useAtom(currentUserAtom);
const { data, isLoading, error } = useCurrentUser();
useEffect(() => {
if (data && data.user) {
setCurrentUser(data);
}
}, [data, isLoading, setCurrentUser]);
if (isLoading) return <></>;
if (error) {
return <>an error occurred</>;
}
return <>{children}</>;
}