Skip to content

Commit

Permalink
Merge pull request #191 from Koniverse/koni/dev/issue-295
Browse files Browse the repository at this point in the history
[Issue 295] Koni_story -  Update wallet connection for on-chain task and AI Agent
  • Loading branch information
Thiendekaco authored Feb 11, 2025
2 parents a84e709 + b9d2dd8 commit 9f463e1
Show file tree
Hide file tree
Showing 6 changed files with 216 additions and 17 deletions.
22 changes: 15 additions & 7 deletions packages/extension-koni-ui/src/Popup/AiAgent/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,25 @@
// SPDX-License-Identifier: Apache-2.0

import { EventStreamContentType, fetchEventSource } from '@microsoft/fetch-event-source';
import { ExtrinsicStatus, RequestTransfer } from '@subwallet/extension-base/background/KoniTypes';
import { ExtrinsicStatus } from '@subwallet/extension-base/background/KoniTypes';
import { SWTransactionBrief, SWTransactionResponse } from '@subwallet/extension-base/services/transaction-service/types';
import { getExplorerLink } from '@subwallet/extension-base/services/transaction-service/utils';
import { WC_DEFAULT_CHAIN_MAINNET_ID } from '@subwallet/extension-base/services/wallet-connect-service/constants';
import { RequestTransfer } from '@subwallet/extension-base/types';
import { isSameAddress } from '@subwallet/extension-base/utils';
import { GameAccountAvatar, Layout } from '@subwallet/extension-koni-ui/components';
import AlertChangeAccountConnectModal from '@subwallet/extension-koni-ui/components/Modal/Account/AlertChangeAccountConnectModal';
import { BookaSdk } from '@subwallet/extension-koni-ui/connector/booka/sdk';
import { BookaAccount, IpAssetParams } from '@subwallet/extension-koni-ui/connector/booka/types';
import { TelegramConnector } from '@subwallet/extension-koni-ui/connector/telegram';
import { ALERT_CHANGE_ACCOUNT_CONNECT_MODAL } from '@subwallet/extension-koni-ui/constants';
import { WalletConnectContext } from '@subwallet/extension-koni-ui/contexts/WalletConnectContext';
import { useNotification, useSelector, useTranslation } from '@subwallet/extension-koni-ui/hooks';
import { makeTransfer, subscribeTransactionById, wcSignMessageRequest } from '@subwallet/extension-koni-ui/messaging';
import { RootState } from '@subwallet/extension-koni-ui/stores';
import { ThemeProps } from '@subwallet/extension-koni-ui/types';
import { AiTransactionData, noop, transformAiMessageData, validateSignature } from '@subwallet/extension-koni-ui/utils';
import { ModalContext } from '@subwallet/react-ui';
import CN from 'classnames';
import { cloneDeep } from 'lodash';
import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
Expand Down Expand Up @@ -50,6 +54,8 @@ interface AiTransactionInfo extends AiTransactionData {
transactionId?: string;
}

const alertChangeAccountModalId = ALERT_CHANGE_ACCOUNT_CONNECT_MODAL;

const Component = (props: Props): React.ReactElement => {
const { className } = props;
const notify = useNotification();
Expand All @@ -58,7 +64,7 @@ const Component = (props: Props): React.ReactElement => {
const [account, setAccount] = useState<BookaAccount | undefined>(apiSDK.account);

const chainInfoMap = useSelector((state: RootState) => state.chainStore.chainInfoMap);

const { activeModal } = useContext(ModalContext);
const { goBack } = useDefaultNavigate();
const [messages, setMessages] = useState<MessageType[]>([]);
const [pendingMessages, setPendingMessages] = useState<MessageType[]>([]);
Expand Down Expand Up @@ -787,11 +793,7 @@ const Component = (props: Props): React.ReactElement => {

if (apiSDK.addressLinked) {
if (apiSDK.addressLinked !== address) {
notify({
message: t('This address is different from the linked address'),
type: 'error',
duration: 8
});
activeModal(alertChangeAccountModalId);
}
} else {
apiSDK.setAddressLinking(address);
Expand Down Expand Up @@ -1008,6 +1010,12 @@ const Component = (props: Props): React.ReactElement => {
onInputChange={setUserInput}
onSubmit={handleSubmit}
/>

{ wcAccount?.address && (
<AlertChangeAccountConnectModal
addressConnected={wcAccount.address}
/>
)}
</Layout.WithSubHeaderOnly>
);
};
Expand Down
15 changes: 6 additions & 9 deletions packages/extension-koni-ui/src/Popup/Home/Mission/TaskItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@ import { GamePoint } from '@subwallet/extension-koni-ui/components';
import { BookaSdk } from '@subwallet/extension-koni-ui/connector/booka/sdk';
import { ShareLeaderboard, Task } from '@subwallet/extension-koni-ui/connector/booka/types';
import { TelegramConnector } from '@subwallet/extension-koni-ui/connector/telegram';
import { ALERT_CHANGE_ACCOUNT_CONNECT_MODAL } from '@subwallet/extension-koni-ui/constants';
import { WalletConnectContext } from '@subwallet/extension-koni-ui/contexts/WalletConnectContext';
import { useConfirmModal, useNotification, useSelector, useSetCurrentPage, useTranslation } from '@subwallet/extension-koni-ui/hooks';
import { wcSignMessageRequest } from '@subwallet/extension-koni-ui/messaging';
import { Theme, ThemeProps } from '@subwallet/extension-koni-ui/types';
import { customFormatDate, noop, toDisplayNumber, validateSignature } from '@subwallet/extension-koni-ui/utils';
import { actionTaskOnChain } from '@subwallet/extension-koni-ui/utils/game/task';
import { Button, Icon, Image, SwModalFuncProps } from '@subwallet/react-ui';
import { Button, Icon, Image, ModalContext, SwModalFuncProps } from '@subwallet/react-ui';
import CN from 'classnames';
import { CheckCircle, SmileySad } from 'phosphor-react';
import React, { useCallback, useContext, useEffect, useMemo, useState } from 'react';
Expand All @@ -31,15 +32,15 @@ type Props = {

const apiSDK = BookaSdk.instance;
const telegramConnector = TelegramConnector.instance;
const alertChangeAccountModalId = ALERT_CHANGE_ACCOUNT_CONNECT_MODAL;

const _TaskItem = ({ actionReloadPoint, className, openWidget, reloadTask, task }: Props): React.ReactElement => {
useSetCurrentPage('/home/mission');
const notify = useNotification();

const { connectWC, requireWC, waitingSigningModal: { close: closeWaiting, open: openWaiting } } = useContext(WalletConnectContext);

const { wcAccount } = useSelector((state) => state.accountState);

const { activeModal } = useContext(ModalContext);
const [, setAccount] = useState(apiSDK.account);
const [taskLoading, setTaskLoading] = useState<boolean>(false);
const { t } = useTranslation();
Expand Down Expand Up @@ -140,11 +141,7 @@ const _TaskItem = ({ actionReloadPoint, className, openWidget, reloadTask, task

if (apiSDK.addressLinked) {
if (apiSDK.addressLinked !== address) {
notify({
message: t('This address is different from the linked address'),
type: 'error',
duration: 8
});
activeModal(alertChangeAccountModalId);

return null;
} else {
Expand Down Expand Up @@ -206,7 +203,7 @@ const _TaskItem = ({ actionReloadPoint, className, openWidget, reloadTask, task
return null;
}
}
}, [closeWaiting, connectWC, notify, openWaiting, requireWC, t, wcAccount]);
}, [activeModal, closeWaiting, connectWC, notify, openWaiting, requireWC, t, wcAccount]);

const { handleSimpleConfirmModal: handleNoNftFoundModalProps } = useConfirmModal(noNftFoundModalProps);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
// Copyright 2019-2022 @subwallet/extension-ui authors & contributors
// SPDX-License-Identifier: Apache-2.0

import AlertChangeAccountConnectModal from '@subwallet/extension-koni-ui/components/Modal/Account/AlertChangeAccountConnectModal';
import { TaskCategory, TaskCategoryInfo } from '@subwallet/extension-koni-ui/connector/booka/types';
import { useTranslation } from '@subwallet/extension-koni-ui/hooks';
import { useSelector, useTranslation } from '@subwallet/extension-koni-ui/hooks';
import TaskItem from '@subwallet/extension-koni-ui/Popup/Home/Mission/TaskItem';
import { ThemeProps } from '@subwallet/extension-koni-ui/types';
import React, { useMemo } from 'react';
Expand All @@ -18,6 +19,7 @@ type Props = ThemeProps & {

const Component = ({ actionReloadPoint, className, openWidget, reloadTask, taskCategoryInfoMap, taskCategoryMap }: Props): React.ReactElement => {
const { t } = useTranslation();
const { wcAccount } = useSelector((state) => state.accountState);

const taskCategoryInfoList = useMemo(() => {
const checkInCatId = Object.values(taskCategoryMap).find((tci) => tci.slug === 'check_in')?.id;
Expand Down Expand Up @@ -75,6 +77,11 @@ const Component = ({ actionReloadPoint, className, openWidget, reloadTask, taskC
)
))
}
{ wcAccount?.address && (
<AlertChangeAccountConnectModal
addressConnected={wcAccount.address}
/>
)}
</div>
);
};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
// Copyright 2019-2022 @polkadot/extension-ui authors & contributors
// SPDX-License-Identifier: Apache-2.0

import { ALERT_CHANGE_ACCOUNT_CONNECT_MODAL } from '@subwallet/extension-koni-ui/constants';
import { WalletConnectContext } from '@subwallet/extension-koni-ui/contexts/WalletConnectContext';
import { useSelector, useTranslation } from '@subwallet/extension-koni-ui/hooks';
import { Theme } from '@subwallet/extension-koni-ui/themes';
import { ThemeProps } from '@subwallet/extension-koni-ui/types';
import { toShort } from '@subwallet/extension-koni-ui/utils';
import { Button, Icon, ModalContext, SwModal } from '@subwallet/react-ui';
import CN from 'classnames';
import { CheckCircle, SmileySad, XCircle } from 'phosphor-react';
import React, { useCallback, useContext, useMemo } from 'react';
import styled, { useTheme } from 'styled-components';

type Props = ThemeProps & {
addressConnected: string;
}

const modalId = ALERT_CHANGE_ACCOUNT_CONNECT_MODAL;

function Component ({ addressConnected, className }: Props): React.ReactElement<Props> {
const { t } = useTranslation();
const { wcAccount } = useSelector((state) => state.accountState);
const { disconnectWithoutConfirmModal } = useContext(WalletConnectContext);
const { inactiveModal } = useContext(ModalContext);
const { token } = useTheme() as Theme;

const onCancel = useCallback(() => {
wcAccount && disconnectWithoutConfirmModal(wcAccount).then(() => {
inactiveModal(modalId);
}).catch(console.error);
}, [disconnectWithoutConfirmModal, inactiveModal, wcAccount]);

const footerModal = useMemo(() => {
return (
<>
<Button
block={true}
icon={(
<Icon
phosphorIcon={XCircle}
weight='fill'
/>
)}
onClick={onCancel}
schema={'secondary'}
shape={'round'}
>
{t('Cancel')}
</Button>
<Button
block={true}
icon={(
<Icon
phosphorIcon={CheckCircle}
/>
)}
onClick={onCancel}
shape={'round'}
size={'sm'}
>
{t('Change account')}
</Button>
</>
);
}, [onCancel, t]);

return (
<SwModal
className={CN(className)}
closable={true}
footer={footerModal}
id={modalId}
onCancel={onCancel}
title={t('Failed to complete')}
>
<div className='ant-sw-modal-confirm-body'>
<div className={'__icon-modal'}>
<Icon
customSize={'60px'}
iconColor={token.colorIconHover}
phosphorIcon={SmileySad}
size='md'
weight={'fill'}
/>
</div>
<div className={'__description-modal'}>
<div className={'__title-modal'}>{t('Change your wallet account')}</div>
<div
className={'__sub-title-modal'}
>
{t(`Your Telegram ID is linked to account ${toShort(addressConnected)}. Connect to this account and try again`)}
</div>
</div>
</div>
</SwModal>
);
}

const AlertChangeAccountConnectModal = styled(Component)<Props>(({ theme: { extendToken, token } }: Props) => {
return {
padding: 0,
maxHeight: '100%',
marginBottom: 0,
backgroundColor: 'transparent',
justifyContent: 'flex-end',

'.ant-sw-modal-body': {
padding: `${token.padding}px ${token.paddingXS}px`
},

'.ant-sw-sub-header-title-content': {
lineHeight: token.lineHeightHeading3
},

'.ant-sw-modal-confirm-body': {
background: extendToken.colorBgGradient,
borderRadius: 24,
padding: `${token.paddingXL}px ${token.paddingMD}px`,
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
gap: token.paddingLG,

'.ant-sw-modal-confirm-content': {
padding: 0,
margin: 0
}
},

'.ant-sw-sub-header-container': {
flexDirection: 'row-reverse',

'.ant-sw-header-left-part': {
marginRight: token.marginXS
}
},

'.__icon-modal': {
borderRadius: '50%',
padding: token.paddingLG - 2,
display: 'flex',
justifyContent: 'center',
backgroundColor: token.colorWhite,
width: 104,
height: 104
},

'.__description-modal': {
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
gap: token.size
},

'.__title-modal': {
fontSize: token.fontSizeHeading5,
lineHeight: token.lineHeightHeading5,
color: token.colorText,
fontWeight: 600
},

'.__sub-title-modal': {
textAlign: 'center',
fontSize: token.fontSizeHeading6,
lineHeight: token.lineHeightHeading6,
fontWeight: 500,
color: token.colorTextDark2
},

'.ant-sw-modal-footer': {
borderTop: 'none',
paddingTop: token.paddingXS,
display: 'flex',
flexDirection: 'row',

'.ant-btn': {
flex: 1
}
}
};
});

export default AlertChangeAccountConnectModal;
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ export { default as OnChainProfileModal } from './OnChainProfileModal';
export { default as ExistedAddressModal } from './ExistedAddressModal';
export { default as ConfirmLinkingAccountModal } from './ConfirmLinkingAccountModal';
export { default as NewAiChatModal } from './NewAiChatModal';
export { default as ConnectFailedAccountLinkedModal } from './AlertChangeAccountConnectModal';
export { default as AccountNameModal } from './AccountNameModal';
1 change: 1 addition & 0 deletions packages/extension-koni-ui/src/constants/modal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export const NEW_SEED_MODAL = 'new-seed-modal';
export const ON_CHAIN_PROFILE_MODAL = 'on_chain_profile_modal';
export const NEW_CHAT_AI_MODAL = 'new-chat-ai-modal';
export const ADDRESS_EXISTED_MODAL = 'address-existed-modal';
export const ALERT_CHANGE_ACCOUNT_CONNECT_MODAL = 'alert_change_account_connect_modal';
export const CONFIRM_LINKING_ACCOUNT_MODAL = 'confirm-linking-account-modal';
export const IMPORT_SEED_MODAL = 'import-seed-modal';
export const DERIVE_ACCOUNT_MODAL = 'derive-account-modal';
Expand Down

0 comments on commit 9f463e1

Please sign in to comment.