feat(authorization): implement grant authorization functionality

在授权管理页面实现创建授权功能:
- 导入所有授权创建 hooks (社区/省公司/市公司/省团队/市团队)
- 添加 extractUserId 函数从 accountSequence 提取 userId (去掉首字母)
- 实现 handleCreate 函数根据授权类型调用对应 API
- 添加创建过程中的加载状态显示

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-01-03 21:21:39 -08:00
parent 9c17140b33
commit 1345b97303
1 changed files with 96 additions and 14 deletions

View File

@ -4,7 +4,15 @@ import { useState, useMemo } from 'react';
import { PageContainer } from '@/components/layout';
import { toast } from '@/components/common';
import { cn } from '@/utils/helpers';
import { useAuthorizations, useRevokeAuthorization } from '@/hooks/useAuthorizations';
import {
useAuthorizations,
useRevokeAuthorization,
useGrantCommunity,
useGrantProvinceCompany,
useGrantCityCompany,
useGrantAuthProvinceCompany,
useGrantAuthCityCompany,
} from '@/hooks/useAuthorizations';
import type { RoleType, Authorization } from '@/types/authorization.types';
import { ROLE_TYPE_LABELS } from '@/types/authorization.types';
import styles from './authorization.module.scss';
@ -50,6 +58,13 @@ export default function AuthorizationPage() {
// 撤销授权 mutation
const revokeMutation = useRevokeAuthorization();
// 创建授权 mutations
const grantCommunityMutation = useGrantCommunity();
const grantProvinceCompanyMutation = useGrantProvinceCompany();
const grantCityCompanyMutation = useGrantCityCompany();
const grantAuthProvinceCompanyMutation = useGrantAuthProvinceCompany();
const grantAuthCityCompanyMutation = useGrantAuthCityCompany();
// 根据状态筛选数据
const filteredData = useMemo(() => {
if (!data?.items) return [];
@ -57,18 +72,85 @@ export default function AuthorizationPage() {
return data.items.filter(item => item.status === filterStatus);
}, [data?.items, filterStatus]);
// 从 accountSequence 提取 userId去掉首字母
const extractUserId = (accountSequence: string): string => {
return accountSequence.slice(1);
};
// 判断是否有正在处理的创建请求
const isCreating =
grantCommunityMutation.isPending ||
grantProvinceCompanyMutation.isPending ||
grantCityCompanyMutation.isPending ||
grantAuthProvinceCompanyMutation.isPending ||
grantAuthCityCompanyMutation.isPending;
// 处理创建授权
const handleCreate = () => {
// TODO: 调用API创建授权
console.log('创建授权:', createForm);
toast.info('创建授权功能开发中');
setShowCreateModal(false);
setCreateForm({
accountSequence: '',
type: 'COMMUNITY',
region: '',
skipAssessment: false,
});
const handleCreate = async () => {
const { accountSequence, type, region, skipAssessment } = createForm;
const userId = extractUserId(accountSequence);
try {
switch (type) {
case 'COMMUNITY':
await grantCommunityMutation.mutateAsync({
userId,
accountSequence,
communityName: region,
skipAssessment,
});
break;
case 'PROVINCE_COMPANY':
await grantProvinceCompanyMutation.mutateAsync({
userId,
accountSequence,
provinceCode: region,
provinceName: region,
skipAssessment,
});
break;
case 'CITY_COMPANY':
await grantCityCompanyMutation.mutateAsync({
userId,
accountSequence,
cityCode: region,
cityName: region,
skipAssessment,
});
break;
case 'AUTH_PROVINCE_COMPANY':
await grantAuthProvinceCompanyMutation.mutateAsync({
userId,
accountSequence,
provinceCode: region,
provinceName: region,
skipAssessment,
});
break;
case 'AUTH_CITY_COMPANY':
await grantAuthCityCompanyMutation.mutateAsync({
userId,
accountSequence,
cityCode: region,
cityName: region,
skipAssessment,
});
break;
}
toast.success('授权创建成功');
setShowCreateModal(false);
setCreateForm({
accountSequence: '',
type: 'COMMUNITY',
region: '',
skipAssessment: false,
});
} catch (err) {
console.error('创建授权失败:', err);
const errorMessage = err instanceof Error ? err.message : '创建授权失败';
toast.error(errorMessage);
}
};
// 处理取消授权
@ -509,9 +591,9 @@ export default function AuthorizationPage() {
<button
className={styles.modal__confirmBtn}
onClick={handleCreate}
disabled={!createForm.accountSequence || !createForm.region}
disabled={!createForm.accountSequence || !createForm.region || isCreating}
>
{isCreating ? '创建中...' : '确认创建'}
</button>
</div>
</div>