import type { GrafaidOld } from '#lib/grafaid-old/index'
import { CRITICALITY_LEVELS } from '#lib/graphql-change/criticality'
import { GraphqlChange } from '#lib/graphql-change/index'
import type { GraphqlChangeset } from '#lib/graphql-changeset/index'
import type { CriticalityLevel } from '@graphql-inspector/core'
import { Box } from '@radix-ui/themes'
import { neverCase } from '@wollybeard/kit/language'
import type React from 'react'
import { useMemo } from 'react'
import type { Schema as ChangelogData } from '../../api/schema/index.js'
import { CriticalitySection } from './Changelog/CriticalitySection.js'
import * as Group from './Changelog/groups/index.js'
export const renderDate = (date: Date) => {
return date.toLocaleString(`default`, {
month: `long`,
year: `numeric`,
day: `numeric`,
timeZone: `utc`,
})
}
export const Changelog: React.FC<{ schema: ChangelogData.Schema }> = ({ schema }) => {
return (
{schema.versions.map(changeset => )}
)
}
const Changeset: React.FC<{ changeset: GraphqlChangeset.ChangeSet }> = ({ changeset }) => {
// Group changes by criticality level
const groupedChanges = useMemo(() => {
const groups = {} as Record
// Initialize empty arrays for each level
CRITICALITY_LEVELS.forEach(level => {
groups[level] = []
})
// Group changes
changeset.changes.forEach(change => {
const level = change.criticality.level
if (groups[level]) {
groups[level].push(change)
}
})
// Return only non-empty groups in order
return CRITICALITY_LEVELS
.filter(level => groups[level].length > 0)
.map(level => ({
level,
changes: groups[level],
}))
}, [changeset.changes])
return (
{renderDate(changeset.date)}
{groupedChanges.map(group => (
{group.changes.map(change => (
))}
))}
)
}
const Change: React.FC<{ change: GraphqlChange.Change; schema: GrafaidOld.Schema.Schema }> = (
{ change, schema },
) => {
if (GraphqlChange.Group.isTypeOperation(change)) {
return
} else if (GraphqlChange.Group.isTypeDescription(change)) {
return
} else if (GraphqlChange.Group.isFieldOperation(change)) {
return
} else if (GraphqlChange.Group.isFieldDescription(change)) {
return
} else if (GraphqlChange.Group.isFieldDeprecation(change)) {
return
} else if (GraphqlChange.Group.isFieldDeprecationReason(change)) {
return
} else if (GraphqlChange.Group.isFieldArgumentOperation(change)) {
return
} else if (GraphqlChange.Group.isFieldArgument(change)) {
return
} else if (GraphqlChange.Group.isFieldArgumentDescription(change)) {
return
} else if (GraphqlChange.Group.isEnumValueOperation(change)) {
return
} else if (GraphqlChange.Group.isEnumValueDescription(change)) {
return
} else if (GraphqlChange.Group.isEnumValueDeprecationReason(change)) {
return
} else if (GraphqlChange.Group.isInputFieldOperation(change)) {
return
} else if (GraphqlChange.Group.isInputFieldDescription(change)) {
return
} else if (GraphqlChange.Group.isInputFieldDefaultValue(change)) {
return
} else if (GraphqlChange.Group.isUnionMemberOperation(change)) {
return
} else if (GraphqlChange.Group.isObjectTypeInterfaceOperation(change)) {
return
} else if (GraphqlChange.Group.isDirectiveOperation(change)) {
return
} else if (GraphqlChange.Group.isDirectiveDescription(change)) {
return
} else if (GraphqlChange.Group.isDirectiveLocationOperation(change)) {
return
} else if (GraphqlChange.Group.isDirectiveArgumentOperation(change)) {
return
} else if (GraphqlChange.Group.isDirectiveArgument(change)) {
return
} else if (GraphqlChange.Group.isDirectiveArgumentDescription(change)) {
return
} else if (GraphqlChange.Group.isSchemaRootType(change)) {
return
} else if (GraphqlChange.Group.isDirectiveUsage(change)) {
return
} else {
neverCase(change)
}
}