2
0

Add Dashboard

This commit is contained in:
Baptiste Arnaud
2021-12-06 15:48:50 +01:00
parent 5e14a94dea
commit 54a641b819
47 changed files with 2002 additions and 168 deletions

View File

@ -0,0 +1,4 @@
import { NextApiResponse } from 'next'
export const methodNotAllowed = (res: NextApiResponse) =>
res.status(405).json({ message: 'Method Not Allowed' })

View File

@ -0,0 +1,69 @@
import { DashboardFolder } from '.prisma/client'
import useSWR from 'swr'
import { fetcher, sendRequest } from './utils'
export const useFolders = ({
parentId,
onError,
}: {
parentId?: string
onError: (error: Error) => void
}) => {
const params = new URLSearchParams(
parentId ? { parentId: parentId.toString() } : undefined
)
const { data, error, mutate } = useSWR<{ folders: DashboardFolder[] }, Error>(
`/api/folders?${params}`,
fetcher
)
if (error) onError(error)
return {
folders: data?.folders,
isLoading: !error && !data,
mutate,
}
}
export const useFolderContent = ({
folderId,
onError,
}: {
folderId?: string
onError: (error: Error) => void
}) => {
const { data, error, mutate } = useSWR<{ folder: DashboardFolder }, Error>(
`/api/folders/${folderId}`,
fetcher
)
if (error) onError(error)
return {
folder: data?.folder,
isLoading: !error && !data,
mutate,
}
}
export const createFolder = async (
folder: Pick<DashboardFolder, 'parentFolderId'>
) =>
sendRequest<DashboardFolder>({
url: `/api/folders`,
method: 'POST',
body: folder,
})
export const deleteFolder = async (id: string) =>
sendRequest({
url: `/api/folders/${id}`,
method: 'DELETE',
})
export const updateFolder = async (
id: string,
folder: Partial<DashboardFolder>
) =>
sendRequest({
url: `/api/folders/${id}`,
method: 'PATCH',
body: folder,
})

View File

@ -0,0 +1,69 @@
import { Typebot } from '@typebot/prisma'
import useSWR from 'swr'
import { fetcher, sendRequest } from './utils'
export const useTypebots = ({
folderId,
onError,
}: {
folderId?: string
onError: (error: Error) => void
}) => {
const params = new URLSearchParams(
folderId ? { folderId: folderId.toString() } : undefined
)
const { data, error, mutate } = useSWR<{ typebots: Typebot[] }, Error>(
`/api/typebots?${params}`,
fetcher
)
if (error) onError(error)
return {
typebots: data?.typebots,
isLoading: !error && !data,
mutate,
}
}
export const createTypebot = async ({
folderId,
}: Pick<Typebot, 'folderId'>) => {
const typebot = {
folderId,
name: 'My typebot',
}
return sendRequest<Typebot>({
url: `/api/typebots`,
method: 'POST',
body: typebot,
})
}
export const duplicateTypebot = async ({
folderId,
ownerId,
name,
}: Typebot) => {
const typebot = {
folderId,
ownerId,
name: `${name} copy`,
}
return sendRequest<Typebot>({
url: `/api/typebots`,
method: 'POST',
body: typebot,
})
}
export const deleteTypebot = async (id: string) =>
sendRequest({
url: `/api/typebots/${id}`,
method: 'DELETE',
})
export const updateTypebot = async (id: string, typebot: Partial<Typebot>) =>
sendRequest({
url: `/api/typebots/${id}`,
method: 'PATCH',
body: typebot,
})

View File

@ -0,0 +1,7 @@
import { User } from '@typebot/prisma'
import { useSession } from 'next-auth/react'
export const useUser = (): User | undefined => {
const { data } = useSession()
return data?.user as User | undefined
}

View File

@ -0,0 +1,32 @@
export const fetcher = async (input: RequestInfo, init?: RequestInit) => {
const res = await fetch(input, init)
return res.json()
}
export const isMobile =
typeof window !== 'undefined' &&
window.matchMedia('only screen and (max-width: 760px)').matches
export const sendRequest = async <ResponseData>({
url,
method,
body,
}: {
url: string
method: string
body?: Record<string, unknown>
}): Promise<{ data?: ResponseData; error?: Error }> => {
try {
const response = await fetch(url, {
method,
mode: 'cors',
body: body ? JSON.stringify(body) : undefined,
})
if (!response.ok) throw new Error(response.statusText)
const data = await response.json()
return { data }
} catch (e) {
console.error(e)
return { error: e as Error }
}
}