@procraft/widget-order
Version:
Order widget for landing
270 lines (242 loc) • 7.22 kB
text/typescript
/* eslint-disable @typescript-eslint/ban-ts-ignore */
import * as _ from 'lodash'
import { capitalize } from 'lodash'
import { CourseFragment } from '../interfaces/CourseFragment'
import {
CourseSubKind,
LangGender,
LangRussianNoun,
} from '../modules/gql/generated/types'
import { formatGenderSpecific, LanguageCase } from './i18n'
import { langRussianNounGetCase } from './LangRussianNoun'
export type CaseTranslationProvider = (languageCase?: LanguageCase) => string
export type CourseSubKindPartial = {
subKind: CourseSubKind
subKindLabel?: LangRussianNoun | null
}
export type CourseSubKindPartialWithString = {
subKind: CourseSubKind
subKindLabel?: LangRussianNoun | string | null
}
export enum CourseKind {
Course = 'Course',
Webinar = 'Webinar',
Subscription = 'Subscription',
Abonnement = 'Abonnement',
}
export function getCaseTranslationProvider(
translations: string[],
cases: LanguageCase[]
): CaseTranslationProvider {
return (languageCase) => {
const casePosition = cases.indexOf(languageCase || LanguageCase.Nominative)
if (casePosition >= 0) {
return translations?.[casePosition] || ''
} else {
return ''
}
}
}
export function getCourseSubKindCaseTranslationProvider(
subKind: CourseSubKind
): CaseTranslationProvider {
return getCaseTranslationProvider(courseSubKindLabels[subKind], [
LanguageCase.Nominative,
LanguageCase.Genitive,
LanguageCase.Accusative,
LanguageCase.Dative,
])
}
export function getCourseKindCaseTranslationProvider(
kind: CourseKind
): CaseTranslationProvider {
return getCaseTranslationProvider(courseKindLabels[kind], [
LanguageCase.Nominative,
LanguageCase.Genitive,
LanguageCase.Accusative,
LanguageCase.Dative,
LanguageCase.Instrumental,
LanguageCase.Prepositional,
])
}
export function formatCourseSubKind(
subKind: CourseSubKind,
languageCase?: LanguageCase
): string {
return getCourseSubKindCaseTranslationProvider(subKind)(languageCase)
}
export function formatCourseSubKindLabel(
course: CourseSubKindPartialWithString,
languageCase?: LanguageCase
): string {
if (course.subKind === CourseSubKind.OTHER) {
if (_.isString(course.subKindLabel)) {
return course.subKindLabel
} else {
return langRussianNounGetCase(
course.subKindLabel as LangRussianNoun,
languageCase ?? LanguageCase.Nominative
)
}
} else {
return getCourseSubKindCaseTranslationProvider(course.subKind)(languageCase)
}
}
export function formatCourseKind(
kind: CourseKind,
languageCase?: LanguageCase
): string {
return getCourseKindCaseTranslationProvider(kind)(languageCase)
}
export function formatCourse(course: {
name: string
kind: CourseKind
subKind: CourseSubKind
subKindLabel?: LangRussianNoun | string
}): string {
const label = (() => {
const kind =
formatCourseSubKindLabel(course) || formatCourseKind(course.kind)
if (kind) {
return `${kind} "${course.name}"`
} else {
return course.name
}
})()
return label?.trim()
}
export function courseSubKindGetGender(
courseSubKindPartial: CourseSubKindPartial
): LangGender {
if (courseSubKindPartial.subKind === CourseSubKind.OTHER) {
return courseSubKindPartial.subKindLabel?.gender ?? LangGender.NEUTER
}
const femaleKinds = [CourseSubKind.SUBSCRIPTION]
if (femaleKinds.includes(courseSubKindPartial.subKind)) {
return LangGender.FEMININE
} else {
return LangGender.MASCULINE
}
}
export function formatFreeLabel(course: CourseFragment): string | null {
if (course.subKind == null) {
return null
}
const gender = courseSubKindGetGender({
subKind: course.subKind,
subKindLabel: course.subKindLabel,
})
const courseSubKindFormatted = formatCourseSubKindLabel({
subKind: course.subKind,
subKindLabel: course.subKindLabel,
})
if (gender === LangGender.NEUTER) {
return `${capitalize(courseSubKindFormatted)} - бесплатно`
} else {
const freeWord = formatGenderSpecific(gender, 'бесплатный', 'бесплатная')
return `${capitalize(freeWord)} ${courseSubKindFormatted}`
}
}
export const courseSubKindLabels = (() => {
// eslint-disable-next-line
const answer = {} as any
// именительный, родительный, винительный, дательный
answer[CourseSubKind.COURSE] = ['курс', 'курса', 'курс', 'курсу']
answer[CourseSubKind.INTENSIVE] = [
'интенсив',
'интенсива',
'интенсив',
'интенсиву',
]
answer[CourseSubKind.MARATHON] = [
'марафон',
'марафона',
'марафон',
'марафону',
]
answer[CourseSubKind.FACULTY] = [
'факультет',
'факультета',
'факультет',
'факультету',
]
answer[CourseSubKind.WEBINAR] = ['вебинар', 'вебинара', 'вебинар', 'вебинару']
answer[CourseSubKind.MASTERCLASS] = [
'мастер-класс',
'мастер-класса',
'мастер-класс',
'мастер-классу',
]
answer[CourseSubKind.FORUM] = ['форум', 'форума', 'форум', 'форуму']
answer[CourseSubKind.WORKSHOP] = [
'воркшоп',
'воркшопа',
'воркшоп',
'воркшопу',
]
answer[CourseSubKind.PRERECORDING] = [
'предзапись',
'предзаписи',
'предзапись',
'предзаписи',
]
answer[CourseSubKind.SUBSCRIPTION] = [
'подписка',
'подписки',
'подписку',
'подписке',
]
answer[CourseSubKind.CLUB] = ['клуб', 'клуба', 'клуб', 'клубу']
answer[CourseSubKind.ABONNEMENT] = [
'абонемент',
'абонемента',
'абонемент',
'абонементу',
]
answer[CourseSubKind.TRAINING] = [
'тренинг',
'тренинга',
'тренинг',
'тренингу',
]
answer[CourseSubKind.OTHER] = ['другое', 'другого', 'другое', 'другому']
return answer
})()
export const courseKindLabels = (() => {
// eslint-disable-next-line
const answer = {} as any
// именительный, родительный, винительный, дательный, Творительный (кем, чем), Предложный (о ком, о чем)
answer[CourseKind.Course] = [
'курс',
'курса',
'курс',
'курсу',
'курсом',
'курсе',
]
answer[CourseKind.Webinar] = [
'вебинар',
'вебинара',
'вебинар',
'вебинару',
'вебинаром',
'вебинаре',
]
answer[CourseKind.Subscription] = [
'подписка',
'подписки',
'подписку',
'подписке',
'подпиской',
'подписке',
]
answer[CourseKind.Abonnement] = [
'абонемент',
'абонемента',
'абонемент',
'абонементу',
'абонементом',
'абонементе',
]
return answer
})()