@@ -18,6 +18,7 @@ import { useUserDashboardData } from "./hooks/useUserDashboardData";
1818import type {
1919 CareerChecklist ,
2020 Job ,
21+ JobModelFilter ,
2122 JobStatus ,
2223 MatchSort ,
2324 NewJob ,
@@ -29,6 +30,11 @@ import {
2930 type ContinentFilter ,
3031 type CountryFilter ,
3132} from "./utils/locationFilters" ;
33+ import {
34+ getModelFilterFromJobTypes ,
35+ modelFilterMatchesJob ,
36+ modelFilterToApiFilter ,
37+ } from "./utils/jobModelFilters" ;
3238import { parseSearchKeywords } from "./utils/searchKeywords" ;
3339
3440function getSection ( pathname : string ) {
@@ -149,7 +155,7 @@ export default function NewDashboardPage() {
149155 const navigate = useNavigate ( ) ;
150156
151157 const [ searchQuery , setSearchQuery ] = useState ( "" ) ;
152- const [ filterType , setFilterType ] = useState ( "Todos" ) ;
158+ const [ filterType , setFilterType ] = useState < JobModelFilter > ( "Todos" ) ;
153159 const [ filterLevel , setFilterLevel ] = useState ( "Todos" ) ;
154160 const [ continentFilter , setContinentFilter ] =
155161 useState < ContinentFilter > ( "Todos" ) ;
@@ -159,12 +165,14 @@ export default function NewDashboardPage() {
159165 const [ isAddJobOpen , setIsAddJobOpen ] = useState ( false ) ;
160166 const [ toast , setToast ] = useState ( "" ) ;
161167 const checklistSaveTimeout = useRef < number | null > ( null ) ;
168+ const hasUserSelectedModelFilter = useRef ( false ) ;
162169 const showToast = useCallback ( ( message : string ) => setToast ( message ) , [ ] ) ;
163170 const {
164171 userProfile,
165172 setUserProfile,
166173 searchPreferences,
167174 setSearchPreferences,
175+ isLoadingUserData,
168176 isSavingProfile,
169177 isSavingPreferences,
170178 saveUserProfile,
@@ -196,6 +204,13 @@ export default function NewDashboardPage() {
196204 ) ,
197205 [ recommendedJobs , userProfile . technologyExperiences ] ,
198206 ) ;
207+ const displayedRecommendedJobs = useMemo (
208+ ( ) =>
209+ matchedRecommendedJobs . filter ( ( job ) =>
210+ modelFilterMatchesJob ( job , filterType ) ,
211+ ) ,
212+ [ filterType , matchedRecommendedJobs ] ,
213+ ) ;
199214 const selectedJob =
200215 [ ...matchedTrackedJobs , ...matchedRecommendedJobs ] . find (
201216 ( job ) => job . id === selectedJobId ,
@@ -230,12 +245,19 @@ export default function NewDashboardPage() {
230245 const handleSavePreferences = async ( preferences : SearchPreferences ) => {
231246 try {
232247 await saveSearchPreferences ( preferences ) ;
248+ hasUserSelectedModelFilter . current = false ;
249+ setFilterType ( getModelFilterFromJobTypes ( preferences . jobTypes ) ) ;
233250 showToast ( "Preferências de busca atualizadas." ) ;
234251 } catch {
235252 // O hook já notificou a falha preservando as preferências editadas.
236253 }
237254 } ;
238255
256+ const handleFilterTypeChange = useCallback ( ( value : JobModelFilter ) => {
257+ hasUserSelectedModelFilter . current = true ;
258+ setFilterType ( value ) ;
259+ } , [ ] ) ;
260+
239261 const handleCareerChecklistChange = useCallback (
240262 ( careerChecklist : CareerChecklist [ ] ) => {
241263 const nextPreferences = {
@@ -313,9 +335,7 @@ export default function NewDashboardPage() {
313335 const typedKeywords = parseSearchKeywords ( searchQuery ) ;
314336 const filters = {
315337 ...( filterLevel !== "Todos" ? { level : filterLevel } : { } ) ,
316- ...( filterType !== "Todos"
317- ? { type : filterType , model : filterType }
318- : { } ) ,
338+ ...modelFilterToApiFilter ( filterType ) ,
319339 ...( continentFilter !== "Todos" ? { continent : continentFilter } : { } ) ,
320340 ...( countryFilter !== "Todos"
321341 ? { country : countryFilter , location : countryFilter }
@@ -347,6 +367,12 @@ export default function NewDashboardPage() {
347367 searchQuery ,
348368 ] ) ;
349369
370+ useEffect ( ( ) => {
371+ if ( isLoadingUserData || hasUserSelectedModelFilter . current ) return ;
372+
373+ setFilterType ( getModelFilterFromJobTypes ( searchPreferences . jobTypes ) ) ;
374+ } , [ isLoadingUserData , searchPreferences . jobTypes ] ) ;
375+
350376 // Busca automática: dispara ao digitar (com debounce) ou ao trocar
351377 // qualquer filtro, sem precisar clicar em "Buscar vagas".
352378 const isFirstSearchRun = useRef ( true ) ;
@@ -398,11 +424,11 @@ export default function NewDashboardPage() {
398424 case "vagas" :
399425 return (
400426 < JobTab
401- jobs = { matchedRecommendedJobs }
427+ jobs = { displayedRecommendedJobs }
402428 searchQuery = { searchQuery }
403429 setSearchQuery = { setSearchQuery }
404430 filterType = { filterType }
405- setFilterType = { setFilterType }
431+ setFilterType = { handleFilterTypeChange }
406432 filterLevel = { filterLevel }
407433 setFilterLevel = { setFilterLevel }
408434 continentFilter = { continentFilter }
0 commit comments