Skip to content

Commit b59b545

Browse files
authored
feat: doc hudson style (#5611)
1 parent 24abe8d commit b59b545

File tree

16 files changed

+348
-299
lines changed

16 files changed

+348
-299
lines changed

package.json

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@
115115
"@remote-ui/rpc": "1.4.7",
116116
"@substrate/connect": "1.3.1",
117117
"@talismn/connect-wallets": "1.2.8",
118+
"@tanstack/react-virtual": "3.13.18",
118119
"@uiw/react-json-view": "2.0.0-alpha.39",
119120
"@walletconnect/core": "2.22.3",
120121
"@walletconnect/sign-client": "2.22.3",
@@ -178,6 +179,8 @@
178179
"@commitlint/config-conventional": "19.8.1",
179180
"@effector/swc-plugin": "0.8.1",
180181
"@electron/notarize": "2.5.0",
182+
"@eslint/js": "9.39.2",
183+
"@eslint/json": "0.12.0",
181184
"@fontsource/inter": "5.2.6",
182185
"@headlessui/tailwindcss": "0.1.3",
183186
"@jonasgeiler/tsc-files": "2.3.1",
@@ -200,10 +203,8 @@
200203
"@types/node": "22.17.0",
201204
"@types/react": "19.2.2",
202205
"@types/react-dom": "19.2.2",
203-
"@eslint/js": "9.39.2",
204206
"@typescript-eslint/eslint-plugin": "8.39.1",
205207
"@typescript-eslint/parser": "8.39.1",
206-
"typescript-eslint": "8.39.1",
207208
"@typescript/native-preview": "7.0.0-dev.20260126.1",
208209
"@vitejs/plugin-react-swc": "4.1.0",
209210
"@vitest/coverage-v8": "3.2.4",
@@ -224,7 +225,6 @@
224225
"electron-updater": "6.6.2",
225226
"electron-window-state": "5.0.3",
226227
"eslint": "9.39.2",
227-
"globals": "16.0.0",
228228
"eslint-import-resolver-typescript": "4.4.4",
229229
"eslint-module-utils": "2.12.1",
230230
"eslint-plugin-boundaries": "5.0.1",
@@ -233,12 +233,12 @@
233233
"eslint-plugin-i18n-json": "4.0.1",
234234
"eslint-plugin-i18next": "6.1.3",
235235
"eslint-plugin-import-x": "4.16.1",
236-
"@eslint/json": "0.12.0",
237236
"eslint-plugin-prettier": "5.5.3",
238237
"eslint-plugin-react": "7.37.5",
239238
"eslint-plugin-unused-imports": "4.1.4",
240239
"fake-indexeddb": "6.0.1",
241240
"favicons": "7.2.0",
241+
"globals": "16.0.0",
242242
"happy-dom": "18.0.1",
243243
"husky": "9.1.7",
244244
"i18next-parser": "9.3.0",
@@ -262,6 +262,7 @@
262262
"ts-node": "10.9.2",
263263
"tslib": "2.8.1",
264264
"typescript": "5.9.2",
265+
"typescript-eslint": "8.39.1",
265266
"vite": "7.1.11",
266267
"vite-plugin-compression2": "2.2.1",
267268
"vite-plugin-mkcert": "1.17.8",
@@ -272,6 +273,7 @@
272273
"vitest": "3.2.4"
273274
},
274275
"sideEffects": [
275-
"*.css", "*.ts"
276+
"*.css",
277+
"*.ts"
276278
]
277279
}

pnpm-lock.yaml

Lines changed: 12 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export { type ToastData, notificationModel } from './model/notification-model';
2+
export { notificationUtils } from './lib/notification-utils';

src/renderer/entities/notification/lib/notification-utils.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import {
2+
type FlexibleMultisigOperationNotification,
23
type MultisigCreated,
4+
type MultisigEventNotification,
35
type MultisigOperationNotification,
46
type Notification,
57
type ProxyAction,
@@ -9,7 +11,11 @@ import { NotificationType } from '@/shared/core';
911
export const notificationUtils = {
1012
isMultisigInvite,
1113
isMultisigOperation,
14+
isMultisigOperationNotification,
15+
isMultisigEventNotification,
16+
isFlexibleMultisigNotification,
1217
isProxyCreation,
18+
isProxyRemoval,
1319
};
1420

1521
function isMultisigInvite(notification: Notification): notification is MultisigCreated {
@@ -27,6 +33,27 @@ function isMultisigOperation(notification: Notification): notification is Multis
2733
return Operations.includes(notification.type);
2834
}
2935

36+
function isMultisigOperationNotification(notification: Notification): notification is MultisigOperationNotification {
37+
return notification.type === NotificationType.MULTISIG_OPERATION;
38+
}
39+
40+
function isMultisigEventNotification(notification: Notification): notification is MultisigEventNotification {
41+
return notification.type === NotificationType.MULTISIG_EVENT;
42+
}
43+
44+
function isFlexibleMultisigNotification(
45+
notification: Notification,
46+
): notification is FlexibleMultisigOperationNotification {
47+
return (
48+
notification.type === NotificationType.FLEXIBLE_MULTISIG_CREATED ||
49+
notification.type === NotificationType.FLEXIBLE_MULTISIG_EDITED
50+
);
51+
}
52+
3053
function isProxyCreation(notification: Notification): notification is ProxyAction {
3154
return notification.type === NotificationType.PROXY_CREATED;
3255
}
56+
57+
function isProxyRemoval(notification: Notification): notification is ProxyAction {
58+
return notification.type === NotificationType.PROXY_REMOVED;
59+
}

src/renderer/features/multisig-operations/components/Operation.tsx

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
import { type BN } from '@polkadot/util';
2-
import { useUnit } from 'effector-react';
32
import { type TFunction } from 'i18next';
43
import { memo, useMemo } from 'react';
54

65
import {
6+
type Address,
77
type Asset,
88
type AssetByChains,
99
type Chain,
1010
type ChainId,
1111
type FlexibleMultisigAccount,
1212
type MultisigAccount,
13+
type Wallet,
1314
} from '@/shared/core';
1415
import { createTransformer, useTransformer } from '@/shared/di';
1516
import { useI18n } from '@/shared/i18n';
1617
import { formatSectionAndMethod, toAddress, toShortAddress } from '@/shared/lib/utils';
1718
import { Accordion, FootnoteText, HelpText } from '@/shared/ui';
1819
import { IconButton } from '@/shared/ui/Buttons';
1920
import { AssetBalance, AssetIcon, WalletAccountIcon } from '@/shared/ui-entities';
20-
import { Copy, Tooltip } from '@/shared/ui-kit';
21+
import { AsyncItem, Copy, Tooltip } from '@/shared/ui-kit';
2122
import { type MultisigOperation, useWalletName } from '@/domains/network';
2223
import { ChainTitle, XcmChains } from '@/entities/chain';
23-
import { networkModel } from '@/entities/network';
2424
import { OperationTitleStatus } from '@/entities/operations';
2525
import { AssetFiatBalance } from '@/entities/price';
2626
import {
@@ -29,7 +29,7 @@ import {
2929
getTransactionAmount,
3030
useTransactionAsset,
3131
} from '@/entities/transaction';
32-
import { accountUtils, walletModel } from '@/entities/wallet';
32+
import { accountUtils } from '@/entities/wallet';
3333
import { type TabFilter } from '../model/context';
3434
import { deepLinkModel } from '../model/deep-link';
3535

@@ -42,6 +42,8 @@ type Props = {
4242
multisigAccount: MultisigAccount | FlexibleMultisigAccount;
4343
isDefaultOpen?: boolean;
4444
tab: TabFilter;
45+
chains: Record<ChainId, Chain>;
46+
wallets: Wallet[];
4547
};
4648

4749
export type OperationTitle = {
@@ -65,16 +67,27 @@ export const operationTitleTransformer = createTransformer<
6567
OperationTitle
6668
>();
6769

68-
export const Operation = memo(({ operation, multisigAccount, isDefaultOpen = false, tab }: Props) => {
70+
const OperationWalletInfo = ({ wallet, accountAddress }: { wallet: Wallet; accountAddress: Address }) => {
71+
const walletName = useWalletName(wallet);
72+
73+
return (
74+
<div className="flex w-[240px] items-center gap-x-2">
75+
<WalletAccountIcon address={accountAddress} type={wallet.type} size={32} iconSize={14} />
76+
<div className="flex min-w-0 flex-col items-start gap-y-0.5">
77+
<FootnoteText className="truncate text-text-primary">{walletName}</FootnoteText>
78+
<HelpText className="text-text-tertiary">{toShortAddress(accountAddress, 6)}</HelpText>
79+
</div>
80+
</div>
81+
);
82+
};
83+
84+
export const Operation = memo(({ operation, multisigAccount, isDefaultOpen = false, tab, chains, wallets }: Props) => {
6985
const { t } = useI18n();
70-
const chains = useUnit(networkModel.$chains);
71-
const wallets = useUnit(walletModel.$wallets);
7286

7387
const wallet = useMemo(
7488
() => wallets.find(w => w.id === multisigAccount.walletId),
7589
[wallets, multisigAccount.walletId],
7690
);
77-
const walletName = useWalletName(wallet);
7891

7992
const isFlexibleMultisigAccount = accountUtils.isFlexibleMultisigAccount(multisigAccount);
8093
const coreTx = isFlexibleMultisigAccount ? findCoreTransaction(operation.transaction) : operation.transaction;
@@ -134,32 +147,32 @@ export const Operation = memo(({ operation, multisigAccount, isDefaultOpen = fal
134147
<AssetIcon asset={titleData.amount.asset} size={32} />
135148
<div className="flex flex-col items-start gap-y-0.5">
136149
<AssetBalance value={titleData.amount.value} asset={titleData.amount.asset} />
137-
<AssetFiatBalance
138-
asset={titleData.amount.asset}
139-
amount={titleData.amount.value}
140-
className="text-help-text text-text-tertiary"
141-
/>
150+
<AsyncItem strategy="async" fallback={<div className="h-[18px]" />}>
151+
<AssetFiatBalance
152+
asset={titleData.amount.asset}
153+
amount={titleData.amount.value}
154+
className="text-help-text text-text-tertiary"
155+
/>
156+
</AsyncItem>
142157
</div>
143158
</div>
144159
)}
145160
</div>
146161

147162
<div className="flex min-w-0 flex-1 items-center justify-between">
148-
{wallet && accountAddress ? (
149-
<div className="flex w-[240px] items-center gap-x-2">
150-
<WalletAccountIcon address={accountAddress} type={wallet.type} size={32} iconSize={14} />
151-
<div className="flex min-w-0 flex-col items-start gap-y-0.5">
152-
<FootnoteText className="truncate text-text-primary">{walletName}</FootnoteText>
153-
<HelpText className="text-text-tertiary">{toShortAddress(accountAddress, 6)}</HelpText>
154-
</div>
155-
</div>
156-
) : (
157-
<div className="w-[240px]" />
158-
)}
163+
<AsyncItem strategy="async" fallback={<div className="w-[240px]" />}>
164+
{wallet && accountAddress ? (
165+
<OperationWalletInfo wallet={wallet} accountAddress={accountAddress} />
166+
) : (
167+
<div className="w-[240px]" />
168+
)}
169+
</AsyncItem>
159170

160171
<OperationTitleStatus operation={operation} account={multisigAccount} />
161172

162-
<OperationActions operation={operation} account={multisigAccount} />
173+
<AsyncItem strategy="async" fallback={<div />}>
174+
<OperationActions operation={operation} account={multisigAccount} />
175+
</AsyncItem>
163176
</div>
164177

165178
<Tooltip>

0 commit comments

Comments
 (0)