Handle premium folders
This commit is contained in:
parent
46dc5dccbd
commit
7ced8311f6
@ -83,6 +83,7 @@ import apiManagerProxy from "../mtproto/mtprotoworker";
|
|||||||
import filterAsync from "../../helpers/array/filterAsync";
|
import filterAsync from "../../helpers/array/filterAsync";
|
||||||
import forEachReverse from "../../helpers/array/forEachReverse";
|
import forEachReverse from "../../helpers/array/forEachReverse";
|
||||||
import indexOfAndSplice from "../../helpers/array/indexOfAndSplice";
|
import indexOfAndSplice from "../../helpers/array/indexOfAndSplice";
|
||||||
|
import whichChild from "../../helpers/dom/whichChild";
|
||||||
|
|
||||||
export const DIALOG_LIST_ELEMENT_TAG = 'A';
|
export const DIALOG_LIST_ELEMENT_TAG = 'A';
|
||||||
|
|
||||||
@ -299,6 +300,17 @@ export class AppDialogsManager {
|
|||||||
(window as any).addElement = add;
|
(window as any).addElement = add;
|
||||||
} */
|
} */
|
||||||
|
|
||||||
|
rootScope.addEventListener('premium_toggle', async(isPremium) => {
|
||||||
|
if(isPremium) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const isFolderAvailable = await this.managers.filtersStorage.isFilterIdAvailable(this.filterId);
|
||||||
|
if(!isFolderAvailable) {
|
||||||
|
selectTab(whichChild(this.filtersRendered[FOLDER_ID_ALL].menu), false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
rootScope.addEventListener('state_cleared', () => {
|
rootScope.addEventListener('state_cleared', () => {
|
||||||
const clearCurrent = REAL_FOLDERS.has(this.filterId);
|
const clearCurrent = REAL_FOLDERS.has(this.filterId);
|
||||||
//setTimeout(() =>
|
//setTimeout(() =>
|
||||||
@ -331,13 +343,19 @@ export class AppDialogsManager {
|
|||||||
|
|
||||||
const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer);
|
const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer);
|
||||||
bottomPart.prepend(this.folders.menuScrollContainer);
|
bottomPart.prepend(this.folders.menuScrollContainer);
|
||||||
const selectTab = this.selectTab = horizontalMenu(this.folders.menu, this.folders.container, (id, tabContent, animate) => {
|
const selectTab = this.selectTab = horizontalMenu(this.folders.menu, this.folders.container, async(id, tabContent) => {
|
||||||
/* if(id !== 0) {
|
/* if(id !== 0) {
|
||||||
id += 1;
|
id += 1;
|
||||||
} */
|
} */
|
||||||
|
|
||||||
|
|
||||||
id = +tabContent.dataset.filterId || FOLDER_ID_ALL;
|
id = +tabContent.dataset.filterId || FOLDER_ID_ALL;
|
||||||
|
|
||||||
|
const isFilterAvailable = REAL_FOLDERS.has(id) || await this.managers.filtersStorage.isFilterIdAvailable(id);
|
||||||
|
if(!isFilterAvailable) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
const wasFilterId = this.filterId;
|
const wasFilterId = this.filterId;
|
||||||
if(!IS_MOBILE_SAFARI) {
|
if(!IS_MOBILE_SAFARI) {
|
||||||
if(id) {
|
if(id) {
|
||||||
|
@ -205,6 +205,10 @@ export class AppImManager extends EventListenerBase<{
|
|||||||
this.setSettings();
|
this.setSettings();
|
||||||
rootScope.addEventListener('settings_updated', this.setSettings);
|
rootScope.addEventListener('settings_updated', this.setSettings);
|
||||||
|
|
||||||
|
rootScope.addEventListener('premium_toggle', (isPremium) => {
|
||||||
|
document.body.classList.toggle('is-premium', isPremium);
|
||||||
|
});
|
||||||
|
|
||||||
useHeavyAnimationCheck(() => {
|
useHeavyAnimationCheck(() => {
|
||||||
animationIntersector.setOnlyOnePlayableGroup('lock');
|
animationIntersector.setOnlyOnePlayableGroup('lock');
|
||||||
animationIntersector.checkAnimations(true);
|
animationIntersector.checkAnimations(true);
|
||||||
|
@ -133,6 +133,8 @@ export class AppUsersManager extends AppManager {
|
|||||||
this.users[user.id] = user;
|
this.users[user.id] = user;
|
||||||
this.setUserNameToCache(user);
|
this.setUserNameToCache(user);
|
||||||
|
|
||||||
|
this.checkPremium(user);
|
||||||
|
|
||||||
if(state.contactsListCachedTime && (user.pFlags.contact || user.pFlags.mutual_contact)) {
|
if(state.contactsListCachedTime && (user.pFlags.contact || user.pFlags.mutual_contact)) {
|
||||||
this.pushContact(user.id);
|
this.pushContact(user.id);
|
||||||
|
|
||||||
@ -540,9 +542,20 @@ export class AppUsersManager extends AppManager {
|
|||||||
this.rootScope.dispatchEvent('peer_title_edit', user.id.toPeerId());
|
this.rootScope.dispatchEvent('peer_title_edit', user.id.toPeerId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.checkPremium(user);
|
||||||
this.setUserToStateIfNeeded(user);
|
this.setUserToStateIfNeeded(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private checkPremium(user: User) {
|
||||||
|
if(user.pFlags.self) {
|
||||||
|
const isPremium = !!user.pFlags.premium;
|
||||||
|
if(this.rootScope.premium !== isPremium) {
|
||||||
|
this.rootScope.premium = isPremium;
|
||||||
|
this.rootScope.dispatchEvent('premium_toggle', isPremium);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private setUserToStateIfNeeded(user: User) {
|
private setUserToStateIfNeeded(user: User) {
|
||||||
if(this.peersStorage.isPeerNeeded(user.id.toPeerId())) {
|
if(this.peersStorage.isPeerNeeded(user.id.toPeerId())) {
|
||||||
this.storage.set({
|
this.storage.set({
|
||||||
|
@ -130,6 +130,15 @@ export class ApiManager extends ApiManagerMethods {
|
|||||||
/// #endif
|
/// #endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected after() {
|
||||||
|
this.apiUpdatesManager.addMultipleEventsListeners({
|
||||||
|
updateConfig: () => {
|
||||||
|
this.getConfig();
|
||||||
|
this.getAppConfig(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
//private lol = false;
|
//private lol = false;
|
||||||
|
|
||||||
// constructor() {
|
// constructor() {
|
||||||
|
@ -138,7 +138,9 @@ export type BroadcastEvents = {
|
|||||||
|
|
||||||
'logging_out': void,
|
'logging_out': void,
|
||||||
|
|
||||||
'payment_sent': {peerId: PeerId, mid: number}
|
'payment_sent': {peerId: PeerId, mid: number},
|
||||||
|
|
||||||
|
'premium_toggle': boolean
|
||||||
};
|
};
|
||||||
|
|
||||||
export type BroadcastEventsListeners = {
|
export type BroadcastEventsListeners = {
|
||||||
|
@ -51,22 +51,7 @@ export default class FiltersStorage extends AppManager {
|
|||||||
this.apiUpdatesManager.addMultipleEventsListeners({
|
this.apiUpdatesManager.addMultipleEventsListeners({
|
||||||
updateDialogFilter: this.onUpdateDialogFilter,
|
updateDialogFilter: this.onUpdateDialogFilter,
|
||||||
|
|
||||||
updateDialogFilters: (update) => {
|
updateDialogFilters: this.onUpdateDialogFilters,
|
||||||
//console.warn('updateDialogFilters', update);
|
|
||||||
|
|
||||||
const oldFilters = copy(this.filters);
|
|
||||||
|
|
||||||
this.getDialogFilters(true).then((filters) => {
|
|
||||||
for(const _filterId in oldFilters) {
|
|
||||||
const filterId = +_filterId;
|
|
||||||
if(!filters.find((filter) => filter.id === filterId)) { // * deleted
|
|
||||||
this.onUpdateDialogFilter({_: 'updateDialogFilter', id: filterId});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.onUpdateDialogFilterOrder({_: 'updateDialogFilterOrder', order: filters.map((filter) => filter.id)});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
updateDialogFilterOrder: this.onUpdateDialogFilterOrder
|
updateDialogFilterOrder: this.onUpdateDialogFilterOrder
|
||||||
});
|
});
|
||||||
@ -91,6 +76,10 @@ export default class FiltersStorage extends AppManager {
|
|||||||
}
|
}
|
||||||
}); */
|
}); */
|
||||||
|
|
||||||
|
this.rootScope.addEventListener('premium_toggle', () => {
|
||||||
|
this.onUpdateDialogFilters({_: 'updateDialogFilters'});
|
||||||
|
});
|
||||||
|
|
||||||
return this.appStateManager.getState().then((state) => {
|
return this.appStateManager.getState().then((state) => {
|
||||||
const filtersArr = this.prependFilters(state.filtersArr);
|
const filtersArr = this.prependFilters(state.filtersArr);
|
||||||
filtersArr.map((filter) => {
|
filtersArr.map((filter) => {
|
||||||
@ -174,6 +163,23 @@ export default class FiltersStorage extends AppManager {
|
|||||||
this.pushToState();
|
this.pushToState();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private onUpdateDialogFilters = (update: Update.updateDialogFilters) => {
|
||||||
|
//console.warn('updateDialogFilters', update);
|
||||||
|
|
||||||
|
const oldFilters = copy(this.filters);
|
||||||
|
|
||||||
|
this.getDialogFilters(true).then((filters) => {
|
||||||
|
for(const _filterId in oldFilters) {
|
||||||
|
const filterId = +_filterId;
|
||||||
|
if(!filters.find((filter) => filter.id === filterId)) { // * deleted
|
||||||
|
this.onUpdateDialogFilter({_: 'updateDialogFilter', id: filterId});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.onUpdateDialogFilterOrder({_: 'updateDialogFilterOrder', order: filters.map((filter) => filter.id)});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {
|
private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {
|
||||||
//console.log('updateDialogFilterOrder', update);
|
//console.log('updateDialogFilterOrder', update);
|
||||||
|
|
||||||
@ -533,4 +539,20 @@ export default class FiltersStorage extends AppManager {
|
|||||||
this.pushToState();
|
this.pushToState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async isFilterIdAvailable(filterId: number) {
|
||||||
|
if(REAL_FOLDERS.has(filterId)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const isPremium = this.rootScope.premium;
|
||||||
|
let isFolderAvailable = isPremium;
|
||||||
|
if(!isPremium) {
|
||||||
|
const config = await this.apiManager.getAppConfig();
|
||||||
|
const limit = config.dialog_filters_limit_default;
|
||||||
|
isFolderAvailable = this.filtersArr.filter((filter) => !REAL_FOLDERS.has(filter.id)).slice(0, limit).some((filter) => filter.id === filterId);
|
||||||
|
}
|
||||||
|
|
||||||
|
return isFolderAvailable;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
17
src/scss/mixins/_premium.scss
Normal file
17
src/scss/mixins/_premium.scss
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* https://github.com/morethanwords/tweb
|
||||||
|
* Copyright (C) 2019-2021 Eduard Kuzmenko
|
||||||
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE
|
||||||
|
*/
|
||||||
|
|
||||||
|
@mixin premium($not: false) {
|
||||||
|
@if $not {
|
||||||
|
body:not(.is-premium) & {
|
||||||
|
@content;
|
||||||
|
}
|
||||||
|
} @else {
|
||||||
|
body.is-premium & {
|
||||||
|
@content;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -610,6 +610,15 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// #folders-tabs {
|
||||||
|
// @include premium(true) {
|
||||||
|
// .menu-horizontal-div-item:nth-child(n+12) {
|
||||||
|
// pointer-events: none;
|
||||||
|
// opacity: .2;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
.edit-profile-container {
|
.edit-profile-container {
|
||||||
.scroll-wrapper {
|
.scroll-wrapper {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -48,6 +48,7 @@ $chat-input-inner-padding-handhelds: .25rem;
|
|||||||
@import "mixins/respondTo";
|
@import "mixins/respondTo";
|
||||||
@import "mixins/textOverflow";
|
@import "mixins/textOverflow";
|
||||||
@import "mixins/animationLevel";
|
@import "mixins/animationLevel";
|
||||||
|
@import "mixins/premium";
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--vh: 1vh;
|
--vh: 1vh;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user