UNPKG

@procraft/widget-order

Version:

Order widget for landing

270 lines (242 loc) 7.22 kB
/* 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 })()