mirror of
https://github.com/overleaf/overleaf.git
synced 2024-12-02 12:49:33 -05:00
0c81bccfca
GitOrigin-RevId: 5a38b4c01921fd4d95dbdb7b9e756443fdb00b80
55 lines
1.7 KiB
TypeScript
55 lines
1.7 KiB
TypeScript
import displayNameForUser from '../../../ide/history/util/displayNameForUser'
|
|
import moment from 'moment/moment'
|
|
import ColorManager from '../../../ide/colors/ColorManager'
|
|
import { DocDiffChunk, Highlight } from '../services/types/doc'
|
|
import { TFunction } from 'i18next'
|
|
|
|
export function highlightsFromDiffResponse(
|
|
chunks: DocDiffChunk[],
|
|
t: TFunction<'translation'> // Must be called `t` for i18next-scanner to find calls to it
|
|
) {
|
|
let pos = 0
|
|
const highlights: Highlight[] = []
|
|
let doc = ''
|
|
|
|
for (const entry of chunks) {
|
|
const content = entry.u || entry.i || entry.d || ''
|
|
doc += content
|
|
const from = pos
|
|
const to = doc.length
|
|
pos = to
|
|
const range = { from, to }
|
|
|
|
const isInsertion = typeof entry.i === 'string'
|
|
const isDeletion = typeof entry.d === 'string'
|
|
|
|
if (isInsertion || isDeletion) {
|
|
const meta = entry.meta
|
|
if (!meta) {
|
|
throw new Error('No meta found')
|
|
}
|
|
const user = meta.users?.[0]
|
|
const name = displayNameForUser(user)
|
|
const date = moment(meta.end_ts).format('Do MMM YYYY, h:mm a')
|
|
if (isInsertion) {
|
|
highlights.push({
|
|
type: 'addition',
|
|
// There doesn't seem to be a convenient way to make this translatable
|
|
label: t('added_by_on', { name, date }),
|
|
range,
|
|
hue: ColorManager.getHueForUserId(user?.id),
|
|
})
|
|
} else if (isDeletion) {
|
|
highlights.push({
|
|
type: 'deletion',
|
|
// There doesn't seem to be a convenient way to make this translatable
|
|
label: t('deleted_by_on', { name, date }),
|
|
range,
|
|
hue: ColorManager.getHueForUserId(user?.id),
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
return { doc, highlights }
|
|
}
|