* Persist 'copied' state of invite codes (close APP-562) * Dont show copied message if invite used
88 lines
2.3 KiB
TypeScript
88 lines
2.3 KiB
TypeScript
import {makeAutoObservable, runInAction} from 'mobx'
|
|
import {ComAtprotoServerDefs, AppBskyActorDefs} from '@atproto/api'
|
|
import {RootStoreModel} from './root-store'
|
|
import {isObj, hasProp, isStrArray} from 'lib/type-guards'
|
|
|
|
export class InvitedUsers {
|
|
copiedInvites: string[] = []
|
|
seenDids: string[] = []
|
|
profiles: AppBskyActorDefs.ProfileViewDetailed[] = []
|
|
|
|
get numNotifs() {
|
|
return this.profiles.length
|
|
}
|
|
|
|
constructor(public rootStore: RootStoreModel) {
|
|
makeAutoObservable(
|
|
this,
|
|
{rootStore: false, serialize: false, hydrate: false},
|
|
{autoBind: true},
|
|
)
|
|
}
|
|
|
|
serialize() {
|
|
return {seenDids: this.seenDids, copiedInvites: this.copiedInvites}
|
|
}
|
|
|
|
hydrate(v: unknown) {
|
|
if (isObj(v) && hasProp(v, 'seenDids') && isStrArray(v.seenDids)) {
|
|
this.seenDids = v.seenDids
|
|
}
|
|
if (
|
|
isObj(v) &&
|
|
hasProp(v, 'copiedInvites') &&
|
|
isStrArray(v.copiedInvites)
|
|
) {
|
|
this.copiedInvites = v.copiedInvites
|
|
}
|
|
}
|
|
|
|
async fetch(invites: ComAtprotoServerDefs.InviteCode[]) {
|
|
// pull the dids of invited users not marked seen
|
|
const dids = []
|
|
for (const invite of invites) {
|
|
for (const use of invite.uses) {
|
|
if (!this.seenDids.includes(use.usedBy)) {
|
|
dids.push(use.usedBy)
|
|
}
|
|
}
|
|
}
|
|
|
|
// fetch their profiles
|
|
this.profiles = []
|
|
if (dids.length) {
|
|
try {
|
|
const res = await this.rootStore.agent.app.bsky.actor.getProfiles({
|
|
actors: dids,
|
|
})
|
|
runInAction(() => {
|
|
// save the ones following -- these are the ones we want to notify the user about
|
|
this.profiles = res.data.profiles.filter(
|
|
profile => !profile.viewer?.following,
|
|
)
|
|
})
|
|
this.rootStore.me.follows.hydrateProfiles(this.profiles)
|
|
} catch (e) {
|
|
this.rootStore.log.error(
|
|
'Failed to fetch profiles for invited users',
|
|
e,
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
isInviteCopied(invite: string) {
|
|
return this.copiedInvites.includes(invite)
|
|
}
|
|
|
|
setInviteCopied(invite: string) {
|
|
if (!this.isInviteCopied(invite)) {
|
|
this.copiedInvites.push(invite)
|
|
}
|
|
}
|
|
|
|
markSeen(did: string) {
|
|
this.seenDids.push(did)
|
|
this.profiles = this.profiles.filter(profile => profile.did !== did)
|
|
}
|
|
}
|