import Input from '../../atoms/input/Input';
import RawModal from '../../atoms/modal/RawModal';
import ScrollView from '../../atoms/scroll/ScrollView';
-import Divider from '../../atoms/divider/Divider';
import RoomSelector from '../../molecules/room-selector/RoomSelector';
import SearchIC from '../../../../public/res/ic/outlined/search.svg';
return [isOpen, requestClose];
}
+function mapRoomIds(roomIds, type) {
+ const mx = initMatrix.matrixClient;
+ const { directs, roomIdToParents } = initMatrix.roomList;
+
+ return roomIds.map((roomId) => {
+ let roomType = type;
+
+ if (!roomType) {
+ roomType = directs.has(roomId) ? 'direct' : 'room';
+ }
+
+ const room = mx.getRoom(roomId);
+ const parentSet = roomIdToParents.get(roomId);
+ const parentNames = parentSet
+ ? [...parentSet].map((parentId) => mx.getRoom(parentId).name)
+ : undefined;
+
+ const parents = parentNames ? parentNames.join(', ') : null;
+
+ return ({
+ type: roomType,
+ name: room.name,
+ parents,
+ roomId,
+ room,
+ });
+ });
+}
+
function Search() {
const [result, setResult] = useState(null);
const [asyncSearch] = useState(new AsyncSearch());
const generateResults = (term) => {
const prefix = term.match(/^[#@*]/)?.[0];
- const { roomIdToParents } = initMatrix.roomList;
-
- const mapRoomIds = (roomIds, type) => roomIds.map((roomId) => {
- const room = mx.getRoom(roomId);
- const parentSet = roomIdToParents.get(roomId);
- const parentNames = parentSet
- ? [...parentSet].map((parentId) => mx.getRoom(parentId).name)
- : undefined;
-
- const parents = parentNames ? parentNames.join(', ') : null;
-
- return ({
- type,
- name: room.name,
- parents,
- roomId,
- room,
- });
- });
if (term.length === 1) {
const { roomList } = initMatrix;
}
};
+ const loadRecentRooms = () => {
+ const { recentRooms } = navigation;
+ handleSearchResults(mapRoomIds(recentRooms).reverse(), '');
+ };
+
const handleAfterOpen = () => {
searchRef.current.focus();
+ loadRecentRooms();
asyncSearch.on(asyncSearch.RESULT_SENT, handleSearchResults);
if (typeof result.term === 'string') {
const handleOnChange = () => {
const { value } = searchRef.current;
+ if (value.length === 0) {
+ loadRecentRooms();
+ return;
+ }
generateResults(value);
};
this.selectedSpacePath = [cons.tabs.HOME];
this.selectedRoomId = null;
+ this.recentRooms = [];
}
_setSpacePath(roomId) {
this.selectedSpacePath.push(roomId);
}
+ removeRecentRoom(roomId) {
+ if (typeof roomId !== 'string') return;
+ const roomIdIndex = this.recentRooms.indexOf(roomId);
+ if (roomIdIndex >= 0) {
+ this.recentRooms.splice(roomIdIndex, 1);
+ }
+ }
+
+ addRecentRoom(roomId) {
+ if (typeof roomId !== 'string') return;
+
+ this.removeRecentRoom(roomId);
+ this.recentRooms.push(roomId);
+ if (this.recentRooms.length > 10) {
+ this.recentRooms.splice(0, 1);
+ }
+ }
+
navigate(action) {
const actions = {
[cons.actions.navigation.SELECT_TAB]: () => {
[cons.actions.navigation.SELECT_ROOM]: () => {
const prevSelectedRoomId = this.selectedRoomId;
this.selectedRoomId = action.roomId;
+ this.addRecentRoom(prevSelectedRoomId);
+ this.removeRecentRoom(this.selectedRoomId);
this.emit(
cons.events.navigation.ROOM_SELECTED,
this.selectedRoomId,