@@ -27,11 +27,11 @@ import { ShareButtons } from "@/components/ShareButtons";
2727import WelcomeUserInputScreen from "@/components/WelcomeUserInputScreen" ;
2828import { PilotFeedbackBanner } from "@/components/PilotFeedbackBanner" ;
2929import { GoodwillReferralToolHeaderPilot } from "@/components/GoodwillReferralToolHeaderPilot" ;
30- import ClientDetailsPromptBubble from "@/components/ClientDetailsPromptBubble" ;
3130import {
3231 ClientDetailsInput ,
3332 resourceCategories ,
3433} from "@/components/ClientDetailsInput" ;
34+ import { RefinePromptPanel } from "@/components/RefinePromptPanel" ;
3535import { RemoveResourceNotification } from "@/components/RemoveResourceNotification" ;
3636
3737export default function Page ( ) {
@@ -64,8 +64,6 @@ export default function Page() {
6464 const [ errorMessage , setErrorMessage ] = useState < string | undefined > (
6565 undefined ,
6666 ) ;
67- const [ requestAfterZipResolution , setRequestAfterZipResolution ] =
68- useState ( "" ) ;
6967
7068 const searchParams = useSearchParams ( ) ;
7169
@@ -119,7 +117,12 @@ export default function Page() {
119117 setShowResultsView ( true ) ;
120118 } ;
121119
122- async function findResources ( ) {
120+ async function findResources ( overrides ?: {
121+ clientDescription ?: string ;
122+ locationText ?: string ;
123+ selectedCategories ?: string [ ] ;
124+ selectedResourceTypes ?: string [ ] ;
125+ } ) {
123126 const prompt_version_id = searchParams ?. get ( "prompt_version_id" ) ?? null ;
124127 const suffix = searchParams ?. get ( "suffix" ) ?? undefined ;
125128
@@ -142,8 +145,7 @@ export default function Page() {
142145 } , 12000 ) ;
143146
144147 try {
145- const request = await buildRequestWithResolvedZipCodes ( ) ;
146- setRequestAfterZipResolution ( request ) ;
148+ const request = await buildRequestWithResolvedZipCodes ( overrides ) ;
147149
148150 const {
149151 resources : finalResources ,
@@ -244,7 +246,6 @@ export default function Page() {
244246 setIsStreamingActionPlan ( false ) ;
245247 setIsGeneratingActionPlan ( false ) ;
246248 setErrorMessage ( undefined ) ;
247- setRequestAfterZipResolution ( "" ) ;
248249 setRecentlyRemoved ( null ) ;
249250 setRemovedResourceIndex ( null ) ;
250251 }
@@ -268,6 +269,34 @@ export default function Page() {
268269 }
269270 }
270271
272+ function handleRefineSearch (
273+ newClientDescription : string ,
274+ newLocationText : string ,
275+ newSelectedCategories : string [ ] ,
276+ newSelectedResourceTypes : string [ ] ,
277+ ) {
278+ // Update state with new values
279+ setClientDescription ( newClientDescription ) ;
280+ setLocationText ( newLocationText ) ;
281+ setSelectedCategories ( newSelectedCategories ) ;
282+ setSelectedResourceTypes ( newSelectedResourceTypes ) ;
283+
284+ // Clear previous results and action plan
285+ setRetainedResources ( undefined ) ;
286+ setSelectedResources ( [ ] ) ;
287+ setActionPlan ( null ) ;
288+ setStreamingPlan ( null ) ;
289+ setActionPlanResultId ( "" ) ;
290+
291+ // Trigger new search with overrides (since state updates are async)
292+ void findResources ( {
293+ clientDescription : newClientDescription ,
294+ locationText : newLocationText ,
295+ selectedCategories : newSelectedCategories ,
296+ selectedResourceTypes : newSelectedResourceTypes ,
297+ } ) ;
298+ }
299+
271300 async function generateActionPlan ( ) {
272301 if ( selectedResources . length === 0 ) return ;
273302
@@ -338,7 +367,21 @@ export default function Page() {
338367 }
339368 }
340369
341- const buildRequestWithResolvedZipCodes = async ( ) : Promise < string > => {
370+ const buildRequestWithResolvedZipCodes = async ( overrides ?: {
371+ clientDescription ?: string ;
372+ locationText ?: string ;
373+ selectedCategories ?: string [ ] ;
374+ selectedResourceTypes ?: string [ ] ;
375+ } ) : Promise < string > => {
376+ // Use overrides if provided, otherwise use state values
377+ const effectiveClientDescription =
378+ overrides ?. clientDescription ?? clientDescription ;
379+ const effectiveLocationText = overrides ?. locationText ?? locationText ;
380+ const effectiveSelectedCategories =
381+ overrides ?. selectedCategories ?? selectedCategories ;
382+ const effectiveSelectedResourceTypes =
383+ overrides ?. selectedResourceTypes ?? selectedResourceTypes ;
384+
342385 // Helper function to replace zip codes with "city, state zip_code" format
343386 const replaceZipCodes = async ( text : string ) : Promise < string > => {
344387 if ( ! text ) return text ;
@@ -378,10 +421,12 @@ export default function Page() {
378421 } ;
379422
380423 // Process both locationText and clientDescription for zip codes
381- const processedLocationText = await replaceZipCodes ( locationText ) ;
382- const processedClientDescription = await replaceZipCodes ( clientDescription ) ;
424+ const processedLocationText = await replaceZipCodes ( effectiveLocationText ) ;
425+ const processedClientDescription = await replaceZipCodes (
426+ effectiveClientDescription ,
427+ ) ;
383428
384- const resourceTypeFilters = selectedCategories
429+ const resourceTypeFilters = effectiveSelectedCategories
385430 . map ( ( categoryId ) => {
386431 const category = resourceCategories . find ( ( c ) => c . id === categoryId ) ;
387432 return category ?. label ;
@@ -394,9 +439,9 @@ export default function Page() {
394439 ? "\nInclude resources that support the following categories: " +
395440 resourceTypeFilters
396441 : "" ) +
397- ( selectedResourceTypes . length > 0
442+ ( effectiveSelectedResourceTypes . length > 0
398443 ? "\nInclude the following types of providers: " +
399- selectedResourceTypes . join ( ", " )
444+ effectiveSelectedResourceTypes . join ( ", " )
400445 : "" ) +
401446 ( processedLocationText . length > 0
402447 ? "\nFocus on resources close to the following location: " +
@@ -510,7 +555,7 @@ export default function Page() {
510555 data-testid = "returnToSearchButton"
511556 >
512557 < ChevronLeft className = "w-4 h-4" />
513- Return To Search
558+ Start a new search
514559 </ Button >
515560 < ShareButtons
516561 onPrint = { handlePrint }
@@ -522,21 +567,36 @@ export default function Page() {
522567 </ div >
523568 ) }
524569
525- { requestAfterZipResolution && (
526- < ClientDetailsPromptBubble
527- clientDescription = { requestAfterZipResolution }
570+ { ( isStreamingResources || showResultsView ) && (
571+ < RefinePromptPanel
572+ clientDescription = { clientDescription }
573+ locationText = { locationText }
574+ selectedCategories = { selectedCategories }
575+ selectedResourceTypes = { selectedResourceTypes }
576+ isLoading = { loading }
577+ isStreamingResources = { isStreamingResources }
578+ onRefine = { handleRefineSearch }
528579 />
529580 ) }
530581
531582 { ( isStreamingResources || showResultsView ) && (
532- < ResourcesList
533- resources = {
534- ( streamingResources as Resource [ ] ) ?? retainedResources ?? [ ]
535- }
536- errorMessage = { errorMessage }
537- handleRemoveResource = { handleRemoveResource }
538- isSearching = { isStreamingResources && ! hasReceivedFirstResource }
539- />
583+ < >
584+ < h2 className = "text-lg font-semibold text-gray-900 mt-4" >
585+ Resources
586+ </ h2 >
587+ < ResourcesList
588+ resources = {
589+ ( streamingResources as Resource [ ] ) ??
590+ retainedResources ??
591+ [ ]
592+ }
593+ errorMessage = { errorMessage }
594+ handleRemoveResource = { handleRemoveResource }
595+ isSearching = {
596+ isStreamingResources && ! hasReceivedFirstResource
597+ }
598+ />
599+ </ >
540600 ) }
541601
542602 { showResultsView &&
@@ -584,6 +644,9 @@ export default function Page() {
584644 resources = { retainedResources ?? [ ] }
585645 clientDescription = { clientDescription }
586646 actionPlan = { actionPlan }
647+ selectedCategories = { selectedCategories }
648+ locationText = { locationText }
649+ selectedResourceTypes = { selectedResourceTypes }
587650 />
588651 </ div >
589652 </ >
0 commit comments