import type { GraphqlChange } from '#lib/graphql-change/index'
import { Code } from '@radix-ui/themes'
import type React from 'react'
import { ChangeBase } from '../ChangeBase.js'
export const DirectiveUsage: React.FC<{ change: GraphqlChange.Group.DirectiveUsage }> = ({ change }) => {
const isAdded = change.type.includes(`_ADDED`)
const action = isAdded ? `Added` : `Removed`
const preposition = isAdded ? `to` : `from`
// Helper to get the directive name based on whether it's added or removed
const getDirectiveName = () => {
if (`addedDirectiveName` in change.meta) {
return change.meta.addedDirectiveName
}
if (`removedDirectiveName` in change.meta) {
return change.meta.removedDirectiveName
}
return ``
}
const directiveName = getDirectiveName()
switch (change.type) {
case `DIRECTIVE_USAGE_UNION_MEMBER_ADDED`:
return (
{action} directive @{directiveName} {preposition} union member{' '}
{change.meta.addedUnionMemberTypeName} on union {change.meta.unionName}
)
case `DIRECTIVE_USAGE_UNION_MEMBER_REMOVED`:
return (
{action} directive @{directiveName} {preposition} union member{' '}
{change.meta.removedUnionMemberTypeName} on union {change.meta.unionName}
)
case `DIRECTIVE_USAGE_ENUM_ADDED`:
case `DIRECTIVE_USAGE_ENUM_REMOVED`:
return (
{action} directive @{directiveName} {preposition} enum {change.meta.enumName}
)
case `DIRECTIVE_USAGE_ENUM_VALUE_ADDED`:
case `DIRECTIVE_USAGE_ENUM_VALUE_REMOVED`:
return (
{action} directive @{directiveName} {preposition} enum value{' '}
{change.meta.enumValueName} on {change.meta.enumName}
)
case `DIRECTIVE_USAGE_INPUT_OBJECT_ADDED`:
case `DIRECTIVE_USAGE_INPUT_OBJECT_REMOVED`:
return (
{action} directive @{directiveName} {preposition} input object{' '}
{change.meta.inputObjectName}
)
case `DIRECTIVE_USAGE_FIELD_ADDED`:
case `DIRECTIVE_USAGE_FIELD_REMOVED`:
return (
{action} directive @{directiveName} {preposition} field {change.meta.fieldName} on
{' '}
{change.meta.typeName}
)
case `DIRECTIVE_USAGE_SCALAR_ADDED`:
case `DIRECTIVE_USAGE_SCALAR_REMOVED`:
return (
{action} directive @{directiveName} {preposition} scalar {change.meta.scalarName}
)
case `DIRECTIVE_USAGE_OBJECT_ADDED`:
case `DIRECTIVE_USAGE_OBJECT_REMOVED`:
return (
{action} directive @{directiveName} {preposition} object {change.meta.objectName}
)
case `DIRECTIVE_USAGE_INTERFACE_ADDED`:
case `DIRECTIVE_USAGE_INTERFACE_REMOVED`:
return (
{action} directive @{directiveName} {preposition} interface{' '}
{change.meta.interfaceName}
)
case `DIRECTIVE_USAGE_ARGUMENT_DEFINITION_ADDED`:
case `DIRECTIVE_USAGE_ARGUMENT_DEFINITION_REMOVED`:
return (
{action} directive @{directiveName} {preposition} argument{' '}
{change.meta.argumentName} on {change.meta.fieldName} field on{' '}
{change.meta.typeName}
)
case `DIRECTIVE_USAGE_SCHEMA_ADDED`:
case `DIRECTIVE_USAGE_SCHEMA_REMOVED`:
return (
{action} directive @{directiveName} {preposition} schema
)
case `DIRECTIVE_USAGE_FIELD_DEFINITION_ADDED`:
case `DIRECTIVE_USAGE_FIELD_DEFINITION_REMOVED`:
return (
{action} directive @{directiveName} {preposition} field definition{' '}
{change.meta.fieldName} on {change.meta.typeName}
)
case `DIRECTIVE_USAGE_INPUT_FIELD_DEFINITION_ADDED`:
case `DIRECTIVE_USAGE_INPUT_FIELD_DEFINITION_REMOVED`:
return (
{action} directive @{directiveName} {preposition} input field{' '}
{change.meta.inputFieldName} on {change.meta.inputObjectName}
)
}
}