@ant-design/icons#BlockOutlined TypeScript Examples
The following examples show how to use
@ant-design/icons#BlockOutlined.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: index.tsx From nanolooker with MIT License | 6 votes |
BlockHeader: React.FC = () => {
const { block = "" } = useParams<PageParams>();
return (
<>
<div
style={{
display: "flex",
fontSize: "16px",
wordWrap: "break-word",
position: "relative",
}}
className="color-normal"
>
<div style={{ alignSelf: "baseline" }}>
<BlockOutlined
style={{
fontSize: "18px",
marginRight: "6px",
}}
/>
</div>
<span className="break-word" style={{ marginRight: "6px" }}>
<span>{block.substr(block.length * -1, block.length - 64)}</span>
<span style={{ color: "#1890ff" }}>{block.substr(-64, 7)}</span>
<span>{block.substr(-57, 50)}</span>
<span style={{ color: "#1890ff" }}>{block.substr(-7)}</span>
</span>
<div
style={{
display: "flex",
}}
>
<Copy text={block} />
</div>
</div>
</>
);
}
Example #2
Source File: AllowOverlap.tsx From datart with Apache License 2.0 | 6 votes |
AllowOverlapBtn = () => {
const { boardToggleAllowOverlap } = useContext(BoardActionContext);
const { allowOverlap } = useContext(BoardConfigContext);
const t = useI18NPrefix(`viz.board.action`);
const onClick = () => {
boardToggleAllowOverlap(!allowOverlap);
};
const renderTitle = () => {
return allowOverlap ? t('forbidOverlap') : t('allowOverlap');
};
return (
<Tooltip title={renderTitle()}>
<ToolbarButton
color={allowOverlap ? PRIMARY : ''}
onClick={onClick}
icon={<BlockOutlined />}
/>
</Tooltip>
);
}
Example #3
Source File: personalizationOptions.tsx From posthog-foss with MIT License | 5 votes |
ROLES: RadioSelectType[] = [
{
key: 'engineer',
label: 'Engineer',
icon: <CodeOutlined />,
},
{
key: 'product',
label: 'Product Manager',
icon: <RocketOutlined />,
},
{
key: 'management',
label: 'Management',
icon: <ClusterOutlined />,
},
{
key: 'marketing',
label: 'Marketing',
icon: <NotificationOutlined />,
},
{
key: 'sales',
label: 'Sales',
icon: <DollarOutlined />,
},
{
key: 'cx',
label: 'Customer success',
icon: <SmileOutlined />,
},
{
key: 'ops',
label: 'Operations',
icon: <ToolOutlined />,
},
{
key: 'other',
label: 'Other',
icon: <BlockOutlined />,
},
]
Example #4
Source File: SnippetList.tsx From next-basics with GNU General Public License v3.0 | 5 votes |
export function SnippetList({
handleSnippetSelect,
}: SnippetListProps): React.ReactElement {
const rootNode = useBuilderNode({ isRoot: true });
const { snippetList, onSnippetSelect } = useBuilderUIContext();
const { t } = useTranslation(NS_NEXT_BUILDER);
const [q, setQ] = useState<string>("");
const handleQChange = (q: string): void => {
setQ(q);
};
const formattedSnippetList = useMemo(() => {
if (!snippetList) {
return [];
}
return snippetList.map((v) => ({
...v,
key: v.id,
}));
}, [snippetList]);
const treeData = useMemo(
() => searchList(formattedSnippetList, q, "title"),
[formattedSnippetList, q]
);
const handleSelect = (node: BuilderSnippetNode): void => {
onSnippetSelect?.(node);
handleSnippetSelect?.(node);
};
return (
<SearchableTree
list={treeData}
defaultSelectedKeys={rootNode ? [rootNode.id] : []}
icon={<BlockOutlined />}
searchPlaceholder={t(K.SEARCH_SNIPPET)}
onSelect={handleSelect}
onQChange={handleQChange}
customClassName={styles.customTree}
/>
);
}
Example #5
Source File: TemplateList.tsx From next-basics with GNU General Public License v3.0 | 5 votes |
export function TemplateList({
handleTemplateSelect,
}: TemplateListProps): React.ReactElement {
const rootNode = useBuilderNode({ isRoot: true });
const { templateList, onTemplateSelect } = useBuilderUIContext();
const { t } = useTranslation(NS_NEXT_BUILDER);
const [q, setQ] = useState<string>("");
const handleQChange = (q: string): void => {
setQ(q);
};
const formattedTemplateList = useMemo(() => {
if (!templateList) {
return [];
}
return templateList.map((v) => ({
...v,
key: v.id,
}));
}, [templateList]);
const treeData = useMemo(
() => searchList(formattedTemplateList, q, "title"),
[formattedTemplateList, q]
);
const handleSelect = (node: BuilderCustomTemplateNode): void => {
onTemplateSelect?.(node);
handleTemplateSelect?.(node);
};
return (
<SearchableTree
list={treeData}
defaultSelectedKeys={rootNode ? [rootNode.id] : []}
icon={<BlockOutlined />}
searchPlaceholder={t(K.SEARCH_TEMPLATE)}
onSelect={handleSelect}
onQChange={handleQChange}
customClassName={styles.customTree}
/>
);
}
Example #6
Source File: Icon.tsx From html2sketch with MIT License | 4 votes |
IconSymbol: FC = () => {
return (
<Row>
{/*<CaretUpOutlined*/}
{/* className="icon"*/}
{/* symbolName={'1.General/2.Icons/1.CaretUpOutlined'}*/}
{/*/>*/}
{/* className="icon"*/}
{/* symbolName={'1.General/2.Icons/2.MailOutlined'}*/}
{/*/>*/}
{/*<StepBackwardOutlined*/}
{/* className="icon"*/}
{/* symbolName={'1.General/2.Icons/2.StepBackwardOutlined'}*/}
{/*/>*/}
{/*<StepForwardOutlined*/}
{/* className="icon"*/}
{/* symbolName={'1.General/2.Icons/2.StepBackwardOutlined'}*/}
{/*/>*/}
<StepForwardOutlined />
<ShrinkOutlined />
<ArrowsAltOutlined />
<DownOutlined />
<UpOutlined />
<LeftOutlined />
<RightOutlined />
<CaretUpOutlined />
<CaretDownOutlined />
<CaretLeftOutlined />
<CaretRightOutlined />
<VerticalAlignTopOutlined />
<RollbackOutlined />
<FastBackwardOutlined />
<FastForwardOutlined />
<DoubleRightOutlined />
<DoubleLeftOutlined />
<VerticalLeftOutlined />
<VerticalRightOutlined />
<VerticalAlignMiddleOutlined />
<VerticalAlignBottomOutlined />
<ForwardOutlined />
<BackwardOutlined />
<EnterOutlined />
<RetweetOutlined />
<SwapOutlined />
<SwapLeftOutlined />
<SwapRightOutlined />
<ArrowUpOutlined />
<ArrowDownOutlined />
<ArrowLeftOutlined />
<ArrowRightOutlined />
<LoginOutlined />
<LogoutOutlined />
<MenuFoldOutlined />
<MenuUnfoldOutlined />
<BorderBottomOutlined />
<BorderHorizontalOutlined />
<BorderInnerOutlined />
<BorderOuterOutlined />
<BorderLeftOutlined />
<BorderRightOutlined />
<BorderTopOutlined />
<BorderVerticleOutlined />
<PicCenterOutlined />
<PicLeftOutlined />
<PicRightOutlined />
<RadiusBottomleftOutlined />
<RadiusBottomrightOutlined />
<RadiusUpleftOutlined />
<RadiusUprightOutlined />
<FullscreenOutlined />
<FullscreenExitOutlined />
<QuestionOutlined />
<PauseOutlined />
<MinusOutlined />
<PauseCircleOutlined />
<InfoOutlined />
<CloseOutlined />
<ExclamationOutlined />
<CheckOutlined />
<WarningOutlined />
<IssuesCloseOutlined />
<StopOutlined />
<EditOutlined />
<CopyOutlined />
<ScissorOutlined />
<DeleteOutlined />
<SnippetsOutlined />
<DiffOutlined />
<HighlightOutlined />
<AlignCenterOutlined />
<AlignLeftOutlined />
<AlignRightOutlined />
<BgColorsOutlined />
<BoldOutlined />
<ItalicOutlined />
<UnderlineOutlined />
<StrikethroughOutlined />
<RedoOutlined />
<UndoOutlined />
<ZoomInOutlined />
<ZoomOutOutlined />
<FontColorsOutlined />
<FontSizeOutlined />
<LineHeightOutlined />
<SortAscendingOutlined />
<SortDescendingOutlined />
<DragOutlined />
<OrderedListOutlined />
<UnorderedListOutlined />
<RadiusSettingOutlined />
<ColumnWidthOutlined />
<ColumnHeightOutlined />
<AreaChartOutlined />
<PieChartOutlined />
<BarChartOutlined />
<DotChartOutlined />
<LineChartOutlined />
<RadarChartOutlined />
<HeatMapOutlined />
<FallOutlined />
<RiseOutlined />
<StockOutlined />
<BoxPlotOutlined />
<FundOutlined />
<SlidersOutlined />
<AndroidOutlined />
<AppleOutlined />
<WindowsOutlined />
<IeOutlined />
<ChromeOutlined />
<GithubOutlined />
<AliwangwangOutlined />
<DingdingOutlined />
<WeiboSquareOutlined />
<WeiboCircleOutlined />
<TaobaoCircleOutlined />
<Html5Outlined />
<WeiboOutlined />
<TwitterOutlined />
<WechatOutlined />
<AlipayCircleOutlined />
<TaobaoOutlined />
<SkypeOutlined />
<FacebookOutlined />
<CodepenOutlined />
<CodeSandboxOutlined />
<AmazonOutlined />
<GoogleOutlined />
<AlipayOutlined />
<AntDesignOutlined />
<AntCloudOutlined />
<ZhihuOutlined />
<SlackOutlined />
<SlackSquareOutlined />
<BehanceSquareOutlined />
<DribbbleOutlined />
<DribbbleSquareOutlined />
<InstagramOutlined />
<YuqueOutlined />
<AlibabaOutlined />
<YahooOutlined />
<RedditOutlined />
<SketchOutlined />
<AccountBookOutlined />
<AlertOutlined />
<ApartmentOutlined />
<ApiOutlined />
<QqOutlined />
<MediumWorkmarkOutlined />
<GitlabOutlined />
<MediumOutlined />
<GooglePlusOutlined />
<AppstoreAddOutlined />
<AppstoreOutlined />
<AudioOutlined />
<AudioMutedOutlined />
<AuditOutlined />
<BankOutlined />
<BarcodeOutlined />
<BarsOutlined />
<BellOutlined />
<BlockOutlined />
<BookOutlined />
<BorderOutlined />
<BranchesOutlined />
<BuildOutlined />
<BulbOutlined />
<CalculatorOutlined />
<CalendarOutlined />
<CameraOutlined />
<CarOutlined />
<CarryOutOutlined />
<CiCircleOutlined />
<CiOutlined />
<CloudOutlined />
<ClearOutlined />
<ClusterOutlined />
<CodeOutlined />
<CoffeeOutlined />
<CompassOutlined />
<CompressOutlined />
<ContactsOutlined />
<ContainerOutlined />
<ControlOutlined />
<CopyrightCircleOutlined />
<CopyrightOutlined />
<CreditCardOutlined />
<CrownOutlined />
<CustomerServiceOutlined />
<DashboardOutlined />
<DatabaseOutlined />
<DeleteColumnOutlined />
<DeleteRowOutlined />
<DisconnectOutlined />
<DislikeOutlined />
<DollarCircleOutlined />
<DollarOutlined />
<DownloadOutlined />
<EllipsisOutlined />
<EnvironmentOutlined />
<EuroCircleOutlined />
<EuroOutlined />
<ExceptionOutlined />
<ExpandAltOutlined />
<ExpandOutlined />
<ExperimentOutlined />
<ExportOutlined />
<EyeOutlined />
<FieldBinaryOutlined />
<FieldNumberOutlined />
<FieldStringOutlined />
<DesktopOutlined />
<DingtalkOutlined />
<FileAddOutlined />
<FileDoneOutlined />
<FileExcelOutlined />
<FileExclamationOutlined />
<FileOutlined />
<FileImageOutlined />
<FileJpgOutlined />
<FileMarkdownOutlined />
<FilePdfOutlined />
<FilePptOutlined />
<FileProtectOutlined />
<FileSearchOutlined />
<FileSyncOutlined />
<FileTextOutlined />
<FileUnknownOutlined />
<FileWordOutlined />
<FilterOutlined />
<FireOutlined />
<FlagOutlined />
<FolderAddOutlined />
<FolderOutlined />
<FolderOpenOutlined />
<ForkOutlined />
<FormatPainterOutlined />
<FrownOutlined />
<FunctionOutlined />
<FunnelPlotOutlined />
<GatewayOutlined />
<GifOutlined />
<GiftOutlined />
<GlobalOutlined />
<GoldOutlined />
<GroupOutlined />
<HddOutlined />
<HeartOutlined />
<HistoryOutlined />
<HomeOutlined />
<HourglassOutlined />
<IdcardOutlined />
<ImportOutlined />
<InboxOutlined />
<InsertRowAboveOutlined />
<InsertRowBelowOutlined />
<InsertRowLeftOutlined />
<InsertRowRightOutlined />
<InsuranceOutlined />
<InteractionOutlined />
<KeyOutlined />
<LaptopOutlined />
<LayoutOutlined />
<LikeOutlined />
<LineOutlined />
<LinkOutlined />
<Loading3QuartersOutlined />
<LoadingOutlined />
<LockOutlined />
<MailOutlined />
<ManOutlined />
<MedicineBoxOutlined />
<MehOutlined />
<MenuOutlined />
<MergeCellsOutlined />
<MessageOutlined />
<MobileOutlined />
<MoneyCollectOutlined />
<MonitorOutlined />
<MoreOutlined />
<NodeCollapseOutlined />
<NodeExpandOutlined />
<NodeIndexOutlined />
<NotificationOutlined />
<NumberOutlined />
<PaperClipOutlined />
<PartitionOutlined />
<PayCircleOutlined />
<PercentageOutlined />
<PhoneOutlined />
<PictureOutlined />
<PoundCircleOutlined />
<PoundOutlined />
<PoweroffOutlined />
<PrinterOutlined />
<ProfileOutlined />
<ProjectOutlined />
<PropertySafetyOutlined />
<PullRequestOutlined />
<PushpinOutlined />
<QrcodeOutlined />
<ReadOutlined />
<ReconciliationOutlined />
<RedEnvelopeOutlined />
<ReloadOutlined />
<RestOutlined />
<RobotOutlined />
<RocketOutlined />
<SafetyCertificateOutlined />
<SafetyOutlined />
<ScanOutlined />
<ScheduleOutlined />
<SearchOutlined />
<SecurityScanOutlined />
<SelectOutlined />
<SendOutlined />
<SettingOutlined />
<ShakeOutlined />
<ShareAltOutlined />
<ShopOutlined />
<ShoppingCartOutlined />
<ShoppingOutlined />
<SisternodeOutlined />
<SkinOutlined />
<SmileOutlined />
<SolutionOutlined />
<SoundOutlined />
<SplitCellsOutlined />
<StarOutlined />
<SubnodeOutlined />
<SyncOutlined />
<TableOutlined />
<TabletOutlined />
<TagOutlined />
<TagsOutlined />
<TeamOutlined />
<ThunderboltOutlined />
<ToTopOutlined />
<ToolOutlined />
<TrademarkCircleOutlined />
<TrademarkOutlined />
<TransactionOutlined />
<TrophyOutlined />
<UngroupOutlined />
<UnlockOutlined />
<UploadOutlined />
<UsbOutlined />
<UserAddOutlined />
<UserDeleteOutlined />
<UserOutlined />
<UserSwitchOutlined />
<UsergroupAddOutlined />
<UsergroupDeleteOutlined />
<VideoCameraOutlined />
<WalletOutlined />
<WifiOutlined />
<BorderlessTableOutlined />
<WomanOutlined />
<BehanceOutlined />
<DropboxOutlined />
<DeploymentUnitOutlined />
<UpCircleOutlined />
<DownCircleOutlined />
<LeftCircleOutlined />
<RightCircleOutlined />
<UpSquareOutlined />
<DownSquareOutlined />
<LeftSquareOutlined />
<RightSquareOutlined />
<PlayCircleOutlined />
<QuestionCircleOutlined />
<PlusCircleOutlined />
<PlusSquareOutlined />
<MinusSquareOutlined />
<MinusCircleOutlined />
<InfoCircleOutlined />
<ExclamationCircleOutlined />
<CloseCircleOutlined />
<CloseSquareOutlined />
<CheckCircleOutlined />
<CheckSquareOutlined />
<ClockCircleOutlined />
<FormOutlined />
<DashOutlined />
<SmallDashOutlined />
<YoutubeOutlined />
<CodepenCircleOutlined />
<AliyunOutlined />
<PlusOutlined />
<LinkedinOutlined />
<AimOutlined />
<BugOutlined />
<CloudDownloadOutlined />
<CloudServerOutlined />
<CloudSyncOutlined />
<CloudUploadOutlined />
<CommentOutlined />
<ConsoleSqlOutlined />
<EyeInvisibleOutlined />
<FileGifOutlined />
<DeliveredProcedureOutlined />
<FieldTimeOutlined />
<FileZipOutlined />
<FolderViewOutlined />
<FundProjectionScreenOutlined />
<FundViewOutlined />
<MacCommandOutlined />
<PlaySquareOutlined />
<OneToOneOutlined />
<RotateLeftOutlined />
<RotateRightOutlined />
<SaveOutlined />
<SwitcherOutlined />
<TranslationOutlined />
<VerifiedOutlined />
<VideoCameraAddOutlined />
<WhatsAppOutlined />
{/*</Col>*/}
</Row>
);
}
Example #7
Source File: BuilderToolbar.tsx From next-basics with GNU General Public License v3.0 | 4 votes |
export function BuilderToolbar(): React.ReactElement {
const { t } = useTranslation(NS_NEXT_BUILDER);
const enableLayerView = React.useMemo(
() => getRuntime().getFeatureFlags()["next-builder-layer-view"],
[]
);
const [libsDropdownVisible, setLibsDropdownVisible] = useState<{
[key in typeof LayerType[keyof typeof LayerType]]: boolean;
}>({
[LayerType.LAYOUT]: false,
[LayerType.WIDGET]: false,
[LayerType.BRICK]: false,
});
const { wrapperNode } = useBuilderData();
const {
onCurrentRouteClick,
onCurrentTemplateClick,
onCurrentSnippetClick,
onBuildAndPush,
onPreview,
dataType,
fullscreen,
setFullscreen,
onWorkbenchClose,
hiddenWrapper,
setHiddenWrapper,
} = useBuilderUIContext();
const rootNode = useBuilderNode({ isRoot: true });
const handleRouteClick = (): void => {
onCurrentRouteClick?.(rootNode as BuilderRouteNode);
};
const handleTemplateClick = (): void => {
onCurrentTemplateClick?.(rootNode as BuilderCustomTemplateNode);
};
const handleSnippetClick = (): void => {
onCurrentSnippetClick?.(rootNode as BuilderSnippetNode);
};
const handlePreview = (): void => {
onPreview?.();
};
const handleBuildAndPush = (): void => {
onBuildAndPush?.();
};
const handleToggleFullscreen = React.useCallback(() => {
setFullscreen((prev) => !prev);
}, [setFullscreen]);
const handleClose = (): void => {
onWorkbenchClose?.();
};
const divider = useMemo(
() => <Divider type="vertical" style={{ height: 25 }} />,
[]
);
return (
<div className={styles.toolbarContainer}>
<div className={styles.toolbarLeft}>
{dataType === BuilderDataType.SNIPPET ? (
<Tooltip title={t(K.VIEW_SNIPPET)} placement="bottomLeft">
<a
className={shareStyles.tabLink}
role="button"
onClick={handleSnippetClick}
data-testid="view-snippet"
>
<BlockOutlined />
</a>
</Tooltip>
) : dataType === BuilderDataType.CUSTOM_TEMPLATE ? (
<Tooltip title={t(K.VIEW_TEMPLATE)} placement="bottomLeft">
<a
className={shareStyles.tabLink}
role="button"
onClick={handleTemplateClick}
data-testid="view-template"
>
<BlockOutlined />
</a>
</Tooltip>
) : (
<Tooltip title={t(K.VIEW_ROUTE)} placement="bottomLeft">
<a
className={shareStyles.tabLink}
role="button"
onClick={handleRouteClick}
data-testid="view-route"
>
<BranchesOutlined />
</a>
</Tooltip>
)}
<RootNodeSelect />
</div>
<div className={styles.toolbarRight}>
{wrapperNode ? (
<Switch
checkedChildren="显示布局"
unCheckedChildren="隐藏布局"
checked={hiddenWrapper}
onChange={setHiddenWrapper}
size="small"
style={{
marginRight: 10,
top: -1,
}}
/>
) : null}
{enableLayerView && (
<>
<LibraryDropdown
menuItems={layoutMenus}
type={LayerType.LAYOUT}
onVisbleChange={(visible) =>
setLibsDropdownVisible({
...libsDropdownVisible,
[LayerType.LAYOUT]: visible,
})
}
>
<Tooltip
title={t(K.LAYOUT_LIBRARY)}
placement="bottomRight"
overlayStyle={{
// Hide tooltip when dropdown is open.
display: libsDropdownVisible[LayerType.LAYOUT]
? "none"
: undefined,
}}
>
<Button
type="link"
size="small"
className={shareStyles.tabLink}
style={{ marginRight: "10px" }}
>
<LayoutOutlined />
</Button>
</Tooltip>
</LibraryDropdown>
<LibraryDropdown
menuItems={widgetMenus}
type={LayerType.WIDGET}
onVisbleChange={(visible) =>
setLibsDropdownVisible({
...libsDropdownVisible,
[LayerType.WIDGET]: visible,
})
}
>
<Tooltip
title={t(K.WIDGET_LIBRARY)}
placement="bottomRight"
overlayStyle={{
display: libsDropdownVisible[LayerType.WIDGET]
? "none"
: undefined,
}}
>
<Button
type="link"
size="small"
className={shareStyles.tabLink}
style={{ marginRight: "10px" }}
>
<GoldOutlined />
</Button>
</Tooltip>
</LibraryDropdown>
</>
)}
<LibraryDropdown
menuItems={brickMenus}
type={LayerType.BRICK}
onVisbleChange={(visible) =>
setLibsDropdownVisible({
...libsDropdownVisible,
[LayerType.BRICK]: visible,
})
}
>
<Tooltip
title={t(K.BRICK_LIBRARY)}
placement="bottomRight"
overlayStyle={{
display: libsDropdownVisible[LayerType.BRICK]
? "none"
: undefined,
}}
>
<Button
type="link"
size="small"
style={{ marginRight: "10px" }}
className={shareStyles.tabLink}
>
<PlusOutlined />
</Button>
</Tooltip>
</LibraryDropdown>
{divider}
<Tooltip title={t(K.BUILD_AND_PUSH_TOOLTIP)} placement="bottomRight">
<a
className={shareStyles.tabLink}
role="button"
onClick={handleBuildAndPush}
data-testid="build-and-push"
>
<ApiOutlined />
</a>
</Tooltip>
<Tooltip title={t(K.PREVIEW)} placement="bottomRight">
<a
className={shareStyles.tabLink}
role="button"
onClick={handlePreview}
data-testid="preview"
>
<CaretRightOutlined />
</a>
</Tooltip>
{divider}
<SettingDropdown />
{!fullscreen && (
<Tooltip
title={t(fullscreen ? K.EXIT_FULLSCREEN : K.ENTER_FULLSCREEN)}
placement="bottomRight"
>
<a
className={shareStyles.tabLink}
role="button"
onClick={handleToggleFullscreen}
data-testid="toggle-fullscreen"
>
{fullscreen ? <FullscreenExitOutlined /> : <FullscreenOutlined />}
</a>
</Tooltip>
)}
<Tooltip title={t(K.CLOSE)} placement="bottomRight">
<a
className={shareStyles.tabLink}
role="button"
onClick={handleClose}
data-testid="workbench-close"
>
<CloseOutlined />
</a>
</Tooltip>
</div>
</div>
);
}
Example #8
Source File: index.tsx From nanolooker with MIT License | 4 votes |
Search = ({ isHome = false }) => {
const { t } = useTranslation();
const { theme } = React.useContext(PreferencesContext);
const { knownAccounts } = React.useContext(KnownAccountsContext);
const { bookmarks } = React.useContext(BookmarksContext);
const hasAccountBookmarks = !!Object.keys(bookmarks?.account || {}).length;
const [isExpanded, setIsExpanded] = React.useState(isHome);
const [isError, setIsError] = React.useState(false);
const [filteredResults, setFilteredResults] = React.useState([] as any);
const { searchValue, setSearchValue } = useSearch();
const [accountBookmarks, setAccountBookmarks] = React.useState<
{ alias: string; account: string }[]
>([]);
const {
searchHistory,
addSearchHistory,
removeSearchHistory,
} = useSearchHistory();
const searchRef = React.useRef(null);
const [isOpen, setIsOpen] = React.useState(false);
const [invalidQrCode, setInvalidQrCode] = React.useState("");
let history = useHistory();
const validateSearch = React.useCallback(
async (value: any) => {
if (!value) {
setIsError(false);
setFilteredResults([]);
} else {
const isValidAccount = isValidAccountAddress(value);
const isValidBlock = isValidBlockHash(value);
setIsError(!isValidAccount && !isValidBlock && value.length > 30);
if (isValidBlock) {
addSearchHistory(value.toUpperCase());
history.push(`/block/${value.toUpperCase()}`);
} else if (isValidAccount) {
let account = getPrefixedAccount(value);
setSearchValue(account);
addSearchHistory(account);
history.push(`/account/${account}`);
} else {
const filteredKnownAccounts = knownAccounts
.filter(({ alias }) =>
alias.toLowerCase().includes(value.toLowerCase()),
)
.map(item => renderItem(item));
const filteredAccountBookmarks = accountBookmarks
.filter(({ alias }) =>
alias.toLowerCase().includes(value.toLowerCase()),
)
.map(item => renderItem(item as KnownAccount));
setFilteredResults(
filteredAccountBookmarks.concat(filteredKnownAccounts),
);
}
}
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[addSearchHistory, knownAccounts, accountBookmarks],
);
React.useEffect(() => {
if (hasAccountBookmarks) {
setAccountBookmarks(
Object.entries(bookmarks?.account).map(([account, alias]) => ({
account,
alias,
})),
);
} else {
setAccountBookmarks([]);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [hasAccountBookmarks]);
React.useEffect(() => {
validateSearch(searchValue);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [searchValue]);
React.useEffect(() => {
if (!isOpen) return;
function onScanSuccess(qrMessage: any) {
if (isValidAccountAddress(qrMessage)) {
setIsOpen(false);
setSearchValue(getPrefixedAccount(qrMessage));
document.getElementById("html5-qrcode-scan-stop-btn")?.click();
} else {
setInvalidQrCode(qrMessage);
}
}
const html5QrcodeScanner = new window.Html5QrcodeScanner(
`qrcode-reader-search${isHome ? "-home" : ""}`,
{
fps: 10,
qrbox: 250,
},
);
html5QrcodeScanner.render(onScanSuccess);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isOpen]);
const renderItem = ({ alias, account }: KnownAccount) => ({
value: account,
label: (
<>
<strong style={{ display: "block" }}>{alias}</strong>
{account}
</>
),
});
return (
<>
<AutoComplete
style={{
float: isExpanded ? "right" : "none",
maxWidth: "calc(100vw - 24px)",
width: isExpanded ? "650px" : "100%",
// transitionDelay: `${isExpanded ? 0 : 0.2}s`,
}}
dropdownClassName={`search-autocomplete-dropdown ${
theme === Theme.DARK ? "theme-dark" : ""
}`}
dropdownStyle={{
maxWidth: "calc(100vw - 40px)",
}}
options={filteredResults}
// @ts-ignore
onSelect={validateSearch}
onChange={value => {
setSearchValue(value);
}}
// @ts-ignore
onPaste={e => {
e.preventDefault();
// @ts-ignore
const paste = (e.clipboardData || window.clipboardData).getData(
"text",
);
const account = getAccountAddressFromText(paste);
const hash = getAccountBlockHashFromText(paste);
if (account || hash) {
setSearchValue(account || hash);
} else {
setSearchValue(paste);
}
}}
value={searchValue}
>
<Input
ref={searchRef}
allowClear
suffix={
<>
<CameraOutlined
onClick={() => setIsOpen(true)}
className="search-history-icon"
style={{ padding: "6px", marginRight: "3px" }}
/>
<Dropdown
key="search-history-dropdown"
overlayStyle={{ zIndex: 1050 }}
overlayClassName={theme === Theme.DARK ? "theme-dark" : ""}
overlay={
<Menu>
{!searchHistory.length ? (
<Menu.Item disabled>{t("search.noHistory")}</Menu.Item>
) : (
searchHistory.map(history => (
<Menu.Item
onClick={() => setSearchValue(history)}
key={history}
>
<div
className="color-normal"
style={{
display: "flex",
alignItems: "flex-start",
}}
>
<div>
{isValidAccountAddress(history) ? (
<WalletOutlined />
) : (
<BlockOutlined />
)}
</div>
<div
className="break-word"
style={{ margin: "0 6px", whiteSpace: "normal" }}
>
{history}
</div>
<DeleteButton
onClick={(e: Event) => {
e.stopPropagation();
removeSearchHistory(history);
}}
/>
</div>
</Menu.Item>
))
)}
</Menu>
}
placement="bottomRight"
>
<HistoryOutlined
className="search-history-icon"
style={{ padding: "6px", marginRight: "6px" }}
/>
</Dropdown>
<SearchOutlined />
</>
}
className={`ant-input-search ${isError ? "has-error" : ""}`}
placeholder={t("search.searchBy")}
onFocus={({ target: { value } }) => {
validateSearch(value);
setIsExpanded(true);
}}
onBlur={() => setIsExpanded(isHome || false)}
size={isHome ? "large" : "middle"}
spellCheck={false}
/>
</AutoComplete>
<Modal
title={t("search.scanWallet")}
visible={isOpen}
onCancel={() => setIsOpen(false)}
footer={[
<Button key="back" onClick={() => setIsOpen(false)}>
{t("common.cancel")}
</Button>,
]}
>
{invalidQrCode ? (
<Alert
message={t("pages.nanoquakejs.invalidAccount")}
description={invalidQrCode}
type="error"
showIcon
style={{ marginBottom: 12 }}
/>
) : null}
<div
id={`qrcode-reader-search${isHome ? "-home" : ""}`}
className="qrcode-reader"
></div>
</Modal>
</>
);
}