Avatar cache search

This commit is contained in:
Natsumi
2021-10-08 20:16:09 +13:00
parent 84ba4dcd43
commit 0e8ae0a6ae
2 changed files with 88 additions and 63 deletions

View File

@@ -6524,6 +6524,19 @@ speechSynthesis.getVoices();
return 0;
};
// descending
var compareByCreatedAt = function (a, b) {
var A = String(a.created_at).toUpperCase();
var B = String(b.created_at).toUpperCase();
if (A < B) {
return 1;
}
if (A > B) {
return -1;
}
return 0;
};
// private
var compareByPrivate = function (a, b) {
if (typeof a.ref === 'undefined' || typeof b.ref === 'undefined') {
@@ -8138,10 +8151,10 @@ speechSynthesis.getVoices();
$app.data.searchWorldOption = '';
$app.data.searchWorldParams = {};
$app.data.searchAvatarResults = [];
$app.data.searchAvatarParams = {};
$app.data.searchAvatarFilter = '';
$app.data.searchAvatarSort = '';
$app.data.isSearchUserLoading = false;
$app.data.isSearchWorldLoading = false;
$app.data.isSearchAvatarLoading = false;
API.$on('LOGIN', function () {
$app.searchText = '';
@@ -8151,10 +8164,10 @@ speechSynthesis.getVoices();
$app.searchWorldOption = '';
$app.searchWorldParams = {};
$app.searchAvatarResults = [];
$app.searchAvatarParams = {};
$app.searchAvatarFilter = '';
$app.searchAvatarSort = '';
$app.isSearchUserLoading = false;
$app.isSearchWorldLoading = false;
$app.isSearchAvatarLoading = false;
});
$app.methods.clearSearch = function () {
@@ -8166,6 +8179,7 @@ speechSynthesis.getVoices();
$app.methods.search = function () {
this.searchUser();
this.searchWorld({});
this.searchAvatar();
};
$app.methods.searchUser = async function () {
@@ -8292,57 +8306,64 @@ speechSynthesis.getVoices();
});
};
$app.methods.searchAvatar = function (option) {
var params = {
n: 10,
offset: 0
};
switch (option) {
case 'updated':
params.sort = 'updated';
break;
case 'created':
params.sort = 'created';
break;
case 'mine':
params.user = 'me';
params.releaseStatus = 'all';
break;
default:
params.sort = 'popularity';
params.search = this.searchText;
break;
$app.methods.searchAvatar = function () {
if (!this.searchAvatarFilter) {
this.searchAvatarFilter = 'all';
}
params.order = 'descending';
// TODO: option.platform
this.searchAvatarParams = params;
this.moreSearchAvatar();
};
$app.methods.moreSearchAvatar = function (go) {
var params = this.searchAvatarParams;
if (go) {
params.offset += params.n * go;
if (params.offset < 0) {
params.offset = 0;
if (!this.searchAvatarSort) {
this.searchAvatarSort = 'name';
}
var avatars = [];
var query = this.searchText.toUpperCase();
if (!query) {
for (var ref of API.cachedAvatars.values()) {
if (ref.authorId === API.currentUser.id) {
avatars.push(ref);
}
}
}
this.isSearchAvatarLoading = true;
API.getAvatars(params)
.finally(() => {
this.isSearchAvatarLoading = false;
})
.then((args) => {
var map = new Map();
for (var json of args.json) {
var ref = API.cachedAvatars.get(json.id);
if (typeof ref !== 'undefined') {
map.set(ref.id, ref);
} else {
for (var ref of API.cachedAvatars.values()) {
var match = ref.name.toUpperCase().includes(query);
if (!match && ref.description) {
match = ref.description.toUpperCase().includes(query);
}
if (!match && ref.authorName) {
match = ref.authorName.toUpperCase().includes(query);
}
if (match) {
switch (this.searchAvatarFilter) {
case 'all':
avatars.push(ref);
break;
case 'public':
if (ref.releaseStatus === 'public') {
avatars.push(ref);
}
break;
case 'private':
if (ref.releaseStatus === 'private') {
avatars.push(ref);
}
break;
}
}
this.searchAvatarResults = Array.from(map.values());
return args;
});
if (avatars.length >= 1000) {
break;
}
}
}
switch (this.searchAvatarSort) {
case 'updated':
avatars.sort(compareByUpdatedAt);
break;
case 'created':
avatars.sort(compareByCreatedAt);
break;
case 'name':
avatars.sort(compareByName);
break;
}
this.searchAvatarResults = avatars;
};
// App: Favorite

View File

@@ -255,25 +255,29 @@ html
el-button-group(style="margin-top:15px")
el-button(v-if="searchWorldParams.offset" @click="moreSearchWorld(-1)" icon="el-icon-back" size="small") Prev
el-button(v-if="searchWorldResults.length" @click="moreSearchWorld(1)" icon="el-icon-right" size="small") Next
//- el-tab-pane(label="Avatar" v-loading="isSearchAvatarLoading" style="min-height:60px")
//- el-dropdown(@command="(command) => searchAvatar(command)" size="small" trigger="click" style="margin-bottom:15px")
//- el-button(size="small") Search by Category #[i.el-icon-arrow-down.el-icon--right]
//- el-dropdown-menu(#default="dropdown")
//- el-dropdown-item(command="updated") Updated Recently
//- el-dropdown-item(command="created") New
//- el-dropdown-item(command="mine") Mine
span(style="margin-left:10px;font-size:12px;color:#909399") Avatar search is not possible.
.x-friend-list
el-tab-pane(label="Avatar" style="min-height:60px")
el-tooltip(placement="bottom" content="Refresh own avatars" :disabled="hideTooltips")
el-button(type="default" :loading="userDialog.isAvatarsLoading" @click="refreshUserDialogAvatars()" size="mini" icon="el-icon-refresh" circle)
span(style="margin-left:5px") Total {{ searchAvatarResults.length }}
el-radio-group(v-model="searchAvatarSort" size="mini" style="margin-left:30px" @change="searchAvatar")
el-radio(label="name") by name
el-radio(label="update") by update
el-radio(label="created") by created
el-radio-group(v-model="searchAvatarFilter" size="mini" style="margin-left:80px" @change="searchAvatar")
el-radio(label="all") all
el-radio(label="public") public
el-radio(label="private") private
.x-friend-list(style="margin-top:20px")
.x-friend-item(v-for="avatar in searchAvatarResults" :key="avatar.id" @click="showAvatarDialog(avatar.id)")
template(v-once)
.avatar
img(v-lazy="avatar.thumbnailImageUrl")
.detail
span.name(v-text="avatar.name")
span.extra(v-text="avatar.releaseStatus" v-if="avatar.releaseStatus === 'public'" style="color: #67c23a;")
span.extra(v-text="avatar.releaseStatus" v-else-if="avatar.releaseStatus === 'private'" style="color: #f56c6c;")
span.extra(v-text="avatar.releaseStatus" v-else)
span.extra(v-text="avatar.authorName")
el-button-group(style="margin-top:15px")
el-button(v-if="searchAvatarParams.offset" @click="moreSearchAvatar(-1)" icon="el-icon-back" size="small") Prev
el-button(v-if="searchAvatarResults.length" @click="moreSearchAvatar(1)" icon="el-icon-right" size="small") Next
//- favorite
.x-container(v-show="$refs.menu && $refs.menu.activeIndex === 'favorite'" v-if="$refs.menu && $refs.menu.activeIndex === 'favorite'")