···11-import {extractEntities} from '../src/view/lib/strings'
11+import {extractEntities} from '../src/lib/strings'
2233describe('extractEntities', () => {
44 const inputs = [
+3
src/lib/numbers.ts
···11+export function clamp(v: number, min: number, max: number): number {
22+ return Math.min(max, Math.max(min, v))
33+}
+1-1
src/state/lib/api.ts
···1010import {AtUri} from '../../third-party/uri'
1111import {APP_BSKY_GRAPH} from '../../third-party/api'
1212import {RootStoreModel} from '../models/root-store'
1313-import {extractEntities} from '../../view/lib/strings'
1313+import {extractEntities} from '../../lib/strings'
14141515export function doPolyfill() {
1616 AtpApi.xrpc.fetch = fetchHandler
+1-1
src/state/models/feed-view.ts
···44import {AtUri} from '../../third-party/uri'
55import {RootStoreModel} from './root-store'
66import * as apilib from '../lib/api'
77-import {cleanError} from '../../view/lib/strings'
77+import {cleanError} from '../../lib/strings'
8899export class FeedItemMyStateModel {
1010 repost?: string
+1-1
src/state/models/notifications-view.ts
···44import {Declaration} from './_common'
55import {hasProp} from '../lib/type-guards'
66import {APP_BSKY_GRAPH} from '../../third-party/api'
77-import {cleanError} from '../../view/lib/strings'
77+import {cleanError} from '../../lib/strings'
8899const UNGROUPABLE_REASONS = ['trend', 'assertion']
1010
+1-1
src/state/models/post.ts
···22import * as Post from '../../third-party/api/src/client/types/app/bsky/feed/post'
33import {AtUri} from '../../third-party/uri'
44import {RootStoreModel} from './root-store'
55-import {cleanError} from '../../view/lib/strings'
55+import {cleanError} from '../../lib/strings'
6677export type PostEntities = Post.Record['entities']
88export type PostReply = Post.Record['reply']
+1-1
src/view/com/modals/CreateScene.tsx
···1818 enforceLen,
1919 MAX_DISPLAY_NAME,
2020 MAX_DESCRIPTION,
2121-} from '../../lib/strings'
2121+} from '../../../lib/strings'
2222import {AppBskyActorCreateScene} from '../../../third-party/api/index'
23232424export const snapPoints = ['60%']
+5-1
src/view/com/modals/EditProfile.tsx
···77import {useStores} from '../../../state'
88import {ProfileViewModel} from '../../../state/models/profile-view'
99import {s, colors, gradients} from '../../lib/styles'
1010-import {enforceLen, MAX_DISPLAY_NAME, MAX_DESCRIPTION} from '../../lib/strings'
1010+import {
1111+ enforceLen,
1212+ MAX_DISPLAY_NAME,
1313+ MAX_DESCRIPTION,
1414+} from '../../../lib/strings'
1115import * as Profile from '../../../third-party/api/src/client/types/app/bsky/actor/profile'
12161317export const snapPoints = ['60%']
+1-1
src/view/com/notifications/FeedItem.tsx
···55import {FontAwesomeIcon, Props} from '@fortawesome/react-native-fontawesome'
66import {NotificationsViewItemModel} from '../../../state/models/notifications-view'
77import {s, colors} from '../../lib/styles'
88-import {ago, pluralize} from '../../lib/strings'
88+import {ago, pluralize} from '../../../lib/strings'
99import {UpIconSolid} from '../../lib/icons'
1010import {UserAvatar} from '../util/UserAvatar'
1111import {PostText} from '../post/PostText'
+1-1
src/view/com/post-thread/PostThreadItem.tsx
···1212import Toast from '../util/Toast'
1313import {UserAvatar} from '../util/UserAvatar'
1414import {s, colors} from '../../lib/styles'
1515-import {ago, pluralize} from '../../lib/strings'
1515+import {ago, pluralize} from '../../../lib/strings'
1616import {useStores} from '../../../state'
1717import {PostMeta} from '../util/PostMeta'
1818import {PostCtrls} from '../util/PostCtrls'
+1-1
src/view/com/profile/ProfileHeader.tsx
···1717 EditProfileModel,
1818 InviteToSceneModel,
1919} from '../../../state/models/shell-ui'
2020-import {pluralize} from '../../lib/strings'
2020+import {pluralize} from '../../../lib/strings'
2121import {s, colors} from '../../lib/styles'
2222import {getGradient} from '../../lib/asset-gen'
2323import {MagnifyingGlassIcon} from '../../lib/icons'
+1-1
src/view/com/util/DropdownBtn.tsx
···1313import RootSiblings from 'react-native-root-siblings'
1414import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
1515import {colors} from '../../lib/styles'
1616-import {toShareUrl} from '../../lib/strings'
1616+import {toShareUrl} from '../../../lib/strings'
1717import {useStores} from '../../../state'
1818import {ConfirmModel} from '../../../state/models/shell-ui'
1919import {TABS_ENABLED} from '../../../build-flags'
+1-1
src/view/com/util/PostMeta.tsx
···44import {Link} from '../util/Link'
55import {PostDropdownBtn} from '../util/DropdownBtn'
66import {s} from '../../lib/styles'
77-import {ago} from '../../lib/strings'
77+import {ago} from '../../../lib/strings'
8899interface PostMetaOpts {
1010 itemHref: string
+3-3
src/view/lib/strings.ts
src/lib/strings.ts
···11-import {AtUri} from '../../third-party/uri'
22-import {Entity} from '../../third-party/api/src/client/types/app/bsky/feed/post'
33-import {PROD_SERVICE} from '../../state'
11+import {AtUri} from '../third-party/uri'
22+import {Entity} from '../third-party/api/src/client/types/app/bsky/feed/post'
33+import {PROD_SERVICE} from '../state'
4455export const MAX_DISPLAY_NAME = 64
66export const MAX_DESCRIPTION = 256
+5-1
src/view/screens/Login.tsx
···1616import {observer} from 'mobx-react-lite'
1717import {Picker} from '../com/util/Picker'
1818import {s, colors} from '../lib/styles'
1919-import {makeValidHandle, createFullHandle, toNiceDomain} from '../lib/strings'
1919+import {
2020+ makeValidHandle,
2121+ createFullHandle,
2222+ toNiceDomain,
2323+} from '../../lib/strings'
2024import {useStores, DEFAULT_SERVICE} from '../../state'
2125import {ServiceDescription} from '../../state/models/session'
2226import {ServerInputModel} from '../../state/models/shell-ui'
+1-1
src/view/screens/PostDownvotedBy.tsx
···44import {PostVotedBy as PostLikedByComponent} from '../com/post-thread/PostVotedBy'
55import {ScreenParams} from '../routes'
66import {useStores} from '../../state'
77-import {makeRecordUri} from '../lib/strings'
77+import {makeRecordUri} from '../../lib/strings'
8899export const PostDownvotedBy = ({navIdx, visible, params}: ScreenParams) => {
1010 const store = useStores()
+1-1
src/view/screens/PostRepostedBy.tsx
···44import {PostRepostedBy as PostRepostedByComponent} from '../com/post-thread/PostRepostedBy'
55import {ScreenParams} from '../routes'
66import {useStores} from '../../state'
77-import {makeRecordUri} from '../lib/strings'
77+import {makeRecordUri} from '../../lib/strings'
8899export const PostRepostedBy = ({navIdx, visible, params}: ScreenParams) => {
1010 const store = useStores()
+1-1
src/view/screens/PostThread.tsx
···11import React, {useEffect, useMemo, useState} from 'react'
22import {View} from 'react-native'
33-import {makeRecordUri} from '../lib/strings'
33+import {makeRecordUri} from '../../lib/strings'
44import {ViewHeader} from '../com/util/ViewHeader'
55import {PostThread as PostThreadComponent} from '../com/post-thread/PostThread'
66import {PostThreadViewModel} from '../../state/models/post-thread-view'
+1-1
src/view/screens/PostUpvotedBy.tsx
···44import {PostVotedBy as PostLikedByComponent} from '../com/post-thread/PostVotedBy'
55import {ScreenParams} from '../routes'
66import {useStores} from '../../state'
77-import {makeRecordUri} from '../lib/strings'
77+import {makeRecordUri} from '../../lib/strings'
8899export const PostUpvotedBy = ({navIdx, visible, params}: ScreenParams) => {
1010 const store = useStores()
+1-1
src/view/shell/mobile/TabsSelector.tsx
···2121import Swipeable from 'react-native-gesture-handler/Swipeable'
2222import {useStores} from '../../../state'
2323import {s, colors} from '../../lib/styles'
2424-import {toShareUrl} from '../../lib/strings'
2424+import {toShareUrl} from '../../../lib/strings'
2525import {match} from '../../routes'
26262727const TAB_HEIGHT = 42
+1
src/view/shell/mobile/index.tsx
···3737import {TabsSelector} from './TabsSelector'
3838import {Composer} from './Composer'
3939import {s, colors} from '../../lib/styles'
4040+import {clamp} from '../../../lib/numbers'
4041import {
4142 GridIcon,
4243 GridIconSolid,