Add recent opened room in search
Signed-off-by: Ajay Bura <ajbura@gmail.com>
This commit is contained in:
parent
77818f9342
commit
413188c995
2 changed files with 60 additions and 20 deletions
|
@ -13,7 +13,6 @@ import IconButton from '../../atoms/button/IconButton';
|
||||||
import Input from '../../atoms/input/Input';
|
import Input from '../../atoms/input/Input';
|
||||||
import RawModal from '../../atoms/modal/RawModal';
|
import RawModal from '../../atoms/modal/RawModal';
|
||||||
import ScrollView from '../../atoms/scroll/ScrollView';
|
import ScrollView from '../../atoms/scroll/ScrollView';
|
||||||
import Divider from '../../atoms/divider/Divider';
|
|
||||||
import RoomSelector from '../../molecules/room-selector/RoomSelector';
|
import RoomSelector from '../../molecules/room-selector/RoomSelector';
|
||||||
|
|
||||||
import SearchIC from '../../../../public/res/ic/outlined/search.svg';
|
import SearchIC from '../../../../public/res/ic/outlined/search.svg';
|
||||||
|
@ -51,6 +50,35 @@ function useVisiblityToggle(setResult) {
|
||||||
return [isOpen, requestClose];
|
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() {
|
function Search() {
|
||||||
const [result, setResult] = useState(null);
|
const [result, setResult] = useState(null);
|
||||||
const [asyncSearch] = useState(new AsyncSearch());
|
const [asyncSearch] = useState(new AsyncSearch());
|
||||||
|
@ -67,25 +95,6 @@ function Search() {
|
||||||
|
|
||||||
const generateResults = (term) => {
|
const generateResults = (term) => {
|
||||||
const prefix = term.match(/^[#@*]/)?.[0];
|
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) {
|
if (term.length === 1) {
|
||||||
const { roomList } = initMatrix;
|
const { roomList } = initMatrix;
|
||||||
|
@ -112,8 +121,14 @@ function Search() {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const loadRecentRooms = () => {
|
||||||
|
const { recentRooms } = navigation;
|
||||||
|
handleSearchResults(mapRoomIds(recentRooms).reverse(), '');
|
||||||
|
};
|
||||||
|
|
||||||
const handleAfterOpen = () => {
|
const handleAfterOpen = () => {
|
||||||
searchRef.current.focus();
|
searchRef.current.focus();
|
||||||
|
loadRecentRooms();
|
||||||
asyncSearch.on(asyncSearch.RESULT_SENT, handleSearchResults);
|
asyncSearch.on(asyncSearch.RESULT_SENT, handleSearchResults);
|
||||||
|
|
||||||
if (typeof result.term === 'string') {
|
if (typeof result.term === 'string') {
|
||||||
|
@ -128,6 +143,10 @@ function Search() {
|
||||||
|
|
||||||
const handleOnChange = () => {
|
const handleOnChange = () => {
|
||||||
const { value } = searchRef.current;
|
const { value } = searchRef.current;
|
||||||
|
if (value.length === 0) {
|
||||||
|
loadRecentRooms();
|
||||||
|
return;
|
||||||
|
}
|
||||||
generateResults(value);
|
generateResults(value);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ class Navigation extends EventEmitter {
|
||||||
this.selectedSpacePath = [cons.tabs.HOME];
|
this.selectedSpacePath = [cons.tabs.HOME];
|
||||||
|
|
||||||
this.selectedRoomId = null;
|
this.selectedRoomId = null;
|
||||||
|
this.recentRooms = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
_setSpacePath(roomId) {
|
_setSpacePath(roomId) {
|
||||||
|
@ -26,6 +27,24 @@ class Navigation extends EventEmitter {
|
||||||
this.selectedSpacePath.push(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) {
|
navigate(action) {
|
||||||
const actions = {
|
const actions = {
|
||||||
[cons.actions.navigation.SELECT_TAB]: () => {
|
[cons.actions.navigation.SELECT_TAB]: () => {
|
||||||
|
@ -50,6 +69,8 @@ class Navigation extends EventEmitter {
|
||||||
[cons.actions.navigation.SELECT_ROOM]: () => {
|
[cons.actions.navigation.SELECT_ROOM]: () => {
|
||||||
const prevSelectedRoomId = this.selectedRoomId;
|
const prevSelectedRoomId = this.selectedRoomId;
|
||||||
this.selectedRoomId = action.roomId;
|
this.selectedRoomId = action.roomId;
|
||||||
|
this.addRecentRoom(prevSelectedRoomId);
|
||||||
|
this.removeRecentRoom(this.selectedRoomId);
|
||||||
this.emit(
|
this.emit(
|
||||||
cons.events.navigation.ROOM_SELECTED,
|
cons.events.navigation.ROOM_SELECTED,
|
||||||
this.selectedRoomId,
|
this.selectedRoomId,
|
||||||
|
|
Loading…
Reference in a new issue