···1+export function clamp(v: number, min: number, max: number): number {
2+ return Math.min(max, Math.max(min, v))
3+}
+1-1
src/state/lib/api.ts
···10import {AtUri} from '../../third-party/uri'
11import {APP_BSKY_GRAPH} from '../../third-party/api'
12import {RootStoreModel} from '../models/root-store'
13-import {extractEntities} from '../../view/lib/strings'
1415export function doPolyfill() {
16 AtpApi.xrpc.fetch = fetchHandler
···10import {AtUri} from '../../third-party/uri'
11import {APP_BSKY_GRAPH} from '../../third-party/api'
12import {RootStoreModel} from '../models/root-store'
13+import {extractEntities} from '../../lib/strings'
1415export function doPolyfill() {
16 AtpApi.xrpc.fetch = fetchHandler
+1-1
src/state/models/feed-view.ts
···4import {AtUri} from '../../third-party/uri'
5import {RootStoreModel} from './root-store'
6import * as apilib from '../lib/api'
7-import {cleanError} from '../../view/lib/strings'
89export class FeedItemMyStateModel {
10 repost?: string
···4import {AtUri} from '../../third-party/uri'
5import {RootStoreModel} from './root-store'
6import * as apilib from '../lib/api'
7+import {cleanError} from '../../lib/strings'
89export class FeedItemMyStateModel {
10 repost?: string
+1-1
src/state/models/notifications-view.ts
···4import {Declaration} from './_common'
5import {hasProp} from '../lib/type-guards'
6import {APP_BSKY_GRAPH} from '../../third-party/api'
7-import {cleanError} from '../../view/lib/strings'
89const UNGROUPABLE_REASONS = ['trend', 'assertion']
10
···4import {Declaration} from './_common'
5import {hasProp} from '../lib/type-guards'
6import {APP_BSKY_GRAPH} from '../../third-party/api'
7+import {cleanError} from '../../lib/strings'
89const UNGROUPABLE_REASONS = ['trend', 'assertion']
10
+1-1
src/state/models/post.ts
···2import * as Post from '../../third-party/api/src/client/types/app/bsky/feed/post'
3import {AtUri} from '../../third-party/uri'
4import {RootStoreModel} from './root-store'
5-import {cleanError} from '../../view/lib/strings'
67export type PostEntities = Post.Record['entities']
8export type PostReply = Post.Record['reply']
···2import * as Post from '../../third-party/api/src/client/types/app/bsky/feed/post'
3import {AtUri} from '../../third-party/uri'
4import {RootStoreModel} from './root-store'
5+import {cleanError} from '../../lib/strings'
67export type PostEntities = Post.Record['entities']
8export type PostReply = Post.Record['reply']
+1-1
src/view/com/modals/CreateScene.tsx
···18 enforceLen,
19 MAX_DISPLAY_NAME,
20 MAX_DESCRIPTION,
21-} from '../../lib/strings'
22import {AppBskyActorCreateScene} from '../../../third-party/api/index'
2324export const snapPoints = ['60%']
···18 enforceLen,
19 MAX_DISPLAY_NAME,
20 MAX_DESCRIPTION,
21+} from '../../../lib/strings'
22import {AppBskyActorCreateScene} from '../../../third-party/api/index'
2324export const snapPoints = ['60%']
+5-1
src/view/com/modals/EditProfile.tsx
···7import {useStores} from '../../../state'
8import {ProfileViewModel} from '../../../state/models/profile-view'
9import {s, colors, gradients} from '../../lib/styles'
10-import {enforceLen, MAX_DISPLAY_NAME, MAX_DESCRIPTION} from '../../lib/strings'
000011import * as Profile from '../../../third-party/api/src/client/types/app/bsky/actor/profile'
1213export const snapPoints = ['60%']
···7import {useStores} from '../../../state'
8import {ProfileViewModel} from '../../../state/models/profile-view'
9import {s, colors, gradients} from '../../lib/styles'
10+import {
11+ enforceLen,
12+ MAX_DISPLAY_NAME,
13+ MAX_DESCRIPTION,
14+} from '../../../lib/strings'
15import * as Profile from '../../../third-party/api/src/client/types/app/bsky/actor/profile'
1617export const snapPoints = ['60%']
+1-1
src/view/com/notifications/FeedItem.tsx
···5import {FontAwesomeIcon, Props} from '@fortawesome/react-native-fontawesome'
6import {NotificationsViewItemModel} from '../../../state/models/notifications-view'
7import {s, colors} from '../../lib/styles'
8-import {ago, pluralize} from '../../lib/strings'
9import {UpIconSolid} from '../../lib/icons'
10import {UserAvatar} from '../util/UserAvatar'
11import {PostText} from '../post/PostText'
···5import {FontAwesomeIcon, Props} from '@fortawesome/react-native-fontawesome'
6import {NotificationsViewItemModel} from '../../../state/models/notifications-view'
7import {s, colors} from '../../lib/styles'
8+import {ago, pluralize} from '../../../lib/strings'
9import {UpIconSolid} from '../../lib/icons'
10import {UserAvatar} from '../util/UserAvatar'
11import {PostText} from '../post/PostText'
+1-1
src/view/com/post-thread/PostThreadItem.tsx
···12import Toast from '../util/Toast'
13import {UserAvatar} from '../util/UserAvatar'
14import {s, colors} from '../../lib/styles'
15-import {ago, pluralize} from '../../lib/strings'
16import {useStores} from '../../../state'
17import {PostMeta} from '../util/PostMeta'
18import {PostCtrls} from '../util/PostCtrls'
···12import Toast from '../util/Toast'
13import {UserAvatar} from '../util/UserAvatar'
14import {s, colors} from '../../lib/styles'
15+import {ago, pluralize} from '../../../lib/strings'
16import {useStores} from '../../../state'
17import {PostMeta} from '../util/PostMeta'
18import {PostCtrls} from '../util/PostCtrls'
+1-1
src/view/com/profile/ProfileHeader.tsx
···17 EditProfileModel,
18 InviteToSceneModel,
19} from '../../../state/models/shell-ui'
20-import {pluralize} from '../../lib/strings'
21import {s, colors} from '../../lib/styles'
22import {getGradient} from '../../lib/asset-gen'
23import {MagnifyingGlassIcon} from '../../lib/icons'
···17 EditProfileModel,
18 InviteToSceneModel,
19} from '../../../state/models/shell-ui'
20+import {pluralize} from '../../../lib/strings'
21import {s, colors} from '../../lib/styles'
22import {getGradient} from '../../lib/asset-gen'
23import {MagnifyingGlassIcon} from '../../lib/icons'
+1-1
src/view/com/util/DropdownBtn.tsx
···13import RootSiblings from 'react-native-root-siblings'
14import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
15import {colors} from '../../lib/styles'
16-import {toShareUrl} from '../../lib/strings'
17import {useStores} from '../../../state'
18import {ConfirmModel} from '../../../state/models/shell-ui'
19import {TABS_ENABLED} from '../../../build-flags'
···13import RootSiblings from 'react-native-root-siblings'
14import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
15import {colors} from '../../lib/styles'
16+import {toShareUrl} from '../../../lib/strings'
17import {useStores} from '../../../state'
18import {ConfirmModel} from '../../../state/models/shell-ui'
19import {TABS_ENABLED} from '../../../build-flags'
+1-1
src/view/com/util/PostMeta.tsx
···4import {Link} from '../util/Link'
5import {PostDropdownBtn} from '../util/DropdownBtn'
6import {s} from '../../lib/styles'
7-import {ago} from '../../lib/strings'
89interface PostMetaOpts {
10 itemHref: string
···4import {Link} from '../util/Link'
5import {PostDropdownBtn} from '../util/DropdownBtn'
6import {s} from '../../lib/styles'
7+import {ago} from '../../../lib/strings'
89interface PostMetaOpts {
10 itemHref: string
+3-3
src/view/lib/strings.ts
src/lib/strings.ts
···1-import {AtUri} from '../../third-party/uri'
2-import {Entity} from '../../third-party/api/src/client/types/app/bsky/feed/post'
3-import {PROD_SERVICE} from '../../state'
45export const MAX_DISPLAY_NAME = 64
6export const MAX_DESCRIPTION = 256
···1+import {AtUri} from '../third-party/uri'
2+import {Entity} from '../third-party/api/src/client/types/app/bsky/feed/post'
3+import {PROD_SERVICE} from '../state'
45export const MAX_DISPLAY_NAME = 64
6export const MAX_DESCRIPTION = 256
+5-1
src/view/screens/Login.tsx
···16import {observer} from 'mobx-react-lite'
17import {Picker} from '../com/util/Picker'
18import {s, colors} from '../lib/styles'
19-import {makeValidHandle, createFullHandle, toNiceDomain} from '../lib/strings'
000020import {useStores, DEFAULT_SERVICE} from '../../state'
21import {ServiceDescription} from '../../state/models/session'
22import {ServerInputModel} from '../../state/models/shell-ui'
···16import {observer} from 'mobx-react-lite'
17import {Picker} from '../com/util/Picker'
18import {s, colors} from '../lib/styles'
19+import {
20+ makeValidHandle,
21+ createFullHandle,
22+ toNiceDomain,
23+} from '../../lib/strings'
24import {useStores, DEFAULT_SERVICE} from '../../state'
25import {ServiceDescription} from '../../state/models/session'
26import {ServerInputModel} from '../../state/models/shell-ui'
+1-1
src/view/screens/PostDownvotedBy.tsx
···4import {PostVotedBy as PostLikedByComponent} from '../com/post-thread/PostVotedBy'
5import {ScreenParams} from '../routes'
6import {useStores} from '../../state'
7-import {makeRecordUri} from '../lib/strings'
89export const PostDownvotedBy = ({navIdx, visible, params}: ScreenParams) => {
10 const store = useStores()
···4import {PostVotedBy as PostLikedByComponent} from '../com/post-thread/PostVotedBy'
5import {ScreenParams} from '../routes'
6import {useStores} from '../../state'
7+import {makeRecordUri} from '../../lib/strings'
89export const PostDownvotedBy = ({navIdx, visible, params}: ScreenParams) => {
10 const store = useStores()
+1-1
src/view/screens/PostRepostedBy.tsx
···4import {PostRepostedBy as PostRepostedByComponent} from '../com/post-thread/PostRepostedBy'
5import {ScreenParams} from '../routes'
6import {useStores} from '../../state'
7-import {makeRecordUri} from '../lib/strings'
89export const PostRepostedBy = ({navIdx, visible, params}: ScreenParams) => {
10 const store = useStores()
···4import {PostRepostedBy as PostRepostedByComponent} from '../com/post-thread/PostRepostedBy'
5import {ScreenParams} from '../routes'
6import {useStores} from '../../state'
7+import {makeRecordUri} from '../../lib/strings'
89export const PostRepostedBy = ({navIdx, visible, params}: ScreenParams) => {
10 const store = useStores()
+1-1
src/view/screens/PostThread.tsx
···1import React, {useEffect, useMemo, useState} from 'react'
2import {View} from 'react-native'
3-import {makeRecordUri} from '../lib/strings'
4import {ViewHeader} from '../com/util/ViewHeader'
5import {PostThread as PostThreadComponent} from '../com/post-thread/PostThread'
6import {PostThreadViewModel} from '../../state/models/post-thread-view'
···1import React, {useEffect, useMemo, useState} from 'react'
2import {View} from 'react-native'
3+import {makeRecordUri} from '../../lib/strings'
4import {ViewHeader} from '../com/util/ViewHeader'
5import {PostThread as PostThreadComponent} from '../com/post-thread/PostThread'
6import {PostThreadViewModel} from '../../state/models/post-thread-view'
+1-1
src/view/screens/PostUpvotedBy.tsx
···4import {PostVotedBy as PostLikedByComponent} from '../com/post-thread/PostVotedBy'
5import {ScreenParams} from '../routes'
6import {useStores} from '../../state'
7-import {makeRecordUri} from '../lib/strings'
89export const PostUpvotedBy = ({navIdx, visible, params}: ScreenParams) => {
10 const store = useStores()
···4import {PostVotedBy as PostLikedByComponent} from '../com/post-thread/PostVotedBy'
5import {ScreenParams} from '../routes'
6import {useStores} from '../../state'
7+import {makeRecordUri} from '../../lib/strings'
89export const PostUpvotedBy = ({navIdx, visible, params}: ScreenParams) => {
10 const store = useStores()
+1-1
src/view/shell/mobile/TabsSelector.tsx
···21import Swipeable from 'react-native-gesture-handler/Swipeable'
22import {useStores} from '../../../state'
23import {s, colors} from '../../lib/styles'
24-import {toShareUrl} from '../../lib/strings'
25import {match} from '../../routes'
2627const TAB_HEIGHT = 42
···21import Swipeable from 'react-native-gesture-handler/Swipeable'
22import {useStores} from '../../../state'
23import {s, colors} from '../../lib/styles'
24+import {toShareUrl} from '../../../lib/strings'
25import {match} from '../../routes'
2627const TAB_HEIGHT = 42
+1
src/view/shell/mobile/index.tsx
···37import {TabsSelector} from './TabsSelector'
38import {Composer} from './Composer'
39import {s, colors} from '../../lib/styles'
040import {
41 GridIcon,
42 GridIconSolid,
···37import {TabsSelector} from './TabsSelector'
38import {Composer} from './Composer'
39import {s, colors} from '../../lib/styles'
40+import {clamp} from '../../../lib/numbers'
41import {
42 GridIcon,
43 GridIconSolid,