about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/state/models/log.ts16
-rw-r--r--src/state/models/ui/preferences.ts8
-rw-r--r--src/state/models/ui/saved-feeds.ts4
-rw-r--r--src/view/screens/SavedFeeds.tsx9
4 files changed, 33 insertions, 4 deletions
diff --git a/src/state/models/log.ts b/src/state/models/log.ts
index d80617139..7c9c37c0d 100644
--- a/src/state/models/log.ts
+++ b/src/state/models/log.ts
@@ -27,6 +27,7 @@ function genId(): string {
 
 export class LogModel {
   entries: LogEntry[] = []
+  timers = new Map<string, number>()
 
   constructor() {
     makeAutoObservable(this)
@@ -74,6 +75,21 @@ export class LogModel {
       ts: Date.now(),
     })
   }
+
+  time = (label = 'default') => {
+    this.timers.set(label, performance.now())
+  }
+
+  timeEnd = (label = 'default', warn = false) => {
+    const endTime = performance.now()
+    if (this.timers.has(label)) {
+      const elapsedTime = endTime - this.timers.get(label)!
+      console.log(`${label}: ${elapsedTime.toFixed(3)}ms`)
+      this.timers.delete(label)
+    } else {
+      warn && console.warn(`Timer with label '${label}' does not exist.`)
+    }
+  }
 }
 
 function detailsToStr(details?: any) {
diff --git a/src/state/models/ui/preferences.ts b/src/state/models/ui/preferences.ts
index c4b6da0f6..dcf6b9a7a 100644
--- a/src/state/models/ui/preferences.ts
+++ b/src/state/models/ui/preferences.ts
@@ -292,11 +292,15 @@ export class PreferencesModel {
     return res
   }
 
+  setFeeds(saved: string[], pinned: string[]) {
+    this.savedFeeds = saved
+    this.pinnedFeeds = pinned
+  }
+
   async setSavedFeeds(saved: string[], pinned: string[]) {
     const oldSaved = this.savedFeeds
     const oldPinned = this.pinnedFeeds
-    this.savedFeeds = saved
-    this.pinnedFeeds = pinned
+    this.setFeeds(saved, pinned)
     try {
       await this.update((prefs: AppBskyActorDefs.Preferences) => {
         const existing = prefs.find(
diff --git a/src/state/models/ui/saved-feeds.ts b/src/state/models/ui/saved-feeds.ts
index 244e75898..979fddf49 100644
--- a/src/state/models/ui/saved-feeds.ts
+++ b/src/state/models/ui/saved-feeds.ts
@@ -47,6 +47,10 @@ export class SavedFeedsModel {
     return this.feeds.filter(f => !this.isPinned(f))
   }
 
+  get all() {
+    return this.pinned.concat(this.unpinned)
+  }
+
   get pinnedFeedNames() {
     return this.pinned.map(f => f.displayName)
   }
diff --git a/src/view/screens/SavedFeeds.tsx b/src/view/screens/SavedFeeds.tsx
index 2f9165b37..e305e6305 100644
--- a/src/view/screens/SavedFeeds.tsx
+++ b/src/view/screens/SavedFeeds.tsx
@@ -99,7 +99,7 @@ export const SavedFeeds = withAuthRequired(
         />
         <DraggableFlatList
           containerStyle={[!isDesktopWeb && s.flex1]}
-          data={[...savedFeeds.pinned, ...savedFeeds.unpinned]} // make a copy so this FlatList re-renders when pinned changes
+          data={savedFeeds.all}
           keyExtractor={item => item.data.uri}
           refreshing={savedFeeds.isRefreshing}
           refreshControl={
@@ -111,6 +111,11 @@ export const SavedFeeds = withAuthRequired(
             />
           }
           renderItem={({item, drag}) => <ListItem item={item} drag={drag} />}
+          getItemLayout={(data, index) => ({
+            length: 77,
+            offset: 77 * index,
+            index,
+          })}
           initialNumToRender={10}
           ListFooterComponent={renderListFooterComponent}
           ListEmptyComponent={renderListEmptyComponent}
@@ -198,7 +203,7 @@ const ListItem = observer(
             />
             <TouchableOpacity
               accessibilityRole="button"
-              hitSlop={{top: 10, bottom: 10, left: 10, right: 10}}
+              hitSlop={10}
               onPress={onTogglePinned}>
               <FontAwesomeIcon
                 icon="thumb-tack"