From 3a0e9f52f37cfd08ee9e34784b030c52a4632558 Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Fri, 11 Nov 2022 10:17:14 -0600 Subject: Only suggest users in invite suggestions --- src/state/models/scene-invite-suggestions.ts | 126 --------------------------- src/state/models/suggested-invites.ts | 126 +++++++++++++++++++++++++++ src/view/com/modals/InviteToScene.tsx | 4 +- 3 files changed, 128 insertions(+), 128 deletions(-) delete mode 100644 src/state/models/scene-invite-suggestions.ts create mode 100644 src/state/models/suggested-invites.ts (limited to 'src') diff --git a/src/state/models/scene-invite-suggestions.ts b/src/state/models/scene-invite-suggestions.ts deleted file mode 100644 index 34bb5c28d..000000000 --- a/src/state/models/scene-invite-suggestions.ts +++ /dev/null @@ -1,126 +0,0 @@ -import {makeAutoObservable, runInAction} from 'mobx' -import {RootStoreModel} from './root-store' -import {MembersViewModel} from './members-view' -import {UserFollowsViewModel, FollowItem} from './user-follows-view' - -export interface SceneInviteSuggestionsParams { - sceneDid: string -} - -export class SceneInviteSuggestions { - // state - isLoading = false - isRefreshing = false - hasLoaded = false - error = '' - params: SceneInviteSuggestionsParams - sceneMembersView: MembersViewModel - myFollowsView: UserFollowsViewModel - - // data - suggestions: FollowItem[] = [] - - constructor( - public rootStore: RootStoreModel, - params: SceneInviteSuggestionsParams, - ) { - makeAutoObservable( - this, - { - rootStore: false, - params: false, - }, - {autoBind: true}, - ) - this.params = params - this.sceneMembersView = new MembersViewModel(rootStore, { - actor: params.sceneDid, - }) - this.myFollowsView = new UserFollowsViewModel(rootStore, { - user: rootStore.me.did || '', - }) - } - - get hasContent() { - return this.suggestions.length > 0 - } - - get hasError() { - return this.error !== '' - } - - get isEmpty() { - return this.hasLoaded && !this.hasContent - } - - // public api - // = - - async setup() { - await this._fetch(false) - } - - async refresh() { - await this._fetch(true) - } - - async loadMore() { - // TODO - } - - // state transitions - // = - - private _xLoading(isRefreshing = false) { - this.isLoading = true - this.isRefreshing = isRefreshing - this.error = '' - } - - private _xIdle(err: string = '') { - this.isLoading = false - this.isRefreshing = false - this.hasLoaded = true - this.error = err - } - - // loader functions - // = - - private async _fetch(isRefreshing = false) { - this._xLoading(isRefreshing) - try { - await this.sceneMembersView.setup() - } catch (e) { - console.error(e) - this._xIdle( - 'Failed to fetch the current scene members. Check your internet connection and try again.', - ) - return - } - try { - await this.myFollowsView.setup() - } catch (e) { - console.error(e) - this._xIdle( - 'Failed to fetch the your current followers. Check your internet connection and try again.', - ) - return - } - - // collect all followed users that arent already in the scene - const newSuggestions: FollowItem[] = [] - for (const follow of this.myFollowsView.follows) { - // TODO: filter out scenes - if ( - !this.sceneMembersView.members.find(member => member.did === follow.did) - ) { - newSuggestions.push(follow) - } - } - runInAction(() => { - this.suggestions = newSuggestions - }) - this._xIdle() - } -} diff --git a/src/state/models/suggested-invites.ts b/src/state/models/suggested-invites.ts new file mode 100644 index 000000000..1b080163b --- /dev/null +++ b/src/state/models/suggested-invites.ts @@ -0,0 +1,126 @@ +import {makeAutoObservable, runInAction} from 'mobx' +import {RootStoreModel} from './root-store' +import {MembersViewModel} from './members-view' +import {UserFollowsViewModel, FollowItem} from './user-follows-view' +import {APP_BSKY_SYSTEM} from '../../third-party/api' + +export interface SuggestedInvites { + sceneDid: string +} + +export class SuggestedInvites { + // state + isLoading = false + isRefreshing = false + hasLoaded = false + error = '' + params: SuggestedInvites + sceneMembersView: MembersViewModel + myFollowsView: UserFollowsViewModel + + // data + suggestions: FollowItem[] = [] + + constructor(public rootStore: RootStoreModel, params: SuggestedInvites) { + makeAutoObservable( + this, + { + rootStore: false, + params: false, + }, + {autoBind: true}, + ) + this.params = params + this.sceneMembersView = new MembersViewModel(rootStore, { + actor: params.sceneDid, + }) + this.myFollowsView = new UserFollowsViewModel(rootStore, { + user: rootStore.me.did || '', + }) + } + + get hasContent() { + return this.suggestions.length > 0 + } + + get hasError() { + return this.error !== '' + } + + get isEmpty() { + return this.hasLoaded && !this.hasContent + } + + // public api + // = + + async setup() { + await this._fetch(false) + } + + async refresh() { + await this._fetch(true) + } + + async loadMore() { + // TODO + } + + // state transitions + // = + + private _xLoading(isRefreshing = false) { + this.isLoading = true + this.isRefreshing = isRefreshing + this.error = '' + } + + private _xIdle(err: string = '') { + this.isLoading = false + this.isRefreshing = false + this.hasLoaded = true + this.error = err + } + + // loader functions + // = + + private async _fetch(isRefreshing = false) { + this._xLoading(isRefreshing) + try { + await this.sceneMembersView.setup() + } catch (e) { + console.error(e) + this._xIdle( + 'Failed to fetch the current scene members. Check your internet connection and try again.', + ) + return + } + try { + await this.myFollowsView.setup() + } catch (e) { + console.error(e) + this._xIdle( + 'Failed to fetch the your current followers. Check your internet connection and try again.', + ) + return + } + + // collect all followed users that arent already in the scene + const newSuggestions: FollowItem[] = [] + for (const follow of this.myFollowsView.follows) { + if (follow.declaration.actorType !== APP_BSKY_SYSTEM.ActorUser) { + continue + } + if ( + !this.sceneMembersView.members.find(member => member.did === follow.did) + ) { + newSuggestions.push(follow) + } + } + runInAction(() => { + this.suggestions = newSuggestions + }) + this._xIdle() + } +} diff --git a/src/view/com/modals/InviteToScene.tsx b/src/view/com/modals/InviteToScene.tsx index f1c9d3386..065df6350 100644 --- a/src/view/com/modals/InviteToScene.tsx +++ b/src/view/com/modals/InviteToScene.tsx @@ -23,7 +23,7 @@ import {ErrorMessage} from '../util/ErrorMessage' import {useStores} from '../../../state' import * as apilib from '../../../state/lib/api' import {ProfileViewModel} from '../../../state/models/profile-view' -import {SceneInviteSuggestions} from '../../../state/models/scene-invite-suggestions' +import {SuggestedInvites} from '../../../state/models/suggested-invites' import {FollowItem} from '../../../state/models/user-follows-view' import {s, colors} from '../../lib/styles' @@ -40,7 +40,7 @@ export function Component({profileView}: {profileView: ProfileViewModel}) { const [hasSetup, setHasSetup] = useState(false) const [error, setError] = useState('') const suggestions = useMemo( - () => new SceneInviteSuggestions(store, {sceneDid: profileView.did}), + () => new SuggestedInvites(store, {sceneDid: profileView.did}), [profileView.did], ) const [createdInvites, setCreatedInvites] = useState>( -- cgit 1.4.1