fix redirect to checkout when the org has not a subscription
This commit is contained in:
@@ -30,20 +30,8 @@ import { initials } from '@repo/ui/lib/utils'
|
||||
import { Link } from 'react-router'
|
||||
|
||||
import type { Workspace, WorkspaceContextProps } from '@/middleware/workspace'
|
||||
import type { Address } from '@/routes/_.$orgid.enrollments.buy/review'
|
||||
|
||||
type Subscription = {
|
||||
billing_day: number
|
||||
payment_method: 'PIX' | 'BANK_SLIP' | 'MANUAL'
|
||||
}
|
||||
|
||||
const WorkspaceContext = createContext<
|
||||
| (WorkspaceContextProps & {
|
||||
subscription: Subscription | null
|
||||
address: Address | null
|
||||
})
|
||||
| null
|
||||
>(null)
|
||||
const WorkspaceContext = createContext<WorkspaceContextProps | null>(null)
|
||||
|
||||
export function useWorksapce() {
|
||||
const ctx = use(WorkspaceContext)
|
||||
@@ -56,33 +44,12 @@ export function useWorksapce() {
|
||||
}
|
||||
|
||||
export function WorkspaceProvider({
|
||||
activeWorkspace,
|
||||
workspaces,
|
||||
subscription,
|
||||
address,
|
||||
children
|
||||
}: {
|
||||
activeWorkspace: Workspace
|
||||
workspaces: Workspace[]
|
||||
subscription?: Subscription
|
||||
address?: Address
|
||||
children,
|
||||
...props
|
||||
}: WorkspaceContextProps & {
|
||||
children: React.ReactNode
|
||||
}) {
|
||||
return (
|
||||
<WorkspaceContext
|
||||
value={{
|
||||
activeWorkspace,
|
||||
workspaces,
|
||||
address: address && Object.keys(address).length > 0 ? address : null,
|
||||
subscription:
|
||||
subscription && Object.keys(subscription).length > 0
|
||||
? subscription
|
||||
: null
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</WorkspaceContext>
|
||||
)
|
||||
return <WorkspaceContext value={props}>{children}</WorkspaceContext>
|
||||
}
|
||||
|
||||
export function WorkspaceSwitcher() {
|
||||
|
||||
@@ -3,6 +3,13 @@ import { type LoaderFunctionArgs, createContext } from 'react-router'
|
||||
import { userContext } from '@repo/auth/context'
|
||||
import { request as req } from '@repo/util/request'
|
||||
|
||||
import type { Address } from '@/routes/_.$orgid.enrollments.buy/review'
|
||||
|
||||
export type Subscription = {
|
||||
billing_day: number
|
||||
payment_method: 'PIX' | 'BANK_SLIP' | 'MANUAL'
|
||||
}
|
||||
|
||||
export type Workspace = {
|
||||
id: string
|
||||
name: string
|
||||
@@ -12,6 +19,8 @@ export type Workspace = {
|
||||
export type WorkspaceContextProps = {
|
||||
activeWorkspace: Workspace
|
||||
workspaces: Workspace[]
|
||||
subscription: Subscription | null
|
||||
address: Address | null
|
||||
}
|
||||
|
||||
export const workspaceContext = createContext<WorkspaceContextProps>()
|
||||
@@ -43,7 +52,33 @@ export const workspaceMiddleware = async (
|
||||
({ id }) => id === org_id
|
||||
) as Workspace
|
||||
|
||||
context.set(workspaceContext, { activeWorkspace, workspaces })
|
||||
const [subscription, address] = await Promise.all([
|
||||
req({
|
||||
url: `/orgs/${activeWorkspace.id}/subscription`,
|
||||
request,
|
||||
context
|
||||
})
|
||||
.then((r) => r.json())
|
||||
.then(emptyObjectToNull),
|
||||
|
||||
req({
|
||||
url: `/orgs/${activeWorkspace.id}/address`,
|
||||
request,
|
||||
context
|
||||
})
|
||||
.then((r) => r.json())
|
||||
.then(emptyObjectToNull)
|
||||
])
|
||||
|
||||
context.set(workspaceContext, {
|
||||
activeWorkspace,
|
||||
workspaces,
|
||||
subscription,
|
||||
address
|
||||
})
|
||||
|
||||
return await next()
|
||||
}
|
||||
|
||||
const emptyObjectToNull = (data: any) =>
|
||||
data && Object.keys(data).length === 0 ? null : data
|
||||
|
||||
@@ -67,7 +67,6 @@ export default function Route({
|
||||
loaderData: { enrollments }
|
||||
}: Route.ComponentProps) {
|
||||
const { orgid } = useParams()
|
||||
const { subscription } = useWorksapce()
|
||||
const [searchParams, setSearchParams] = useSearchParams()
|
||||
const [selectedRows, setSelectedRows] = useState<Enrollment[]>([])
|
||||
const status = searchParams.get('status')
|
||||
@@ -205,7 +204,7 @@ export default function Route({
|
||||
<DataTableViewOptions className="flex-1" />
|
||||
|
||||
<Button className="flex-1" asChild>
|
||||
<Link to={subscription ? 'add' : 'buy'}>
|
||||
<Link to="add">
|
||||
<PlusIcon /> Adicionar
|
||||
</Link>
|
||||
</Button>
|
||||
|
||||
@@ -72,6 +72,7 @@ import { ScheduledForInput } from './scheduled-for'
|
||||
import { CoursePicker } from './course-picker'
|
||||
import { UserPicker } from './user-picker'
|
||||
import { cn } from '@repo/ui/lib/utils'
|
||||
import { workspaceContext } from '@/middleware/workspace'
|
||||
|
||||
const emptyRow = {
|
||||
user: undefined,
|
||||
@@ -84,6 +85,12 @@ export function meta({}: Route.MetaArgs) {
|
||||
}
|
||||
|
||||
export async function loader({ params, context, request }: Route.LoaderArgs) {
|
||||
const { subscription } = context.get(workspaceContext)
|
||||
// If there's no subscription for the org, redirect to checkout
|
||||
if (!subscription) {
|
||||
throw redirect('../enrollments/buy')
|
||||
}
|
||||
|
||||
const url = new URL(request.url)
|
||||
const submissionId = url.searchParams.get('submission')
|
||||
const cloudflare = context.get(cloudflareContext)
|
||||
|
||||
@@ -27,32 +27,17 @@ export const middleware: Route.MiddlewareFunction[] = [
|
||||
workspaceMiddleware
|
||||
]
|
||||
|
||||
export async function loader({ params, context, request }: Route.ActionArgs) {
|
||||
export async function loader({ context, request }: Route.ActionArgs) {
|
||||
const user = context.get(userContext)!
|
||||
const { activeWorkspace, workspaces } = context.get(workspaceContext)
|
||||
const workspace = context.get(workspaceContext)
|
||||
const rawCookie = request.headers.get('cookie') || ''
|
||||
const parsedCookies = cookie.parse(rawCookie)
|
||||
const { sidebar_state = 'true' } = parsedCookies
|
||||
|
||||
const subscription = req({
|
||||
url: `/orgs/${activeWorkspace.id}/subscription`,
|
||||
request,
|
||||
context
|
||||
}).then((r) => r.json())
|
||||
|
||||
const address = req({
|
||||
url: `/orgs/${activeWorkspace.id}/address`,
|
||||
request,
|
||||
context
|
||||
}).then((r) => r.json())
|
||||
|
||||
return {
|
||||
user,
|
||||
activeWorkspace,
|
||||
workspaces,
|
||||
sidebar_state,
|
||||
subscription,
|
||||
address
|
||||
...workspace
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,9 +49,14 @@ export function shouldRevalidate({
|
||||
}
|
||||
|
||||
export default function Route({ loaderData }: Route.ComponentProps) {
|
||||
const { user, activeWorkspace, workspaces, sidebar_state } = loaderData
|
||||
const subscription = use(loaderData.subscription)
|
||||
const address = use(loaderData.address)
|
||||
const {
|
||||
user,
|
||||
activeWorkspace,
|
||||
workspaces,
|
||||
subscription,
|
||||
address,
|
||||
sidebar_state
|
||||
} = loaderData
|
||||
|
||||
useEffect(() => {
|
||||
if (typeof window !== 'undefined' && window.rybbit) {
|
||||
|
||||
Reference in New Issue
Block a user