Skip to content

Commit 42b9127

Browse files
committed
stargifts
1 parent 0a104dc commit 42b9127

File tree

87 files changed

+5760
-1640
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

87 files changed

+5760
-1640
lines changed

‎pnpm-lock.yaml

+314-320
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎public/assets/fonts/tgico.svg

+275-268
Loading

‎public/assets/fonts/tgico.ttf

2.44 KB
Binary file not shown.

‎public/assets/fonts/tgico.woff

2.44 KB
Binary file not shown.

‎src/components/appSearchSuper..ts

+58-5
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import useHeavyAnimationCheck, {getHeavyAnimationPromise} from '../hooks/useHeav
1818
import I18n, {LangPackKey, i18n, join} from '../lib/langPack';
1919
import findUpClassName from '../helpers/dom/findUpClassName';
2020
import {getMiddleware, Middleware, MiddlewareHelper} from '../helpers/middleware';
21-
import {ChannelParticipant, Chat, ChatFull, ChatParticipant, Document, Message, MessageMedia, MessagesChats, Peer, Photo, StoryItem, Update, User, WebPage} from '../layer';
21+
import {ChannelParticipant, Chat, ChatFull, ChatParticipant, Document, Message, MessageMedia, MessagesChats, Peer, Photo, StoryItem, Update, User, UserFull, WebPage} from '../layer';
2222
import SortedUserList from './sortedUserList';
2323
import findUpTag from '../helpers/dom/findUpTag';
2424
import appSidebarRight from './sidebarRight';
@@ -93,6 +93,8 @@ import setBlankToAnchor from '../lib/richTextProcessor/setBlankToAnchor';
9393
import cancelClickOrNextIfNotClick from '../helpers/dom/cancelClickOrNextIfNotClick';
9494
import createElementFromMarkup from '../helpers/createElementFromMarkup';
9595
import numberThousandSplitter from '../helpers/number/numberThousandSplitter';
96+
import {StarGiftsProfileTab} from './sidebarRight/tabs/stargifts';
97+
import {getFirstChild, resolveFirst} from '@solid-primitives/refs';
9698

9799
// const testScroll = false;
98100

@@ -112,7 +114,7 @@ export type SearchSuperContext = {
112114

113115
export type SearchSuperMediaType = 'stories' | 'members' | 'media' |
114116
'files' | 'links' | 'music' | 'chats' | 'voice' | 'groups' | 'similar' |
115-
'savedDialogs' | 'saved' | 'channels' | 'apps';
117+
'savedDialogs' | 'saved' | 'channels' | 'apps' | 'gifts';
116118
export type SearchSuperMediaTab = {
117119
inputFilter?: SearchSuperType,
118120
name: LangPackKey,
@@ -1963,6 +1965,39 @@ export default class AppSearchSuper {
19631965
this.loaded[mediaTab.type] = true;
19641966
}
19651967

1968+
private _loadedGifts: true
1969+
private async loadGifts({mediaTab}: SearchSuperLoadTypeOptions) {
1970+
if(!this._loadedGifts) {
1971+
const middleware = this.middleware.get();
1972+
createRoot((dispose) => {
1973+
middleware.onClean(() => dispose());
1974+
1975+
const scrollTarget = this.scrollable.container;
1976+
1977+
const {render: giftsList, loadNext} = StarGiftsProfileTab({
1978+
peerId: this.searchContext.peerId,
1979+
scrollParent: scrollTarget,
1980+
onCountChange: (count) => {
1981+
this.setCounter('gifts', count);
1982+
}
1983+
});
1984+
1985+
scrollTarget.addEventListener('scroll', () => {
1986+
const offset = 400;
1987+
if(this.mediaTab !== mediaTab) return; // There is one scrollable for all tabs
1988+
if(scrollTarget.scrollTop + scrollTarget.clientHeight >= scrollTarget.scrollHeight - offset) {
1989+
loadNext();
1990+
}
1991+
});
1992+
1993+
mediaTab.contentTab.append(getFirstChild(giftsList, v => v instanceof Element) as Element);
1994+
});
1995+
this._loadedGifts = true;
1996+
}
1997+
1998+
return Promise.resolve();
1999+
}
2000+
19662001
private loadType(options: SearchSuperLoadTypeOptions) {
19672002
const {
19682003
mediaTab,
@@ -1991,6 +2026,8 @@ export default class AppSearchSuper {
19912026
promise = this.loadChannels(options);
19922027
} else if(type === 'apps') {
19932028
promise = this.loadApps(options);
2029+
} else if(type === 'gifts') {
2030+
promise = this.loadGifts(options);
19942031
}
19952032

19962033
if(promise) {
@@ -2158,15 +2195,17 @@ export default class AppSearchSuper {
21582195
canViewMembers,
21592196
canViewGroups,
21602197
canViewStories,
2161-
canViewSimilar
2198+
canViewSimilar,
2199+
giftsCount
21622200
] = await Promise.all([
21632201
this.managers.appMessagesManager.getSearchCounters(peerId, filters, undefined, threadId),
21642202
this.canViewSavedDialogs(),
21652203
this.canViewSaved(),
21662204
this.canViewMembers(),
21672205
this.canViewGroups(),
21682206
this.canViewStories(),
2169-
this.canViewSimilar()
2207+
this.canViewSimilar(),
2208+
this.getGiftsCount()
21702209
]);
21712210

21722211
if(!middleware()) {
@@ -2207,14 +2246,16 @@ export default class AppSearchSuper {
22072246
const storiesTab = this.mediaTabsMap.get('stories');
22082247
const groupsTab = this.mediaTabsMap.get('groups');
22092248
const similarTab = this.mediaTabsMap.get('similar');
2249+
const giftsTab = this.mediaTabsMap.get('gifts');
22102250

22112251
const a: [SearchSuperMediaTab, boolean][] = [
22122252
[savedDialogsTab, canViewSavedDialogs],
22132253
[savedTab, canViewSaved],
22142254
[storiesTab, canViewStories],
22152255
[membersTab, canViewMembers],
22162256
[groupsTab, canViewGroups],
2217-
[similarTab, canViewSimilar]
2257+
[similarTab, canViewSimilar],
2258+
[giftsTab, giftsCount !== 0]
22182259
];
22192260

22202261
a.forEach(([tab, value]) => {
@@ -2229,6 +2270,8 @@ export default class AppSearchSuper {
22292270
}
22302271
});
22312272

2273+
this.setCounter('gifts', giftsCount);
2274+
22322275
if(canViewStories) {
22332276
firstMediaTab = storiesTab;
22342277

@@ -2441,6 +2484,16 @@ export default class AppSearchSuper {
24412484
}
24422485
}
24432486

2487+
public async getGiftsCount() {
2488+
const {peerId} = this.searchContext
2489+
const full =
2490+
peerId.isUser() ?
2491+
await this.managers.appProfileManager.getProfile(peerId.toUserId()) :
2492+
await this.managers.appProfileManager.getChannelFull(peerId.toChatId());
2493+
2494+
return full.stargifts_count ?? 0;
2495+
}
2496+
24442497
public cleanup() {
24452498
this.loadPromises = {};
24462499
this.loaded = {};
+3-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import {createEffect, on, splitProps} from 'solid-js'
1+
import {splitProps} from 'solid-js'
22
import ButtonMenuToggle from './buttonMenuToggle'
3+
import {attachClassName} from '../helpers/solid/classname'
34

45
export type ButtonMenuToggleProps = Parameters<typeof ButtonMenuToggle>[0] & {
56
class?: string
@@ -9,13 +10,7 @@ export const ButtonMenuToggleTsx = (props: ButtonMenuToggleProps) => {
910
const [, rest] = splitProps(props, ['class'])
1011
const res = ButtonMenuToggle(rest)
1112

12-
createEffect(on(
13-
() => props.class,
14-
(value, prev) => {
15-
res.classList.remove(prev)
16-
res.classList.add(value)
17-
}
18-
))
13+
attachClassName(res, () => props.class)
1914

2015
return res
2116
}

‎src/components/buttonTsx.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export default function Button(props: Partial<{
1111
disabled: boolean,
1212
children: JSX.Element,
1313
icon: Icon,
14+
iconAfter: Icon,
1415
onClick: (e: MouseEvent) => void,
1516
text: LangPackKey,
1617
textArgs: FormatterArguments
@@ -25,6 +26,7 @@ export default function Button(props: Partial<{
2526
>
2627
{props.icon && <IconTsx icon={props.icon} class="button-icon" />}
2728
{props.text ? i18n(props.text, props.textArgs) : props.children}
29+
{props.iconAfter && <IconTsx icon={props.iconAfter} class="button-icon" />}
2830
</Dynamic>
2931
);
3032
}

0 commit comments

Comments
 (0)