Bluesky app fork with some witchin' additions 💫 witchsky.app
bluesky fork client

Refactor: create src/lib to reflect actual sharing of that code

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