diff --git a/002_source/cms/src/app/dashboard/students/create/page.tsx b/002_source/cms/src/app/dashboard/students/create/page.tsx index c428fad..0f88255 100644 --- a/002_source/cms/src/app/dashboard/students/create/page.tsx +++ b/002_source/cms/src/app/dashboard/students/create/page.tsx @@ -1,19 +1,25 @@ +'use client'; + +// src/app/dashboard/students/create/page.tsx +// PURPOSE +// T.B.A. +// import * as React from 'react'; -import type { Metadata } from 'next'; import RouterLink from 'next/link'; import Box from '@mui/material/Box'; import Link from '@mui/material/Link'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; +import { useTranslation } from 'react-i18next'; import { config } from '@/config'; import { paths } from '@/paths'; import { StudentCreateForm } from '@/components/dashboard/student/student-create-form'; -export const metadata = { title: `Create | Customers | Dashboard | ${config.site.name}` } satisfies Metadata; - export default function Page(): React.JSX.Element { + const { t } = useTranslation(['students']); + return ( - Customers + {t('students')}
- Create customer + + {t('create-student')} + {/* */} +
diff --git a/002_source/cms/src/app/dashboard/students/edit/[id]/page.tsx b/002_source/cms/src/app/dashboard/students/edit/[id]/page.tsx index d80d10c..b9fc2c2 100644 --- a/002_source/cms/src/app/dashboard/students/edit/[id]/page.tsx +++ b/002_source/cms/src/app/dashboard/students/edit/[id]/page.tsx @@ -1,6 +1,9 @@ 'use client'; -// src/app/dashboard/students/edit/[customerId]/page.tsx +// src/app/dashboard/students/edit/[id]/page.tsx +// PURPOSE +// T.B.A. +// import * as React from 'react'; import RouterLink from 'next/link'; import Box from '@mui/material/Box'; diff --git a/002_source/cms/src/app/dashboard/teachers/create/page.tsx b/002_source/cms/src/app/dashboard/teachers/create/page.tsx index 294fe48..2358537 100644 --- a/002_source/cms/src/app/dashboard/teachers/create/page.tsx +++ b/002_source/cms/src/app/dashboard/teachers/create/page.tsx @@ -1,4 +1,9 @@ 'use client'; + +// src/app/dashboard/teachers/create/page.tsx +// PURPOSE +// T.B.A. +// import * as React from 'react'; import RouterLink from 'next/link'; import Box from '@mui/material/Box'; @@ -6,12 +11,15 @@ import Link from '@mui/material/Link'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; +import { useTranslation } from 'react-i18next'; import { config } from '@/config'; import { paths } from '@/paths'; import { TeacherCreateForm } from '@/components/dashboard/teacher/teacher-create-form'; export default function Page(): React.JSX.Element { + const { t } = useTranslation(['teachers']); + return ( - Teachers + {t('teachers')}
- Create teacher + + {t('create-teacher')} + {/* */} +
diff --git a/002_source/cms/src/app/dashboard/teachers/edit/[id]/page.tsx b/002_source/cms/src/app/dashboard/teachers/edit/[id]/page.tsx index f7bef10..3965e80 100644 --- a/002_source/cms/src/app/dashboard/teachers/edit/[id]/page.tsx +++ b/002_source/cms/src/app/dashboard/teachers/edit/[id]/page.tsx @@ -1,5 +1,9 @@ 'use client'; +// src/app/dashboard/teachers/edit/[id]/page.tsx +// PURPOSE +// T.B.A. +// import * as React from 'react'; import RouterLink from 'next/link'; import Box from '@mui/material/Box'; @@ -10,7 +14,8 @@ import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/Arrow import { useTranslation } from 'react-i18next'; import { paths } from '@/paths'; -import { CrCategoryEditForm } from '@/components/dashboard/cr/categories/cr-category-edit-form'; +// TODO: remove me +// import { CrCategoryEditForm } from '@/components/dashboard/cr/categories/cr-category-edit-form'; import { TeacherEditForm } from '@/components/dashboard/teacher/teacher-edit-form'; export default function Page(): React.JSX.Element { diff --git a/002_source/cms/src/app/dashboard/user_metas/view/[id]/BasicDetailCard.tsx b/002_source/cms/src/app/dashboard/user_metas/view/[id]/BasicDetailCard.tsx index 9c467fe..110c5fc 100644 --- a/002_source/cms/src/app/dashboard/user_metas/view/[id]/BasicDetailCard.tsx +++ b/002_source/cms/src/app/dashboard/user_metas/view/[id]/BasicDetailCard.tsx @@ -14,7 +14,7 @@ import { useTranslation } from 'react-i18next'; import { PropertyItem } from '@/components/core/property-item'; import { PropertyList } from '@/components/core/property-list'; // import { CrCategory } from '@/components/dashboard/cr/categories/type'; -import type { UserMeta } from '@/components/dashboard/user_meta/type.d'; +import type { UserMeta } from '@/components/dashboard/user_meta/type_move.d'; export default function BasicDetailCard({ userMeta, diff --git a/002_source/cms/src/app/dashboard/user_metas/view/[id]/page.tsx b/002_source/cms/src/app/dashboard/user_metas/view/[id]/page.tsx index ff1f083..a792805 100644 --- a/002_source/cms/src/app/dashboard/user_metas/view/[id]/page.tsx +++ b/002_source/cms/src/app/dashboard/user_metas/view/[id]/page.tsx @@ -1,5 +1,9 @@ 'use client'; +// src/app/dashboard/user_metas/view/[id]/page.tsx +// PURPOSE +// T.B.A. +// import * as React from 'react'; import RouterLink from 'next/link'; import { useParams, useRouter } from 'next/navigation'; @@ -7,7 +11,7 @@ import SampleAddressCard from '@/app/dashboard/Sample/AddressCard'; import { SampleNotifications } from '@/app/dashboard/Sample/Notifications'; import SamplePaymentCard from '@/app/dashboard/Sample/PaymentCard'; import SampleSecurityCard from '@/app/dashboard/Sample/SecurityCard'; - +import { COL_USER_METAS } from '@/constants'; import Box from '@mui/material/Box'; import Link from '@mui/material/Link'; import Stack from '@mui/material/Stack'; @@ -21,16 +25,14 @@ import { paths } from '@/paths'; import { logger } from '@/lib/default-logger'; import { pb } from '@/lib/pb'; import { toast } from '@/components/core/toaster'; - import ErrorDisplay from '@/components/dashboard/error'; - +import { defaultUserMeta } from '@/components/dashboard/user_meta/_constants'; import { Notifications } from '@/components/dashboard/user_meta/notifications'; +import type { UserMeta } from '@/components/dashboard/user_meta/type_move.d'; import FormLoading from '@/components/loading'; + import BasicDetailCard from './BasicDetailCard'; import TitleCard from './TitleCard'; -import { defaultUserMeta } from '@/components/dashboard/user_meta/_constants'; -import type { UserMeta } from '@/components/dashboard/user_meta/type.d'; -import { COL_USER_METAS } from '@/constants'; export default function Page(): React.JSX.Element { const { t } = useTranslation(); diff --git a/002_source/cms/src/components/dashboard/student/helloworld.tsx b/002_source/cms/src/components/dashboard/student/helloworld.tsx index 3989cb1..abc7f8a 100644 --- a/002_source/cms/src/components/dashboard/student/helloworld.tsx +++ b/002_source/cms/src/components/dashboard/student/helloworld.tsx @@ -1,3 +1,6 @@ +// PURPOSE +// T.B.A. +// const helloworld = 'helloworld'; export { helloworld }; diff --git a/002_source/cms/src/components/dashboard/student/student-create-form.tsx b/002_source/cms/src/components/dashboard/student/student-create-form.tsx index 7b471be..ee5ee3d 100644 --- a/002_source/cms/src/components/dashboard/student/student-create-form.tsx +++ b/002_source/cms/src/components/dashboard/student/student-create-form.tsx @@ -1,14 +1,13 @@ 'use client'; // src/components/dashboard/student/student-create-form.tsx +// PURPOSE +// T.B.A. // import * as React from 'react'; import RouterLink from 'next/link'; import { useRouter } from 'next/navigation'; -import { UpdateBillingAddressById } from '@/db/billingAddress/UpdateById'; import { createStudent } from '@/db/Students/Create'; -import { getStudentById } from '@/db/Students/GetById'; -import { UpdateStudentById } from '@/db/Students/UpdateById'; import { zodResolver } from '@hookform/resolvers/zod'; import { LoadingButton } from '@mui/lab'; // @@ -41,14 +40,10 @@ import { paths } from '@/paths'; import isDevelopment from '@/lib/check-is-development'; import { logger } from '@/lib/default-logger'; import { base64ToFile, fileToBase64 } from '@/lib/file-to-base64'; -import { pb } from '@/lib/pb'; -import { Option } from '@/components/core/option'; import { toast } from '@/components/core/toaster'; -import FormLoading from '@/components/loading'; // import ErrorDisplay from '../../error'; -import ErrorDisplay from '../error'; -import { CreateFormProps, Student } from './type.d'; +import { CreateFormProps } from './type.d'; // TODO: review schema const schema = zod.object({ @@ -135,11 +130,11 @@ export function StudentCreateForm(): React.JSX.Element { // } const record = await createStudent(tempCreate); - toast.success('Student created'); - // router.push(paths.dashboard.students.view(record.id)); + toast.success('student-created'); + router.push(paths.dashboard.students.view(record.id)); } catch (err) { logger.error(err); - toast.error('Failed to create Student'); + toast.error('failed-to-create-student'); } finally { setIsUpdating(false); } diff --git a/002_source/cms/src/components/dashboard/student/student-edit-form.tsx b/002_source/cms/src/components/dashboard/student/student-edit-form.tsx index 1810e24..3afe504 100644 --- a/002_source/cms/src/components/dashboard/student/student-edit-form.tsx +++ b/002_source/cms/src/components/dashboard/student/student-edit-form.tsx @@ -1,12 +1,13 @@ 'use client'; // src/components/dashboard/student/student-edit-form.tsx +// PURPOSE: +// handle change details for student collection // import * as React from 'react'; import RouterLink from 'next/link'; import { useParams, useRouter } from 'next/navigation'; // -import { COL_CUSTOMERS, COL_USER_METAS } from '@/constants'; import { UpdateBillingAddressById } from '@/db/billingAddress/UpdateById'; import { getStudentById } from '@/db/Students/GetById'; import { UpdateStudentById } from '@/db/Students/UpdateById'; @@ -40,12 +41,13 @@ import { paths } from '@/paths'; import isDevelopment from '@/lib/check-is-development'; import { logger } from '@/lib/default-logger'; import { base64ToFile, fileToBase64 } from '@/lib/file-to-base64'; -import { pb } from '@/lib/pb'; +import getImageUrlFromFile from '@/lib/get-image-url-from-file.ts'; import { toast } from '@/components/core/toaster'; import FormLoading from '@/components/loading'; // import ErrorDisplay from '../../error'; import ErrorDisplay from '../error'; +import type { Student } from './type.d'; // TODO: review schema const schema = zod.object({ @@ -116,8 +118,6 @@ export function StudentEditForm(): React.JSX.Element { setIsUpdating(true); const updateData = { - avatar: values.avatar ? await base64ToFile(values.avatar) : null, - // name: values.name, email: values.email, phone: values.phone, @@ -125,16 +125,17 @@ export function StudentEditForm(): React.JSX.Element { // // billingAddress: values.billingAddress, // + taxId: values.taxId, timezone: values.timezone, language: values.language, currency: values.currency, - taxId: values.taxId, + avatar: values.avatar ? await base64ToFile(values.avatar) : null, }; try { - // await pb.collection(COL_USER_METAS).update(studentId, updateData); await UpdateStudentById(studentId, updateData); - toast.success('Student updated successfully'); + // + toast.success(t('student-updated-successfully')); router.push(paths.dashboard.students.list); if (billingAddressId) { @@ -142,7 +143,7 @@ export function StudentEditForm(): React.JSX.Element { } } catch (error) { logger.error(error); - toast.error('Failed to update student'); + toast.error(t('failed-to-update-student')); } finally { setIsUpdating(false); } @@ -176,22 +177,21 @@ export function StudentEditForm(): React.JSX.Element { setShowLoading(true); try { - const result = await getStudentById(id); + const result = (await getStudentById(id)) as unknown as Student; + // reset({ ...defaultValues, ...result }); setBillingAddressId(result.billingAddress.id); if (result.avatar) { - const fetchResult = await fetch( - `http://127.0.0.1:8090/api/files/${result.collectionId}/${result.id}/${result.avatar}` - ); + const fetchResult = await fetch(getImageUrlFromFile(result.collectionId, result.id, result.avatar)); const blob = await fetchResult.blob(); const url = await fileToBase64(blob); setValue('avatar', url); } } catch (error) { logger.error(error); - toast.error('Failed to load student data'); + toast.error(t('failed-to-load-student-data')); setShowError({ show: true, detail: JSON.stringify(error, null, 2) }); } finally { setShowLoading(false); @@ -365,6 +365,7 @@ export function StudentEditForm(): React.JSX.Element { )} /> + {/* */} {/* */} diff --git a/002_source/cms/src/components/dashboard/teacher/teacher-create-form.tsx b/002_source/cms/src/components/dashboard/teacher/teacher-create-form.tsx index c8b4242..47204ca 100644 --- a/002_source/cms/src/components/dashboard/teacher/teacher-create-form.tsx +++ b/002_source/cms/src/components/dashboard/teacher/teacher-create-form.tsx @@ -1,9 +1,19 @@ 'use client'; +// src/components/dashboard/teacher/teacher-create-form.tsx +// PURPOSE +// T.B.A. +// import * as React from 'react'; import RouterLink from 'next/link'; import { useRouter } from 'next/navigation'; +import { UpdateBillingAddressById } from '@/db/billingAddress/UpdateById'; +import { createTeacher } from '@/db/Teachers/Create'; +import { getTeacherById } from '@/db/Teachers/GetById'; +import { UpdateTeacherById } from '@/db/Teachers/UpdateById'; import { zodResolver } from '@hookform/resolvers/zod'; +import { LoadingButton } from '@mui/lab'; +// import Avatar from '@mui/material/Avatar'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; @@ -16,41 +26,38 @@ import FormControl from '@mui/material/FormControl'; import FormControlLabel from '@mui/material/FormControlLabel'; import FormHelperText from '@mui/material/FormHelperText'; import InputLabel from '@mui/material/InputLabel'; +import MenuItem from '@mui/material/MenuItem'; import OutlinedInput from '@mui/material/OutlinedInput'; import Select from '@mui/material/Select'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; import Grid from '@mui/material/Unstable_Grid2'; +// import { Camera as CameraIcon } from '@phosphor-icons/react/dist/ssr/Camera'; +// import { Controller, useForm } from 'react-hook-form'; +import { useTranslation } from 'react-i18next'; import { z as zod } from 'zod'; import { paths } from '@/paths'; +import isDevelopment from '@/lib/check-is-development'; import { logger } from '@/lib/default-logger'; +import { base64ToFile, fileToBase64 } from '@/lib/file-to-base64'; +import { pb } from '@/lib/pb'; import { Option } from '@/components/core/option'; import { toast } from '@/components/core/toaster'; -import { createTeacher } from '@/db/Teachers/Create'; -import isDevelopment from '@/lib/check-is-development'; +import FormLoading from '@/components/loading'; -function fileToBase64(file: Blob): Promise { - return new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.readAsDataURL(file); - reader.onload = () => { - resolve(reader.result as string); - }; - reader.onerror = () => { - reject(new Error('Error converting file to base64')); - }; - }); -} +// import ErrorDisplay from '../../error'; +import ErrorDisplay from '../error'; +import { CreateFormProps } from './type.d'; +// TODO: review schema const schema = zod.object({ - avatar: zod.string().optional(), name: zod.string().min(1, 'Name is required').max(255), email: zod.string().email('Must be a valid email').min(1, 'Email is required').max(255), - phone: zod.string().min(1, 'Phone is required').max(15), - company: zod.string().max(255), + phone: zod.string().min(1, 'Phone is required').max(25), + company: zod.string().max(255).optional(), billingAddress: zod.object({ country: zod.string().min(1, 'Country is required').max(255), state: zod.string().min(1, 'State is required').max(255), @@ -63,12 +70,12 @@ const schema = zod.object({ timezone: zod.string().min(1, 'Timezone is required').max(255), language: zod.string().min(1, 'Language is required').max(255), currency: zod.string().min(1, 'Currency is required').max(255), + avatar: zod.string().optional(), }); type Values = zod.infer; const defaultValues = { - avatar: '', name: 'new name', email: '123@123.com', phone: '91234567', @@ -85,10 +92,18 @@ const defaultValues = { timezone: 'new_york', language: 'en', currency: 'USD', + avatar: '', } satisfies Values; export function TeacherCreateForm(): React.JSX.Element { const router = useRouter(); + const { t } = useTranslation(['students']); + + // + const [isUpdating, setIsUpdating] = React.useState(false); + const [showLoading, setShowLoading] = React.useState(false); + // + const [showError, setShowError] = React.useState({ show: false, detail: '' }); const { control, @@ -100,14 +115,31 @@ export function TeacherCreateForm(): React.JSX.Element { const onSubmit = React.useCallback( async (values: Values): Promise => { + // Use standard create method from db/Customers/Create + const tempCreate: CreateFormProps = { + avatar: values.avatar ? await base64ToFile(values.avatar) : null, + // + name: values.name, + email: values.email, + phone: values.phone, + company: values.company, + timezone: values.timezone, + language: values.language, + currency: values.currency, + taxId: values.taxId, + state: 'pending', + meta: {}, + }; + try { - // Use standard create method from db/Customers/Create - const record = await createTeacher(values); - toast.success('Customer created'); + const record = await createTeacher(tempCreate); + toast.success('teacher-created'); router.push(paths.dashboard.teachers.details(record.id)); } catch (err) { logger.error(err); - toast.error('Failed to create customer'); + toast.error('failed-to-create-teacher'); + } finally { + setIsUpdating(false); } }, [router] @@ -137,7 +169,7 @@ export function TeacherCreateForm(): React.JSX.Element { spacing={4} > - Account information + {t('create.basic-info')} - Avatar - Min 400x400px, PNG or JPEG + {t('create.avatar')} + {t('create.avatarRequirements')} - Email address + {t('create.email-address')} - Phone number + {t('create.phone-number')} {errors.phone ? {errors.phone.message} : null} @@ -268,7 +301,10 @@ export function TeacherCreateForm(): React.JSX.Element { fullWidth > Company - + {errors.company ? {errors.company.message} : null} )} @@ -276,8 +312,9 @@ export function TeacherCreateForm(): React.JSX.Element { + {/* */} - Billing information + {t('create.billing-information')} Country {errors.billingAddress?.country ? ( {errors.billingAddress?.country?.message} @@ -362,7 +401,7 @@ export function TeacherCreateForm(): React.JSX.Element { error={Boolean(errors.billingAddress?.zipCode)} fullWidth > - Zip code + {t('create.zip-code')} {errors.billingAddress?.zipCode ? ( {errors.billingAddress?.zipCode?.message} @@ -383,7 +422,7 @@ export function TeacherCreateForm(): React.JSX.Element { error={Boolean(errors.billingAddress?.line1)} fullWidth > - Address + {t('create.address-line-1')} {errors.billingAddress?.line1 ? ( {errors.billingAddress?.line1?.message} @@ -424,7 +463,7 @@ export function TeacherCreateForm(): React.JSX.Element { /> - Additional information + {t('create.additional-information')} Timezone {errors.timezone ? {errors.timezone.message} : null} @@ -467,10 +510,11 @@ export function TeacherCreateForm(): React.JSX.Element { > Language {errors.language ? {errors.language.message} : null} @@ -489,12 +533,12 @@ export function TeacherCreateForm(): React.JSX.Element { error={Boolean(errors.currency)} fullWidth > - Currency + {t('create.currency')} {errors.currency ? {errors.currency.message} : null} @@ -511,14 +555,17 @@ export function TeacherCreateForm(): React.JSX.Element { component={RouterLink} href={paths.dashboard.teachers.list} > - Cancel + {t('create.cancelButton')} - + {t('create.updateButton')} + diff --git a/002_source/cms/src/components/dashboard/teacher/teacher-edit-form.tsx b/002_source/cms/src/components/dashboard/teacher/teacher-edit-form.tsx index 9bee1da..51c8d1a 100644 --- a/002_source/cms/src/components/dashboard/teacher/teacher-edit-form.tsx +++ b/002_source/cms/src/components/dashboard/teacher/teacher-edit-form.tsx @@ -1,12 +1,16 @@ 'use client'; // src/components/dashboard/teacher/teacher-edit-form.tsx +// PURPOSE: +// handle change details for teachers collection // import * as React from 'react'; import RouterLink from 'next/link'; import { useParams, useRouter } from 'next/navigation'; // -import { COL_USER_METAS } from '@/constants'; +import { UpdateBillingAddressById } from '@/db/billingAddress/UpdateById'; +import { getTeacherById } from '@/db/Teachers/GetById'; +import { UpdateTeacherById } from '@/db/Teachers/UpdateById'; import { zodResolver } from '@hookform/resolvers/zod'; import { LoadingButton } from '@mui/lab'; // @@ -37,14 +41,15 @@ import { paths } from '@/paths'; import isDevelopment from '@/lib/check-is-development'; import { logger } from '@/lib/default-logger'; import { base64ToFile, fileToBase64 } from '@/lib/file-to-base64'; -import { pb } from '@/lib/pb'; +import getImageUrlFromFile from '@/lib/get-image-url-from-file.ts'; import { toast } from '@/components/core/toaster'; import FormLoading from '@/components/loading'; // import ErrorDisplay from '../../error'; import ErrorDisplay from '../error'; +import type { Teacher } from './type.d'; -// TODO: review this +// TODO: review schema const schema = zod.object({ name: zod.string().min(1, 'Name is required').max(255), email: zod.string().email('Must be a valid email').min(1, 'Email is required').max(255), @@ -89,7 +94,7 @@ const defaultValues = { export function TeacherEditForm(): React.JSX.Element { const router = useRouter(); - const { t } = useTranslation(['lp_categories']); + const { t } = useTranslation(['teachers']); const { id: teacherId } = useParams<{ id: string }>(); // @@ -97,6 +102,7 @@ export function TeacherEditForm(): React.JSX.Element { const [showLoading, setShowLoading] = React.useState(false); // const [showError, setShowError] = React.useState({ show: false, detail: '' }); + const [billingAddressId, setBillingAddressId] = React.useState(null); const { control, @@ -116,7 +122,9 @@ export function TeacherEditForm(): React.JSX.Element { email: values.email, phone: values.phone, company: values.company, - billingAddress: values.billingAddress, + // + // billingAddress: values.billingAddress, + // taxId: values.taxId, timezone: values.timezone, language: values.language, @@ -125,12 +133,17 @@ export function TeacherEditForm(): React.JSX.Element { }; try { - await pb.collection(COL_USER_METAS).update(teacherId, updateData); - toast.success('Teacher updated successfully'); + await UpdateTeacherById(teacherId, updateData); + // + toast.success(t('teacher-updated-successfully')); router.push(paths.dashboard.teachers.list); + + if (billingAddressId) { + await UpdateBillingAddressById(billingAddressId, values.billingAddress); + } } catch (error) { logger.error(error); - toast.error('Failed to update teacher'); + toast.error(t('failed-to-update-teacher')); } finally { setIsUpdating(false); } @@ -164,21 +177,21 @@ export function TeacherEditForm(): React.JSX.Element { setShowLoading(true); try { - const result = await pb.collection(COL_USER_METAS).getOne(id); + const result = (await getTeacherById(id)) as unknown as Teacher; + // reset({ ...defaultValues, ...result }); - console.log({ result }); + + setBillingAddressId(result.billingAddress.id); if (result.avatar) { - const fetchResult = await fetch( - `http://127.0.0.1:8090/api/files/${result.collectionId}/${result.id}/${result.avatar}` - ); + const fetchResult = await fetch(getImageUrlFromFile(result.collectionId, result.id, result.avatar)); const blob = await fetchResult.blob(); const url = await fileToBase64(blob); setValue('avatar', url); } } catch (error) { logger.error(error); - toast.error('Failed to load teacher data'); + toast.error(t('failed-to-load-teacher-data')); setShowError({ show: true, detail: JSON.stringify(error, null, 2) }); } finally { setShowLoading(false); @@ -301,7 +314,7 @@ export function TeacherEditForm(): React.JSX.Element { error={Boolean(errors.email)} fullWidth > - Email + {t('edit.email-address')} - Phone + {t('edit.phone-number')} {errors.phone ? {errors.phone.message} : null} @@ -352,11 +365,12 @@ export function TeacherEditForm(): React.JSX.Element { )} /> + {/* */} {/* */} - Billing Information + {t('edit.billing-information')} Country {errors.billingAddress?.country ? ( {errors.billingAddress.country.message} @@ -440,7 +457,7 @@ export function TeacherEditForm(): React.JSX.Element { error={Boolean(errors.billingAddress?.zipCode)} fullWidth > - Zip Code + {t('edit.zip-code')} {errors.billingAddress?.zipCode ? ( {errors.billingAddress.zipCode.message} @@ -461,7 +478,7 @@ export function TeacherEditForm(): React.JSX.Element { error={Boolean(errors.billingAddress?.line1)} fullWidth > - Address Line 1 + {t('edit.address-line-1')} {errors.billingAddress?.line1 ? ( {errors.billingAddress.line1.message} @@ -496,7 +513,7 @@ export function TeacherEditForm(): React.JSX.Element { - Additional Information + {t('edit.additional-information')} Language {errors.language ? {errors.language.message} : null} @@ -564,8 +583,9 @@ export function TeacherEditForm(): React.JSX.Element { error={Boolean(errors.currency)} fullWidth > - Currency + {t('edit.currency')} + No Country selected United States United Kingdom Canada + Germany + Spain {errors.billingAddress?.country ? ( {errors.billingAddress.country.message} @@ -449,7 +457,7 @@ export function UserMetaEditForm(): React.JSX.Element { error={Boolean(errors.billingAddress?.zipCode)} fullWidth > - Zip Code + {t('edit.zip-code')} {errors.billingAddress?.zipCode ? ( {errors.billingAddress.zipCode.message} @@ -470,7 +478,7 @@ export function UserMetaEditForm(): React.JSX.Element { error={Boolean(errors.billingAddress?.line1)} fullWidth > - Address Line 1 + {t('edit.address-line-1')} {errors.billingAddress?.line1 ? ( {errors.billingAddress.line1.message} @@ -505,7 +513,7 @@ export function UserMetaEditForm(): React.JSX.Element { - {t('additional-information')} + {t('edit.additional-information')} Language {errors.language ? {errors.language.message} : null} @@ -573,8 +583,9 @@ export function UserMetaEditForm(): React.JSX.Element { error={Boolean(errors.currency)} fullWidth > - Currency + {t('edit.currency')}