page-title.ts 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. export interface StudioPageTitleParts {
  2. entity?: string
  3. section?: string
  4. surface?: string
  5. project?: string
  6. org?: string
  7. brand?: string
  8. }
  9. export const STUDIO_PAGE_TITLE_SEPARATOR = ' | '
  10. const MAX_SEGMENT_LENGTH = 60
  11. const normalizeTitleSegment = (value?: string) => {
  12. if (value === undefined) return undefined
  13. const normalized = value.trim().replace(/\s+/g, ' ')
  14. if (normalized.length === 0) return undefined
  15. if (normalized.length <= MAX_SEGMENT_LENGTH) return normalized
  16. return `${normalized.slice(0, MAX_SEGMENT_LENGTH - 1).trimEnd()}…`
  17. }
  18. export const buildStudioPageTitle = (parts: StudioPageTitleParts) => {
  19. const orderedParts = [
  20. parts.entity,
  21. parts.section,
  22. parts.surface,
  23. parts.project,
  24. parts.org,
  25. parts.brand,
  26. ]
  27. const segments: string[] = []
  28. orderedParts.forEach((part) => {
  29. const segment = normalizeTitleSegment(part)
  30. if (!segment) return
  31. const lastSegment = segments[segments.length - 1]
  32. if (lastSegment !== undefined && lastSegment.toLowerCase() === segment.toLowerCase()) return
  33. segments.push(segment)
  34. })
  35. return segments.join(STUDIO_PAGE_TITLE_SEPARATOR)
  36. }