mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Replace all logs with new logger

+301 -230
+6 -5
src/lib/analytics/analytics.tsx
··· 10 10 import {useStores} from 'state/models/root-store' 11 11 import {sha256} from 'js-sha256' 12 12 import {ScreenEvent, TrackEvent} from './types' 13 + import {logger} from '#/logger' 13 14 14 15 const segmentClient = createClient({ 15 16 writeKey: '8I6DsgfiSLuoONyaunGoiQM7A6y2ybdI', ··· 54 55 if (sess.did) { 55 56 const did_hashed = sha256(sess.did) 56 57 segmentClient.identify(did_hashed, {did_hashed}) 57 - store.log.debug('Ping w/hash') 58 + logger.debug('Ping w/hash') 58 59 } else { 59 - store.log.debug('Ping w/o hash') 60 + logger.debug('Ping w/o hash') 60 61 segmentClient.identify() 61 62 } 62 63 } ··· 68 69 // -prf 69 70 segmentClient.isReady.onChange(() => { 70 71 if (AppState.currentState !== 'active') { 71 - store.log.debug('Prevented a metrics ping while the app was backgrounded') 72 + logger.debug('Prevented a metrics ping while the app was backgrounded') 72 73 return 73 74 } 74 75 const context = segmentClient.context.get() 75 76 if (typeof context?.app === 'undefined') { 76 - store.log.debug('Aborted metrics ping due to unavailable context') 77 + logger.debug('Aborted metrics ping due to unavailable context') 77 78 return 78 79 } 79 80 80 81 const oldAppInfo = store.appInfo 81 82 const newAppInfo = context.app as AppInfo 82 83 store.setAppInfo(newAppInfo) 83 - store.log.debug('Recording app info', {new: newAppInfo, old: oldAppInfo}) 84 + logger.debug('Recording app info', {new: newAppInfo, old: oldAppInfo}) 84 85 85 86 if (typeof oldAppInfo === 'undefined') { 86 87 if (store.session.hasSession) {
+3 -2
src/lib/analytics/analytics.web.tsx
··· 7 7 import {RootStoreModel} from 'state/models/root-store' 8 8 import {useStores} from 'state/models/root-store' 9 9 import {sha256} from 'js-sha256' 10 + import {logger} from '#/logger' 10 11 11 12 const segmentClient = createClient( 12 13 { ··· 49 50 if (sess.did) { 50 51 const did_hashed = sha256(sess.did) 51 52 segmentClient.identify(did_hashed, {did_hashed}) 52 - store.log.debug('Ping w/hash') 53 + logger.debug('Ping w/hash') 53 54 } else { 54 - store.log.debug('Ping w/o hash') 55 + logger.debug('Ping w/o hash') 55 56 segmentClient.identify() 56 57 } 57 58 }
+2 -1
src/lib/api/index.ts
··· 15 15 import {isWeb} from 'platform/detection' 16 16 import {ImageModel} from 'state/models/media/image' 17 17 import {shortenLinks} from 'lib/strings/rich-text-manip' 18 + import {logger} from '#/logger' 18 19 19 20 export interface ExternalEmbedDraft { 20 21 uri: string ··· 178 179 ) { 179 180 encoding = 'image/jpeg' 180 181 } else { 181 - store.log.warn('Unexpected image format for thumbnail, skipping', { 182 + logger.warn('Unexpected image format for thumbnail, skipping', { 182 183 thumbnail: opts.extLink.localThumb.path, 183 184 }) 184 185 }
+3 -2
src/lib/hooks/useFollowProfile.ts
··· 2 2 import {AppBskyActorDefs} from '@atproto/api' 3 3 import {useStores} from 'state/index' 4 4 import {FollowState} from 'state/models/cache/my-follows' 5 + import {logger} from '#/logger' 5 6 6 7 export function useFollowProfile(profile: AppBskyActorDefs.ProfileViewBasic) { 7 8 const store = useStores() ··· 22 23 following: false, 23 24 } 24 25 } catch (e: any) { 25 - store.log.error('Failed to delete follow', {error: e}) 26 + logger.error('Failed to delete follow', {error: e}) 26 27 throw e 27 28 } 28 29 } else if (state === FollowState.NotFollowing) { ··· 40 41 following: true, 41 42 } 42 43 } catch (e: any) { 43 - store.log.error('Failed to create follow', {error: e}) 44 + logger.error('Failed to create follow', {error: e}) 44 45 throw e 45 46 } 46 47 }
+7 -6
src/lib/hooks/useOTAUpdate.ts
··· 2 2 import {useCallback, useEffect} from 'react' 3 3 import {AppState} from 'react-native' 4 4 import {useStores} from 'state/index' 5 + import {logger} from '#/logger' 5 6 6 7 export function useOTAUpdate() { 7 8 const store = useStores() ··· 21 22 }) 22 23 }, [store.shell]) 23 24 const checkForUpdate = useCallback(async () => { 24 - store.log.debug('useOTAUpdate: Checking for update...') 25 + logger.debug('useOTAUpdate: Checking for update...') 25 26 try { 26 27 // Check if new OTA update is available 27 28 const update = await Updates.checkForUpdateAsync() ··· 34 35 // show a popup modal 35 36 showUpdatePopup() 36 37 } catch (e) { 37 - store.log.error('useOTAUpdate: Error while checking for update', { 38 + logger.error('useOTAUpdate: Error while checking for update', { 38 39 error: e, 39 40 }) 40 41 } 41 - }, [showUpdatePopup, store.log]) 42 + }, [showUpdatePopup]) 42 43 const updateEventListener = useCallback( 43 44 (event: Updates.UpdateEvent) => { 44 - store.log.debug('useOTAUpdate: Listening for update...') 45 + logger.debug('useOTAUpdate: Listening for update...') 45 46 if (event.type === Updates.UpdateEventType.ERROR) { 46 - store.log.error('useOTAUpdate: Error while listening for update', { 47 + logger.error('useOTAUpdate: Error while listening for update', { 47 48 message: event.message, 48 49 }) 49 50 } else if (event.type === Updates.UpdateEventType.NO_UPDATE_AVAILABLE) { ··· 55 56 showUpdatePopup() 56 57 } 57 58 }, 58 - [showUpdatePopup, store.log], 59 + [showUpdatePopup], 59 60 ) 60 61 61 62 useEffect(() => {
+44 -17
src/lib/notifications/notifications.ts
··· 3 3 import {resetToTab} from '../../Navigation' 4 4 import {devicePlatform, isIOS} from 'platform/detection' 5 5 import {track} from 'lib/analytics/analytics' 6 + import {logger} from '#/logger' 6 7 7 8 const SERVICE_DID = (serviceUrl?: string) => 8 9 serviceUrl?.includes('staging') ··· 29 30 token: token.data, 30 31 appId: 'xyz.blueskyweb.app', 31 32 }) 32 - store.log.debug('Notifications: Sent push token (init)', { 33 - tokenType: token.type, 34 - token: token.data, 35 - }) 33 + logger.debug( 34 + 'Notifications: Sent push token (init)', 35 + { 36 + tokenType: token.type, 37 + token: token.data, 38 + }, 39 + logger.DebugContext.notifications, 40 + ) 36 41 } catch (error) { 37 - store.log.error('Notifications: Failed to set push token', {error}) 42 + logger.error('Notifications: Failed to set push token', {error}) 38 43 } 39 44 } 40 45 41 46 // listens for new changes to the push token 42 47 // In rare situations, a push token may be changed by the push notification service while the app is running. When a token is rolled, the old one becomes invalid and sending notifications to it will fail. A push token listener will let you handle this situation gracefully by registering the new token with your backend right away. 43 48 Notifications.addPushTokenListener(async ({data: t, type}) => { 44 - store.log.debug('Notifications: Push token changed', {t, tokenType: type}) 49 + logger.debug( 50 + 'Notifications: Push token changed', 51 + {t, tokenType: type}, 52 + logger.DebugContext.notifications, 53 + ) 45 54 if (t) { 46 55 try { 47 56 await store.agent.api.app.bsky.notification.registerPush({ ··· 50 59 token: t, 51 60 appId: 'xyz.blueskyweb.app', 52 61 }) 53 - store.log.debug('Notifications: Sent push token (event)', { 54 - tokenType: type, 55 - token: t, 56 - }) 62 + logger.debug( 63 + 'Notifications: Sent push token (event)', 64 + { 65 + tokenType: type, 66 + token: t, 67 + }, 68 + logger.DebugContext.notifications, 69 + ) 57 70 } catch (error) { 58 - store.log.error('Notifications: Failed to set push token', {error}) 71 + logger.error('Notifications: Failed to set push token', {error}) 59 72 } 60 73 } 61 74 }) ··· 63 76 64 77 // handle notifications that are received, both in the foreground or background 65 78 Notifications.addNotificationReceivedListener(event => { 66 - store.log.debug('Notifications: received', {event}) 79 + logger.debug( 80 + 'Notifications: received', 81 + {event}, 82 + logger.DebugContext.notifications, 83 + ) 67 84 if (event.request.trigger.type === 'push') { 68 85 // refresh notifications in the background 69 86 store.me.notifications.syncQueue() ··· 75 92 // TODO: handle android payload deeplink 76 93 } 77 94 if (payload) { 78 - store.log.debug('Notifications: received payload', payload) 95 + logger.debug( 96 + 'Notifications: received payload', 97 + payload, 98 + logger.DebugContext.notifications, 99 + ) 79 100 // TODO: deeplink notif here 80 101 } 81 102 } ··· 84 105 // handle notifications that are tapped on 85 106 const sub = Notifications.addNotificationResponseReceivedListener( 86 107 response => { 87 - store.log.debug('Notifications: response received', { 88 - actionIdentifier: response.actionIdentifier, 89 - }) 108 + logger.debug( 109 + 'Notifications: response received', 110 + { 111 + actionIdentifier: response.actionIdentifier, 112 + }, 113 + logger.DebugContext.notifications, 114 + ) 90 115 if ( 91 116 response.actionIdentifier === Notifications.DEFAULT_ACTION_IDENTIFIER 92 117 ) { 93 - store.log.debug( 118 + logger.debug( 94 119 'User pressed a notification, opening notifications tab', 120 + {}, 121 + logger.DebugContext.notifications, 95 122 ) 96 123 track('Notificatons:OpenApp') 97 124 store.me.notifications.refresh() // refresh notifications
+2
src/logger/debugContext.ts
··· 7 7 */ 8 8 export const DebugContext = { 9 9 // e.g. composer: 'composer' 10 + session: 'session', 11 + notifications: 'notifications', 10 12 } as const
+3 -2
src/state/index.ts
··· 4 4 import {RootStoreModel} from './models/root-store' 5 5 import * as apiPolyfill from 'lib/api/api-polyfill' 6 6 import * as storage from 'lib/storage' 7 + import {logger} from '#/logger' 7 8 8 9 export const LOCAL_DEV_SERVICE = 9 10 Platform.OS === 'android' ? 'http://10.0.2.2:2583' : 'http://localhost:2583' ··· 22 23 rootStore = new RootStoreModel(new BskyAgent({service: serviceUri})) 23 24 try { 24 25 data = (await storage.load(ROOT_STATE_STORAGE_KEY)) || {} 25 - rootStore.log.debug('Initial hydrate', {hasSession: !!data.session}) 26 + logger.debug('Initial hydrate', {hasSession: !!data.session}) 26 27 rootStore.hydrate(data) 27 28 } catch (e: any) { 28 - rootStore.log.error('Failed to load state from storage', {error: e}) 29 + logger.error('Failed to load state from storage', {error: e}) 29 30 } 30 31 rootStore.attemptSessionResumption() 31 32
+6 -5
src/state/models/content/feed-source.ts
··· 6 6 import {bundleAsync} from 'lib/async/bundle' 7 7 import {cleanError} from 'lib/strings/errors' 8 8 import {track} from 'lib/analytics/analytics' 9 + import {logger} from '#/logger' 9 10 10 11 export class FeedSourceModel { 11 12 // state ··· 134 135 try { 135 136 await this.rootStore.preferences.addSavedFeed(this.uri) 136 137 } catch (error) { 137 - this.rootStore.log.error('Failed to save feed', {error}) 138 + logger.error('Failed to save feed', {error}) 138 139 } finally { 139 140 track('CustomFeed:Save') 140 141 } ··· 147 148 try { 148 149 await this.rootStore.preferences.removeSavedFeed(this.uri) 149 150 } catch (error) { 150 - this.rootStore.log.error('Failed to unsave feed', {error}) 151 + logger.error('Failed to unsave feed', {error}) 151 152 } finally { 152 153 track('CustomFeed:Unsave') 153 154 } ··· 157 158 try { 158 159 await this.rootStore.preferences.addPinnedFeed(this.uri) 159 160 } catch (error) { 160 - this.rootStore.log.error('Failed to pin feed', {error}) 161 + logger.error('Failed to pin feed', {error}) 161 162 } finally { 162 163 track('CustomFeed:Pin', { 163 164 name: this.displayName, ··· 194 195 } catch (e: any) { 195 196 this.likeUri = undefined 196 197 this.likeCount = (this.likeCount || 1) - 1 197 - this.rootStore.log.error('Failed to like feed', {error: e}) 198 + logger.error('Failed to like feed', {error: e}) 198 199 } finally { 199 200 track('CustomFeed:Like') 200 201 } ··· 215 216 } catch (e: any) { 216 217 this.likeUri = uri 217 218 this.likeCount = (this.likeCount || 0) + 1 218 - this.rootStore.log.error('Failed to unlike feed', {error: e}) 219 + logger.error('Failed to unlike feed', {error: e}) 219 220 } finally { 220 221 track('CustomFeed:Unlike') 221 222 }
+4 -3
src/state/models/content/list.ts
··· 16 16 import {bundleAsync} from 'lib/async/bundle' 17 17 import {track} from 'lib/analytics/analytics' 18 18 import {until} from 'lib/async/until' 19 + import {logger} from '#/logger' 19 20 20 21 const PAGE_SIZE = 30 21 22 ··· 339 340 try { 340 341 await this.rootStore.preferences.addPinnedFeed(this.uri) 341 342 } catch (error) { 342 - this.rootStore.log.error('Failed to pin feed', {error}) 343 + logger.error('Failed to pin feed', {error}) 343 344 } finally { 344 345 track('CustomFeed:Pin', { 345 346 name: this.data?.name || '', ··· 455 456 this.error = cleanError(err) 456 457 this.loadMoreError = cleanError(loadMoreErr) 457 458 if (err) { 458 - this.rootStore.log.error('Failed to fetch user items', {error: err}) 459 + logger.error('Failed to fetch user items', {error: err}) 459 460 } 460 461 if (loadMoreErr) { 461 - this.rootStore.log.error('Failed to fetch user items', { 462 + logger.error('Failed to fetch user items', { 462 463 error: loadMoreErr, 463 464 }) 464 465 }
+2 -1
src/state/models/content/post-thread.ts
··· 11 11 import {cleanError} from 'lib/strings/errors' 12 12 import {ThreadViewPreference} from '../ui/preferences' 13 13 import {PostThreadItemModel} from './post-thread-item' 14 + import {logger} from '#/logger' 14 15 15 16 export class PostThreadModel { 16 17 // state ··· 163 164 this.hasLoaded = true 164 165 this.error = cleanError(err) 165 166 if (err) { 166 - this.rootStore.log.error('Failed to fetch post thread', {error: err}) 167 + logger.error('Failed to fetch post thread', {error: err}) 167 168 } 168 169 this.notFound = err instanceof GetPostThread.NotFoundError 169 170 }
+2 -1
src/state/models/content/profile.ts
··· 15 15 import {FollowState} from '../cache/my-follows' 16 16 import {Image as RNImage} from 'react-native-image-crop-picker' 17 17 import {track} from 'lib/analytics/analytics' 18 + import {logger} from '#/logger' 18 19 19 20 export class ProfileViewerModel { 20 21 muted?: boolean ··· 235 236 this.hasLoaded = true 236 237 this.error = cleanError(err) 237 238 if (err) { 238 - this.rootStore.log.error('Failed to fetch profile', {error: err}) 239 + logger.error('Failed to fetch profile', {error: err}) 239 240 } 240 241 } 241 242
+2 -1
src/state/models/discovery/feeds.ts
··· 4 4 import {bundleAsync} from 'lib/async/bundle' 5 5 import {cleanError} from 'lib/strings/errors' 6 6 import {FeedSourceModel} from '../content/feed-source' 7 + import {logger} from '#/logger' 7 8 8 9 const DEFAULT_LIMIT = 50 9 10 ··· 120 121 this.hasLoaded = true 121 122 this.error = cleanError(err) 122 123 if (err) { 123 - this.rootStore.log.error('Failed to fetch popular feeds', {error: err}) 124 + logger.error('Failed to fetch popular feeds', {error: err}) 124 125 } 125 126 } 126 127
+2 -1
src/state/models/discovery/suggested-actors.ts
··· 3 3 import {RootStoreModel} from '../root-store' 4 4 import {cleanError} from 'lib/strings/errors' 5 5 import {bundleAsync} from 'lib/async/bundle' 6 + import {logger} from '#/logger' 6 7 7 8 const PAGE_SIZE = 30 8 9 ··· 144 145 this.hasLoaded = true 145 146 this.error = cleanError(err) 146 147 if (err) { 147 - this.rootStore.log.error('Failed to fetch suggested actors', {error: err}) 148 + logger.error('Failed to fetch suggested actors', {error: err}) 148 149 } 149 150 } 150 151 }
+11 -13
src/state/models/feeds/notifications.ts
··· 17 17 import {RootStoreModel} from '../root-store' 18 18 import {PostThreadModel} from '../content/post-thread' 19 19 import {cleanError} from 'lib/strings/errors' 20 + import {logger} from '#/logger' 20 21 21 22 const GROUPABLE_REASONS = ['like', 'repost', 'follow'] 22 23 const PAGE_SIZE = 30 ··· 210 211 if (valid.success) { 211 212 return v 212 213 } else { 213 - this.rootStore.log.warn('Received an invalid record', { 214 + logger.warn('Received an invalid record', { 214 215 record: v, 215 216 error: valid.error, 216 217 }) ··· 218 219 } 219 220 } 220 221 } 221 - this.rootStore.log.warn( 222 + logger.warn( 222 223 'app.bsky.notifications.list served an unsupported record type', 223 224 {record: v}, 224 225 ) ··· 319 320 * Nuke all data 320 321 */ 321 322 clear() { 322 - this.rootStore.log.debug('NotificationsModel:clear') 323 + logger.debug('NotificationsModel:clear') 323 324 this.isLoading = false 324 325 this.isRefreshing = false 325 326 this.hasLoaded = false ··· 336 337 * Load for first render 337 338 */ 338 339 setup = bundleAsync(async (isRefreshing: boolean = false) => { 339 - this.rootStore.log.debug('NotificationsModel:refresh', {isRefreshing}) 340 + logger.debug('NotificationsModel:refresh', {isRefreshing}) 340 341 await this.lock.acquireAsync() 341 342 try { 342 343 this._xLoading(isRefreshing) ··· 368 369 * Sync the next set of notifications to show 369 370 */ 370 371 syncQueue = bundleAsync(async () => { 371 - this.rootStore.log.debug('NotificationsModel:syncQueue') 372 + logger.debug('NotificationsModel:syncQueue') 372 373 if (this.unreadCount >= MAX_VISIBLE_NOTIFS) { 373 374 return // no need to check 374 375 } ··· 401 402 this._setQueued(this._filterNotifications(queueModels)) 402 403 this._countUnread() 403 404 } catch (e) { 404 - this.rootStore.log.error('NotificationsModel:syncQueue failed', { 405 + logger.error('NotificationsModel:syncQueue failed', { 405 406 error: e, 406 407 }) 407 408 } finally { ··· 463 464 } 464 465 } 465 466 await Promise.all(promises).catch(e => { 466 - this.rootStore.log.error( 467 - 'Uncaught failure during notifications update()', 468 - e, 469 - ) 467 + logger.error('Uncaught failure during notifications update()', e) 470 468 }) 471 469 } 472 470 ··· 483 481 this.lastSync ? this.lastSync.toISOString() : undefined, 484 482 ) 485 483 } catch (e: any) { 486 - this.rootStore.log.warn('Failed to update notifications read state', { 484 + logger.warn('Failed to update notifications read state', { 487 485 error: e, 488 486 }) 489 487 } ··· 505 503 this.error = cleanError(error) 506 504 this.loadMoreError = cleanError(loadMoreError) 507 505 if (error) { 508 - this.rootStore.log.error('Failed to fetch notifications', {error}) 506 + logger.error('Failed to fetch notifications', {error}) 509 507 } 510 508 if (loadMoreError) { 511 - this.rootStore.log.error('Failed to load more notifications', { 509 + logger.error('Failed to load more notifications', { 512 510 error: loadMoreError, 513 511 }) 514 512 }
+7 -6
src/state/models/feeds/post.ts
··· 10 10 import {updateDataOptimistically} from 'lib/async/revertible' 11 11 import {track} from 'lib/analytics/analytics' 12 12 import {hackAddDeletedEmbed} from 'lib/api/hack-add-deleted-embed' 13 + import {logger} from '#/logger' 13 14 14 15 type FeedViewPost = AppBskyFeedDefs.FeedViewPost 15 16 type ReasonRepost = AppBskyFeedDefs.ReasonRepost ··· 42 43 } else { 43 44 this.postRecord = undefined 44 45 this.richText = undefined 45 - rootStore.log.warn('Received an invalid app.bsky.feed.post record', { 46 + logger.warn('Received an invalid app.bsky.feed.post record', { 46 47 error: valid.error, 47 48 }) 48 49 } 49 50 } else { 50 51 this.postRecord = undefined 51 52 this.richText = undefined 52 - rootStore.log.warn( 53 + logger.warn( 53 54 'app.bsky.feed.getTimeline or app.bsky.feed.getAuthorFeed served an unexpected record type', 54 55 {record: this.post.record}, 55 56 ) ··· 132 133 track('Post:Like') 133 134 } 134 135 } catch (error) { 135 - this.rootStore.log.error('Failed to toggle like', {error}) 136 + logger.error('Failed to toggle like', {error}) 136 137 } 137 138 } 138 139 ··· 167 168 track('Post:Repost') 168 169 } 169 170 } catch (error) { 170 - this.rootStore.log.error('Failed to toggle repost', {error}) 171 + logger.error('Failed to toggle repost', {error}) 171 172 } 172 173 } 173 174 ··· 181 182 track('Post:ThreadMute') 182 183 } 183 184 } catch (error) { 184 - this.rootStore.log.error('Failed to toggle thread mute', {error}) 185 + logger.error('Failed to toggle thread mute', {error}) 185 186 } 186 187 } 187 188 ··· 190 191 await this.rootStore.agent.deletePost(this.post.uri) 191 192 this.rootStore.emitPostDeleted(this.post.uri) 192 193 } catch (error) { 193 - this.rootStore.log.error('Failed to delete post', {error}) 194 + logger.error('Failed to delete post', {error}) 194 195 } finally { 195 196 track('Post:Delete') 196 197 }
+5 -4
src/state/models/feeds/posts.ts
··· 22 22 import {CustomFeedAPI} from 'lib/api/feed/custom' 23 23 import {ListFeedAPI} from 'lib/api/feed/list' 24 24 import {MergeFeedAPI} from 'lib/api/feed/merge' 25 + import {logger} from '#/logger' 25 26 26 27 const PAGE_SIZE = 30 27 28 ··· 161 162 * Nuke all data 162 163 */ 163 164 clear() { 164 - this.rootStore.log.debug('FeedModel:clear') 165 + logger.debug('FeedModel:clear') 165 166 this.isLoading = false 166 167 this.isRefreshing = false 167 168 this.hasNewLatest = false ··· 177 178 * Load for first render 178 179 */ 179 180 setup = bundleAsync(async (isRefreshing: boolean = false) => { 180 - this.rootStore.log.debug('FeedModel:setup', {isRefreshing}) 181 + logger.debug('FeedModel:setup', {isRefreshing}) 181 182 if (isRefreshing) { 182 183 this.isRefreshing = true // set optimistically for UI 183 184 } ··· 324 325 this.knownError = detectKnownError(this.feedType, error) 325 326 this.loadMoreError = cleanError(loadMoreError) 326 327 if (error) { 327 - this.rootStore.log.error('Posts feed request failed', {error}) 328 + logger.error('Posts feed request failed', {error}) 328 329 } 329 330 if (loadMoreError) { 330 - this.rootStore.log.error('Posts feed load-more request failed', { 331 + logger.error('Posts feed load-more request failed', { 331 332 error: loadMoreError, 332 333 }) 333 334 }
+2 -1
src/state/models/invited-users.ts
··· 2 2 import {ComAtprotoServerDefs, AppBskyActorDefs} from '@atproto/api' 3 3 import {RootStoreModel} from './root-store' 4 4 import {isObj, hasProp, isStrArray} from 'lib/type-guards' 5 + import {logger} from '#/logger' 5 6 6 7 export class InvitedUsers { 7 8 copiedInvites: string[] = [] ··· 63 64 }) 64 65 this.rootStore.me.follows.hydrateMany(this.profiles) 65 66 } catch (e) { 66 - this.rootStore.log.error('Failed to fetch profiles for invited users', { 67 + logger.error('Failed to fetch profiles for invited users', { 67 68 error: e, 68 69 }) 69 70 }
+2 -1
src/state/models/lists/actor-feeds.ts
··· 4 4 import {bundleAsync} from 'lib/async/bundle' 5 5 import {cleanError} from 'lib/strings/errors' 6 6 import {FeedSourceModel} from '../content/feed-source' 7 + import {logger} from '#/logger' 7 8 8 9 const PAGE_SIZE = 30 9 10 ··· 98 99 this.hasLoaded = true 99 100 this.error = cleanError(err) 100 101 if (err) { 101 - this.rootStore.log.error('Failed to fetch user followers', {error: err}) 102 + logger.error('Failed to fetch user followers', {error: err}) 102 103 } 103 104 } 104 105
+2 -1
src/state/models/lists/blocked-accounts.ts
··· 6 6 import {RootStoreModel} from '../root-store' 7 7 import {cleanError} from 'lib/strings/errors' 8 8 import {bundleAsync} from 'lib/async/bundle' 9 + import {logger} from '#/logger' 9 10 10 11 const PAGE_SIZE = 30 11 12 ··· 86 87 this.hasLoaded = true 87 88 this.error = cleanError(err) 88 89 if (err) { 89 - this.rootStore.log.error('Failed to fetch user followers', {error: err}) 90 + logger.error('Failed to fetch user followers', {error: err}) 90 91 } 91 92 } 92 93
+2 -1
src/state/models/lists/likes.ts
··· 5 5 import {cleanError} from 'lib/strings/errors' 6 6 import {bundleAsync} from 'lib/async/bundle' 7 7 import * as apilib from 'lib/api/index' 8 + import {logger} from '#/logger' 8 9 9 10 const PAGE_SIZE = 30 10 11 ··· 97 98 this.hasLoaded = true 98 99 this.error = cleanError(err) 99 100 if (err) { 100 - this.rootStore.log.error('Failed to fetch likes', {error: err}) 101 + logger.error('Failed to fetch likes', {error: err}) 101 102 } 102 103 } 103 104
+3 -2
src/state/models/lists/lists-list.ts
··· 4 4 import {cleanError} from 'lib/strings/errors' 5 5 import {bundleAsync} from 'lib/async/bundle' 6 6 import {accumulate} from 'lib/async/accumulate' 7 + import {logger} from '#/logger' 7 8 8 9 const PAGE_SIZE = 30 9 10 ··· 204 205 this.error = cleanError(err) 205 206 this.loadMoreError = cleanError(loadMoreErr) 206 207 if (err) { 207 - this.rootStore.log.error('Failed to fetch user lists', {error: err}) 208 + logger.error('Failed to fetch user lists', {error: err}) 208 209 } 209 210 if (loadMoreErr) { 210 - this.rootStore.log.error('Failed to fetch user lists', { 211 + logger.error('Failed to fetch user lists', { 211 212 error: loadMoreErr, 212 213 }) 213 214 }
+2 -1
src/state/models/lists/muted-accounts.ts
··· 6 6 import {RootStoreModel} from '../root-store' 7 7 import {cleanError} from 'lib/strings/errors' 8 8 import {bundleAsync} from 'lib/async/bundle' 9 + import {logger} from '#/logger' 9 10 10 11 const PAGE_SIZE = 30 11 12 ··· 86 87 this.hasLoaded = true 87 88 this.error = cleanError(err) 88 89 if (err) { 89 - this.rootStore.log.error('Failed to fetch user followers', {error: err}) 90 + logger.error('Failed to fetch user followers', {error: err}) 90 91 } 91 92 } 92 93
+2 -1
src/state/models/lists/reposted-by.ts
··· 8 8 import {bundleAsync} from 'lib/async/bundle' 9 9 import {cleanError} from 'lib/strings/errors' 10 10 import * as apilib from 'lib/api/index' 11 + import {logger} from '#/logger' 11 12 12 13 const PAGE_SIZE = 30 13 14 ··· 100 101 this.hasLoaded = true 101 102 this.error = cleanError(err) 102 103 if (err) { 103 - this.rootStore.log.error('Failed to fetch reposted by view', {error: err}) 104 + logger.error('Failed to fetch reposted by view', {error: err}) 104 105 } 105 106 } 106 107
+2 -1
src/state/models/lists/user-followers.ts
··· 6 6 import {RootStoreModel} from '../root-store' 7 7 import {cleanError} from 'lib/strings/errors' 8 8 import {bundleAsync} from 'lib/async/bundle' 9 + import {logger} from '#/logger' 9 10 10 11 const PAGE_SIZE = 30 11 12 ··· 99 100 this.hasLoaded = true 100 101 this.error = cleanError(err) 101 102 if (err) { 102 - this.rootStore.log.error('Failed to fetch user followers', {error: err}) 103 + logger.error('Failed to fetch user followers', {error: err}) 103 104 } 104 105 } 105 106
+2 -1
src/state/models/lists/user-follows.ts
··· 6 6 import {RootStoreModel} from '../root-store' 7 7 import {cleanError} from 'lib/strings/errors' 8 8 import {bundleAsync} from 'lib/async/bundle' 9 + import {logger} from '#/logger' 9 10 10 11 const PAGE_SIZE = 30 11 12 ··· 99 100 this.hasLoaded = true 100 101 this.error = cleanError(err) 101 102 if (err) { 102 - this.rootStore.log.error('Failed to fetch user follows', err) 103 + logger.error('Failed to fetch user follows', err) 103 104 } 104 105 } 105 106
+10 -9
src/state/models/me.ts
··· 9 9 import {MyFeedsUIModel} from './ui/my-feeds' 10 10 import {MyFollowsCache} from './cache/my-follows' 11 11 import {isObj, hasProp} from 'lib/type-guards' 12 + import {logger} from '#/logger' 12 13 13 14 const PROFILE_UPDATE_INTERVAL = 10 * 60 * 1e3 // 10min 14 15 const NOTIFS_UPDATE_INTERVAL = 30 * 1e3 // 30sec ··· 104 105 105 106 async load() { 106 107 const sess = this.rootStore.session 107 - this.rootStore.log.debug('MeModel:load', {hasSession: sess.hasSession}) 108 + logger.debug('MeModel:load', {hasSession: sess.hasSession}) 108 109 if (sess.hasSession) { 109 110 this.did = sess.currentSession?.did || '' 110 111 await this.fetchProfile() 111 112 this.mainFeed.clear() 112 113 /* dont await */ this.mainFeed.setup().catch(e => { 113 - this.rootStore.log.error('Failed to setup main feed model', {error: e}) 114 + logger.error('Failed to setup main feed model', {error: e}) 114 115 }) 115 116 /* dont await */ this.notifications.setup().catch(e => { 116 - this.rootStore.log.error('Failed to setup notifications model', { 117 + logger.error('Failed to setup notifications model', { 117 118 error: e, 118 119 }) 119 120 }) 120 121 /* dont await */ this.notifications.setup().catch(e => { 121 - this.rootStore.log.error('Failed to setup notifications model', { 122 + logger.error('Failed to setup notifications model', { 122 123 error: e, 123 124 }) 124 125 }) ··· 134 135 135 136 async updateIfNeeded() { 136 137 if (Date.now() - this.lastProfileStateUpdate > PROFILE_UPDATE_INTERVAL) { 137 - this.rootStore.log.debug('Updating me profile information') 138 + logger.debug('Updating me profile information') 138 139 this.lastProfileStateUpdate = Date.now() 139 140 await this.fetchProfile() 140 141 await this.fetchInviteCodes() ··· 188 189 }) 189 190 }) 190 191 } catch (e) { 191 - this.rootStore.log.error('Failed to fetch user invite codes', { 192 + logger.error('Failed to fetch user invite codes', { 192 193 error: e, 193 194 }) 194 195 } ··· 205 206 this.appPasswords = res.data.passwords 206 207 }) 207 208 } catch (e) { 208 - this.rootStore.log.error('Failed to fetch user app passwords', { 209 + logger.error('Failed to fetch user app passwords', { 209 210 error: e, 210 211 }) 211 212 } ··· 228 229 }) 229 230 return res.data 230 231 } catch (e) { 231 - this.rootStore.log.error('Failed to create app password', {error: e}) 232 + logger.error('Failed to create app password', {error: e}) 232 233 } 233 234 } 234 235 } ··· 243 244 this.appPasswords = this.appPasswords.filter(p => p.name !== name) 244 245 }) 245 246 } catch (e) { 246 - this.rootStore.log.error('Failed to delete app password', {error: e}) 247 + logger.error('Failed to delete app password', {error: e}) 247 248 } 248 249 } 249 250 }
+2 -1
src/state/models/media/image.ts
··· 9 9 import {Position} from 'react-avatar-editor' 10 10 import {Dimensions} from 'lib/media/types' 11 11 import {isIOS} from 'platform/detection' 12 + import {logger} from '#/logger' 12 13 13 14 export interface ImageManipulationAttributes { 14 15 aspectRatio?: '4:3' | '1:1' | '3:4' | 'None' ··· 188 189 this.cropped = cropped 189 190 }) 190 191 } catch (err) { 191 - this.rootStore.log.error('Failed to crop photo', {error: err}) 192 + logger.error('Failed to crop photo', {error: err}) 192 193 } 193 194 } 194 195
+7 -8
src/state/models/root-store.ts
··· 41 41 export class RootStoreModel { 42 42 agent: BskyAgent 43 43 appInfo?: AppInfo 44 - log = logger 45 44 session = new SessionModel(this) 46 45 shell = new ShellUiModel(this) 47 46 preferences = new PreferencesModel(this) ··· 122 121 * Called during init to resume any stored session. 123 122 */ 124 123 async attemptSessionResumption() { 125 - this.log.debug('RootStoreModel:attemptSessionResumption') 124 + logger.debug('RootStoreModel:attemptSessionResumption') 126 125 try { 127 126 await this.session.attemptSessionResumption() 128 - this.log.debug('Session initialized', { 127 + logger.debug('Session initialized', { 129 128 hasSession: this.session.hasSession, 130 129 }) 131 130 this.updateSessionState() 132 131 } catch (e: any) { 133 - this.log.warn('Failed to initialize session', {error: e}) 132 + logger.warn('Failed to initialize session', {error: e}) 134 133 } 135 134 } 136 135 ··· 141 140 agent: BskyAgent, 142 141 {hadSession}: {hadSession: boolean}, 143 142 ) { 144 - this.log.debug('RootStoreModel:handleSessionChange') 143 + logger.debug('RootStoreModel:handleSessionChange') 145 144 this.agent = agent 146 145 applyDebugHeader(this.agent) 147 146 this.me.clear() ··· 157 156 * Called by the session model. Handles session drops by informing the user. 158 157 */ 159 158 async handleSessionDrop() { 160 - this.log.debug('RootStoreModel:handleSessionDrop') 159 + logger.debug('RootStoreModel:handleSessionDrop') 161 160 resetToTab('HomeTab') 162 161 this.me.clear() 163 162 this.emitSessionDropped() ··· 167 166 * Clears all session-oriented state. 168 167 */ 169 168 clearAllSessionState() { 170 - this.log.debug('RootStoreModel:clearAllSessionState') 169 + logger.debug('RootStoreModel:clearAllSessionState') 171 170 this.session.clear() 172 171 resetToTab('HomeTab') 173 172 this.me.clear() ··· 184 183 await this.me.updateIfNeeded() 185 184 await this.preferences.sync() 186 185 } catch (e: any) { 187 - this.log.error('Failed to fetch latest state', {error: e}) 186 + logger.error('Failed to fetch latest state', {error: e}) 188 187 } 189 188 } 190 189
+2 -1
src/state/models/session.ts
··· 12 12 import {RootStoreModel} from './root-store' 13 13 import {IS_PROD} from 'lib/constants' 14 14 import {track} from 'lib/analytics/analytics' 15 + import {logger} from '#/logger' 15 16 16 17 export type ServiceDescription = DescribeServer.OutputSchema 17 18 ··· 56 57 ), 57 58 isResumingSession: this.isResumingSession, 58 59 } 59 - this.rootStore.log.debug(message, details) 60 + logger.debug(message, details, logger.DebugContext.session) 60 61 } 61 62 62 63 /**
+3 -2
src/state/models/ui/create-account.ts
··· 8 8 import {cleanError} from 'lib/strings/errors' 9 9 import {getAge} from 'lib/strings/time' 10 10 import {track} from 'lib/analytics/analytics' 11 + import {logger} from '#/logger' 11 12 12 13 const DEFAULT_DATE = new Date(Date.now() - 60e3 * 60 * 24 * 365 * 20) // default to 20 years ago 13 14 ··· 76 77 this.setServiceDescription(desc) 77 78 this.setUserDomain(desc.availableUserDomains[0]) 78 79 } catch (err: any) { 79 - this.rootStore.log.warn( 80 + logger.warn( 80 81 `Failed to fetch service description for ${this.serviceUrl}`, 81 82 {error: err}, 82 83 ) ··· 127 128 errMsg = 128 129 'Invite code not accepted. Check that you input it correctly and try again.' 129 130 } 130 - this.rootStore.log.error('Failed to create account', {error: e}) 131 + logger.error('Failed to create account', {error: e}) 131 132 this.setIsProcessing(false) 132 133 this.setError(cleanError(errMsg)) 133 134 throw e
+2 -1
src/state/models/ui/preferences.ts
··· 14 14 import {getAge} from 'lib/strings/time' 15 15 import {FeedTuner} from 'lib/api/feed-manip' 16 16 import {LANGUAGES} from '../../../locale/languages' 17 + import {logger} from '#/logger' 17 18 18 19 // TEMP we need to permanently convert 'show' to 'ignore', for now we manually convert -prf 19 20 export type LabelPreference = APILabelPreference | 'show' ··· 246 247 }) 247 248 await this.rootStore.agent.setSavedFeeds(saved, pinned) 248 249 } catch (error) { 249 - this.rootStore.log.error('Failed to set default feeds', {error}) 250 + logger.error('Failed to set default feeds', {error}) 250 251 } 251 252 } 252 253 } finally {
+4 -9
src/state/models/ui/profile.ts
··· 4 4 import {PostsFeedModel} from '../feeds/posts' 5 5 import {ActorFeedsModel} from '../lists/actor-feeds' 6 6 import {ListsListModel} from '../lists/lists-list' 7 + import {logger} from '#/logger' 7 8 8 9 export enum Sections { 9 10 PostsNoReplies = 'Posts', ··· 223 224 await Promise.all([ 224 225 this.profile 225 226 .setup() 226 - .catch(err => 227 - this.rootStore.log.error('Failed to fetch profile', {error: err}), 228 - ), 227 + .catch(err => logger.error('Failed to fetch profile', {error: err})), 229 228 this.feed 230 229 .setup() 231 - .catch(err => 232 - this.rootStore.log.error('Failed to fetch feed', {error: err}), 233 - ), 230 + .catch(err => logger.error('Failed to fetch feed', {error: err})), 234 231 ]) 235 232 runInAction(() => { 236 233 this.isAuthenticatedUser = ··· 241 238 this.lists.source = this.profile.did 242 239 this.lists 243 240 .loadMore() 244 - .catch(err => 245 - this.rootStore.log.error('Failed to fetch lists', {error: err}), 246 - ) 241 + .catch(err => logger.error('Failed to fetch lists', {error: err})) 247 242 } 248 243 249 244 async refresh() {
+2 -1
src/state/models/ui/saved-feeds.ts
··· 4 4 import {cleanError} from 'lib/strings/errors' 5 5 import {FeedSourceModel} from '../content/feed-source' 6 6 import {track} from 'lib/analytics/analytics' 7 + import {logger} from '#/logger' 7 8 8 9 export class SavedFeedsModel { 9 10 // state ··· 126 127 this.hasLoaded = true 127 128 this.error = cleanError(err) 128 129 if (err) { 129 - this.rootStore.log.error('Failed to fetch user feeds', {err}) 130 + logger.error('Failed to fetch user feeds', {err}) 130 131 } 131 132 } 132 133
+8 -9
src/view/com/auth/login/Login.tsx
··· 30 30 import {useTheme} from 'lib/ThemeContext' 31 31 import {cleanError} from 'lib/strings/errors' 32 32 import {isWeb} from 'platform/detection' 33 + import {logger} from '#/logger' 33 34 34 35 enum Forms { 35 36 Login, ··· 81 82 if (aborted) { 82 83 return 83 84 } 84 - store.log.warn( 85 - `Failed to fetch service description for ${serviceUrl}`, 86 - {error: err}, 87 - ) 85 + logger.warn(`Failed to fetch service description for ${serviceUrl}`, { 86 + error: err, 87 + }) 88 88 setError( 89 89 'Unable to contact your service. Please check your Internet connection.', 90 90 ) ··· 93 93 return () => { 94 94 aborted = true 95 95 } 96 - }, [store.session, store.log, serviceUrl, retryDescribeTrigger]) 96 + }, [store.session, serviceUrl, retryDescribeTrigger]) 97 97 98 98 const onPressRetryConnect = () => setRetryDescribeTrigger({}) 99 99 const onPressForgotPassword = () => { ··· 349 349 }) 350 350 } catch (e: any) { 351 351 const errMsg = e.toString() 352 - store.log.warn('Failed to login', {error: e}) 352 + logger.warn('Failed to login', {error: e}) 353 353 setIsProcessing(false) 354 354 if (errMsg.includes('Authentication Required')) { 355 355 setError('Invalid username or password') ··· 578 578 onEmailSent() 579 579 } catch (e: any) { 580 580 const errMsg = e.toString() 581 - store.log.warn('Failed to request password reset', {error: e}) 581 + logger.warn('Failed to request password reset', {error: e}) 582 582 setIsProcessing(false) 583 583 if (isNetworkError(e)) { 584 584 setError( ··· 694 694 } 695 695 696 696 const SetNewPasswordForm = ({ 697 - store, 698 697 error, 699 698 serviceUrl, 700 699 setError, ··· 734 733 onPasswordSet() 735 734 } catch (e: any) { 736 735 const errMsg = e.toString() 737 - store.log.warn('Failed to set new password', {error: e}) 736 + logger.warn('Failed to set new password', {error: e}) 738 737 setIsProcessing(false) 739 738 if (isNetworkError(e)) { 740 739 setError(
+2 -1
src/view/com/composer/photos/OpenCameraBtn.tsx
··· 12 12 import {HITSLOP_10, POST_IMG_MAX} from 'lib/constants' 13 13 import {GalleryModel} from 'state/models/media/gallery' 14 14 import {isMobileWeb, isNative} from 'platform/detection' 15 + import {logger} from '#/logger' 15 16 16 17 type Props = { 17 18 gallery: GalleryModel ··· 39 40 gallery.add(img) 40 41 } catch (err: any) { 41 42 // ignore 42 - store.log.warn('Error using camera', {error: err}) 43 + logger.warn('Error using camera', {error: err}) 43 44 } 44 45 }, [gallery, track, store, requestCameraAccessIfNeeded]) 45 46
+4 -3
src/view/com/composer/useExternalLinkFetch.ts
··· 16 16 } from 'lib/strings/url-helpers' 17 17 import {ComposerOpts} from 'state/models/ui/shell' 18 18 import {POST_IMG_MAX} from 'lib/constants' 19 + import {logger} from '#/logger' 19 20 20 21 export function useExternalLinkFetch({ 21 22 setQuote, ··· 46 47 setExtLink(undefined) 47 48 }, 48 49 err => { 49 - store.log.error('Failed to fetch post for quote embedding', { 50 + logger.error('Failed to fetch post for quote embedding', { 50 51 error: err, 51 52 }) 52 53 setExtLink(undefined) ··· 66 67 }) 67 68 }, 68 69 err => { 69 - store.log.error('Failed to fetch feed for embedding', {error: err}) 70 + logger.error('Failed to fetch feed for embedding', {error: err}) 70 71 setExtLink(undefined) 71 72 }, 72 73 ) ··· 84 85 }) 85 86 }, 86 87 err => { 87 - store.log.error('Failed to fetch list for embedding', {error: err}) 88 + logger.error('Failed to fetch list for embedding', {error: err}) 88 89 setExtLink(undefined) 89 90 }, 90 91 )
+4 -3
src/view/com/feeds/FeedPage.tsx
··· 20 20 import {FAB} from '../util/fab/FAB' 21 21 import {LoadLatestBtn} from '../util/load-latest/LoadLatestBtn' 22 22 import useAppState from 'react-native-appstate-hook' 23 + import {logger} from '#/logger' 23 24 24 25 export const FeedPage = observer(function FeedPageImpl({ 25 26 testID, ··· 66 67 if (feed.isLoading) { 67 68 return 68 69 } 69 - store.log.debug('HomeScreen: Polling for new posts') 70 + logger.debug('HomeScreen: Polling for new posts') 70 71 feed.checkForLatest() 71 72 }, 72 - [appState, isScreenFocused, isPageFocused, store, feed], 73 + [appState, isScreenFocused, isPageFocused, feed], 73 74 ) 74 75 75 76 const scrollToTop = React.useCallback(() => { ··· 96 97 const pollInterval = setInterval(doPoll, POLL_FREQ) 97 98 98 99 screen('Feed') 99 - store.log.debug('HomeScreen: Updating feed') 100 + logger.debug('HomeScreen: Updating feed') 100 101 feed.checkForLatest() 101 102 102 103 return () => {
+3 -2
src/view/com/feeds/FeedSourceCard.tsx
··· 15 15 import {AtUri} from '@atproto/api' 16 16 import * as Toast from 'view/com/util/Toast' 17 17 import {sanitizeHandle} from 'lib/strings/handles' 18 + import {logger} from '#/logger' 18 19 19 20 export const FeedSourceCard = observer(function FeedSourceCardImpl({ 20 21 item, ··· 45 46 Toast.show('Removed from my feeds') 46 47 } catch (e) { 47 48 Toast.show('There was an issue contacting your server') 48 - store.log.error('Failed to unsave feed', {error: e}) 49 + logger.error('Failed to unsave feed', {error: e}) 49 50 } 50 51 }, 51 52 }) ··· 55 56 Toast.show('Added to my feeds') 56 57 } catch (e) { 57 58 Toast.show('There was an issue contacting your server') 58 - store.log.error('Failed to save feed', {error: e}) 59 + logger.error('Failed to save feed', {error: e}) 59 60 } 60 61 } 61 62 }, [store, item])
+3 -2
src/view/com/lists/ListItems.tsx
··· 21 21 import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' 22 22 import {s} from 'lib/styles' 23 23 import {OnScrollCb} from 'lib/hooks/useOnMainScroll' 24 + import {logger} from '#/logger' 24 25 25 26 const LOADING_ITEM = {_reactKey: '__loading__'} 26 27 const EMPTY_ITEM = {_reactKey: '__empty__'} ··· 94 95 try { 95 96 await list.refresh() 96 97 } catch (err) { 97 - list.rootStore.log.error('Failed to refresh lists', {error: err}) 98 + logger.error('Failed to refresh lists', {error: err}) 98 99 } 99 100 setIsRefreshing(false) 100 101 }, [list, track, setIsRefreshing]) ··· 104 105 try { 105 106 await list.loadMore() 106 107 } catch (err) { 107 - list.rootStore.log.error('Failed to load more lists', {error: err}) 108 + logger.error('Failed to load more lists', {error: err}) 108 109 } 109 110 }, [list, track]) 110 111
+3 -2
src/view/com/lists/ListsList.tsx
··· 19 19 import {usePalette} from 'lib/hooks/usePalette' 20 20 import {FlatList} from '../util/Views.web' 21 21 import {s} from 'lib/styles' 22 + import {logger} from '#/logger' 22 23 23 24 const LOADING = {_reactKey: '__loading__'} 24 25 const EMPTY = {_reactKey: '__empty__'} ··· 78 79 try { 79 80 await listsList.refresh() 80 81 } catch (err) { 81 - listsList.rootStore.log.error('Failed to refresh lists', {error: err}) 82 + logger.error('Failed to refresh lists', {error: err}) 82 83 } 83 84 setIsRefreshing(false) 84 85 }, [listsList, track, setIsRefreshing]) ··· 88 89 try { 89 90 await listsList.loadMore() 90 91 } catch (err) { 91 - listsList.rootStore.log.error('Failed to load more lists', {error: err}) 92 + logger.error('Failed to load more lists', {error: err}) 92 93 } 93 94 }, [listsList, track]) 94 95
+2 -1
src/view/com/modals/AddAppPasswords.tsx
··· 12 12 } from '@fortawesome/react-native-fontawesome' 13 13 import Clipboard from '@react-native-clipboard/clipboard' 14 14 import * as Toast from '../util/Toast' 15 + import {logger} from '#/logger' 15 16 16 17 export const snapPoints = ['70%'] 17 18 ··· 95 96 } 96 97 } catch (e) { 97 98 Toast.show('Failed to create app password.') 98 - store.log.error('Failed to create app password', {error: e}) 99 + logger.error('Failed to create app password', {error: e}) 99 100 } 100 101 } 101 102
+6 -6
src/view/com/modals/ChangeHandle.tsx
··· 21 21 import {useTheme} from 'lib/ThemeContext' 22 22 import {useAnalytics} from 'lib/analytics/analytics' 23 23 import {cleanError} from 'lib/strings/errors' 24 + import {logger} from '#/logger' 24 25 25 26 export const snapPoints = ['100%'] 26 27 ··· 65 66 return 66 67 } 67 68 setProcessing(false) 68 - store.log.warn( 69 + logger.warn( 69 70 `Failed to fetch service description for ${String( 70 71 store.agent.service, 71 72 )}`, ··· 79 80 return () => { 80 81 aborted = true 81 82 } 82 - }, [store.agent.service, store.session, store.log, retryDescribeTrigger]) 83 + }, [store.agent.service, store.session, retryDescribeTrigger]) 83 84 84 85 // events 85 86 // = ··· 105 106 try { 106 107 track('EditHandle:SetNewHandle') 107 108 const newHandle = isCustom ? handle : createFullHandle(handle, userDomain) 108 - store.log.debug(`Updating handle to ${newHandle}`) 109 + logger.debug(`Updating handle to ${newHandle}`) 109 110 await store.agent.updateHandle({ 110 111 handle: newHandle, 111 112 }) ··· 113 114 onChanged() 114 115 } catch (err: any) { 115 116 setError(cleanError(err)) 116 - store.log.error('Failed to update handle', {handle, error: err}) 117 + logger.error('Failed to update handle', {handle, error: err}) 117 118 } finally { 118 119 setProcessing(false) 119 120 } ··· 343 344 } 344 345 } catch (err: any) { 345 346 setError(cleanError(err)) 346 - store.log.error('Failed to verify domain', {handle, error: err}) 347 + logger.error('Failed to verify domain', {handle, error: err}) 347 348 } finally { 348 349 setIsVerifying(false) 349 350 } ··· 355 356 setError, 356 357 canSave, 357 358 onPressSave, 358 - store.log, 359 359 store.agent, 360 360 ]) 361 361
+3 -2
src/view/com/modals/ContentFilteringSettings.tsx
··· 15 15 import {isIOS} from 'platform/detection' 16 16 import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' 17 17 import * as Toast from '../util/Toast' 18 + import {logger} from '#/logger' 18 19 19 20 export const snapPoints = ['90%'] 20 21 ··· 103 104 Toast.show( 104 105 'There was an issue syncing your preferences with the server', 105 106 ) 106 - store.log.error('Failed to update preferences with server', {error: e}) 107 + logger.error('Failed to update preferences with server', {error: e}) 107 108 } 108 109 } 109 110 ··· 168 169 Toast.show( 169 170 'There was an issue syncing your preferences with the server', 170 171 ) 171 - store.log.error('Failed to update preferences with server', {error: e}) 172 + logger.error('Failed to update preferences with server', {error: e}) 172 173 } 173 174 }, 174 175 [store, group],
+3 -2
src/view/com/modals/UserAddRemoveLists.tsx
··· 20 20 import {usePalette} from 'lib/hooks/usePalette' 21 21 import {isWeb, isAndroid} from 'platform/detection' 22 22 import isEqual from 'lodash.isequal' 23 + import {logger} from '#/logger' 23 24 24 25 export const snapPoints = ['fullscreen'] 25 26 ··· 62 63 setMembershipsLoaded(true) 63 64 }, 64 65 err => { 65 - store.log.error('Failed to fetch memberships', {error: err}) 66 + logger.error('Failed to fetch memberships', {error: err}) 66 67 }, 67 68 ) 68 69 }, [memberships, listsList, store, setSelected, setMembershipsLoaded]) ··· 76 77 try { 77 78 changes = await memberships.updateTo(selected) 78 79 } catch (err) { 79 - store.log.error('Failed to update memberships', {error: err}) 80 + logger.error('Failed to update memberships', {error: err}) 80 81 return 81 82 } 82 83 Toast.show('Lists updated')
+3 -2
src/view/com/notifications/Feed.tsx
··· 11 11 import {OnScrollCb} from 'lib/hooks/useOnMainScroll' 12 12 import {s} from 'lib/styles' 13 13 import {usePalette} from 'lib/hooks/usePalette' 14 + import {logger} from '#/logger' 14 15 15 16 const EMPTY_FEED_ITEM = {_reactKey: '__empty__'} 16 17 const LOAD_MORE_ERROR_ITEM = {_reactKey: '__load_more_error__'} ··· 61 62 setIsPTRing(true) 62 63 await view.refresh() 63 64 } catch (err) { 64 - view.rootStore.log.error('Failed to refresh notifications feed', { 65 + logger.error('Failed to refresh notifications feed', { 65 66 error: err, 66 67 }) 67 68 } finally { ··· 73 74 try { 74 75 await view.loadMore() 75 76 } catch (err) { 76 - view.rootStore.log.error('Failed to load more notifications', { 77 + logger.error('Failed to load more notifications', { 77 78 error: err, 78 79 }) 79 80 }
+4 -5
src/view/com/post-thread/PostLikedBy.tsx
··· 7 7 import {ProfileCardWithFollowBtn} from '../profile/ProfileCard' 8 8 import {useStores} from 'state/index' 9 9 import {usePalette} from 'lib/hooks/usePalette' 10 + import {logger} from '#/logger' 10 11 11 12 export const PostLikedBy = observer(function PostLikedByImpl({ 12 13 uri, ··· 20 21 useEffect(() => { 21 22 view 22 23 .loadMore() 23 - .catch(err => store.log.error('Failed to fetch likes', {error: err})) 24 - }, [view, store.log]) 24 + .catch(err => logger.error('Failed to fetch likes', {error: err})) 25 + }, [view]) 25 26 26 27 const onRefresh = () => { 27 28 view.refresh() ··· 29 30 const onEndReached = () => { 30 31 view 31 32 .loadMore() 32 - .catch(err => 33 - view?.rootStore.log.error('Failed to load more likes', {error: err}), 34 - ) 33 + .catch(err => logger.error('Failed to load more likes', {error: err})) 35 34 } 36 35 37 36 if (!view.hasLoaded) {
+4 -5
src/view/com/post-thread/PostRepostedBy.tsx
··· 7 7 import {ErrorMessage} from '../util/error/ErrorMessage' 8 8 import {useStores} from 'state/index' 9 9 import {usePalette} from 'lib/hooks/usePalette' 10 + import {logger} from '#/logger' 10 11 11 12 export const PostRepostedBy = observer(function PostRepostedByImpl({ 12 13 uri, ··· 23 24 useEffect(() => { 24 25 view 25 26 .loadMore() 26 - .catch(err => store.log.error('Failed to fetch reposts', {error: err})) 27 - }, [view, store.log]) 27 + .catch(err => logger.error('Failed to fetch reposts', {error: err})) 28 + }, [view]) 28 29 29 30 const onRefresh = () => { 30 31 view.refresh() ··· 32 33 const onEndReached = () => { 33 34 view 34 35 .loadMore() 35 - .catch(err => 36 - view?.rootStore.log.error('Failed to load more reposts', {error: err}), 37 - ) 36 + .catch(err => logger.error('Failed to load more reposts', {error: err})) 38 37 } 39 38 40 39 if (!view.hasLoaded) {
+2 -1
src/view/com/post-thread/PostThread.tsx
··· 30 30 import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' 31 31 import {NavigationProp} from 'lib/routes/types' 32 32 import {sanitizeDisplayName} from 'lib/strings/display-names' 33 + import {logger} from '#/logger' 33 34 34 35 const MAINTAIN_VISIBLE_CONTENT_POSITION = {minIndexForVisible: 2} 35 36 ··· 119 120 try { 120 121 view?.refresh() 121 122 } catch (err) { 122 - view.rootStore.log.error('Failed to refresh posts thread', {error: err}) 123 + logger.error('Failed to refresh posts thread', {error: err}) 123 124 } 124 125 setIsRefreshing(false) 125 126 }, [view, setIsRefreshing])
+9 -8
src/view/com/post-thread/PostThreadItem.tsx
··· 36 36 import {makeProfileLink} from 'lib/routes/links' 37 37 import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' 38 38 import {MAX_POST_LINES} from 'lib/constants' 39 + import {logger} from '#/logger' 39 40 40 41 export const PostThreadItem = observer(function PostThreadItem({ 41 42 item, ··· 111 112 const onPressToggleRepost = React.useCallback(() => { 112 113 return item 113 114 .toggleRepost() 114 - .catch(e => store.log.error('Failed to toggle repost', {error: e})) 115 - }, [item, store]) 115 + .catch(e => logger.error('Failed to toggle repost', {error: e})) 116 + }, [item]) 116 117 117 118 const onPressToggleLike = React.useCallback(() => { 118 119 return item 119 120 .toggleLike() 120 - .catch(e => store.log.error('Failed to toggle like', {error: e})) 121 - }, [item, store]) 121 + .catch(e => logger.error('Failed to toggle like', {error: e})) 122 + }, [item]) 122 123 123 124 const onCopyPostText = React.useCallback(() => { 124 125 Clipboard.setString(record?.text || '') ··· 138 139 Toast.show('You will now receive notifications for this thread') 139 140 } 140 141 } catch (e) { 141 - store.log.error('Failed to toggle thread mute', {error: e}) 142 + logger.error('Failed to toggle thread mute', {error: e}) 142 143 } 143 - }, [item, store]) 144 + }, [item]) 144 145 145 146 const onDeletePost = React.useCallback(() => { 146 147 item.delete().then( ··· 149 150 Toast.show('Post deleted') 150 151 }, 151 152 e => { 152 - store.log.error('Failed to delete post', {error: e}) 153 + logger.error('Failed to delete post', {error: e}) 153 154 Toast.show('Failed to delete post, please try again') 154 155 }, 155 156 ) 156 - }, [item, store]) 157 + }, [item]) 157 158 158 159 const onPressShowMore = React.useCallback(() => { 159 160 setLimitLines(false)
+9 -8
src/view/com/post/Post.tsx
··· 32 32 import {makeProfileLink} from 'lib/routes/links' 33 33 import {MAX_POST_LINES} from 'lib/constants' 34 34 import {countLines} from 'lib/strings/helpers' 35 + import {logger} from '#/logger' 35 36 36 37 export const Post = observer(function PostImpl({ 37 38 view, ··· 142 143 const onPressToggleRepost = React.useCallback(() => { 143 144 return item 144 145 .toggleRepost() 145 - .catch(e => store.log.error('Failed to toggle repost', {error: e})) 146 - }, [item, store]) 146 + .catch(e => logger.error('Failed to toggle repost', {error: e})) 147 + }, [item]) 147 148 148 149 const onPressToggleLike = React.useCallback(() => { 149 150 return item 150 151 .toggleLike() 151 - .catch(e => store.log.error('Failed to toggle like', {error: e})) 152 - }, [item, store]) 152 + .catch(e => logger.error('Failed to toggle like', {error: e})) 153 + }, [item]) 153 154 154 155 const onCopyPostText = React.useCallback(() => { 155 156 Clipboard.setString(record.text) ··· 169 170 Toast.show('You will now receive notifications for this thread') 170 171 } 171 172 } catch (e) { 172 - store.log.error('Failed to toggle thread mute', {error: e}) 173 + logger.error('Failed to toggle thread mute', {error: e}) 173 174 } 174 - }, [item, store]) 175 + }, [item]) 175 176 176 177 const onDeletePost = React.useCallback(() => { 177 178 item.delete().then( ··· 180 181 Toast.show('Post deleted') 181 182 }, 182 183 e => { 183 - store.log.error('Failed to delete post', {error: e}) 184 + logger.error('Failed to delete post', {error: e}) 184 185 Toast.show('Failed to delete post, please try again') 185 186 }, 186 187 ) 187 - }, [item, setDeleted, store]) 188 + }, [item, setDeleted]) 188 189 189 190 const onPressShowMore = React.useCallback(() => { 190 191 setLimitLines(false)
+3 -2
src/view/com/posts/Feed.tsx
··· 19 19 import {useAnalytics} from 'lib/analytics/analytics' 20 20 import {usePalette} from 'lib/hooks/usePalette' 21 21 import {useTheme} from 'lib/ThemeContext' 22 + import {logger} from '#/logger' 22 23 23 24 const LOADING_ITEM = {_reactKey: '__loading__'} 24 25 const EMPTY_FEED_ITEM = {_reactKey: '__empty__'} ··· 92 93 try { 93 94 await feed.refresh() 94 95 } catch (err) { 95 - feed.rootStore.log.error('Failed to refresh posts feed', {error: err}) 96 + logger.error('Failed to refresh posts feed', {error: err}) 96 97 } 97 98 setIsRefreshing(false) 98 99 }, [feed, track, setIsRefreshing]) ··· 104 105 try { 105 106 await feed.loadMore() 106 107 } catch (err) { 107 - feed.rootStore.log.error('Failed to load more posts', {error: err}) 108 + logger.error('Failed to load more posts', {error: err}) 108 109 } 109 110 }, [feed, track]) 110 111
+2 -1
src/view/com/posts/FeedErrorMessage.tsx
··· 10 10 import {useNavigation} from '@react-navigation/native' 11 11 import {NavigationProp} from 'lib/routes/types' 12 12 import {useStores} from 'state/index' 13 + import {logger} from '#/logger' 13 14 14 15 const MESSAGES = { 15 16 [KnownError.Unknown]: '', ··· 73 74 Toast.show( 74 75 'There was an an issue removing this feed. Please check your internet connection and try again.', 75 76 ) 76 - store.log.error('Failed to remove feed', {error: err}) 77 + logger.error('Failed to remove feed', {error: err}) 77 78 } 78 79 }, 79 80 onPressCancel() {
+9 -8
src/view/com/posts/FeedItem.tsx
··· 32 32 import {isEmbedByEmbedder} from 'lib/embeds' 33 33 import {MAX_POST_LINES} from 'lib/constants' 34 34 import {countLines} from 'lib/strings/helpers' 35 + import {logger} from '#/logger' 35 36 36 37 export const FeedItem = observer(function FeedItemImpl({ 37 38 item, ··· 94 95 track('FeedItem:PostRepost') 95 96 return item 96 97 .toggleRepost() 97 - .catch(e => store.log.error('Failed to toggle repost', {error: e})) 98 - }, [track, item, store]) 98 + .catch(e => logger.error('Failed to toggle repost', {error: e})) 99 + }, [track, item]) 99 100 100 101 const onPressToggleLike = React.useCallback(() => { 101 102 track('FeedItem:PostLike') 102 103 return item 103 104 .toggleLike() 104 - .catch(e => store.log.error('Failed to toggle like', {error: e})) 105 - }, [track, item, store]) 105 + .catch(e => logger.error('Failed to toggle like', {error: e})) 106 + }, [track, item]) 106 107 107 108 const onCopyPostText = React.useCallback(() => { 108 109 Clipboard.setString(record?.text || '') ··· 123 124 Toast.show('You will now receive notifications for this thread') 124 125 } 125 126 } catch (e) { 126 - store.log.error('Failed to toggle thread mute', {error: e}) 127 + logger.error('Failed to toggle thread mute', {error: e}) 127 128 } 128 - }, [track, item, store]) 129 + }, [track, item]) 129 130 130 131 const onDeletePost = React.useCallback(() => { 131 132 track('FeedItem:PostDelete') ··· 135 136 Toast.show('Post deleted') 136 137 }, 137 138 e => { 138 - store.log.error('Failed to delete post', {error: e}) 139 + logger.error('Failed to delete post', {error: e}) 139 140 Toast.show('Failed to delete post, please try again') 140 141 }, 141 142 ) 142 - }, [track, item, setDeleted, store]) 143 + }, [track, item, setDeleted]) 143 144 144 145 const onPressShowMore = React.useCallback(() => { 145 146 setLimitLines(false)
+4 -3
src/view/com/profile/ProfileFollowers.tsx
··· 10 10 import {ProfileCardWithFollowBtn} from './ProfileCard' 11 11 import {useStores} from 'state/index' 12 12 import {usePalette} from 'lib/hooks/usePalette' 13 + import {logger} from '#/logger' 13 14 14 15 export const ProfileFollowers = observer(function ProfileFollowers({ 15 16 name, ··· 27 28 view 28 29 .loadMore() 29 30 .catch(err => 30 - store.log.error('Failed to fetch user followers', {error: err}), 31 + logger.error('Failed to fetch user followers', {error: err}), 31 32 ) 32 - }, [view, store.log]) 33 + }, [view]) 33 34 34 35 const onRefresh = () => { 35 36 view.refresh() 36 37 } 37 38 const onEndReached = () => { 38 39 view.loadMore().catch(err => 39 - view?.rootStore.log.error('Failed to load more followers', { 40 + logger.error('Failed to load more followers', { 40 41 error: err, 41 42 }), 42 43 )
+4 -5
src/view/com/profile/ProfileFollows.tsx
··· 7 7 import {ProfileCardWithFollowBtn} from './ProfileCard' 8 8 import {useStores} from 'state/index' 9 9 import {usePalette} from 'lib/hooks/usePalette' 10 + import {logger} from '#/logger' 10 11 11 12 export const ProfileFollows = observer(function ProfileFollows({ 12 13 name, ··· 23 24 useEffect(() => { 24 25 view 25 26 .loadMore() 26 - .catch(err => store.log.error('Failed to fetch user follows', err)) 27 - }, [view, store.log]) 27 + .catch(err => logger.error('Failed to fetch user follows', err)) 28 + }, [view]) 28 29 29 30 const onRefresh = () => { 30 31 view.refresh() ··· 32 33 const onEndReached = () => { 33 34 view 34 35 .loadMore() 35 - .catch(err => 36 - view?.rootStore.log.error('Failed to load more follows', err), 37 - ) 36 + .catch(err => logger.error('Failed to load more follows', err)) 38 37 } 39 38 40 39 if (!view.hasLoaded) {
+9 -8
src/view/com/profile/ProfileHeader.tsx
··· 39 39 import {makeProfileLink} from 'lib/routes/links' 40 40 import {Link} from '../util/Link' 41 41 import {ProfileHeaderSuggestedFollows} from './ProfileHeaderSuggestedFollows' 42 + import {logger} from '#/logger' 42 43 43 44 interface Props { 44 45 view: ProfileModel ··· 150 151 : 'ProfileHeader:UnfollowButtonClicked', 151 152 ) 152 153 }, 153 - err => store.log.error('Failed to toggle follow', {error: err}), 154 + err => logger.error('Failed to toggle follow', {error: err}), 154 155 ) 155 - }, [track, view, store.log, setShowSuggestedFollows]) 156 + }, [track, view, setShowSuggestedFollows]) 156 157 157 158 const onPressEditProfile = React.useCallback(() => { 158 159 track('ProfileHeader:EditProfileButtonClicked') ··· 193 194 await view.muteAccount() 194 195 Toast.show('Account muted') 195 196 } catch (e: any) { 196 - store.log.error('Failed to mute account', {error: e}) 197 + logger.error('Failed to mute account', {error: e}) 197 198 Toast.show(`There was an issue! ${e.toString()}`) 198 199 } 199 - }, [track, view, store]) 200 + }, [track, view]) 200 201 201 202 const onPressUnmuteAccount = React.useCallback(async () => { 202 203 track('ProfileHeader:UnmuteAccountButtonClicked') ··· 204 205 await view.unmuteAccount() 205 206 Toast.show('Account unmuted') 206 207 } catch (e: any) { 207 - store.log.error('Failed to unmute account', {error: e}) 208 + logger.error('Failed to unmute account', {error: e}) 208 209 Toast.show(`There was an issue! ${e.toString()}`) 209 210 } 210 - }, [track, view, store]) 211 + }, [track, view]) 211 212 212 213 const onPressBlockAccount = React.useCallback(async () => { 213 214 track('ProfileHeader:BlockAccountButtonClicked') ··· 222 223 onRefreshAll() 223 224 Toast.show('Account blocked') 224 225 } catch (e: any) { 225 - store.log.error('Failed to block account', {error: e}) 226 + logger.error('Failed to block account', {error: e}) 226 227 Toast.show(`There was an issue! ${e.toString()}`) 227 228 } 228 229 }, ··· 242 243 onRefreshAll() 243 244 Toast.show('Account unblocked') 244 245 } catch (e: any) { 245 - store.log.error('Failed to unblock account', {error: e}) 246 + logger.error('Failed to unblock account', {error: e}) 246 247 Toast.show(`There was an issue! ${e.toString()}`) 247 248 } 248 249 },
+3 -2
src/view/screens/ModerationBlockedAccounts.tsx
··· 21 21 import {ViewHeader} from '../com/util/ViewHeader' 22 22 import {CenteredView} from 'view/com/util/Views' 23 23 import {ProfileCard} from 'view/com/profile/ProfileCard' 24 + import {logger} from '#/logger' 24 25 25 26 type Props = NativeStackScreenProps< 26 27 CommonNavigatorParams, ··· 52 53 blockedAccounts 53 54 .loadMore() 54 55 .catch(err => 55 - store.log.error('Failed to load more blocked accounts', {error: err}), 56 + logger.error('Failed to load more blocked accounts', {error: err}), 56 57 ) 57 - }, [blockedAccounts, store]) 58 + }, [blockedAccounts]) 58 59 59 60 const renderItem = ({ 60 61 item,
+3 -2
src/view/screens/ModerationMutedAccounts.tsx
··· 21 21 import {ViewHeader} from '../com/util/ViewHeader' 22 22 import {CenteredView} from 'view/com/util/Views' 23 23 import {ProfileCard} from 'view/com/profile/ProfileCard' 24 + import {logger} from '#/logger' 24 25 25 26 type Props = NativeStackScreenProps< 26 27 CommonNavigatorParams, ··· 49 50 mutedAccounts 50 51 .loadMore() 51 52 .catch(err => 52 - store.log.error('Failed to load more muted accounts', {error: err}), 53 + logger.error('Failed to load more muted accounts', {error: err}), 53 54 ) 54 - }, [mutedAccounts, store]) 55 + }, [mutedAccounts]) 55 56 56 57 const renderItem = ({ 57 58 item,
+2 -1
src/view/screens/Notifications.tsx
··· 20 20 import {s, colors} from 'lib/styles' 21 21 import {useAnalytics} from 'lib/analytics/analytics' 22 22 import {isWeb} from 'platform/detection' 23 + import {logger} from '#/logger' 23 24 24 25 type Props = NativeStackScreenProps< 25 26 NotificationsTabNavigatorParams, ··· 60 61 useFocusEffect( 61 62 React.useCallback(() => { 62 63 store.shell.setMinimalShellMode(false) 63 - store.log.debug('NotificationsScreen: Updating feed') 64 + logger.debug('NotificationsScreen: Updating feed') 64 65 const softResetSub = store.onScreenSoftReset(onPressLoadLatest) 65 66 store.me.notifications.update() 66 67 screen('Notifications')
+2 -1
src/view/screens/PostThread.tsx
··· 14 14 import {useSafeAreaInsets} from 'react-native-safe-area-context' 15 15 import {clamp} from 'lodash' 16 16 import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' 17 + import {logger} from '#/logger' 17 18 18 19 const SHELL_FOOTER_HEIGHT = 44 19 20 ··· 38 39 InteractionManager.runAfterInteractions(() => { 39 40 if (!view.hasLoaded && !view.isLoading) { 40 41 view.setup().catch(err => { 41 - store.log.error('Failed to fetch thread', {error: err}) 42 + logger.error('Failed to fetch thread', {error: err}) 42 43 }) 43 44 } 44 45 })
+5 -4
src/view/screens/Profile.tsx
··· 29 29 import {FeedSourceModel} from 'state/models/content/feed-source' 30 30 import {useSetTitle} from 'lib/hooks/useSetTitle' 31 31 import {combinedDisplayName} from 'lib/strings/display-names' 32 + import {logger} from '#/logger' 32 33 33 34 type Props = NativeStackScreenProps<CommonNavigatorParams, 'Profile'> 34 35 export const ProfileScreen = withAuthRequired( ··· 108 109 uiState 109 110 .refresh() 110 111 .catch((err: any) => 111 - store.log.error('Failed to refresh user profile', {error: err}), 112 + logger.error('Failed to refresh user profile', {error: err}), 112 113 ) 113 - }, [uiState, store]) 114 + }, [uiState]) 114 115 const onEndReached = React.useCallback(() => { 115 116 uiState.loadMore().catch((err: any) => 116 - store.log.error('Failed to load more entries in user profile', { 117 + logger.error('Failed to load more entries in user profile', { 117 118 error: err, 118 119 }), 119 120 ) 120 - }, [uiState, store]) 121 + }, [uiState]) 121 122 const onPressTryAgain = React.useCallback(() => { 122 123 uiState.setup() 123 124 }, [uiState])
+7 -6
src/view/screens/ProfileFeed.tsx
··· 40 40 import {sanitizeHandle} from 'lib/strings/handles' 41 41 import {makeProfileLink} from 'lib/routes/links' 42 42 import {ComposeIcon2} from 'lib/icons' 43 + import {logger} from '#/logger' 43 44 44 45 const SECTION_TITLES = ['Posts', 'About'] 45 46 ··· 165 166 Toast.show( 166 167 'There was an an issue updating your feeds, please check your internet connection and try again.', 167 168 ) 168 - store.log.error('Failed up update feeds', {error: err}) 169 + logger.error('Failed up update feeds', {error: err}) 169 170 } 170 - }, [store, feedInfo]) 171 + }, [feedInfo]) 171 172 172 173 const onToggleLiked = React.useCallback(async () => { 173 174 Haptics.default() ··· 181 182 Toast.show( 182 183 'There was an an issue contacting the server, please check your internet connection and try again.', 183 184 ) 184 - store.log.error('Failed up toggle like', {error: err}) 185 + logger.error('Failed up toggle like', {error: err}) 185 186 } 186 - }, [store, feedInfo]) 187 + }, [feedInfo]) 187 188 188 189 const onTogglePinned = React.useCallback(async () => { 189 190 Haptics.default() 190 191 if (feedInfo) { 191 192 feedInfo.togglePin().catch(e => { 192 193 Toast.show('There was an issue contacting the server') 193 - store.log.error('Failed to toggle pinned feed', {error: e}) 194 + logger.error('Failed to toggle pinned feed', {error: e}) 194 195 }) 195 196 } 196 - }, [store, feedInfo]) 197 + }, [feedInfo]) 197 198 198 199 const onPressShare = React.useCallback(() => { 199 200 const url = toShareUrl(`/profile/${handleOrDid}/feed/${rkey}`)
+3 -2
src/view/screens/ProfileList.tsx
··· 43 43 import {makeProfileLink, makeListLink} from 'lib/routes/links' 44 44 import {ComposeIcon2} from 'lib/icons' 45 45 import {ListItems} from 'view/com/lists/ListItems' 46 + import {logger} from '#/logger' 46 47 47 48 const SECTION_TITLES_CURATE = ['Posts', 'About'] 48 49 const SECTION_TITLES_MOD = ['About'] ··· 272 273 Haptics.default() 273 274 list.togglePin().catch(e => { 274 275 Toast.show('There was an issue contacting the server') 275 - store.log.error('Failed to toggle pinned list', {error: e}) 276 + logger.error('Failed to toggle pinned list', {error: e}) 276 277 }) 277 - }, [store, list]) 278 + }, [list]) 278 279 279 280 const onSubscribeMute = useCallback(() => { 280 281 store.shell.openModal({
+7 -7
src/view/screens/SavedFeeds.tsx
··· 26 26 import * as Toast from 'view/com/util/Toast' 27 27 import {Haptics} from 'lib/haptics' 28 28 import {TextLink} from 'view/com/util/Link' 29 + import {logger} from '#/logger' 29 30 30 31 const HITSLOP_TOP = { 31 32 top: 20, ··· 159 160 item: FeedSourceModel 160 161 }) { 161 162 const pal = usePalette('default') 162 - const store = useStores() 163 163 const isPinned = item.isPinned 164 164 165 165 const onTogglePinned = useCallback(() => { 166 166 Haptics.default() 167 167 item.togglePin().catch(e => { 168 168 Toast.show('There was an issue contacting the server') 169 - store.log.error('Failed to toggle pinned feed', {error: e}) 169 + logger.error('Failed to toggle pinned feed', {error: e}) 170 170 }) 171 - }, [item, store]) 171 + }, [item]) 172 172 const onPressUp = useCallback( 173 173 () => 174 174 savedFeeds.movePinnedFeed(item, 'up').catch(e => { 175 175 Toast.show('There was an issue contacting the server') 176 - store.log.error('Failed to set pinned feed order', {error: e}) 176 + logger.error('Failed to set pinned feed order', {error: e}) 177 177 }), 178 - [store, savedFeeds, item], 178 + [savedFeeds, item], 179 179 ) 180 180 const onPressDown = useCallback( 181 181 () => 182 182 savedFeeds.movePinnedFeed(item, 'down').catch(e => { 183 183 Toast.show('There was an issue contacting the server') 184 - store.log.error('Failed to set pinned feed order', {error: e}) 184 + logger.error('Failed to set pinned feed order', {error: e}) 185 185 }), 186 - [store, savedFeeds, item], 186 + [savedFeeds, item], 187 187 ) 188 188 189 189 return (
+4 -4
src/view/screens/Settings.tsx
··· 45 45 import Clipboard from '@react-native-clipboard/clipboard' 46 46 import {makeProfileLink} from 'lib/routes/links' 47 47 import {AccountDropdownBtn} from 'view/com/util/AccountDropdownBtn' 48 + import {logger} from '#/logger' 48 49 49 50 // TEMPORARY (APP-700) 50 51 // remove after backend testing finishes ··· 110 111 Toast.show('Your handle has been updated') 111 112 }, 112 113 err => { 113 - store.log.error( 114 - 'Failed to reload from server after handle update', 115 - {error: err}, 116 - ) 114 + logger.error('Failed to reload from server after handle update', { 115 + error: err, 116 + }) 117 117 setIsSwitching(false) 118 118 }, 119 119 )