Compare commits
2 Commits
trunk
...
feature/jo
Author | SHA1 | Date | |
---|---|---|---|
10e7f39c92 | |||
1c1bb146fc |
@ -99,12 +99,8 @@ export function CompanyPublishJobDialog(props: IProps) {
|
||||
|
||||
const handleNext = useCallback(async () => {
|
||||
onClose(true);
|
||||
if (userInfo.bossAuthStatus) {
|
||||
navigateTo(PageUrl.JobPublish);
|
||||
} else {
|
||||
navigateTo(PageUrl.CertificationStart);
|
||||
}
|
||||
}, [userInfo, onClose]);
|
||||
navigateTo(PageUrl.JobPublish);
|
||||
}, [onClose]);
|
||||
|
||||
useEffect(() => {
|
||||
initRef.current = async () => {
|
||||
|
@ -16,6 +16,7 @@ import { postSubscribe, subscribeMessage } from '@/utils/subscribe';
|
||||
import Toast from '@/utils/toast';
|
||||
|
||||
interface IProps {
|
||||
defaultSelect?: number;
|
||||
onNext: () => void;
|
||||
}
|
||||
|
||||
@ -85,8 +86,8 @@ const subscribe = async () => {
|
||||
};
|
||||
|
||||
export default function CompanyPublishJobBuy(props: IProps) {
|
||||
const { onNext } = props;
|
||||
const [selectItem, setSelectItem] = useState(LIST[0]);
|
||||
const { onNext, defaultSelect = 0 } = props;
|
||||
const [selectItem, setSelectItem] = useState(LIST[defaultSelect]);
|
||||
|
||||
const handleClickItem = useCallback((newSelectItem: Item) => setSelectItem(newSelectItem), []);
|
||||
|
||||
|
@ -5,7 +5,6 @@ import { useCallback } from 'react';
|
||||
import CertificationStatus from '@/components/certification-status';
|
||||
import WechatCell from '@/components/wx-cell';
|
||||
import { PageUrl } from '@/constants/app';
|
||||
import { CertificationStatusType } from '@/constants/company';
|
||||
import useUserInfo from '@/hooks/use-user-info';
|
||||
import { navigateTo } from '@/utils/route';
|
||||
|
||||
@ -18,10 +17,6 @@ export default function CompanyFragment() {
|
||||
// const [showPublish, setShowPublish] = useState(false);
|
||||
|
||||
const handlePublishJob = useCallback(async () => {
|
||||
if (userInfo.bossAuthStatus !== CertificationStatusType.Success) {
|
||||
navigateTo(PageUrl.CertificationStart);
|
||||
return;
|
||||
}
|
||||
navigateTo(PageUrl.CertificationManage);
|
||||
}, [userInfo]);
|
||||
|
||||
|
10
src/hooks/use-cached-job.tsx
Normal file
10
src/hooks/use-cached-job.tsx
Normal file
@ -0,0 +1,10 @@
|
||||
import { useSelector } from 'react-redux';
|
||||
|
||||
import { selectCreatedJob } from '@/store/selector/job';
|
||||
|
||||
function useCachedJob() {
|
||||
const data = useSelector(selectCreatedJob);
|
||||
return data;
|
||||
}
|
||||
|
||||
export default useCachedJob;
|
@ -174,7 +174,7 @@ export default function AnchorPage() {
|
||||
try {
|
||||
const { jobResults = [] } = await requestJobManageList({ status: JobManageStatus.Open });
|
||||
if (!jobResults.length) {
|
||||
Toast.info('当前是根据定位为您展示主播');
|
||||
// Toast.info('当前是根据定位为您展示主播');
|
||||
return;
|
||||
}
|
||||
const lastSelectJobId = getLastSelectMyJobId();
|
||||
|
@ -6,14 +6,15 @@ import classNames from 'classnames';
|
||||
import { useCallback, useEffect, useState } from 'react';
|
||||
|
||||
import JobManageList, { IJobManageListProps } from '@/components/job-manage-list';
|
||||
import { CompanyPublishJobDialog } from '@/components/product-dialog/publish-job';
|
||||
import SafeBottomPadding from '@/components/safe-bottom-padding';
|
||||
import { PageUrl } from '@/constants/app';
|
||||
import { ReportEventId } from '@/constants/event';
|
||||
import { JOB_MANAGE_TABS, JobManageStatus, JobManageType } from '@/constants/job';
|
||||
import useListHeight, { IUseListHeightProps } from '@/hooks/use-list-height';
|
||||
import useUserInfo from '@/hooks/use-user-info';
|
||||
import { logWithPrefix } from '@/utils/common';
|
||||
import { reportEvent } from '@/utils/event';
|
||||
import { navigateTo } from '@/utils/route';
|
||||
import { ensureUserInfo } from '@/utils/user';
|
||||
|
||||
import './index.less';
|
||||
@ -91,7 +92,6 @@ export default function CertificationManage() {
|
||||
const userInfo = useUserInfo();
|
||||
const listHeight = useListHeight(CALC_LIST_PROPS);
|
||||
const [tabType, setTabType] = useState<JobManageType>(JobManageType.All);
|
||||
const [showPublish, setShowPublish] = useState(false);
|
||||
|
||||
const handleTypeChange = useCallback(value => setTabType(value), []);
|
||||
|
||||
@ -101,7 +101,7 @@ export default function CertificationManage() {
|
||||
if (!(await ensureUserInfo(userInfo))) {
|
||||
return;
|
||||
}
|
||||
setShowPublish(true);
|
||||
navigateTo(PageUrl.JobPublish);
|
||||
}, [userInfo]);
|
||||
|
||||
return (
|
||||
@ -124,7 +124,6 @@ export default function CertificationManage() {
|
||||
</Button>
|
||||
</div>
|
||||
<SafeBottomPadding className={SAFE_BOTTOM_PADDING_CLASS} />
|
||||
<div>{showPublish && <CompanyPublishJobDialog userInfo={userInfo} onClose={() => setShowPublish(false)} />}</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ import BlFormInput from '@/components/bl-form-input';
|
||||
import BlFormItem from '@/components/bl-form-item';
|
||||
import LoadingDialog from '@/components/loading-dialog';
|
||||
import SafeBottomPadding from '@/components/safe-bottom-padding';
|
||||
import { PageUrl } from '@/constants/app';
|
||||
import { EventName, PageUrl } from '@/constants/app';
|
||||
import { CertificationStatusType } from '@/constants/company';
|
||||
import { CollectEventName, ReportEventId } from '@/constants/event';
|
||||
import useUserInfo from '@/hooks/use-user-info';
|
||||
@ -16,12 +16,18 @@ import { isValidIdCard, isValidPhone, logWithPrefix } from '@/utils/common';
|
||||
import { postCertification, getPhone } from '@/utils/company';
|
||||
import { collectEvent, reportEvent } from '@/utils/event';
|
||||
import { chooseMedia } from '@/utils/material';
|
||||
import { redirectTo } from '@/utils/route';
|
||||
import { redirectTo } from '@/utils/route';
|
||||
import Toast from '@/utils/toast';
|
||||
import { dispatchUpdateUser, requestUserInfo } from '@/utils/user';
|
||||
import { uploadVideo } from '@/utils/video';
|
||||
|
||||
import './index.less';
|
||||
import { requestProductBalance } from '@/utils/product';
|
||||
import { ProductType } from '@/constants/product';
|
||||
import useCachedJob from '@/hooks/use-cached-job';
|
||||
import { postCreateJob } from '@/utils/job';
|
||||
import { Dialog } from '@taroify/core';
|
||||
import CompanyPublishJobBuy from '@/components/product-dialog/steps-ui/company-publish-job-buy';
|
||||
|
||||
const PREFIX = 'page-certification';
|
||||
const log = logWithPrefix(PREFIX);
|
||||
@ -100,6 +106,8 @@ export default function Certification() {
|
||||
// const [code, setCode] = useState('');
|
||||
const [company, setCompany] = useState('');
|
||||
const [open, setOpen] = useState(false);
|
||||
const [showBuy, setShowBuy] = useState(false);
|
||||
const cachedJobData = useCachedJob();
|
||||
|
||||
const handleClickIdCardLeft = useCallback(async () => {
|
||||
reportEvent(ReportEventId.CLICK_UPLOAD_ID_CARD, { type: 'left' });
|
||||
@ -133,6 +141,26 @@ export default function Certification() {
|
||||
setCompany(value);
|
||||
}, []);
|
||||
|
||||
const handleCreateJob = useCallback(async () => {
|
||||
if (cachedJobData.employType) {
|
||||
Taro.showLoading();
|
||||
try {
|
||||
await postCreateJob(cachedJobData);
|
||||
Taro.eventCenter.trigger(EventName.COMPANY_JOB_PUBLISH_CHANGED);
|
||||
await Toast.success('通告创建成功', 1500, true);
|
||||
redirectTo(PageUrl.CertificationManage);
|
||||
} catch (e) {
|
||||
console.error('submit error', e);
|
||||
Toast.error('通告审核失败请重试');
|
||||
collectEvent(CollectEventName.PUBLISH_JOB_FAILED, e);
|
||||
} finally {
|
||||
Taro.hideLoading();
|
||||
}
|
||||
} else {
|
||||
Toast.error('数据出错');
|
||||
}
|
||||
}, [cachedJobData]);
|
||||
|
||||
const handleSubmit = useCallback(async () => {
|
||||
reportEvent(ReportEventId.CLICK_CERTIFICATION_SUBMIT);
|
||||
const data: ICertificationRequest = {
|
||||
@ -157,7 +185,16 @@ export default function Certification() {
|
||||
return;
|
||||
}
|
||||
dispatchUpdateUser({ bossAuthStatus: CertificationStatusType.Success });
|
||||
redirectTo(PageUrl.CertificationManage);
|
||||
// 判断付钱没有
|
||||
const [time] = await requestProductBalance(ProductType.CompanyPublishJob);
|
||||
if (time <= 0) {
|
||||
// 付钱
|
||||
setShowBuy(true);
|
||||
Taro.hideLoading();
|
||||
} else {
|
||||
// 获取data创建
|
||||
await handleCreateJob();
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('submit error', e);
|
||||
Toast.error('认证失败请重试');
|
||||
@ -262,6 +299,11 @@ export default function Certification() {
|
||||
<div>
|
||||
<LoadingDialog open={open} text="认证中" />
|
||||
</div>
|
||||
<Dialog open={showBuy} onClose={() => setShowBuy(false)}>
|
||||
<Dialog.Content>
|
||||
<CompanyPublishJobBuy onNext={handleCreateJob} defaultSelect={1} />
|
||||
</Dialog.Content>
|
||||
</Dialog>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
import { BaseEventOrig, Button, InputProps } from '@tarojs/components';
|
||||
import Taro, { useLoad } from '@tarojs/taro';
|
||||
|
||||
import { Dialog } from '@taroify/core';
|
||||
import classNames from 'classnames';
|
||||
import { useCallback, useEffect, useState } from 'react';
|
||||
|
||||
@ -12,15 +13,29 @@ import BlFormSelect from '@/components/bl-form-select';
|
||||
import BlSalaryInput, { BlSalaryValue } from '@/components/bl-salary-input';
|
||||
import { CityPickerPopup } from '@/components/city-picker';
|
||||
import PageLoading from '@/components/page-loading';
|
||||
import CompanyPublishJobBuy from '@/components/product-dialog/steps-ui/company-publish-job-buy';
|
||||
import SafeBottomPadding from '@/components/safe-bottom-padding';
|
||||
import { EventName, PageUrl } from '@/constants/app';
|
||||
import { CertificationStatusType } from '@/constants/company';
|
||||
import { CollectEventName } from '@/constants/event';
|
||||
import { EMPLOY_TYPE_TITLE_MAP, EmployType, JOB_TYPE_SELECT_OPTIONS, JobType } from '@/constants/job';
|
||||
import { ProductType } from '@/constants/product';
|
||||
import useUserInfo from '@/hooks/use-user-info';
|
||||
import store from '@/store';
|
||||
import { cacheCreateJob } from '@/store/actions';
|
||||
import { CreateJobInfo, JobDetails } from '@/types/job';
|
||||
import { logWithPrefix } from '@/utils/common';
|
||||
import { collectEvent } from '@/utils/event';
|
||||
import { postCloseJob, postCreateJob, postUpdateJob, requestJobDetail, isFullTimePriceRequired, isPartTimePriceRequired } from '@/utils/job';
|
||||
import {
|
||||
postCloseJob,
|
||||
postCreateJob,
|
||||
postUpdateJob,
|
||||
requestJobDetail,
|
||||
isFullTimePriceRequired,
|
||||
isPartTimePriceRequired,
|
||||
} from '@/utils/job';
|
||||
import { getCityValues } from '@/utils/location';
|
||||
import { requestProductBalance } from '@/utils/product';
|
||||
import { getPageQuery, navigateBack, navigateTo } from '@/utils/route';
|
||||
import Toast from '@/utils/toast';
|
||||
|
||||
@ -91,6 +106,8 @@ export default function JobPublish() {
|
||||
const [city, setCity] = useState<string[] | undefined>();
|
||||
const [showCityPicker, setShowCityPicker] = useState(false);
|
||||
const [address, setAddress] = useState('');
|
||||
const [showBuy, setShowBuy] = useState(false);
|
||||
const userInfo = useUserInfo();
|
||||
|
||||
const handleEmployTypeChange = useCallback((value: EmployType) => {
|
||||
setEmployType(value);
|
||||
@ -144,7 +161,7 @@ export default function JobPublish() {
|
||||
}
|
||||
}, [job]);
|
||||
|
||||
const handleSubmit = useCallback(async () => {
|
||||
const getCreateJobInfo = useCallback((): [CreateJobInfo, string[]] => {
|
||||
const cityCodes = city || [];
|
||||
const data: CreateJobInfo = {
|
||||
title,
|
||||
@ -160,6 +177,11 @@ export default function JobPublish() {
|
||||
highPriceForPartyTime: !isPartTimePriceRequired(employType) ? 0 : salary[3],
|
||||
address: address,
|
||||
};
|
||||
return [data, cityCodes];
|
||||
}, [address, category, city, describe, employType, salary, title]);
|
||||
|
||||
const handleSubmit = useCallback(async () => {
|
||||
const [data, cityCodes] = getCreateJobInfo();
|
||||
const errMsg = isInvalidCreateJobInfo(data);
|
||||
if (errMsg) {
|
||||
Toast.info(errMsg);
|
||||
@ -178,6 +200,20 @@ export default function JobPublish() {
|
||||
await postUpdateJob(data);
|
||||
Taro.eventCenter.trigger(EventName.JOB_UPDATE, job!.id);
|
||||
} else {
|
||||
if (userInfo.bossAuthStatus !== CertificationStatusType.Success) {
|
||||
// 去认证
|
||||
store.dispatch(cacheCreateJob(data));
|
||||
navigateTo(PageUrl.CertificationStart);
|
||||
Taro.hideLoading();
|
||||
return;
|
||||
}
|
||||
const [time] = await requestProductBalance(ProductType.CompanyPublishJob);
|
||||
if (time <= 0) {
|
||||
// 付钱
|
||||
setShowBuy(true);
|
||||
Taro.hideLoading();
|
||||
return;
|
||||
}
|
||||
await postCreateJob(data);
|
||||
}
|
||||
Taro.eventCenter.trigger(EventName.COMPANY_JOB_PUBLISH_CHANGED);
|
||||
@ -190,7 +226,30 @@ export default function JobPublish() {
|
||||
} finally {
|
||||
Taro.hideLoading();
|
||||
}
|
||||
}, [isUpdate, job, title, employType, category, describe, city, salary, address]);
|
||||
}, [getCreateJobInfo, isUpdate, job, userInfo.bossAuthStatus]);
|
||||
|
||||
const handleNext = useCallback(async () => {
|
||||
const [data, cityCodes] = getCreateJobInfo();
|
||||
|
||||
const cityValues = getCityValues(cityCodes);
|
||||
if (!data.address.startsWith(cityValues)) {
|
||||
data.address = `${cityValues}${data.address}`;
|
||||
}
|
||||
Taro.showLoading();
|
||||
|
||||
try {
|
||||
await postCreateJob(data);
|
||||
Taro.eventCenter.trigger(EventName.COMPANY_JOB_PUBLISH_CHANGED);
|
||||
await Toast.success('创建成功', 1500, true);
|
||||
navigateBack();
|
||||
} catch (e) {
|
||||
console.error('submit error', e);
|
||||
Toast.error('审核失败请重试');
|
||||
collectEvent(CollectEventName.PUBLISH_JOB_FAILED, e);
|
||||
} finally {
|
||||
Taro.hideLoading();
|
||||
}
|
||||
}, [getCreateJobInfo]);
|
||||
|
||||
useEffect(() => {
|
||||
const callback = (d: string) => setDescribe(d);
|
||||
@ -306,6 +365,11 @@ export default function JobPublish() {
|
||||
onConfirm={handleConfirmCityPicker}
|
||||
onCancel={() => setShowCityPicker(false)}
|
||||
/>
|
||||
<Dialog open={showBuy} onClose={() => setShowBuy(false)}>
|
||||
<Dialog.Content>
|
||||
<CompanyPublishJobBuy onNext={handleNext} defaultSelect={1}/>
|
||||
</Dialog.Content>
|
||||
</Dialog>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
@ -1,3 +1,4 @@
|
||||
export * from './app';
|
||||
export * from './user';
|
||||
export * from './message';
|
||||
export * from './job';
|
||||
|
7
src/store/actions/job.ts
Normal file
7
src/store/actions/job.ts
Normal file
@ -0,0 +1,7 @@
|
||||
import { CreateJobInfo } from '@/types/job';
|
||||
|
||||
import { CREATE_JOB } from '../constants';
|
||||
|
||||
export const cacheCreateJob = (value: CreateJobInfo) => ({ type: CREATE_JOB, value });
|
||||
|
||||
export const clearCachedJob = () => ({ type: CREATE_JOB, value: {} });
|
@ -5,3 +5,4 @@ export const SET_USER_INFO = 'SET_USER_INFO';
|
||||
export const SET_BIND_PHONE = 'SET_BIND_PHONE';
|
||||
export const SET_USER_MESSAGE = 'SET_USER_MESSAGE';
|
||||
export const SET_INVITE_CODE = 'SET_INVITE_CODE';
|
||||
export const CREATE_JOB = 'CREATE_JOB';
|
||||
|
@ -1,6 +1,7 @@
|
||||
import { combineReducers } from 'redux';
|
||||
|
||||
import appState from './app';
|
||||
import jobState from './job';
|
||||
import message from './message';
|
||||
import partnerInfo from './partner';
|
||||
import userInfo from './user';
|
||||
@ -10,4 +11,5 @@ export default combineReducers({
|
||||
userInfo,
|
||||
message,
|
||||
partnerInfo,
|
||||
jobState,
|
||||
});
|
||||
|
19
src/store/reducers/job.ts
Normal file
19
src/store/reducers/job.ts
Normal file
@ -0,0 +1,19 @@
|
||||
import { Action } from 'redux';
|
||||
|
||||
import { CreateJobInfo } from '@/types/job';
|
||||
|
||||
import { CREATE_JOB } from '../constants';
|
||||
|
||||
const INIT_STATE: Partial<CreateJobInfo> = {};
|
||||
|
||||
const userInfo = (state: Partial<CreateJobInfo> = INIT_STATE, action: Action): Partial<CreateJobInfo> => {
|
||||
const { type, value } = action as BL.Anything;
|
||||
switch (type) {
|
||||
case CREATE_JOB:
|
||||
return value;
|
||||
default:
|
||||
return state;
|
||||
}
|
||||
};
|
||||
|
||||
export default userInfo;
|
3
src/store/selector/job.ts
Normal file
3
src/store/selector/job.ts
Normal file
@ -0,0 +1,3 @@
|
||||
import { IState } from '@/types/store';
|
||||
|
||||
export const selectCreatedJob = (state: IState) => state.jobState;
|
@ -1,4 +1,5 @@
|
||||
import { RoleType, PageType } from '@/constants/app';
|
||||
import { CreateJobInfo } from '@/types/job';
|
||||
import { UserMessage } from '@/types/message';
|
||||
import { PartnerInfo } from '@/types/partner';
|
||||
|
||||
@ -10,6 +11,7 @@ export interface IState {
|
||||
userInfo: UserInfo;
|
||||
message: UserMessage;
|
||||
partnerInfo: PartnerInfo;
|
||||
jobState: CreateJobInfo;
|
||||
}
|
||||
|
||||
export interface AppState {
|
||||
|
Reference in New Issue
Block a user