'use client' import type { SubscriptionModel } from '@dify/contracts/api/console/features/types.gen' import type { GetWorkspacesCurrentSummaryResponse } from '@dify/contracts/api/console/workspaces/types.gen' import type { ReactNode } from 'react' import type { EducationRole } from './types' import { Button, buttonVariants } from '@langgenius/dify-ui/button' import { Checkbox } from '@langgenius/dify-ui/checkbox' import { CheckboxGroup } from '@langgenius/dify-ui/checkbox-group' import { Field, FieldDescription, FieldItem, FieldLabel } from '@langgenius/dify-ui/field' import { Fieldset, FieldsetLegend } from '@langgenius/dify-ui/fieldset' import { Form } from '@langgenius/dify-ui/form' import { toast } from '@langgenius/dify-ui/toast' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { useAtomValue } from 'jotai' import { useState } from 'react' import { Trans, useTranslation } from 'react-i18next' import { useEducationDiscount } from '@/app/components/billing/hooks/use-education-discount' import { useDocLink } from '@/context/i18n' import { currentWorkspaceAtom, isCurrentWorkspaceManagerAtom } from '@/context/workspace-state' import { useAsyncWindowOpen } from '@/hooks/use-async-window-open' import Link from '@/next/link' import { consoleClient, consoleQuery } from '@/service/client' import UserInfo from '../user-info' import AppliedEducationContent from './applied-education-content' import InstitutionField from './institution-field' import RoleSelector from './role-selector' const REQUIRED_AGREEMENTS = ['age', 'inSchool', 'personalUse'] const AppliedEducationCase = { eligible: 'eligible', activeSubscription: 'activeSubscription', noPaymentPermission: 'noPaymentPermission', } as const type EducationApplyPageProps = { plan: SubscriptionModel['plan'] token: string } const EducationApplyPage = ({ plan, token }: EducationApplyPageProps) => { const { t } = useTranslation() const queryClient = useQueryClient() const [schoolName, setSchoolName] = useState('') const [role, setRole] = useState('Student') const [agreements, setAgreements] = useState([]) const [hasSubmittedEducation, setHasSubmittedEducation] = useState(false) const [isOpeningBillingPortal, setIsOpeningBillingPortal] = useState(false) const { isPending, mutate: educationAdd } = useMutation( consoleQuery.account.education.post.mutationOptions(), ) const { data: isEducationAccount = false } = useQuery( consoleQuery.account.education.get.queryOptions({ select: ({ is_student }) => is_student ?? false, }), ) const currentWorkspace = useAtomValue(currentWorkspaceAtom) const isCurrentWorkspaceManager = useAtomValue(isCurrentWorkspaceManagerAtom) const docLink = useDocLink() const { handleEducationDiscount } = useEducationDiscount() const openAsyncWindow = useAsyncWindowOpen() const switchWorkspaceMutation = useMutation(consoleQuery.workspaces.switch.post.mutationOptions()) const appliedEducationCase = (() => { if (!isCurrentWorkspaceManager) return AppliedEducationCase.noPaymentPermission if (plan === 'sandbox') return AppliedEducationCase.eligible return AppliedEducationCase.activeSubscription })() const handleSubmit = () => { educationAdd( { body: { token, role, institution: schoolName, }, }, { onSuccess: (res) => { if (res.message === 'success') { void queryClient.invalidateQueries({ queryKey: consoleQuery.features.get.queryKey() }) setHasSubmittedEducation(true) } else { toast.error(t(($) => $.submitError, { ns: 'education' })) } }, }, ) } const handleOpenBillingPortal = async () => { if (isOpeningBillingPortal) return setIsOpeningBillingPortal(true) try { await openAsyncWindow( async () => { const res = await consoleClient.billing.invoices.get() if (res.url) return res.url throw new Error('Failed to open billing page') }, { onError: (err) => { toast.error(err.message || String(err)) }, }, ) } finally { setIsOpeningBillingPortal(false) } } const renderBackToDifyButton = () => (