/**
* inline: true
* background: '#f6f7f9'
*/
import React, { useMemo, useState, useRef, useCallback } from 'react';
import {
TouchableOpacity,
StyleSheet,
Text,
FlatList,
View,
} from 'react-native';
import * as icons from '../../../icons';
import Clipboard from '@react-native-clipboard/clipboard';
import Input from '../../Input';
import debounce from 'lodash/debounce';
import { success as showSuccessNotification } from '../../Notification/NotificationInstance';
const ITEM_MARGIN = 20;
export default ({ NUM_COLUMNS = 6 }) => {
const [searchText, setSearchText] = useState('');
const components = useMemo<[string, any][]>(() => {
return Object.entries(icons).sort(([nameA], [nameB]) =>
nameA.localeCompare(nameB)
);
}, []);
const filteredComponents = useMemo(() => {
if (!searchText) {
return components;
}
const lowerCaseSearchText = searchText.toLowerCase();
return components.filter(([name]) =>
name.toLowerCase().includes(lowerCaseSearchText)
);
}, [components, searchText]);
const copyToClipboard = (name: string) => {
Clipboard.setString(`<${name} />`);
showSuccessNotification({
title: '拷贝成功',
description: `已拷贝: <${name} />`,
duration: 2000,
});
};
const renderIconItem = ({ item }: { item: [string, any] }) => {
const [name, Component] = item;
return (
copyToClipboard(name)}
style={styles.iconWrapper}
>
{name}
);
};
const debouncedSetSearchText = useRef(
debounce((text: string) => {
setSearchText(text);
}, 300)
).current;
const handleSearchTextChange = useCallback(
(text: string) => {
debouncedSetSearchText(text);
},
[debouncedSetSearchText]
);
return (
name}
numColumns={NUM_COLUMNS}
contentContainerStyle={styles.container}
columnWrapperStyle={styles.columnWrapper}
/>
);
};
const styles = StyleSheet.create({
pageContainer: {
flex: 1,
},
searchInput: {
marginVertical: ITEM_MARGIN,
},
container: {
gap: ITEM_MARGIN,
backgroundColor: '#d3d3d3',
borderRadius: 12,
padding: 4,
},
columnWrapper: {
gap: ITEM_MARGIN,
alignItems: 'center',
justifyContent: 'space-between',
marginVertical: 20,
paddingVertical: 20,
},
iconWrapper: {
width: 160,
justifyContent: 'center',
alignItems: 'center',
},
iconNameText: {
marginTop: 16,
},
});