hooks.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import {
  2. useCallback,
  3. useEffect,
  4. useState,
  5. } from 'react'
  6. import { useDebounceFn } from 'ahooks'
  7. import { useSearchParams } from 'next/navigation'
  8. import type { SearchParams } from './types'
  9. import {
  10. EDUCATION_VERIFYING_LOCALSTORAGE_ITEM,
  11. EDUCATION_VERIFY_URL_SEARCHPARAMS_ACTION,
  12. } from './constants'
  13. import { useEducationAutocomplete } from '@/service/use-education'
  14. import { useModalContextSelector } from '@/context/modal-context'
  15. export const useEducation = () => {
  16. const {
  17. mutateAsync,
  18. isPending,
  19. data,
  20. } = useEducationAutocomplete()
  21. const [prevSchools, setPrevSchools] = useState<string[]>([])
  22. const handleUpdateSchools = useCallback((searchParams: SearchParams) => {
  23. if (searchParams.keywords) {
  24. mutateAsync(searchParams).then((res) => {
  25. const currentPage = searchParams.page || 0
  26. const resSchools = res.data
  27. if (currentPage > 0)
  28. setPrevSchools(prevSchools => [...(prevSchools || []), ...resSchools])
  29. else
  30. setPrevSchools(resSchools)
  31. })
  32. }
  33. }, [mutateAsync])
  34. const { run: querySchoolsWithDebounced } = useDebounceFn((searchParams: SearchParams) => {
  35. handleUpdateSchools(searchParams)
  36. }, {
  37. wait: 300,
  38. })
  39. return {
  40. schools: prevSchools,
  41. setSchools: setPrevSchools,
  42. querySchoolsWithDebounced,
  43. handleUpdateSchools,
  44. isLoading: isPending,
  45. hasNext: data?.has_next,
  46. }
  47. }
  48. export const useEducationInit = () => {
  49. const setShowAccountSettingModal = useModalContextSelector(s => s.setShowAccountSettingModal)
  50. const educationVerifying = localStorage.getItem(EDUCATION_VERIFYING_LOCALSTORAGE_ITEM)
  51. const searchParams = useSearchParams()
  52. const educationVerifyAction = searchParams.get('action')
  53. useEffect(() => {
  54. if (educationVerifying === 'yes' || educationVerifyAction === EDUCATION_VERIFY_URL_SEARCHPARAMS_ACTION) {
  55. setShowAccountSettingModal({ payload: 'billing' })
  56. if (educationVerifyAction === EDUCATION_VERIFY_URL_SEARCHPARAMS_ACTION)
  57. localStorage.setItem(EDUCATION_VERIFYING_LOCALSTORAGE_ITEM, 'yes')
  58. }
  59. }, [setShowAccountSettingModal, educationVerifying, educationVerifyAction])
  60. }