| | import { z } from 'zod'; |
| |
|
| | export type TFeedbackRating = 'thumbsUp' | 'thumbsDown'; |
| | export const FEEDBACK_RATINGS = ['thumbsUp', 'thumbsDown'] as const; |
| |
|
| | export const FEEDBACK_REASON_KEYS = [ |
| | |
| | 'not_matched', |
| | 'inaccurate', |
| | 'bad_style', |
| | 'missing_image', |
| | 'unjustified_refusal', |
| | 'not_helpful', |
| | 'other', |
| | |
| | 'accurate_reliable', |
| | 'creative_solution', |
| | 'clear_well_written', |
| | 'attention_to_detail', |
| | ] as const; |
| |
|
| | export type TFeedbackTagKey = (typeof FEEDBACK_REASON_KEYS)[number]; |
| |
|
| | export interface TFeedbackTag { |
| | key: TFeedbackTagKey; |
| | label: string; |
| | direction: TFeedbackRating; |
| | icon: string; |
| | } |
| |
|
| | |
| | export const FEEDBACK_TAGS: TFeedbackTag[] = [ |
| | |
| | { |
| | key: 'not_matched', |
| | label: 'com_ui_feedback_tag_not_matched', |
| | direction: 'thumbsDown', |
| | icon: 'AlertCircle', |
| | }, |
| | { |
| | key: 'inaccurate', |
| | label: 'com_ui_feedback_tag_inaccurate', |
| | direction: 'thumbsDown', |
| | icon: 'AlertCircle', |
| | }, |
| | { |
| | key: 'bad_style', |
| | label: 'com_ui_feedback_tag_bad_style', |
| | direction: 'thumbsDown', |
| | icon: 'PenTool', |
| | }, |
| | { |
| | key: 'missing_image', |
| | label: 'com_ui_feedback_tag_missing_image', |
| | direction: 'thumbsDown', |
| | icon: 'ImageOff', |
| | }, |
| | { |
| | key: 'unjustified_refusal', |
| | label: 'com_ui_feedback_tag_unjustified_refusal', |
| | direction: 'thumbsDown', |
| | icon: 'Ban', |
| | }, |
| | { |
| | key: 'not_helpful', |
| | label: 'com_ui_feedback_tag_not_helpful', |
| | direction: 'thumbsDown', |
| | icon: 'ThumbsDown', |
| | }, |
| | { |
| | key: 'other', |
| | label: 'com_ui_feedback_tag_other', |
| | direction: 'thumbsDown', |
| | icon: 'HelpCircle', |
| | }, |
| | |
| | { |
| | key: 'accurate_reliable', |
| | label: 'com_ui_feedback_tag_accurate_reliable', |
| | direction: 'thumbsUp', |
| | icon: 'CheckCircle', |
| | }, |
| | { |
| | key: 'creative_solution', |
| | label: 'com_ui_feedback_tag_creative_solution', |
| | direction: 'thumbsUp', |
| | icon: 'Lightbulb', |
| | }, |
| | { |
| | key: 'clear_well_written', |
| | label: 'com_ui_feedback_tag_clear_well_written', |
| | direction: 'thumbsUp', |
| | icon: 'PenTool', |
| | }, |
| | { |
| | key: 'attention_to_detail', |
| | label: 'com_ui_feedback_tag_attention_to_detail', |
| | direction: 'thumbsUp', |
| | icon: 'Search', |
| | }, |
| | ]; |
| |
|
| | export function getTagsForRating(rating: TFeedbackRating): TFeedbackTag[] { |
| | return FEEDBACK_TAGS.filter((tag) => tag.direction === rating); |
| | } |
| |
|
| | export const feedbackTagKeySchema = z.enum(FEEDBACK_REASON_KEYS); |
| | export const feedbackRatingSchema = z.enum(FEEDBACK_RATINGS); |
| |
|
| | export const feedbackSchema = z.object({ |
| | rating: feedbackRatingSchema, |
| | tag: feedbackTagKeySchema, |
| | text: z.string().max(1024).optional(), |
| | }); |
| |
|
| | export type TMinimalFeedback = z.infer<typeof feedbackSchema>; |
| |
|
| | export type TFeedback = { |
| | rating: TFeedbackRating; |
| | tag: TFeedbackTag | undefined; |
| | text?: string; |
| | }; |
| |
|
| | export function toMinimalFeedback(feedback: TFeedback | undefined): TMinimalFeedback | undefined { |
| | if (!feedback?.rating || !feedback?.tag || !feedback.tag.key) { |
| | return undefined; |
| | } |
| |
|
| | return { |
| | rating: feedback.rating, |
| | tag: feedback.tag.key, |
| | text: feedback.text, |
| | }; |
| | } |
| |
|
| | export function getTagByKey(key: TFeedbackTagKey | undefined): TFeedbackTag | undefined { |
| | if (!key) { |
| | return undefined; |
| | } |
| | return FEEDBACK_TAGS.find((tag) => tag.key === key); |
| | } |
| |
|