@@ -2,12 +2,19 @@ import React, { useState, useMemo } from 'react';
22import { Check , ChevronsUpDown , Plus } from 'lucide-react' ;
33import { cn } from '../../../lib/utils' ;
44import { Button } from './button' ;
5- import { Input } from './input' ;
65import { Popover , PopoverContent , PopoverTrigger } from './popover' ;
7- import subjectsData from '../../../data/subjects.json' ;
8- import type { SubjectData } from '../../../types/types' ;
6+ import { Input } from './input' ;
7+ // Import descriptors from the new JSON file.
8+ import descriptorsData from '../../../data/descriptors.json' ;
99
10- const subjects = subjectsData as SubjectData [ ] ;
10+ interface DescriptorsData {
11+ descriptors : string [ ] ;
12+ }
13+
14+ interface SubjectOption {
15+ label : string ;
16+ value : string ;
17+ }
1118
1219interface SubjectSelectorProps {
1320 value : string ;
@@ -22,36 +29,33 @@ const SubjectSelector: React.FC<SubjectSelectorProps> = ({
2229 onAddDescriptor,
2330 username,
2431} ) => {
25- // Retrieve initial descriptors for the user.
26- const initialDescriptors = useMemo ( ( ) => {
27- const subjectData = subjects . find ( ( s ) => s . subject === username ) ;
28- return subjectData ? subjectData . descriptors : [ ] ;
32+ // Build the subject options using the entered name and descriptors from descriptors.json.
33+ const subjectTiles : SubjectOption [ ] = useMemo ( ( ) => {
34+ const data = descriptorsData as DescriptorsData ;
35+ const baseOption = { label : username , value : username } ;
36+ const descriptorOptions = data . descriptors . map ( ( descriptor ) => ( {
37+ label : `${ username } 's ${ descriptor } ` ,
38+ value : `${ username } 's ${ descriptor } ` ,
39+ } ) ) ;
40+ return [ baseOption , ...descriptorOptions ] ;
2941 } , [ username ] ) ;
3042
31- // Local state for descriptors, search text, popover open state, etc.
32- const [ descriptors , setDescriptors ] = useState < string [ ] > ( initialDescriptors ) ;
43+ // Local state for search, popover open state, and adding a new descriptor.
3344 const [ open , setOpen ] = useState ( false ) ;
3445 const [ search , setSearch ] = useState ( '' ) ;
3546 const [ isAddingNew , setIsAddingNew ] = useState ( false ) ;
3647 const [ newDescriptor , setNewDescriptor ] = useState ( '' ) ;
3748
38- // Create the options list: the primary subject and each descriptor option .
49+ // Filter the options based on the search text .
3950 const options = useMemo ( ( ) => {
40- const baseOption = { label : username , value : username } ;
41- const descriptorOptions = descriptors . map ( ( descriptor ) => ( {
42- label : `${ username } 's ${ descriptor } ` ,
43- value : `${ username } 's ${ descriptor } ` ,
44- } ) ) ;
45- // Filter based on search text.
46- return [ baseOption , ...descriptorOptions ] . filter ( ( opt ) =>
51+ return subjectTiles . filter ( ( opt ) =>
4752 opt . label . toLowerCase ( ) . includes ( search . toLowerCase ( ) )
4853 ) ;
49- } , [ descriptors , search , username ] ) ;
54+ } , [ subjectTiles , search ] ) ;
5055
5156 const handleAddNewDescriptor = ( ) => {
5257 if ( newDescriptor . trim ( ) ) {
5358 onAddDescriptor ( newDescriptor ) ;
54- setDescriptors ( ( prev ) => [ ...prev , newDescriptor ] ) ;
5559 onChange ( `${ username } 's ${ newDescriptor } ` ) ;
5660 setNewDescriptor ( '' ) ;
5761 setIsAddingNew ( false ) ;
0 commit comments