mobile端身份认证 及mobile绑定样式

This commit is contained in:
wkj 2024-05-21 20:07:44 +08:00
parent 1c13ecc25a
commit 6ea5255a43
33 changed files with 362 additions and 491 deletions

View File

@ -2,7 +2,6 @@ import WechatSDK from 'oak-external-sdk/lib/WechatSDK';
import { assert } from 'oak-domain/lib/utils/assert';
import { generateNewIdAsync } from 'oak-domain/lib/utils/uuid';
import { OakExternalException } from 'oak-domain/lib/types/Exception';
async function getWechatPublicConfig(applicationId, context) {
const [application] = await context.select('application', {
data: {
@ -49,15 +48,14 @@ export async function getMenu(params, context) {
try {
const result = await wechatInstance.getMenu();
return result;
} catch (e) {
if (
e instanceof OakExternalException &&
e?.message?.includes('menu no exist')
) {
}
catch (e) {
if (e instanceof OakExternalException &&
e?.message?.includes('menu no exist')) {
return {
menu: {
button: [],
},
button: []
}
};
}
throw e;

View File

@ -1,2 +1,2 @@
declare const checkers: (import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "token", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "mobile", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "message", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "parasite", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>>)[];
declare const checkers: (import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "token", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "mobile", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "message", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "parasite", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>>)[];
export default checkers;

View File

@ -13,19 +13,19 @@ declare const _default: <ED2 extends EntityDict & BaseEntityDict, T2 extends key
type?: ButtonProps['type'] | AmButtonProps['type'];
executeText?: string | undefined;
buttonProps?: (ButtonProps & {
color?: "success" | "default" | "warning" | "primary" | "danger" | undefined;
color?: "default" | "success" | "warning" | "primary" | "danger" | undefined;
fill?: "none" | "solid" | "outline" | undefined;
size?: "small" | "middle" | "large" | "mini" | undefined;
size?: "small" | "large" | "middle" | "mini" | undefined;
block?: boolean | undefined;
loading?: boolean | "auto" | undefined;
loadingText?: string | undefined;
loadingIcon?: import("react").ReactNode;
disabled?: boolean | undefined;
onClick?: ((event: import("react").MouseEvent<HTMLButtonElement, MouseEvent>) => unknown) | undefined;
type?: "button" | "reset" | "submit" | undefined;
type?: "button" | "submit" | "reset" | undefined;
shape?: "default" | "rounded" | "rectangular" | undefined;
children?: import("react").ReactNode;
} & Pick<import("react").ClassAttributes<HTMLButtonElement> & import("react").ButtonHTMLAttributes<HTMLButtonElement>, "id" | "onMouseDown" | "onMouseUp" | "onTouchStart" | "onTouchEnd"> & {
} & Pick<import("react").ClassAttributes<HTMLButtonElement> & import("react").ButtonHTMLAttributes<HTMLButtonElement>, "id" | "onMouseDown" | "onMouseUp" | "onTouchEnd" | "onTouchStart"> & {
className?: string | undefined;
style?: (import("react").CSSProperties & Partial<Record<"--text-color" | "--background-color" | "--border-radius" | "--border-width" | "--border-style" | "--border-color", string>>) | undefined;
tabIndex?: number | undefined;

View File

@ -1,22 +1,15 @@
.loginbox-main {
height: 100vh;
display: flex;
flex: 1;
display: flex;
align-items: center;
flex-direction: column;
background: var(--oak-bg-color-container);
padding-top: 20%;
}
.loginbox-wrap {
width: 90%;
display: block;
background: var(--oak-bg-color-container);
border-radius: 4px;
overflow: hidden;
box-shadow: 0 2px 4px rgb(0 0 0 / 8%), 0 0 4px rgb(0 0 0 / 8%);
}
.loginbox-hd {

View File

@ -1,5 +1,6 @@
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<import("../../../oak-app-domain").EntityDict, "mobile", true, {
onFinish: (() => void) | undefined;
bindNum: number;
addMobile: (() => void) | undefined;
}>) => React.ReactElement;
export default _default;

View File

@ -36,6 +36,7 @@ export default OakComponent({
properties: {
onFinish: undefined,
bindNum: 10,
addMobile: undefined,
},
methods: {
async onRefreshMobile(e) {
@ -86,9 +87,11 @@ export default OakComponent({
});
},
goAddMobile() {
this.navigateTo({
url: '/mobile/login',
});
const { addMobile } = this.props;
if (addMobile) {
addMobile();
return;
}
},
async onRemoveConfirm() {
const { mobileId } = this.state;

View File

@ -1,14 +1,17 @@
import React from 'react';
import { List, Button, Dialog } from 'antd-mobile';
import React, { useState } from 'react';
import { List, Button, Popup, Dialog } from 'antd-mobile';
import { MobileOutlined, DeleteOutlined } from '@ant-design/icons';
import Style from './mobile.module.less';
import MobileLogin from '../login';
export default function render(props) {
const { mobiles, allowRemove, tokenMobileId } = props.data;
const { goAddMobile, removeItem, recoverItem, execute } = props.methods;
const [open, setOpen] = useState(false);
return (<div className={Style.container}>
{mobiles && mobiles.length > 0 ? (<>
<List className={Style.list}>
{mobiles?.map((ele, index) => (<List.Item key={index} prefix={<MobileOutlined />} extra={allowRemove && tokenMobileId !== ele.id && (<div onClick={async () => {
{mobiles?.map((ele, index) => (<List.Item key={index} prefix={<MobileOutlined />} extra={allowRemove &&
tokenMobileId !== ele.id && (<div onClick={async () => {
const result = await Dialog.confirm({
content: '确认删除吗?删除后无法用此号码登录',
});
@ -33,8 +36,20 @@ export default function render(props) {
<span>尚未绑定手机号</span>
</div>)}
<Button block size="large" color="primary" onClick={() => goAddMobile()}>
<Button block size="large" color="primary" onClick={() => setOpen(true)}>
绑定
</Button>
<Popup visible={open} showCloseButton={true} onClose={() => {
setOpen(false);
}} bodyStyle={{
borderTopLeftRadius: '8px',
borderTopRightRadius: '8px',
height: '40vh',
}}>
<MobileLogin callback={() => {
setOpen(false);
}} oakPath="$mobile/me-mobile/login" oakAutoUnmount={true}/>
</Popup>
</div>);
}

View File

@ -1,54 +1,16 @@
.addView {
position: absolute;
top: 50%;
transform: translate(-50%, -50%);
left: 50%;
z-index: 99;
}
.imgView {
position: relative;
width: 100%;
height: 200px;
}
.img {
position: absolute;
width: 100%;
.pageBody {
height: 100%;
object-fit: contain;
}
.imgContent {
padding: 16px;
margin: 16px;
border-radius: 8px;
background-color: var(--oak-bg-color-page);
display: flex;
flex: 1;
flex-direction: column;
box-sizing: border-box;
align-items: stretch;
}
.container {
height: 100%;
box-sizing: border-box;
display: flex;
flex-direction: column;
background-color: #fff;
flex: 1;
display: flex;
flex-direction: column;
}
.circleBtn {
width: 25px;
height: 25px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
background-color: var(--oak-color-primary);
}
.buttonView {
display: flex;
flex-direction: column;
flex: 1;
justify-content: flex-end;
padding: 16px;
box-sizing: border-box;
}

View File

@ -1,13 +1,17 @@
import React from 'react';
import { WebComponentProps } from 'oak-frontend-base';
import { EntityDict } from '../../../oak-app-domain';
import type { UploadFile } from 'antd/es/upload/interface';
export default function Render(props: WebComponentProps<EntityDict, 'user', false, {
userId: string;
name: string;
idNumber: string;
idState: EntityDict['user']['Schema']['idState'];
idCardType: EntityDict['user']['Schema']['idCardType'];
idCardTypeArr: {
value: string;
label: string;
}[];
showBtn: boolean;
}, {
commit: (file1: UploadFile, file2: UploadFile) => void;
prevImg: (file: UploadFile, id: string) => void;
onChange: (attr: keyof EntityDict['user']['Schema'], value: string) => void;
}>): null;
onConfirm: () => void;
}>): React.JSX.Element;

View File

@ -1,104 +1,52 @@
import React, { useState } from 'react';
import Styles from './mobile.module.less';
import { Picker, Form, Input, Button } from 'antd-mobile';
export default function Render(props) {
const { methods, data } = props;
const { t, onChange, prevImg, commit } = methods;
// const { oakFullpath, oakId, oakLegalActions, userId, idState, name, idNumber } = data;
// const [fileList, setFileList] = useState<UploadFile[]>([]);
// const [fileList2, setFileList2] = useState<UploadFile[]>([]);
// const uploadProps: UploadProps = {
// maxCount: 1,
// showUploadList: false,
// beforeUpload: (file) => {
// return false;
// },
// onChange: ({ file, fileList, event }) => {
// prevImg(file, 'imgView1');
// setFileList([...fileList]);
// },
// fileList,
// };
// const uploadProps2: UploadProps = {
// maxCount: 1,
// showUploadList: false,
// beforeUpload: (file) => {
// return false;
// },
// onChange: ({ file, fileList, event }) => {
// prevImg(file, 'imgView2');
// setFileList2([...fileList]);
// },
// fileList: fileList2,
// };
// if (idState === 'verified') {
// return (
// <Result
// status='success'
// title={t("Real name verification passed")}
// />
// )
// }
return null;
// return (
// <div className={styles.container}>
// <div className={styles.imgContent}>
// <Upload {...uploadProps}>
// <div id="imgView1" className={styles.imgView} style={{ marginBottom: 16 }}>
// <IDCard1 width={"100%"} height={"100%"} style={{ background: '#fff' }} />
// {/* <img id="img1" className={styles.img} /> */}
// {fileList.length === 0 && (
// <Space direction="vertical" className={styles.addView} align="center">
// <div className={styles.circleBtn}>
// <AddOutline color="#fff" />
// </div>
// <div className={styles.text}>
// {t("Identity witness profile")}
// </div>
// </Space>
// )}
// </div>
// </Upload>
// <Upload {...uploadProps2}>
// <div id="imgView2" className={styles.imgView}>
// <IDCard2 width={"100%"} height={"100%"} style={{ background: '#fff' }} />
// {/* <img id="img2" className={styles.img} /> */}
// {fileList2.length === 0 && (
// <Space direction="vertical" className={styles.addView} align="center">
// <div className={styles.circleBtn}>
// <AddOutline color="#fff" />
// </div>
// <div className={styles.text}>
// {t("Identity national emblem profile")}
// </div>
// </Space>
// )}
// </div>
// </Upload>
// </div>
// <Form layout='horizontal'>
// <Form.Item label={t("user:attr.name")}>
// <Input
// value={name}
// style={{ '--text-align': 'right' }}
// placeholder={t("please input name")}
// clearable
// onChange={(value) => onChange('name', value)}
// />
// </Form.Item>
// <Form.Item label={t("user:attr.idNumber")}>
// <Input
// value={idNumber}
// style={{ '--text-align': 'right' }}
// placeholder={t("please input idNumber")}
// clearable
// onChange={(value) => onChange('idNumber', value)}
// />
// </Form.Item>
// </Form>
// <div className={styles.buttonView}>
// <Button block shape='rounded' color='primary' onClick={() => commit(fileList[0], fileList2[0])}>
// {t("common::commit")}
// </Button>
// <SafeArea position='bottom' />
// </div>
// </div>
// );
const { t, update, onConfirm } = methods;
const { oakFullpath, oakId, oakLegalActions, idState, name, idNumber, idCardType, idCardTypeArr, showBtn, } = data;
const [open, setOpen] = useState(false);
return (<div className={Styles.pageBody}>
<div className={Styles.container}>
<Form layout="horizontal">
<Form.Item label={t('user:attr.name')} required>
<Input disabled={idState !== 'unverified'} value={name} onChange={(val) => {
update({
name: val,
});
}} placeholder={t('please input name')}/>
</Form.Item>
<Form.Item label={t('user:attr.idCardType')} required>
<div onClick={idState === 'unverified' ? () => {
setOpen(true);
} : undefined}>
<Input value={idCardType
? t('user:v.idCardType.' + idCardType)
: ''} readOnly placeholder={t('please choose idCardType')}/>
</div>
<Picker columns={[idCardTypeArr]} visible={open} onClose={() => {
setOpen(false);
}} value={idCardType ? [idCardType] : undefined} onConfirm={(v) => {
update({
idCardType: v[0],
});
}}/>
</Form.Item>
<Form.Item label={t('user:attr.idNumber')} required>
<Input value={idNumber} disabled={!idCardType || idState !== 'unverified'} onChange={(val) => {
update({
idNumber: val,
});
}} placeholder={t('please input idNumber')}/>
</Form.Item>
</Form>
</div>
{showBtn ? (<Button block color="primary" size="large" onClick={() => {
onConfirm();
}}>
提交认证
</Button>) : null}
</div>);
}

View File

@ -4,8 +4,8 @@ declare const _default: (props: import("oak-frontend-base").ReactComponentProps<
entity: keyof EntityDict;
entityFilter: any;
relationIds: string[];
rule: "single" | "all" | "free";
ruleOnRow: "single" | "all" | "free";
rule: "all" | "single" | "free";
ruleOnRow: "all" | "single" | "free";
onPickRelations: (ids: string[]) => void;
onPickRows: (ids: string[]) => void;
pickedRowIds: string[] | undefined;

View File

@ -11,7 +11,7 @@ declare const _default: (props: import("oak-frontend-base").ReactComponentProps<
claimUrl: string;
qrCodeType: QrCodeType;
multiple: boolean;
rule: "single" | "all" | "free";
ruleOnRow: "single" | "all" | "free";
rule: "all" | "single" | "free";
ruleOnRow: "all" | "single" | "free";
}>) => React.ReactElement;
export default _default;

View File

@ -1,6 +1,6 @@
import { EntityDict } from '../../../oak-app-domain';
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<EntityDict, keyof EntityDict, false, {
type: "bind" | "login";
type: "login" | "bind";
url: string;
}>) => React.ReactElement;
export default _default;

View File

@ -1,4 +1,4 @@
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<import("../../oak-app-domain").EntityDict, keyof import("../../oak-app-domain").EntityDict, true, {
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<import("../../oak-app-domain").EntityDict, keyof import("../../oak-app-domain").EntityDict, false, {
applicationId: string;
isPlatform: boolean;
tabKey: string;

View File

@ -1,5 +1,5 @@
export default OakComponent({
isList: true,
isList: false,
properties: {
applicationId: '',
isPlatform: false,
@ -8,7 +8,6 @@ export default OakComponent({
lifetimes: {
async ready() {
const { applicationId } = this.props;
// const result = await this.features.wechatMenu.getCurrentMenu({ applicationId: applicationId! });
const { data: wechatMenu } = await this.features.cache.refresh('wechatMenu', {
data: {
id: 1,

View File

@ -19,7 +19,6 @@ export default OakComponent({
return {
id: rows?.[0]?.id,
config: rows?.[0]?.menuConfig,
totalConfig: rows?.[0]?.menuConfig,
iState: rows?.[0]?.iState,
};
},

View File

@ -1,13 +1,10 @@
import React from 'react';
import { WechatPublicInstance } from 'oak-external-sdk/es/WechatSDK';
import { WebComponentProps } from 'oak-frontend-base';
import { EntityDict } from "../../../oak-app-domain";
export default function Render(props: WebComponentProps<EntityDict, 'wechatMenu', true, {
id: string;
config: any;
totalConfig: any;
file: File;
wechatInstance: WechatPublicInstance;
errorIndex: number[];
oakId: string;
menuType: string;

View File

@ -6,7 +6,7 @@ import ActionPhone from '../actionPhone';
import MenuInfo from '../menuInfo';
export default function Render(props) {
const { data, methods } = props;
const { id, oakFullpath, config, wechatInstance, totalConfig, menuType, applicationId, actions, iState, tabKey } = data;
const { id, oakFullpath, config, menuType, applicationId, actions, iState, tabKey } = data;
const { updateItem, execute, create, } = methods;
const [open, setOpen] = useState(false);
const [isPreview, setIsPreview] = useState(false);

View File

@ -1,10 +1,10 @@
import React from 'react';
import { WebComponentProps } from 'oak-frontend-base';
import { EntityDict } from '../../oak-app-domain';
export default function Render(props: WebComponentProps<EntityDict, 'wechatMenu', true, {
export default function Render(props: WebComponentProps<EntityDict, 'wechatMenu', false, {
is_menu_open: boolean;
applicationId: string;
menuId: string;
isPlatform: boolean;
tabKey: string;
}, {}>): React.JSX.Element | null;
}, {}>): React.JSX.Element;

View File

@ -5,7 +5,7 @@ import Style from './web.module.less';
import { Tabs } from 'antd';
import TagList from './tagList';
export default function Render(props) {
const { menuId, oakFullpath, is_menu_open, applicationId, isPlatform, tabKey } = props.data;
const { menuId, oakFullpath, is_menu_open, applicationId, isPlatform, tabKey, } = props.data;
const {} = props.methods;
const [menuType, setMenuType] = useState('common');
const [tag, setTag] = useState({});
@ -16,38 +16,29 @@ export default function Render(props) {
{
key: '1',
label: '通用菜单',
children: <WechatMenu menuId={menuId ? menuId : undefined} oakPath={'$wechatMenu'} applicationId={applicationId} oakAutoUnmount={true} menuType={menuType} tabKey={tabKey}/>,
children: (<WechatMenu menuId={menuId ? menuId : undefined} oakPath={'$wechatMenu'} applicationId={applicationId} oakAutoUnmount={true} menuType={menuType} tabKey={tabKey}/>),
},
{
key: '2',
label: '个性化菜单',
children: <div className={Style.conditionalMenu}>
children: (<div className={Style.conditionalMenu}>
<div className={Style.tagList}>
<TagList oakAutoUnmount={true} oakPath='$wechatPublicTag' applicationId={applicationId} getTag={getTag}/>
<TagList oakAutoUnmount={true} oakPath="$wechatPublicTag" applicationId={applicationId} getTag={getTag}/>
</div>
{tag.id ? (<ConditionalMenu oakPath={`$conditionalMenu-${tag.id}`} applicationId={applicationId} oakAutoUnmount={true} tagId={tag.id} wechatId={tag.wechatId} menuType={menuType} tabKey={tabKey}/>) : (<div className={Style.tagHelp}>请选择一个标签</div>)}
</div>,
</div>),
},
];
if (oakFullpath) {
return (<div>
{is_menu_open && (<div className={Style.tabs}>
{isPlatform ? <WechatMenu menuId={menuId ? menuId : undefined} oakPath={'$wechatMenu'} applicationId={applicationId} oakAutoUnmount={true} menuType={menuType} tabKey={tabKey}/> : <Tabs defaultActiveKey='1' items={items} onChange={(key) => {
if (key === '1') {
setMenuType('common');
}
else {
setMenuType('conditional');
}
}}/>}
</div>)
// : (
// <div className={Style.container}>
// <div className={Style.warn}>尚未开启菜单,请先前往微信公众平台开启。</div>
// </div>
// )
}
</div>);
}
return null;
return (<div>
{is_menu_open ? (<div className={Style.tabs}>
{isPlatform ? (<WechatMenu menuId={menuId ? menuId : undefined} oakPath={'$wechatMenu'} applicationId={applicationId} oakAutoUnmount={true} menuType={menuType} tabKey={tabKey}/>) : (<Tabs defaultActiveKey="1" items={items} onChange={(key) => {
if (key === '1') {
setMenuType('common');
}
else {
setMenuType('conditional');
}
}}/>)}
</div>) : null}
</div>);
}

View File

@ -1,2 +1,2 @@
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
export default _default;

View File

@ -5,8 +5,7 @@ const tslib_1 = require("tslib");
const WechatSDK_1 = tslib_1.__importDefault(require("oak-external-sdk/lib/WechatSDK"));
const assert_1 = require("oak-domain/lib/utils/assert");
const uuid_1 = require("oak-domain/lib/utils/uuid");
const Exception_1 = require('oak-domain/lib/types/Exception');
const Exception_1 = require("oak-domain/lib/types/Exception");
async function getWechatPublicConfig(applicationId, context) {
const [application] = await context.select('application', {
data: {
@ -56,16 +55,14 @@ async function getMenu(params, context) {
return result;
}
catch (e) {
if (
e instanceof Exception_1.OakExternalException &&
e?.message?.includes('menu no exist')
) {
return {
menu: {
button: [],
},
};
}
if (e instanceof Exception_1.OakExternalException &&
e?.message?.includes('menu no exist')) {
return {
menu: {
button: []
}
};
}
throw e;
}
}

View File

@ -1,2 +1,2 @@
declare const checkers: (import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "token", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "mobile", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "message", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "parasite", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>>)[];
declare const checkers: (import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "token", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "mobile", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "message", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "parasite", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>>)[];
export default checkers;

View File

@ -1,2 +1,2 @@
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
export default _default;

View File

@ -1,22 +1,15 @@
.loginbox-main {
height: 100vh;
display: flex;
flex: 1;
display: flex;
align-items: center;
flex-direction: column;
background: var(--oak-bg-color-container);
padding-top: 20%;
}
.loginbox-wrap {
width: 90%;
display: block;
background: var(--oak-bg-color-container);
border-radius: 4px;
overflow: hidden;
box-shadow: 0 2px 4px rgb(0 0 0 / 8%), 0 0 4px rgb(0 0 0 / 8%);
}
.loginbox-hd {

View File

@ -37,6 +37,7 @@ export default OakComponent({
properties: {
onFinish: undefined as (() => void) | undefined,
bindNum: 10,
addMobile: undefined as (() => void) | undefined,
},
methods: {
async onRefreshMobile(e: WechatMiniprogram.Touch) {
@ -84,9 +85,11 @@ export default OakComponent({
},
goAddMobile() {
this.navigateTo({
url: '/mobile/login',
});
const { addMobile } = this.props;
if (addMobile) {
addMobile();
return;
}
},
async onRemoveConfirm() {

View File

@ -1,10 +1,12 @@
import React, { useState } from 'react';
import { List, Button, Modal, Dialog } from 'antd-mobile';
import { List, Button, Popup, Dialog } from 'antd-mobile';
import { MobileOutlined, DeleteOutlined } from '@ant-design/icons';
import { WebComponentProps } from 'oak-frontend-base';
import { EntityDict } from '../../../oak-app-domain';
import Style from './mobile.module.less';
import MobileLogin from '../login';
export default function render(
props: WebComponentProps<
EntityDict,
@ -22,6 +24,8 @@ export default function render(
) {
const { mobiles, allowRemove, tokenMobileId } = props.data;
const { goAddMobile, removeItem, recoverItem, execute } = props.methods;
const [open, setOpen] = useState(false);
return (
<div className={Style.container}>
{mobiles && mobiles.length > 0 ? (
@ -32,7 +36,8 @@ export default function render(
key={index}
prefix={<MobileOutlined />}
extra={
allowRemove && tokenMobileId !== ele.id && (
allowRemove &&
tokenMobileId !== ele.id && (
<div
onClick={async () => {
const result =
@ -44,8 +49,7 @@ export default function render(
removeItem(ele.id);
try {
await execute();
}
catch (err) {
} catch (err) {
recoverItem(ele.id);
throw err;
}
@ -73,10 +77,31 @@ export default function render(
block
size="large"
color="primary"
onClick={() => goAddMobile()}
onClick={() => setOpen(true)}
>
</Button>
<Popup
visible={open}
showCloseButton={true}
onClose={() => {
setOpen(false);
}}
bodyStyle={{
borderTopLeftRadius: '8px',
borderTopRightRadius: '8px',
height: '40vh',
}}
>
<MobileLogin
callback={() => {
setOpen(false);
}}
oakPath="$mobile/me-mobile/login"
oakAutoUnmount={true}
/>
</Popup>
</div>
);
}

View File

@ -1,54 +1,16 @@
.addView {
position: absolute;
top: 50%;
transform: translate(-50%, -50%);
left: 50%;
z-index: 99;
}
.imgView {
position: relative;
width: 100%;
height: 200px;
}
.img {
position: absolute;
width: 100%;
.pageBody {
height: 100%;
object-fit: contain;
}
.imgContent {
padding: 16px;
margin: 16px;
border-radius: 8px;
background-color: var(--oak-bg-color-page);
display: flex;
flex: 1;
flex-direction: column;
box-sizing: border-box;
align-items: stretch;
}
.container {
height: 100%;
box-sizing: border-box;
display: flex;
flex-direction: column;
background-color: #fff;
flex: 1;
display: flex;
flex-direction: column;
}
.circleBtn {
width: 25px;
height: 25px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
background-color: var(--oak-color-primary);
}
.buttonView {
display: flex;
flex-direction: column;
flex: 1;
justify-content: flex-end;
padding: 16px;
box-sizing: border-box;
}

View File

@ -1,10 +1,8 @@
import React, { useRef, useState } from 'react';
import { WebComponentProps } from 'oak-frontend-base';
import { EntityDict } from '../../../oak-app-domain';
import styles from './mobile.module.less';
import { Image, Card, Space, Form, Input, SafeArea, Button, Result } from 'antd-mobile';
import { AddOutline } from 'antd-mobile-icons';
import type { UploadFile, UploadProps } from 'antd/es/upload/interface';
import Styles from './mobile.module.less';
import { Picker, Form, Input, Button } from 'antd-mobile';
export default function Render(
props: WebComponentProps<
@ -16,117 +14,105 @@ export default function Render(
name: string;
idNumber: string;
idState: EntityDict['user']['Schema']['idState'];
idCardType: EntityDict['user']['Schema']['idCardType'];
idCardTypeArr: { value: string; label: string }[];
showBtn: boolean;
},
{
commit: (file1: UploadFile, file2: UploadFile) => void;
prevImg: (file: UploadFile, id: string) => void;
onChange: (attr: keyof EntityDict['user']['Schema'], value: string) => void;
onConfirm: () => void;
}
>
) {
const { methods, data } = props;
const { t, onChange, prevImg, commit } = methods;
// const { oakFullpath, oakId, oakLegalActions, userId, idState, name, idNumber } = data;
// const [fileList, setFileList] = useState<UploadFile[]>([]);
// const [fileList2, setFileList2] = useState<UploadFile[]>([]);
// const uploadProps: UploadProps = {
// maxCount: 1,
// showUploadList: false,
// beforeUpload: (file) => {
// return false;
// },
// onChange: ({ file, fileList, event }) => {
// prevImg(file, 'imgView1');
// setFileList([...fileList]);
// },
// fileList,
// };
const { t, update, onConfirm } = methods;
const {
oakFullpath,
oakId,
oakLegalActions,
idState,
name,
idNumber,
idCardType,
idCardTypeArr,
showBtn,
} = data;
const [open, setOpen] = useState(false);
// const uploadProps2: UploadProps = {
// maxCount: 1,
// showUploadList: false,
// beforeUpload: (file) => {
// return false;
// },
// onChange: ({ file, fileList, event }) => {
// prevImg(file, 'imgView2');
// setFileList2([...fileList]);
// },
// fileList: fileList2,
// };
// if (idState === 'verified') {
// return (
// <Result
// status='success'
// title={t("Real name verification passed")}
// />
// )
// }
return (
<div className={Styles.pageBody}>
<div className={Styles.container}>
<Form layout="horizontal">
<Form.Item label={t('user:attr.name')} required>
<Input
disabled={idState !== 'unverified'}
value={name}
onChange={(val) => {
update({
name: val,
});
}}
placeholder={t('please input name')}
/>
</Form.Item>
<Form.Item label={t('user:attr.idCardType')} required>
<div
onClick={idState === 'unverified' ? () => {
setOpen(true);
} : undefined}
>
<Input
value={
idCardType
? t('user:v.idCardType.' + idCardType)
: ''
}
readOnly
placeholder={t('please choose idCardType')}
/>
</div>
return null;
<Picker
columns={[idCardTypeArr]}
visible={open}
onClose={() => {
setOpen(false);
}}
value={idCardType ? [idCardType] : undefined}
onConfirm={(v) => {
update({
idCardType:
v[0] as EntityDict['user']['Schema']['idCardType'],
});
}}
/>
</Form.Item>
<Form.Item label={t('user:attr.idNumber')} required>
<Input
value={idNumber}
disabled={!idCardType || idState !== 'unverified'}
onChange={(val) => {
update({
idNumber: val,
});
}}
placeholder={t('please input idNumber')}
/>
</Form.Item>
</Form>
</div>
// return (
// <div className={styles.container}>
// <div className={styles.imgContent}>
// <Upload {...uploadProps}>
// <div id="imgView1" className={styles.imgView} style={{ marginBottom: 16 }}>
// <IDCard1 width={"100%"} height={"100%"} style={{ background: '#fff' }} />
// {/* <img id="img1" className={styles.img} /> */}
// {fileList.length === 0 && (
// <Space direction="vertical" className={styles.addView} align="center">
// <div className={styles.circleBtn}>
// <AddOutline color="#fff" />
// </div>
// <div className={styles.text}>
// {t("Identity witness profile")}
// </div>
// </Space>
// )}
// </div>
// </Upload>
// <Upload {...uploadProps2}>
// <div id="imgView2" className={styles.imgView}>
// <IDCard2 width={"100%"} height={"100%"} style={{ background: '#fff' }} />
// {/* <img id="img2" className={styles.img} /> */}
// {fileList2.length === 0 && (
// <Space direction="vertical" className={styles.addView} align="center">
// <div className={styles.circleBtn}>
// <AddOutline color="#fff" />
// </div>
// <div className={styles.text}>
// {t("Identity national emblem profile")}
// </div>
// </Space>
// )}
// </div>
// </Upload>
// </div>
// <Form layout='horizontal'>
// <Form.Item label={t("user:attr.name")}>
// <Input
// value={name}
// style={{ '--text-align': 'right' }}
// placeholder={t("please input name")}
// clearable
// onChange={(value) => onChange('name', value)}
// />
// </Form.Item>
// <Form.Item label={t("user:attr.idNumber")}>
// <Input
// value={idNumber}
// style={{ '--text-align': 'right' }}
// placeholder={t("please input idNumber")}
// clearable
// onChange={(value) => onChange('idNumber', value)}
// />
// </Form.Item>
// </Form>
// <div className={styles.buttonView}>
// <Button block shape='rounded' color='primary' onClick={() => commit(fileList[0], fileList2[0])}>
// {t("common::commit")}
// </Button>
// <SafeArea position='bottom' />
// </div>
// </div>
// );
{showBtn ? (
<Button
block
color="primary"
size="large"
onClick={() => {
onConfirm();
}}
>
</Button>
) : null}
</div>
);
}

View File

@ -1,6 +1,6 @@
export default OakComponent({
isList: true,
isList: false,
properties: {
applicationId: '',
isPlatform: false,
@ -9,7 +9,6 @@ export default OakComponent({
lifetimes: {
async ready() {
const { applicationId } = this.props;
// const result = await this.features.wechatMenu.getCurrentMenu({ applicationId: applicationId! });
const { data: wechatMenu } = await this.features.cache.refresh(
'wechatMenu',
{

View File

@ -1,6 +1,4 @@
import WechatSDK, { WechatMpInstance, WechatPublicInstance } from 'oak-external-sdk/es/WechatSDK';
import { WechatMpConfig, WechatPublicConfig } from '../../../oak-app-domain/Application/Schema';
import { generateNewIdAsync } from 'oak-domain/lib/utils/uuid';
export default OakComponent({
isList: true,
entity: 'wechatMenu',
@ -22,7 +20,6 @@ export default OakComponent({
return {
id: rows?.[0]?.id,
config: rows?.[0]?.menuConfig,
totalConfig: rows?.[0]?.menuConfig,
iState: rows?.[0]?.iState,
};
},

View File

@ -1,12 +1,12 @@
import React, { useEffect, useState, useRef } from 'react';
import { WechatPublicInstance } from 'oak-external-sdk/es/WechatSDK';
import { WebComponentProps } from 'oak-frontend-base';
import { EntityDict } from "../../../oak-app-domain";
import Style from './web.module.less';
import { Space, Button, Form, Input, Radio, Modal } from 'antd';
import { Modal } from 'antd';
import Preview from '../preview';
import ActionPhone from '../actionPhone';
import MenuInfo from '../menuInfo';
export default function Render(
props: WebComponentProps<
EntityDict,
@ -15,9 +15,7 @@ export default function Render(
{
id: string;
config: any;
totalConfig: any;
file: File;
wechatInstance: WechatPublicInstance;
errorIndex: number[];
oakId: string;
menuType: string;
@ -32,7 +30,7 @@ export default function Render(
>
) {
const { data, methods } = props;
const { id, oakFullpath, config, wechatInstance, totalConfig, menuType, applicationId, actions, iState, tabKey } = data;
const { id, oakFullpath, config, menuType, applicationId, actions, iState, tabKey } = data;
const {
updateItem,
execute,

View File

@ -12,7 +12,7 @@ export default function Render(
props: WebComponentProps<
EntityDict,
'wechatMenu',
true,
false,
{
is_menu_open: boolean;
applicationId: string;
@ -20,100 +20,101 @@ export default function Render(
isPlatform: boolean;
tabKey: string;
},
{
}
{}
>
) {
const { menuId, oakFullpath, is_menu_open, applicationId, isPlatform, tabKey } = props.data;
const { } = props.methods;
const {
menuId,
oakFullpath,
is_menu_open,
applicationId,
isPlatform,
tabKey,
} = props.data;
const {} = props.methods;
const [menuType, setMenuType] = useState('common');
const [tag, setTag] = useState({} as { id: string, name: string, wechatId: string });
const [tag, setTag] = useState(
{} as { id: string; name: string; wechatId: string }
);
const getTag = (tag: { id: string, name: string, wechatId: string }) => {
const getTag = (tag: { id: string; name: string; wechatId: string }) => {
setTag(tag);
}
};
const items: TabsProps['items'] = [
{
key: '1',
label: '通用菜单',
children: <WechatMenu
menuId={menuId ? menuId : undefined}
oakPath={'$wechatMenu'}
applicationId={applicationId}
oakAutoUnmount={true}
menuType={menuType}
tabKey={tabKey}
/>,
children: (
<WechatMenu
menuId={menuId ? menuId : undefined}
oakPath={'$wechatMenu'}
applicationId={applicationId}
oakAutoUnmount={true}
menuType={menuType}
tabKey={tabKey}
/>
),
},
{
key: '2',
label: '个性化菜单',
children:
children: (
<div className={Style.conditionalMenu}>
<div className={Style.tagList}>
<TagList
oakAutoUnmount={true}
oakPath='$wechatPublicTag'
oakPath="$wechatPublicTag"
applicationId={applicationId}
getTag={getTag}
/>
</div>
{
tag.id ? (
<ConditionalMenu
oakPath={`$conditionalMenu-${tag.id}`}
applicationId={applicationId}
oakAutoUnmount={true}
tagId={tag.id}
wechatId={tag.wechatId}
menuType={menuType}
tabKey={tabKey}
/>
) : (
<div className={Style.tagHelp}></div>
)
}
</div>,
{tag.id ? (
<ConditionalMenu
oakPath={`$conditionalMenu-${tag.id}`}
applicationId={applicationId}
oakAutoUnmount={true}
tagId={tag.id}
wechatId={tag.wechatId}
menuType={menuType}
tabKey={tabKey}
/>
) : (
<div className={Style.tagHelp}></div>
)}
</div>
),
},
];
if (oakFullpath) {
return (
<div>
{
is_menu_open && (
<div className={Style.tabs}>
{
isPlatform ? <WechatMenu
menuId={menuId ? menuId : undefined}
oakPath={'$wechatMenu'}
applicationId={applicationId}
oakAutoUnmount={true}
menuType={menuType}
tabKey={tabKey}
/> : <Tabs
defaultActiveKey='1'
items={items}
onChange={(key: string) => {
if (key === '1') {
setMenuType('common');
} else {
setMenuType('conditional');
}
}}
/>
}
</div>
)
// : (
// <div className={Style.container}>
// <div className={Style.warn}>尚未开启菜单,请先前往微信公众平台开启。</div>
// </div>
// )
}
</div>
)
}
return null;
return (
<div>
{is_menu_open ? (
<div className={Style.tabs}>
{isPlatform ? (
<WechatMenu
menuId={menuId ? menuId : undefined}
oakPath={'$wechatMenu'}
applicationId={applicationId}
oakAutoUnmount={true}
menuType={menuType}
tabKey={tabKey}
/>
) : (
<Tabs
defaultActiveKey="1"
items={items}
onChange={(key: string) => {
if (key === '1') {
setMenuType('common');
} else {
setMenuType('conditional');
}
}}
/>
)}
</div>
) : null}
</div>
);
}