import Taro from '@tarojs/taro'; import { Dispatch, SetStateAction, useCallback, useState } from 'react'; import { EventName, PageUrl } from '@/constants/app'; import { CertificationStatusType } from '@/constants/company'; import { CollectEventName } from '@/constants/event'; import useUserInfo from '@/hooks/use-user-info'; import { RESPONSE_ERROR_CODE } from '@/http/constant'; import { HttpError } from '@/http/error'; import store from '@/store'; import { cacheJobId } from '@/store/actions'; import { collectEvent } from '@/utils/event'; import { postPublishJob } from '@/utils/job'; import { navigateTo } from '@/utils/route'; import Toast from '@/utils/toast'; export const usePublishJob = (jobId: string): [boolean, Dispatch>, () => Promise] => { const userInfo = useUserInfo(); const [showBuy, setShowBuy] = useState(false); const handlePublishJob = useCallback(async () => { try { if (userInfo.bossAuthStatus !== CertificationStatusType.Success) { store.dispatch(cacheJobId(jobId)); navigateTo(PageUrl.CertificationStart); return; } Taro.showLoading(); await postPublishJob(jobId); Taro.eventCenter.trigger(EventName.COMPANY_JOB_PUBLISH_CHANGED); setShowBuy(false); Toast.success('发布成功'); Taro.hideLoading(); } catch (error) { Taro.hideLoading(); const e = error as HttpError; const errorCode = e.errorCode; const errorMsg = e.info?.() || e.message; collectEvent(CollectEventName.PUBLISH_OPEN_JOB_FAILED, { jobId, error: e.info?.() || e.message }); if (errorCode === RESPONSE_ERROR_CODE.INSUFFICIENT_FREE_BALANCE) { setShowBuy(true); } else if (errorCode === RESPONSE_ERROR_CODE.INSUFFICIENT_BALANCE) { Toast.info('您购买的产品已耗尽使用次数'); setShowBuy(true); } else if (errorCode === RESPONSE_ERROR_CODE.BOSS_VIP_EXPIRED) { Toast.info('该通告已到期,请创建新通告', 3000); } else { Toast.error(errorMsg || '发布失败请重试', 3000); } console.error(e); } }, [jobId, userInfo.bossAuthStatus]); return [showBuy, setShowBuy, handlePublishJob]; };