Add Dashboard
This commit is contained in:
4
apps/builder/services/api/utils.ts
Normal file
4
apps/builder/services/api/utils.ts
Normal file
@ -0,0 +1,4 @@
|
||||
import { NextApiResponse } from 'next'
|
||||
|
||||
export const methodNotAllowed = (res: NextApiResponse) =>
|
||||
res.status(405).json({ message: 'Method Not Allowed' })
|
69
apps/builder/services/folders.ts
Normal file
69
apps/builder/services/folders.ts
Normal 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,
|
||||
})
|
69
apps/builder/services/typebots.ts
Normal file
69
apps/builder/services/typebots.ts
Normal 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,
|
||||
})
|
7
apps/builder/services/user.ts
Normal file
7
apps/builder/services/user.ts
Normal 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
|
||||
}
|
32
apps/builder/services/utils.ts
Normal file
32
apps/builder/services/utils.ts
Normal 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 }
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user