Merge remote-tracking branch 'origin' into eric/app-864-integrate-post-tags-into-app
* origin: (21 commits) resolve fork of zeed-dom (#1663) Port remaining lightbox code to Reanimated (#1669) Update testrunner to use new dev-env [WIP] (#1575) Fix MobX crash for Android lightbox (#1668) Change lightbox to use Pager (#1666) make empty feed required (#1667) Only warn on links to bsky.app if it represents itself as another url (#1662) Fix keyboard double pad issue in email change & verify modals (#1664) Don't highlight tags in composer yet (#1665) Fix: fetch follows on desktop search for typeahead (#1660) Remove duplicate modal container (#1661) Drive-by lightbox refactors (#1659) Only prompt users once to verify email (according to local storage) close #1657 (#1658) Revert "Fix invite codes flash on desktop, use loading placeholder (#1591)" (#1656) Refactor iOS lightbox to Reanimated (#1645) Bump package.json to 1.52 Remove unnecessary opacity logic (#1646) Fix typo in image.ts (#1638) fix typo README.md (#1631) Typo fix in README.md: "small about" -> "small amount" (#1639) ...
This commit is contained in:
Vendored
+3
-2
@@ -5,6 +5,7 @@ import {
|
||||
moderateProfile,
|
||||
} from '@atproto/api'
|
||||
import {RootStoreModel} from '../root-store'
|
||||
import {bundleAsync} from 'lib/async/bundle'
|
||||
|
||||
const MAX_SYNC_PAGES = 10
|
||||
const SYNC_TTL = 60e3 * 10 // 10 minutes
|
||||
@@ -56,7 +57,7 @@ export class MyFollowsCache {
|
||||
* Syncs a subset of the user's follows
|
||||
* for performance reasons, caps out at 1000 follows
|
||||
*/
|
||||
async syncIfNeeded() {
|
||||
syncIfNeeded = bundleAsync(async () => {
|
||||
if (this.lastSync > Date.now() - SYNC_TTL) {
|
||||
return
|
||||
}
|
||||
@@ -81,7 +82,7 @@ export class MyFollowsCache {
|
||||
}
|
||||
|
||||
this.lastSync = Date.now()
|
||||
}
|
||||
})
|
||||
|
||||
getFollowState(did: string): FollowState {
|
||||
if (typeof this.byDid[did] === 'undefined') {
|
||||
|
||||
@@ -25,13 +25,13 @@ export class MeModel {
|
||||
savedFeeds: SavedFeedsModel
|
||||
notifications: NotificationsFeedModel
|
||||
follows: MyFollowsCache
|
||||
invites: ComAtprotoServerDefs.InviteCode[] | null = []
|
||||
invites: ComAtprotoServerDefs.InviteCode[] = []
|
||||
appPasswords: ComAtprotoServerListAppPasswords.AppPassword[] = []
|
||||
lastProfileStateUpdate = Date.now()
|
||||
lastNotifsUpdate = Date.now()
|
||||
|
||||
get invitesAvailable() {
|
||||
return this.invites?.filter(isInviteAvailable).length || null
|
||||
return this.invites.filter(isInviteAvailable).length
|
||||
}
|
||||
|
||||
constructor(public rootStore: RootStoreModel) {
|
||||
@@ -180,9 +180,7 @@ export class MeModel {
|
||||
} catch (e) {
|
||||
this.rootStore.log.error('Failed to fetch user invite codes', e)
|
||||
}
|
||||
if (this.invites) {
|
||||
await this.rootStore.invitedUsers.fetch(this.invites)
|
||||
}
|
||||
await this.rootStore.invitedUsers.fetch(this.invites)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -166,7 +166,7 @@ export class ImageModel implements Omit<RNImage, 'size'> {
|
||||
async crop() {
|
||||
try {
|
||||
// NOTE
|
||||
// on ios, react-native-image-cropper gives really bad quality
|
||||
// on ios, react-native-image-crop-picker gives really bad quality
|
||||
// without specifying width and height. on android, however, the
|
||||
// crop stretches incorrectly if you do specify it. these are
|
||||
// both separate bugs in the library. we deal with that by
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
import {makeAutoObservable} from 'mobx'
|
||||
import {RootStoreModel} from '../root-store'
|
||||
|
||||
export class Reminders {
|
||||
constructor(public rootStore: RootStoreModel) {
|
||||
makeAutoObservable(
|
||||
this,
|
||||
{serialize: false, hydrate: false},
|
||||
{autoBind: true},
|
||||
)
|
||||
}
|
||||
|
||||
serialize() {
|
||||
return {}
|
||||
}
|
||||
|
||||
hydrate(_v: unknown) {}
|
||||
|
||||
get shouldRequestEmailConfirmation() {
|
||||
return false
|
||||
}
|
||||
|
||||
setEmailConfirmationRequested() {}
|
||||
}
|
||||
@@ -3,10 +3,8 @@ import {isObj, hasProp} from 'lib/type-guards'
|
||||
import {RootStoreModel} from '../root-store'
|
||||
import {toHashCode} from 'lib/strings/helpers'
|
||||
|
||||
const DAY = 60e3 * 24 * 1 // 1 day (ms)
|
||||
|
||||
export class Reminders {
|
||||
lastEmailConfirm: Date = new Date()
|
||||
lastEmailConfirm: Date | null = null
|
||||
|
||||
constructor(public rootStore: RootStoreModel) {
|
||||
makeAutoObservable(
|
||||
@@ -45,6 +43,10 @@ export class Reminders {
|
||||
if (this.rootStore.onboarding.isActive) {
|
||||
return false
|
||||
}
|
||||
// only prompt once
|
||||
if (this.lastEmailConfirm) {
|
||||
return false
|
||||
}
|
||||
const today = new Date()
|
||||
// shard the users into 2 day of the week buckets
|
||||
// (this is to avoid a sudden influx of email updates when
|
||||
@@ -53,9 +55,7 @@ export class Reminders {
|
||||
if (code !== today.getDay() && code !== (today.getDay() + 1) % 7) {
|
||||
return false
|
||||
}
|
||||
// only ask once a day at most, but because of the bucketing
|
||||
// this will be more like weekly
|
||||
return Number(today) - Number(this.lastEmailConfirm) > DAY
|
||||
return true
|
||||
}
|
||||
|
||||
setEmailConfirmationRequested() {
|
||||
|
||||
Reference in New Issue
Block a user