mirror of
				https://github.com/vector-im/element-web.git
				synced 2025-11-04 10:11:03 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			138 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/*
 | 
						|
Copyright 2015, 2016 OpenMarket Ltd
 | 
						|
 | 
						|
Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
you may not use this file except in compliance with the License.
 | 
						|
You may obtain a copy of the License at
 | 
						|
 | 
						|
    http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 | 
						|
Unless required by applicable law or agreed to in writing, software
 | 
						|
distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
See the License for the specific language governing permissions and
 | 
						|
limitations under the License.
 | 
						|
*/
 | 
						|
 | 
						|
import * as sdk from './index';
 | 
						|
 | 
						|
function isMatch(query, name, uid) {
 | 
						|
    query = query.toLowerCase();
 | 
						|
    name = name.toLowerCase();
 | 
						|
    uid = uid.toLowerCase();
 | 
						|
 | 
						|
    // direct prefix matches
 | 
						|
    if (name.indexOf(query) === 0 || uid.indexOf(query) === 0) {
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    // strip @ on uid and try matching again
 | 
						|
    if (uid.length > 1 && uid[0] === "@" && uid.substring(1).indexOf(query) === 0) {
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    // split spaces in name and try matching constituent parts
 | 
						|
    const parts = name.split(" ");
 | 
						|
    for (let i = 0; i < parts.length; i++) {
 | 
						|
        if (parts[i].indexOf(query) === 0) {
 | 
						|
            return true;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    return false;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Converts various data models to Entity objects.
 | 
						|
 *
 | 
						|
 * Entity objects provide an interface for UI components to use to display
 | 
						|
 * members in a data-agnostic way. This means they don't need to care if the
 | 
						|
 * underlying data model is a RoomMember, User or 3PID data structure, it just
 | 
						|
 * cares about rendering.
 | 
						|
 */
 | 
						|
 | 
						|
class Entity {
 | 
						|
    constructor(model) {
 | 
						|
        this.model = model;
 | 
						|
    }
 | 
						|
 | 
						|
    getJsx() {
 | 
						|
        return null;
 | 
						|
    }
 | 
						|
 | 
						|
    matches(queryString) {
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
class MemberEntity extends Entity {
 | 
						|
    getJsx() {
 | 
						|
        const MemberTile = sdk.getComponent("rooms.MemberTile");
 | 
						|
        return (
 | 
						|
            <MemberTile key={this.model.userId} member={this.model} />
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    matches(queryString) {
 | 
						|
        return isMatch(queryString, this.model.name, this.model.userId);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
class UserEntity extends Entity {
 | 
						|
    constructor(model, showInviteButton, inviteFn) {
 | 
						|
        super(model);
 | 
						|
        this.showInviteButton = Boolean(showInviteButton);
 | 
						|
        this.inviteFn = inviteFn;
 | 
						|
        this.onClick = this.onClick.bind(this);
 | 
						|
    }
 | 
						|
 | 
						|
    onClick() {
 | 
						|
        if (this.inviteFn) {
 | 
						|
            this.inviteFn(this.model.userId);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    getJsx() {
 | 
						|
        const UserTile = sdk.getComponent("rooms.UserTile");
 | 
						|
        return (
 | 
						|
            <UserTile key={this.model.userId} user={this.model}
 | 
						|
                showInviteButton={this.showInviteButton} onClick={this.onClick} />
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    matches(queryString) {
 | 
						|
        const name = this.model.displayName || this.model.userId;
 | 
						|
        return isMatch(queryString, name, this.model.userId);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
export function newEntity(jsx, matchFn) {
 | 
						|
    const entity = new Entity();
 | 
						|
    entity.getJsx = function() {
 | 
						|
        return jsx;
 | 
						|
    };
 | 
						|
    entity.matches = matchFn;
 | 
						|
    return entity;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @param {RoomMember[]} members
 | 
						|
 * @return {Entity[]}
 | 
						|
 */
 | 
						|
export function fromRoomMembers(members) {
 | 
						|
    return members.map(function(m) {
 | 
						|
        return new MemberEntity(m);
 | 
						|
    });
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @param {User[]} users
 | 
						|
 * @param {boolean} showInviteButton
 | 
						|
 * @param {Function} inviteFn Called with the user ID.
 | 
						|
 * @return {Entity[]}
 | 
						|
 */
 | 
						|
export function fromUsers(users, showInviteButton, inviteFn) {
 | 
						|
    return users.map(function(u) {
 | 
						|
        return new UserEntity(u, showInviteButton, inviteFn);
 | 
						|
    });
 | 
						|
}
 |