personal web client for Bluesky
typescript solidjs bluesky atcute

chore: add import sort plugin for once

mary.my.id 4dc39e28 ca99259a

verified
Changed files
+392 -297
src
api
components
globals
lib
views
+18 -1
.prettierrc
··· 6 6 "semi": true, 7 7 "singleQuote": true, 8 8 "bracketSpacing": true, 9 - "plugins": ["prettier-plugin-tailwindcss"], 9 + "plugins": ["prettier-plugin-tailwindcss", "@trivago/prettier-plugin-sort-imports"], 10 10 "tailwindFunctions": ["tw"], 11 + "importOrder": [ 12 + "^node:", 13 + "<THIRD_PARTY_MODULES>", 14 + "^@(atcute|mary)/", 15 + "^~/api/", 16 + "^~/globals/", 17 + "^~/lib/", 18 + "^~/components/", 19 + "^~/views/", 20 + "^~/assets/", 21 + "^~", 22 + "^\\.{2}(?:/(?:.*)(?<!\\.css))?$", 23 + "^\\.(?:/(?:.*)(?<!\\.css))?$", 24 + "^\\." 25 + ], 26 + "importOrderSeparation": true, 27 + "importOrderSortSpecifiers": true, 11 28 "overrides": [ 12 29 { 13 30 "files": ["tsconfig.json", "jsconfig.json"],
+1
package.json
··· 28 28 "solid-js": "^1.8.22" 29 29 }, 30 30 "devDependencies": { 31 + "@trivago/prettier-plugin-sort-imports": "^4.3.0", 31 32 "@types/dom-close-watcher": "^1.0.0", 32 33 "autoprefixer": "^10.4.20", 33 34 "babel-plugin-transform-typescript-const-enums": "^0.1.0",
+110 -2
pnpm-lock.yaml
··· 80 80 specifier: ^1.8.22 81 81 version: 1.8.22(patch_hash=5rodyfcb76rtbo26dwlsojy7jy) 82 82 devDependencies: 83 + '@trivago/prettier-plugin-sort-imports': 84 + specifier: ^4.3.0 85 + version: 4.3.0(prettier@3.3.3) 83 86 '@types/dom-close-watcher': 84 87 specifier: ^1.0.0 85 88 version: 1.0.0 ··· 94 97 version: 3.3.3 95 98 prettier-plugin-tailwindcss: 96 99 specifier: ^0.6.6 97 - version: 0.6.6(prettier@3.3.3) 100 + version: 0.6.6(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.3.3))(prettier@3.3.3) 98 101 tailwindcss: 99 102 specifier: ^3.4.10 100 103 version: 3.4.10 ··· 174 177 resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} 175 178 engines: {node: '>=6.9.0'} 176 179 180 + '@babel/generator@7.17.7': 181 + resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} 182 + engines: {node: '>=6.9.0'} 183 + 177 184 '@babel/generator@7.25.6': 178 185 resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} 179 186 engines: {node: '>=6.9.0'} ··· 207 214 peerDependencies: 208 215 '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 209 216 217 + '@babel/helper-environment-visitor@7.24.7': 218 + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} 219 + engines: {node: '>=6.9.0'} 220 + 221 + '@babel/helper-function-name@7.24.7': 222 + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} 223 + engines: {node: '>=6.9.0'} 224 + 225 + '@babel/helper-hoist-variables@7.24.7': 226 + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} 227 + engines: {node: '>=6.9.0'} 228 + 210 229 '@babel/helper-member-expression-to-functions@7.24.8': 211 230 resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} 212 231 engines: {node: '>=6.9.0'} ··· 251 270 252 271 '@babel/helper-skip-transparent-expression-wrappers@7.24.7': 253 272 resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} 273 + engines: {node: '>=6.9.0'} 274 + 275 + '@babel/helper-split-export-declaration@7.24.7': 276 + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} 254 277 engines: {node: '>=6.9.0'} 255 278 256 279 '@babel/helper-string-parser@7.24.8': ··· 736 759 resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} 737 760 engines: {node: '>=6.9.0'} 738 761 762 + '@babel/traverse@7.23.2': 763 + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} 764 + engines: {node: '>=6.9.0'} 765 + 739 766 '@babel/traverse@7.25.6': 740 767 resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} 768 + engines: {node: '>=6.9.0'} 769 + 770 + '@babel/types@7.17.0': 771 + resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} 741 772 engines: {node: '>=6.9.0'} 742 773 743 774 '@babel/types@7.25.6': ··· 1273 1304 1274 1305 '@tanstack/query-core@5.17.19': 1275 1306 resolution: {integrity: sha512-Lzw8FUtnLCc9Jwz0sw9xOjZB+/mCCmJev38v2wHMUl/ioXNIhnNWeMxu0NKUjIhAd62IRB3eAtvxAGDJ55UkyA==} 1307 + 1308 + '@trivago/prettier-plugin-sort-imports@4.3.0': 1309 + resolution: {integrity: sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==} 1310 + peerDependencies: 1311 + '@vue/compiler-sfc': 3.x 1312 + prettier: 2.x - 3.x 1313 + peerDependenciesMeta: 1314 + '@vue/compiler-sfc': 1315 + optional: true 1276 1316 1277 1317 '@types/babel__core@7.20.5': 1278 1318 resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} ··· 1928 1968 engines: {node: '>=10'} 1929 1969 hasBin: true 1930 1970 1971 + javascript-natural-sort@0.7.1: 1972 + resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} 1973 + 1931 1974 jiti@1.21.6: 1932 1975 resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} 1933 1976 hasBin: true ··· 2409 2452 2410 2453 source-map-support@0.5.21: 2411 2454 resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 2455 + 2456 + source-map@0.5.7: 2457 + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} 2458 + engines: {node: '>=0.10.0'} 2412 2459 2413 2460 source-map@0.6.1: 2414 2461 resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} ··· 2858 2905 transitivePeerDependencies: 2859 2906 - supports-color 2860 2907 2908 + '@babel/generator@7.17.7': 2909 + dependencies: 2910 + '@babel/types': 7.25.6 2911 + jsesc: 2.5.2 2912 + source-map: 0.5.7 2913 + 2861 2914 '@babel/generator@7.25.6': 2862 2915 dependencies: 2863 2916 '@babel/types': 7.25.6 ··· 2915 2968 transitivePeerDependencies: 2916 2969 - supports-color 2917 2970 2971 + '@babel/helper-environment-visitor@7.24.7': 2972 + dependencies: 2973 + '@babel/types': 7.25.6 2974 + 2975 + '@babel/helper-function-name@7.24.7': 2976 + dependencies: 2977 + '@babel/template': 7.25.0 2978 + '@babel/types': 7.25.6 2979 + 2980 + '@babel/helper-hoist-variables@7.24.7': 2981 + dependencies: 2982 + '@babel/types': 7.25.6 2983 + 2918 2984 '@babel/helper-member-expression-to-functions@7.24.8': 2919 2985 dependencies: 2920 2986 '@babel/traverse': 7.25.6 ··· 2980 3046 '@babel/types': 7.25.6 2981 3047 transitivePeerDependencies: 2982 3048 - supports-color 3049 + 3050 + '@babel/helper-split-export-declaration@7.24.7': 3051 + dependencies: 3052 + '@babel/types': 7.25.6 2983 3053 2984 3054 '@babel/helper-string-parser@7.24.8': {} 2985 3055 ··· 3583 3653 '@babel/parser': 7.25.6 3584 3654 '@babel/types': 7.25.6 3585 3655 3656 + '@babel/traverse@7.23.2': 3657 + dependencies: 3658 + '@babel/code-frame': 7.24.7 3659 + '@babel/generator': 7.25.6 3660 + '@babel/helper-environment-visitor': 7.24.7 3661 + '@babel/helper-function-name': 7.24.7 3662 + '@babel/helper-hoist-variables': 7.24.7 3663 + '@babel/helper-split-export-declaration': 7.24.7 3664 + '@babel/parser': 7.25.6 3665 + '@babel/types': 7.25.6 3666 + debug: 4.3.6 3667 + globals: 11.12.0 3668 + transitivePeerDependencies: 3669 + - supports-color 3670 + 3586 3671 '@babel/traverse@7.25.6': 3587 3672 dependencies: 3588 3673 '@babel/code-frame': 7.24.7 ··· 3594 3679 globals: 11.12.0 3595 3680 transitivePeerDependencies: 3596 3681 - supports-color 3682 + 3683 + '@babel/types@7.17.0': 3684 + dependencies: 3685 + '@babel/helper-validator-identifier': 7.24.7 3686 + to-fast-properties: 2.0.0 3597 3687 3598 3688 '@babel/types@7.25.6': 3599 3689 dependencies: ··· 3956 4046 3957 4047 '@tanstack/query-core@5.17.19(patch_hash=mh34qchsf4y2z6x2owv2ljabky)': {} 3958 4048 4049 + '@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.3.3)': 4050 + dependencies: 4051 + '@babel/generator': 7.17.7 4052 + '@babel/parser': 7.25.6 4053 + '@babel/traverse': 7.23.2 4054 + '@babel/types': 7.17.0 4055 + javascript-natural-sort: 0.7.1 4056 + lodash: 4.17.21 4057 + prettier: 3.3.3 4058 + transitivePeerDependencies: 4059 + - supports-color 4060 + 3959 4061 '@types/babel__core@7.20.5': 3960 4062 dependencies: 3961 4063 '@babel/parser': 7.25.6 ··· 4696 4798 filelist: 1.0.4 4697 4799 minimatch: 3.1.2 4698 4800 4801 + javascript-natural-sort@0.7.1: {} 4802 + 4699 4803 jiti@1.21.6: {} 4700 4804 4701 4805 js-tokens@4.0.0: {} ··· 4895 4999 picocolors: 1.0.1 4896 5000 source-map-js: 1.2.0 4897 5001 4898 - prettier-plugin-tailwindcss@0.6.6(prettier@3.3.3): 5002 + prettier-plugin-tailwindcss@0.6.6(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.3.3))(prettier@3.3.3): 4899 5003 dependencies: 4900 5004 prettier: 3.3.3 5005 + optionalDependencies: 5006 + '@trivago/prettier-plugin-sort-imports': 4.3.0(prettier@3.3.3) 4901 5007 4902 5008 prettier@3.3.3: {} 4903 5009 ··· 5102 5208 dependencies: 5103 5209 buffer-from: 1.1.2 5104 5210 source-map: 0.6.1 5211 + 5212 + source-map@0.5.7: {} 5105 5213 5106 5214 source-map@0.6.1: {} 5107 5215
+2 -1
src/api/cache/post-shadow.ts
··· 1 - import { batch, createRenderEffect, createSignal, onCleanup, type Accessor } from 'solid-js'; 1 + import { type Accessor, batch, createRenderEffect, createSignal, onCleanup } from 'solid-js'; 2 2 3 3 import type { AppBskyFeedDefs } from '@atcute/client/lexicons'; 4 4 import { EventEmitter } from '@mary/events'; ··· 11 11 import { findAllPosts as findAllPostsInTimeline } from '../queries-cache/timeline'; 12 12 import { EQUALS_DEQUAL } from '../utils/dequal'; 13 13 import type { AccessorMaybe } from '../utils/types'; 14 + 14 15 import { iterateQueryCache } from './utils'; 15 16 16 17 export interface PostShadow {
+2 -1
src/api/cache/profile-shadow.ts
··· 1 - import { batch, createRenderEffect, createSignal, onCleanup, type Accessor } from 'solid-js'; 1 + import { type Accessor, batch, createRenderEffect, createSignal, onCleanup } from 'solid-js'; 2 2 3 3 import type { AppBskyActorDefs, At } from '@atcute/client/lexicons'; 4 4 import { EventEmitter } from '@mary/events'; ··· 16 16 import { findAllProfiles as findAllProfilesInTimeline } from '../queries-cache/timeline'; 17 17 import { EQUALS_DEQUAL } from '../utils/dequal'; 18 18 import type { AccessorMaybe } from '../utils/types'; 19 + 19 20 import { iterateQueryCache } from './utils'; 20 21 21 22 export interface ProfileShadow {
+1 -1
src/api/cache/utils.ts
··· 1 - import { matchQuery, type QueryClient, type QueryFilters } from '@mary/solid-query'; 1 + import { type QueryClient, type QueryFilters, matchQuery } from '@mary/solid-query'; 2 2 3 3 export interface CacheMatcher<T> { 4 4 filter: QueryFilters;
+1 -1
src/api/models/post-thread.tsx
··· 10 10 11 11 import { 12 12 ContextContentList, 13 - getModerationUI, 14 13 type ModerationCause, 15 14 type ModerationOptions, 15 + getModerationUI, 16 16 } from '../moderation'; 17 17 import { moderatePost } from '../moderation/entities/post'; 18 18
+1 -1
src/api/moderation/entities/generic.ts
··· 1 1 import type { At, ComAtprotoLabelDefs } from '@atcute/client/lexicons'; 2 2 3 - import { TargetContent, decideLabelModeration, type ModerationCause, type ModerationOptions } from '..'; 3 + import { type ModerationCause, type ModerationOptions, TargetContent, decideLabelModeration } from '..'; 4 4 5 5 export const moderateGeneric = ( 6 6 item: { labels?: ComAtprotoLabelDefs.Label[] },
+3 -2
src/api/moderation/entities/post.ts
··· 3 3 import { unwrapPostEmbedText } from '~/api/utils/post'; 4 4 5 5 import { 6 + type ModerationCause, 7 + type ModerationOptions, 6 8 PreferenceWarn, 7 9 TargetContent, 8 10 decideLabelModeration, 9 11 decideMutedKeywordModeration, 10 - type ModerationCause, 11 - type ModerationOptions, 12 12 } from '..'; 13 + 13 14 import { moderateProfile } from './profile'; 14 15 15 16 export const moderatePost = (post: AppBskyFeedDefs.PostView, opts: ModerationOptions) => {
+2 -2
src/api/moderation/entities/profile.ts
··· 1 1 import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 2 2 3 3 import { 4 + type ModerationCause, 5 + type ModerationOptions, 4 6 TargetAccount, 5 7 TargetProfile, 6 8 decideLabelModeration, 7 9 decideMutedPermanentModeration, 8 - type ModerationCause, 9 - type ModerationOptions, 10 10 } from '..'; 11 11 12 12 type AllProfileView =
+3 -2
src/api/moderation/entities/quote.ts
··· 3 3 import { unwrapPostEmbedText } from '~/api/utils/post'; 4 4 5 5 import { 6 + type ModerationCause, 7 + type ModerationOptions, 6 8 PreferenceWarn, 7 9 TargetContent, 8 10 decideLabelModeration, 9 11 decideMutedKeywordModeration, 10 - type ModerationCause, 11 - type ModerationOptions, 12 12 } from '..'; 13 + 13 14 import { moderateProfile } from './profile'; 14 15 15 16 export const moderateQuote = (quote: AppBskyEmbedRecord.ViewRecord, opts: ModerationOptions) => {
+6 -6
src/api/moderation/labeler.ts
··· 7 7 BlurMedia, 8 8 BlurNone, 9 9 FlagsAdultOnly, 10 + FlagsNoSelf, 10 11 FlagsNone, 11 - FlagsNoSelf, 12 + type LabelBlur, 13 + type LabelDefinitionMapping, 14 + type LabelPreference, 15 + type LabelSeverity, 16 + type ModerationLabeler, 12 17 PreferenceHide, 13 18 PreferenceIgnore, 14 19 PreferenceWarn, 15 20 SeverityAlert, 16 21 SeverityInform, 17 22 SeverityNone, 18 - type LabelBlur, 19 - type LabelDefinitionMapping, 20 - type LabelPreference, 21 - type LabelSeverity, 22 - type ModerationLabeler, 23 23 } from '.'; 24 24 25 25 export const interpretLabelerDefinition = (
+2 -2
src/api/mutations/post.ts
··· 4 4 import { useAgent } from '~/lib/states/agent'; 5 5 import { useSession } from '~/lib/states/session'; 6 6 7 - import { updatePostShadow, type PostShadowView } from '../cache/post-shadow'; 7 + import { type PostShadowView, updatePostShadow } from '../cache/post-shadow'; 8 + import { getCurrentDate } from '../utils/misc'; 8 9 import { createRecord, deleteRecord } from '../utils/records'; 9 10 import { parseAtUri } from '../utils/strings'; 10 11 import { createToggleMutationQueue } from '../utils/toggle-mutation'; 11 - import { getCurrentDate } from '../utils/misc'; 12 12 13 13 export const createPostLikeMutation = ( 14 14 post: () => AppBskyFeedDefs.PostView,
+2 -2
src/api/mutations/profile.ts
··· 4 4 import { useAgent } from '~/lib/states/agent'; 5 5 import { useSession } from '~/lib/states/session'; 6 6 7 - import { updateProfileShadow, type ProfileShadowView } from '../cache/profile-shadow'; 7 + import { type ProfileShadowView, updateProfileShadow } from '../cache/profile-shadow'; 8 + import { getCurrentDate } from '../utils/misc'; 8 9 import { createRecord, deleteRecord } from '../utils/records'; 9 10 import { parseAtUri } from '../utils/strings'; 10 11 import { createToggleMutationQueue } from '../utils/toggle-mutation'; 11 - import { getCurrentDate } from '../utils/misc'; 12 12 13 13 export const createProfileFollowMutation = ( 14 14 profile: () => AppBskyActorDefs.ProfileView | AppBskyActorDefs.ProfileViewDetailed,
+1 -1
src/api/queries-cache/profile-following.ts
··· 1 - import type { AppBskyActorDefs, At, AppBskyGraphGetFollows } from '@atcute/client/lexicons'; 1 + import type { AppBskyActorDefs, AppBskyGraphGetFollows, At } from '@atcute/client/lexicons'; 2 2 import type { InfiniteData } from '@mary/solid-query'; 3 3 4 4 import type { CacheMatcher } from '../cache/utils';
+1 -1
src/api/queries/composer-gif.ts
··· 1 - import { createInfiniteQuery, type InfiniteData, type QueryFunctionContext as QC } from '@mary/solid-query'; 1 + import { type InfiniteData, type QueryFunctionContext as QC, createInfiniteQuery } from '@mary/solid-query'; 2 2 3 3 const GIF_ENDPOINT = `https://gifs.bsky.app`; 4 4
+1
src/api/queries/feed.ts
··· 4 4 import { useAgent } from '~/lib/states/agent'; 5 5 6 6 import { isDid, parseAtUri } from '../utils/strings'; 7 + 7 8 import { resolveHandle } from './handle'; 8 9 9 10 export interface ExtendedGeneratorView extends AppBskyFeedDefs.GeneratorView {
+1
src/api/queries/list.ts
··· 4 4 import { useAgent } from '~/lib/states/agent'; 5 5 6 6 import { isDid, parseAtUri } from '../utils/strings'; 7 + 7 8 import { resolveHandle } from './handle'; 8 9 9 10 export const createListMetaQuery = (listUri: () => string) => {
+3 -3
src/api/queries/notification-feed.tsx
··· 1 1 import { createSignal } from 'solid-js'; 2 2 3 3 import type { AppBskyFeedDefs, AppBskyNotificationListNotifications } from '@atcute/client/lexicons'; 4 - import { createInfiniteQuery, useQueryClient, type QueryFunctionContext as QC } from '@mary/solid-query'; 4 + import { type QueryFunctionContext as QC, createInfiniteQuery, useQueryClient } from '@mary/solid-query'; 5 5 6 - import { mapDefined } from '~/lib/utils/misc'; 7 6 import { useAgent } from '~/lib/states/agent'; 7 + import { mapDefined } from '~/lib/utils/misc'; 8 8 9 9 import { dequal } from '../utils/dequal'; 10 + import { chunked } from '../utils/misc'; 10 11 import { resetInfiniteData } from '../utils/query'; 11 12 import { parseAtUri } from '../utils/strings'; 12 - import { chunked } from '../utils/misc'; 13 13 14 14 type Notification = AppBskyNotificationListNotifications.Notification; 15 15
+1 -1
src/api/queries/post-quotes.ts
··· 1 - import { createInfiniteQuery, type QueryFunctionContext as QC } from '@mary/solid-query'; 2 1 import type { AppBskyFeedGetQuotes } from '@atcute/client/lexicons'; 2 + import { type QueryFunctionContext as QC, createInfiniteQuery } from '@mary/solid-query'; 3 3 4 4 import { useAgent } from '~/lib/states/agent'; 5 5
+1
src/api/queries/post.ts
··· 5 5 6 6 import { findPostsInCache } from '../cache/post-shadow'; 7 7 import { isDid, parseAtUri } from '../utils/strings'; 8 + 8 9 import { resolveHandle } from './handle'; 9 10 10 11 export const createPostQuery = (postUri: () => string) => {
+2 -1
src/api/queries/profile-followers.ts
··· 1 1 import type { AppBskyActorDefs, AppBskyGraphGetFollowers } from '@atcute/client/lexicons'; 2 - import { createInfiniteQuery, type InfiniteData, type QueryFunctionContext as QC } from '@mary/solid-query'; 2 + import { type InfiniteData, type QueryFunctionContext as QC, createInfiniteQuery } from '@mary/solid-query'; 3 + 3 4 import { useAgent } from '~/lib/states/agent'; 4 5 5 6 export const createProfileFollowersQuery = (didOrHandle: () => string) => {
+1 -1
src/api/queries/profile-following.ts
··· 1 1 import type { AppBskyActorDefs, AppBskyGraphGetFollows } from '@atcute/client/lexicons'; 2 - import { createInfiniteQuery, type InfiniteData, type QueryFunctionContext as QC } from '@mary/solid-query'; 2 + import { type InfiniteData, type QueryFunctionContext as QC, createInfiniteQuery } from '@mary/solid-query'; 3 3 4 4 import { useAgent } from '~/lib/states/agent'; 5 5
+1 -1
src/api/queries/profile-known-followers.ts
··· 1 1 import type { AppBskyActorDefs, AppBskyGraphGetFollowers } from '@atcute/client/lexicons'; 2 - import { createInfiniteQuery, type InfiniteData, type QueryFunctionContext as QC } from '@mary/solid-query'; 2 + import { type InfiniteData, type QueryFunctionContext as QC, createInfiniteQuery } from '@mary/solid-query'; 3 3 4 4 import { useAgent } from '~/lib/states/agent'; 5 5
+1 -1
src/api/queries/profile.ts
··· 1 1 import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 2 - import { createQuery, type QueryPersister } from '@mary/solid-query'; 2 + import { type QueryPersister, createQuery } from '@mary/solid-query'; 3 3 4 4 import { useAgent } from '~/lib/states/agent'; 5 5 import { useSession } from '~/lib/states/session';
+5 -6
src/api/queries/timeline.ts
··· 8 8 AppBskyFeedPost, 9 9 At, 10 10 } from '@atcute/client/lexicons'; 11 - import { createInfiniteQuery, createQuery, useQueryClient, type InfiniteData } from '@mary/solid-query'; 11 + import { type InfiniteData, createInfiniteQuery, createQuery, useQueryClient } from '@mary/solid-query'; 12 12 13 13 import { globalEvents } from '~/globals/events'; 14 14 15 - import { assert } from '~/lib/utils/invariant'; 16 15 import { useAgent } from '~/lib/states/agent'; 17 16 import { useModerationOptions } from '~/lib/states/moderation'; 18 17 import { useSession } from '~/lib/states/session'; 18 + import { assert } from '~/lib/utils/invariant'; 19 19 20 20 import { 21 - createJoinedItems, 22 21 type EnsuredReplyRef, 23 22 type EnsuredTimelineItem, 24 23 type PostFilter, 25 24 type SliceFilter, 26 25 type TimelineSlice, 27 26 type UiTimelineItem, 27 + createJoinedItems, 28 28 } from '../models/timeline'; 29 29 import { 30 30 ContextContentList, 31 + type ModerationCause, 32 + type ModerationOptions, 31 33 PreferenceHide, 32 34 TargetContent, 33 35 decideLabelModeration, 34 36 decideMutedKeywordModeration, 35 37 getModerationUI, 36 - type ModerationCause, 37 - type ModerationOptions, 38 38 } from '../moderation'; 39 - 40 39 import { EQUALS_DEQUAL } from '../utils/dequal'; 41 40 import { unwrapPostEmbedText } from '../utils/post'; 42 41 import { resetInfiniteData, wrapQuery } from '../utils/query';
-1
src/api/richtext/parser/parse.ts
··· 1 1 import { safeUrlParse } from '../../utils/strings'; 2 - 3 2 import { graphemeLen } from '../intl'; 4 3 import { toShortUrl } from '../url'; 5 4
+1
src/api/richtext/segment.ts
··· 1 1 import type { AppBskyRichtextFacet, BlueMojiRichtextFacet, Brand } from '@atcute/client/lexicons'; 2 2 3 3 import type { UnwrapArray } from '../utils/types'; 4 + 4 5 import { textDecoder, textEncoder } from './intl'; 5 6 6 7 interface UtfString {
+1 -1
src/components/avatar.tsx
··· 2 2 3 3 import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 4 4 5 - import { ContextProfileMedia, getModerationUI, type ModerationCause } from '~/api/moderation'; 5 + import { ContextProfileMedia, type ModerationCause, getModerationUI } from '~/api/moderation'; 6 6 7 7 import DefaultFeedAvatar from '~/assets/default-feed-avatar.svg?url'; 8 8 import DefaultLabelerAvatar from '~/assets/default-labeler-avatar.svg?url';
+2 -2
src/components/bookmarks/add-post-to-folder-dialog.tsx
··· 1 - import { createMemo, For } from 'solid-js'; 1 + import { For, createMemo } from 'solid-js'; 2 2 3 3 import type { AppBskyFeedDefs } from '@atcute/client/lexicons'; 4 4 import { useQueryClient } from '@mary/solid-query'; ··· 9 9 import { openModal, useModalContext } from '~/globals/modals'; 10 10 11 11 import { createDerivedSignal } from '~/lib/hooks/derived-signal'; 12 - import { isSetEqual } from '~/lib/utils/misc'; 13 12 import { useBookmarks } from '~/lib/states/bookmarks'; 13 + import { isSetEqual } from '~/lib/utils/misc'; 14 14 15 15 import Button from '../button'; 16 16 import * as Dialog from '../dialog';
+1 -1
src/components/boxed.tsx
··· 1 - import { createMemo, type Component, type ComponentProps, type JSX } from 'solid-js'; 1 + import { type Component, type ComponentProps, type JSX, createMemo } from 'solid-js'; 2 2 3 3 import { openModal, useModalContext } from '~/globals/modals'; 4 4
+18 -21
src/components/composer/composer-dialog.tsx
··· 1 1 import { 2 + type Component, 3 + type ComponentProps, 2 4 For, 5 + type JSX, 3 6 Show, 4 7 batch, 5 8 createEffect, 6 9 createMemo, 7 10 createSignal, 8 - type Component, 9 - type ComponentProps, 10 - type JSX, 11 11 } from 'solid-js'; 12 12 import { createMutable, unwrap } from 'solid-js/store'; 13 13 14 14 import type { AppBskyActorDefs, AppBskyFeedPost } from '@atcute/client/lexicons'; 15 - import { useQueryClient, type CreateQueryResult } from '@mary/solid-query'; 15 + import { type CreateQueryResult, useQueryClient } from '@mary/solid-query'; 16 16 17 17 import { GLOBAL_LABELS, getLocalizedLabel } from '~/api/moderation'; 18 18 import { createProfileQuery } from '~/api/queries/profile'; ··· 23 23 import { openModal, useModalContext } from '~/globals/modals'; 24 24 25 25 import { createEventListener } from '~/lib/hooks/event-listener'; 26 - import { createGuard, type GuardFunction } from '~/lib/hooks/guard'; 27 - import { assert } from '~/lib/utils/invariant'; 28 - import { on } from '~/lib/utils/misc'; 26 + import { type GuardFunction, createGuard } from '~/lib/hooks/guard'; 29 27 import { useAgent } from '~/lib/states/agent'; 30 28 import { useSession } from '~/lib/states/session'; 31 29 import { SUPPORTED_IMAGE_FORMATS, openImagePicker } from '~/lib/utils/blob'; 30 + import { assert } from '~/lib/utils/invariant'; 31 + import { on } from '~/lib/utils/misc'; 32 32 33 + import Avatar, { getUserAvatarType } from '../avatar'; 33 34 import Button from '../button'; 35 + import CircularProgress from '../circular-progress'; 34 36 import * as Dialog from '../dialog'; 35 - import IconButton from '../icon-button'; 36 - import * as Prompt from '../prompt'; 37 - 38 - import Avatar, { getUserAvatarType } from '../avatar'; 39 - import CircularProgress from '../circular-progress'; 40 37 import Divider from '../divider'; 41 38 import { useFieldset } from '../fieldset'; 39 + import IconButton from '../icon-button'; 42 40 import AddOutlinedIcon from '../icons-central/add-outline'; 43 41 import AtOutlinedIcon from '../icons-central/at-outline'; 44 42 import BlockOutlinedIcon from '../icons-central/block-outline'; ··· 55 53 import ShieldOutlinedIcon from '../icons-central/shield-outline'; 56 54 import TranslateOutlinedIcon from '../icons-central/translate-outline'; 57 55 import Keyed from '../keyed'; 56 + import * as Prompt from '../prompt'; 58 57 59 58 import ComposerInput from './composer-input'; 60 - 61 59 import ComposerReplyContext from './composer-reply-context'; 62 60 import ContentWarningMenu from './dialogs/content-warning-menu'; 63 61 import LanguageSelectDialogLazy from './dialogs/language-select-dialog-lazy'; ··· 69 67 import ImageEmbed from './embeds/image-embed'; 70 68 import ListEmbed from './embeds/list-embed'; 71 69 import QuoteEmbed from './embeds/quote-embed'; 72 - import GifSearchDialogLazy from './gifs/gif-search-dialog-lazy'; 73 - 74 70 import type { BaseEmbedProps } from './embeds/types'; 71 + import GifSearchDialogLazy from './gifs/gif-search-dialog-lazy'; 75 72 import { publish } from './lib/api'; 76 73 import { getEmbedFromLink } from './lib/link-detection'; 77 74 import { 75 + type ComposerState, 76 + type CreateComposerStateOptions, 78 77 EmbedKind, 78 + type PostEmbed, 79 + type PostRecordEmbed, 80 + type PostRecordWithMediaEmbed, 81 + type PostState, 79 82 ThreadgateKnownValue, 80 83 createComposerState, 81 84 createPostState, ··· 84 87 getPostEmbedFlags, 85 88 getPostRt, 86 89 getThreadgateValue, 87 - type ComposerState, 88 - type CreateComposerStateOptions, 89 - type PostEmbed, 90 - type PostRecordEmbed, 91 - type PostRecordWithMediaEmbed, 92 - type PostState, 93 90 } from './lib/state'; 94 91 95 92 export interface ComposerDialogProps {
+3 -4
src/components/composer/composer-input.tsx
··· 1 + import { autoPlacement, autoUpdate, offset, shift, size } from '@floating-ui/dom'; 1 2 import { useFloating } from 'solid-floating-ui'; 2 3 import { 3 4 For, 5 + type JSX, 4 6 Match, 5 7 Switch, 6 8 createEffect, ··· 8 10 createRenderEffect, 9 11 createResource, 10 12 createSignal, 11 - type JSX, 12 13 } from 'solid-js'; 13 14 14 15 import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 15 16 16 - import { autoPlacement, autoUpdate, offset, shift, size } from '@floating-ui/dom'; 17 - 18 17 import { type PreliminaryRichText } from '~/api/richtext/parser/parse'; 19 18 import { safeUrlParse } from '~/api/utils/strings'; 20 19 ··· 22 21 import { createEventListener } from '~/lib/hooks/event-listener'; 23 22 import { useTextareaAutosize } from '~/lib/hooks/textarea-autosize'; 24 23 import { isCtrlKeyPressed } from '~/lib/interaction'; 25 - import { assert } from '~/lib/utils/invariant'; 26 24 import { useAgent } from '~/lib/states/agent'; 25 + import { assert } from '~/lib/utils/invariant'; 27 26 28 27 import Avatar, { getUserAvatarType } from '../avatar'; 29 28 import CircularProgress from '../circular-progress';
-1
src/components/composer/dialogs/gif-alt-dialog.tsx
··· 12 12 import Divider from '../../divider'; 13 13 import CharCounterAccessory from '../../input/char-counter-accessory'; 14 14 import TextareaInput from '../../textarea-input'; 15 - 16 15 import type { GifMedia } from '../gifs/gif-search-dialog'; 17 16 18 17 export interface GifAltDialogProps {
-1
src/components/composer/dialogs/threadgate-menu.tsx
··· 8 8 import EarthOutlinedIcon from '../../icons-central/earth-outline'; 9 9 import PersonCheckOutlinedIcon from '../../icons-central/person-check-outline'; 10 10 import * as Menu from '../../menu'; 11 - 12 11 import { ThreadgateKnownValue, getThreadgateValue } from '../lib/state'; 13 12 14 13 export interface ThreadgateMenuProps {
+2 -2
src/components/composer/embeds/external-embed.tsx
··· 5 5 import { createLinkMetaQuery } from '~/api/queries/composer'; 6 6 7 7 import CircularProgress from '~/components/circular-progress'; 8 + import ExternalEmbedContent from '~/components/embeds/external-embed'; 8 9 import IconButton from '~/components/icon-button'; 9 10 import CrossLargeOutlinedIcon from '~/components/icons-central/cross-large-outline'; 10 11 11 - import ExternalEmbedContent from '~/components/embeds/external-embed'; 12 + import type { PostExternalEmbed } from '../lib/state'; 12 13 13 - import type { PostExternalEmbed } from '../lib/state'; 14 14 import type { BaseEmbedProps } from './types'; 15 15 16 16 export interface ExternalEmbedProps extends BaseEmbedProps {
+2 -2
src/components/composer/embeds/feed-embed.tsx
··· 3 3 import { createFeedMetaQuery } from '~/api/queries/feed'; 4 4 5 5 import CircularProgress from '~/components/circular-progress'; 6 + import FeedEmbedContent from '~/components/embeds/feed-embed'; 6 7 import IconButton from '~/components/icon-button'; 7 8 import CrossLargeOutlinedIcon from '~/components/icons-central/cross-large-outline'; 8 9 9 - import FeedEmbedContent from '~/components/embeds/feed-embed'; 10 + import type { PostFeedEmbed } from '../lib/state'; 10 11 11 - import type { PostFeedEmbed } from '../lib/state'; 12 12 import type { BaseEmbedProps } from './types'; 13 13 14 14 export interface FeedEmbedProps extends BaseEmbedProps {
+4 -7
src/components/composer/embeds/gif-embed.tsx
··· 1 1 import { openModal } from '~/globals/modals'; 2 2 3 + import AltButton from '../../alt-button'; 4 + import { type BlueskyGifSnippet, SnippetType } from '../../embeds/lib/snippet'; 5 + import { GifEmbed as GifEmbedContent } from '../../embeds/supports/gif-embed'; 3 6 import IconButton from '../../icon-button'; 4 7 import CrossLargeOutlinedIcon from '../../icons-central/cross-large-outline'; 5 8 import Keyed from '../../keyed'; 6 - 7 - import AltButton from '../../alt-button'; 8 - 9 - import { SnippetType, type BlueskyGifSnippet } from '../../embeds/lib/snippet'; 10 - import { GifEmbed as GifEmbedContent } from '../../embeds/supports/gif-embed'; 11 - 12 9 import GifAltDialogLazy from '../dialogs/gif-alt-dialog-lazy'; 13 - 14 10 import type { PostGifEmbed } from '../lib/state'; 11 + 15 12 import type { BaseEmbedProps } from './types'; 16 13 17 14 export interface GifEmbedProps extends BaseEmbedProps {
+2 -3
src/components/composer/embeds/image-embed.tsx
··· 2 2 3 3 import { openModal } from '~/globals/modals'; 4 4 5 + import AltButton from '../../alt-button'; 5 6 import IconButton from '../../icon-button'; 6 7 import CrossLargeOutlinedIcon from '../../icons-central/cross-large-outline'; 7 - 8 - import AltButton from '../../alt-button'; 9 8 import ImageAltDialogLazy from '../dialogs/image-alt-dialog-lazy'; 10 - 11 9 import type { PostImageEmbed } from '../lib/state'; 10 + 12 11 import type { BaseEmbedProps } from './types'; 13 12 14 13 export interface ImageEmbedProps extends BaseEmbedProps {
+2 -2
src/components/composer/embeds/list-embed.tsx
··· 3 3 import { createListMetaQuery } from '~/api/queries/list'; 4 4 5 5 import CircularProgress from '~/components/circular-progress'; 6 + import ListEmbedContent from '~/components/embeds/list-embed'; 6 7 import IconButton from '~/components/icon-button'; 7 8 import CrossLargeOutlinedIcon from '~/components/icons-central/cross-large-outline'; 8 9 9 - import ListEmbedContent from '~/components/embeds/list-embed'; 10 + import type { PostListEmbed } from '../lib/state'; 10 11 11 - import type { PostListEmbed } from '../lib/state'; 12 12 import type { BaseEmbedProps } from './types'; 13 13 14 14 export interface ListEmbedProps extends BaseEmbedProps {
+2 -2
src/components/composer/embeds/quote-embed.tsx
··· 5 5 import { createPostQuery } from '~/api/queries/post'; 6 6 7 7 import CircularProgress from '~/components/circular-progress'; 8 + import QuoteEmbedContent from '~/components/embeds/quote-embed'; 8 9 import IconButton from '~/components/icon-button'; 9 10 import CrossLargeOutlinedIcon from '~/components/icons-central/cross-large-outline'; 10 11 11 - import QuoteEmbedContent from '~/components/embeds/quote-embed'; 12 + import type { PostQuoteEmbed } from '../lib/state'; 12 13 13 - import type { PostQuoteEmbed } from '../lib/state'; 14 14 import type { BaseEmbedProps } from './types'; 15 15 16 16 export interface QuoteEmbedProps extends BaseEmbedProps {
+1 -1
src/components/composer/gifs/gif-search-dialog.tsx
··· 1 1 import { For, Match, Switch, createSignal } from 'solid-js'; 2 2 3 - import { createGifSearchQuery, type Gif } from '~/api/queries/composer-gif'; 3 + import { type Gif, createGifSearchQuery } from '~/api/queries/composer-gif'; 4 4 import { chunked } from '~/api/utils/misc'; 5 5 6 6 import { useModalContext } from '~/globals/modals';
+4 -4
src/components/composer/lib/api.ts
··· 22 22 import type { LinkMeta } from '~/api/queries/composer'; 23 23 import { getUtf8Length } from '~/api/richtext/intl'; 24 24 import type { PreliminaryRichText } from '~/api/richtext/parser/parse'; 25 - 26 25 import { getRecord } from '~/api/utils/records'; 26 + 27 27 import { compressPostImage } from '~/lib/bsky/image'; 28 28 import type { AgentContext } from '~/lib/states/agent'; 29 29 import { assert } from '~/lib/utils/invariant'; 30 30 31 31 import { 32 - EmbedKind, 33 - getEmbedLabels, 34 - getPostRt, 35 32 type ComposerState, 33 + EmbedKind, 36 34 type PostEmbed, 37 35 type PostMediaEmbed, 38 36 type PostRecordEmbed, 37 + getEmbedLabels, 38 + getPostRt, 39 39 } from './state'; 40 40 41 41 export interface PublishOptions {
+2 -2
src/components/composer/lib/state.tsx
··· 2 2 3 3 import type { AppBskyFeedDefs, AppBskyFeedThreadgate } from '@atcute/client/lexicons'; 4 4 5 - import { parseRt, type PreliminaryRichText } from '~/api/richtext/parser/parse'; 5 + import { type PreliminaryRichText, parseRt } from '~/api/richtext/parser/parse'; 6 6 7 7 import { primarySystemLanguage } from '~/globals/locales'; 8 8 9 - import { assert } from '~/lib/utils/invariant'; 10 9 import type { ComposerPreferences } from '~/lib/preferences/account'; 10 + import { assert } from '~/lib/utils/invariant'; 11 11 12 12 import type { GifMedia } from '../gifs/gif-search-dialog'; 13 13
+1 -1
src/components/dialog.tsx
··· 1 1 import { type ParentProps } from 'solid-js'; 2 2 3 3 import { useModalContext } from '~/globals/modals'; 4 - import { useMediaQuery } from '~/lib/hooks/media-query'; 5 4 5 + import { useMediaQuery } from '~/lib/hooks/media-query'; 6 6 import { useModalClose } from '~/lib/hooks/modal-close'; 7 7 8 8 import { Fieldset } from './fieldset';
+1 -1
src/components/embeds/embed.tsx
··· 7 7 Brand, 8 8 } from '@atcute/client/lexicons'; 9 9 10 - import { ContextContentMedia, getModerationUI, type ModerationCause } from '~/api/moderation'; 10 + import { ContextContentMedia, type ModerationCause, getModerationUI } from '~/api/moderation'; 11 11 import { parseAtUri } from '~/api/utils/strings'; 12 12 13 13 import ContentHider from '../moderation/content-hider';
+1 -1
src/components/embeds/external-embed.tsx
··· 1 - import { createSignal, type JSX } from 'solid-js'; 1 + import { type JSX, createSignal } from 'solid-js'; 2 2 3 3 import type { AppBskyEmbedExternal } from '@atcute/client/lexicons'; 4 4
+1 -2
src/components/embeds/players/video-player.tsx
··· 1 + import Hls from 'hls.js'; 1 2 import { onCleanup } from 'solid-js'; 2 - 3 - import Hls from 'hls.js'; 4 3 5 4 import type { AppBskyEmbedVideo } from '@atcute/client/lexicons'; 6 5
+2 -1
src/components/embeds/quote-embed.tsx
··· 1 - import { createMemo, type JSX } from 'solid-js'; 1 + import { type JSX, createMemo } from 'solid-js'; 2 2 3 3 import type { 4 4 AppBskyEmbedImages, ··· 16 16 17 17 import Avatar, { getUserAvatarType } from '../avatar'; 18 18 import TimeAgo from '../time-ago'; 19 + 19 20 import ImageEmbed from './image-embed'; 20 21 import VideoEmbed from './video-embed'; 21 22
+1 -1
src/components/embeds/supports/gif-embed.tsx
··· 1 - import { createRenderEffect, createSignal, lazy, Show, Suspense } from 'solid-js'; 1 + import { Show, Suspense, createRenderEffect, createSignal, lazy } from 'solid-js'; 2 2 3 3 import CircularProgress from '~/components/circular-progress'; 4 4 import PlaySolidIcon from '~/components/icons-central/play-solid';
+1 -1
src/components/embeds/video-embed.tsx
··· 1 - import { createSignal, lazy, Show, Suspense } from 'solid-js'; 1 + import { Show, Suspense, createSignal, lazy } from 'solid-js'; 2 2 3 3 import type { AppBskyEmbedDefs, AppBskyEmbedVideo } from '@atcute/client/lexicons'; 4 4
+1 -1
src/components/fieldset.tsx
··· 1 - import { createContext, createMemo, useContext, type ParentProps } from 'solid-js'; 1 + import { type ParentProps, createContext, createMemo, useContext } from 'solid-js'; 2 2 3 3 export interface FieldsetContext { 4 4 readonly disabled: boolean;
+1 -1
src/components/images/image-viewer-modal.tsx
··· 1 - import { createMemo, createSignal, onMount, Show } from 'solid-js'; 1 + import { Show, createMemo, createSignal, onMount } from 'solid-js'; 2 2 3 3 import { useModalContext } from '~/globals/modals'; 4 4
+1
src/components/inline-link.tsx
··· 1 1 import type { ParentProps } from 'solid-js'; 2 + 2 3 import { useFieldset } from './fieldset'; 3 4 4 5 export interface InlineLinkProps extends ParentProps {
+2 -1
src/components/keyed.tsx
··· 1 - import { createMemo, type JSX } from 'solid-js'; 1 + import { type JSX, createMemo } from 'solid-js'; 2 + 2 3 import { on } from '~/lib/utils/misc'; 3 4 4 5 export interface KeyedProps<T> {
+1 -1
src/components/list.tsx
··· 1 - import { For, Match, Switch, untrack, type JSX } from 'solid-js'; 1 + import { For, type JSX, Match, Switch, untrack } from 'solid-js'; 2 2 3 3 import { getQueryErrorInfo } from '~/api/utils/query'; 4 4
+2 -2
src/components/main/modal-renderer.tsx
··· 1 1 import { For, Suspense, onCleanup } from 'solid-js'; 2 2 3 - import { INTERNAL_ModalContext, INTERNAL_modals, closeModal, type ModalContext } from '~/globals/modals'; 3 + import { INTERNAL_ModalContext, INTERNAL_modals, type ModalContext, closeModal } from '~/globals/modals'; 4 4 5 - import * as Dialog from '../dialog'; 6 5 import CircularProgress from '../circular-progress'; 6 + import * as Dialog from '../dialog'; 7 7 8 8 let isScrollbarSizeDetermined = false; 9 9
+2 -3
src/components/main/sign-in-dialog.tsx
··· 1 - import { createSignal, Match, Switch } from 'solid-js'; 1 + import { Match, Switch, createSignal } from 'solid-js'; 2 2 3 3 import { createMutation } from '@mary/solid-query'; 4 - 5 - import { autofocusOnMutation } from '~/lib/input-refs'; 6 4 7 5 import { OAuthServerAgent } from '~/lib/bsky-oauth/agents/server-agent'; 8 6 import { createES256Key } from '~/lib/bsky-oauth/dpop'; ··· 10 8 import { database } from '~/lib/bsky-oauth/globals'; 11 9 import { resolveFromIdentity } from '~/lib/bsky-oauth/resolver'; 12 10 import { generatePKCE, generateState } from '~/lib/bsky-oauth/utils'; 11 + import { autofocusOnMutation } from '~/lib/input-refs'; 13 12 14 13 import Button from '../button'; 15 14 import * as Dialog from '../dialog';
+3 -4
src/components/menu.tsx
··· 1 + import { flip, shift, size } from '@floating-ui/dom'; 2 + import { type Placement, getSide } from '@floating-ui/utils'; 1 3 import { useFloating } from 'solid-floating-ui'; 2 - import { createSignal, type Component, type JSX } from 'solid-js'; 3 - 4 - import { flip, shift, size } from '@floating-ui/dom'; 5 - import { getSide, type Placement } from '@floating-ui/utils'; 4 + import { type Component, type JSX, createSignal } from 'solid-js'; 6 5 7 6 import { useModalContext } from '~/globals/modals'; 8 7
+1 -1
src/components/moderation/block-account-prompt.tsx
··· 1 - import { Match, onMount, Switch } from 'solid-js'; 1 + import { Match, Switch, onMount } from 'solid-js'; 2 2 3 3 import type { AppBskyActorDefs, At } from '@atcute/client/lexicons'; 4 4 import { createMutation } from '@mary/solid-query';
+3 -3
src/components/moderation/content-hider.tsx
··· 1 - import { createSignal, type Component, type JSX, type ParentProps } from 'solid-js'; 1 + import { type Component, type JSX, type ParentProps, createSignal } from 'solid-js'; 2 2 3 3 import { 4 4 CauseLabel, 5 5 CauseMutedKeyword, 6 6 CauseMutedPermanent, 7 7 CauseMutedTemporary, 8 - SeverityAlert, 9 - getLocalizedLabel, 10 8 type ModerationCause, 11 9 type ModerationCauseType, 12 10 type ModerationLabeler, 13 11 type ModerationUI, 12 + SeverityAlert, 13 + getLocalizedLabel, 14 14 } from '~/api/moderation'; 15 15 16 16 import { openModal } from '~/globals/modals';
+1 -1
src/components/moderation/label-details-prompt.tsx
··· 1 - import { getLocalizedLabel, type LabelModerationCause, type ModerationLabeler } from '~/api/moderation'; 1 + import { type LabelModerationCause, type ModerationLabeler, getLocalizedLabel } from '~/api/moderation'; 2 2 3 3 import { useModalContext } from '~/globals/modals'; 4 4
+2 -2
src/components/moderation/moderation-alerts.tsx
··· 1 - import { createMemo, type JSX } from 'solid-js'; 1 + import { type JSX, createMemo } from 'solid-js'; 2 2 3 3 import { 4 4 CauseLabel, 5 - getLocalizedLabel, 6 5 type LabelModerationCause, 7 6 type ModerationCause, 8 7 type ModerationUI, 8 + getLocalizedLabel, 9 9 } from '~/api/moderation'; 10 10 import { EQUALS_DEQUAL } from '~/api/utils/dequal'; 11 11
+1 -1
src/components/moderation/mute-account-prompt.tsx
··· 1 - import { Match, onMount, Switch } from 'solid-js'; 1 + import { Match, Switch, onMount } from 'solid-js'; 2 2 3 3 import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 4 4 import { createMutation } from '@mary/solid-query';
+2 -3
src/components/notifications/notification-item.tsx
··· 1 - import { createMemo, type Component, type ComponentProps, type JSX } from 'solid-js'; 1 + import { type Component, type ComponentProps, type JSX, createMemo } from 'solid-js'; 2 2 3 3 import type { 4 4 AppBskyEmbedImages, ··· 26 26 import { assert } from '~/lib/utils/invariant'; 27 27 28 28 import Avatar, { getUserAvatarType } from '../avatar'; 29 + import { type BlueskyGifSnippet, SnippetType, detectSnippet } from '../embeds/lib/snippet'; 29 30 import HeartSolidIcon from '../icons-central/heart-solid'; 30 31 import PersonSolidIcon from '../icons-central/person-solid'; 31 32 import RepeatOutlinedIcon from '../icons-central/repeat-outline'; 32 - 33 - import { detectSnippet, SnippetType, type BlueskyGifSnippet } from '../embeds/lib/snippet'; 34 33 import PostFeedItem from '../timeline/post-feed-item'; 35 34 36 35 export interface NotificationItemProps {
+1 -1
src/components/paged-list.tsx
··· 1 - import { For, Match, Switch, untrack, type JSX } from 'solid-js'; 1 + import { For, type JSX, Match, Switch, untrack } from 'solid-js'; 2 2 3 3 import { getQueryErrorInfo } from '~/api/utils/query'; 4 4
+1 -1
src/components/profiles/edit-profile-dialog.tsx
··· 1 - import { createMemo, createSignal, Show } from 'solid-js'; 1 + import { Show, createMemo, createSignal } from 'solid-js'; 2 2 3 3 import type { AppBskyActorDefs, At } from '@atcute/client/lexicons'; 4 4 import { createMutation } from '@mary/solid-query';
+1 -1
src/components/profiles/profile-follow-button.tsx
··· 1 - import { createMemo, type JSX } from 'solid-js'; 1 + import { type JSX, createMemo } from 'solid-js'; 2 2 3 3 import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 4 4
+1 -1
src/components/profiles/profile-item.tsx
··· 1 - import { createMemo, type JSX } from 'solid-js'; 1 + import { type JSX, createMemo } from 'solid-js'; 2 2 3 3 import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 4 4 import { useQueryClient } from '@mary/solid-query';
-1
src/components/profiles/profile-overflow-menu.tsx
··· 22 22 import ShareOutlinedIcon from '../icons-central/share-outline'; 23 23 import VolumeFullOutlinedIcon from '../icons-central/volume-full-outlined'; 24 24 import * as Menu from '../menu'; 25 - 26 25 import BlockAccountPromptLazy from '../moderation/block-account-prompt-lazy'; 27 26 import MuteAccountPromptLazy from '../moderation/mute-account-prompt-lazy'; 28 27
+4 -5
src/components/profiles/profile-view-header.tsx
··· 1 - import { type Component, type ComponentProps, createMemo, type JSX, Match, Show, Switch } from 'solid-js'; 1 + import { type Component, type ComponentProps, type JSX, Match, Show, Switch, createMemo } from 'solid-js'; 2 2 3 3 import type { AppBskyActorDefs } from '@atcute/client/lexicons'; 4 4 ··· 13 13 import { useModerationOptions } from '~/lib/states/moderation'; 14 14 import { useSession } from '~/lib/states/session'; 15 15 16 + import DefaultLabelerAvatar from '~/assets/default-labeler-avatar.svg?url'; 17 + import DefaultUserAvatar from '~/assets/default-user-avatar.svg?url'; 18 + 16 19 import Avatar, { getUserAvatarType } from '../avatar'; 17 20 import Button from '../button'; 18 21 import IconButton from '../icon-button'; 19 22 import MailOutlinedIcon from '../icons-central/mail-outline'; 20 23 import MuteOutlinedIcon from '../icons-central/mute-outline'; 21 - 22 24 import ImageViewerModalLazy from '../images/image-viewer-modal-lazy'; 23 25 24 26 import EditProfileDialogLazy from './edit-profile-dialog-lazy'; 25 27 import ProfileFollowButton from './profile-follow-button'; 26 - 27 - import DefaultLabelerAvatar from '~/assets/default-labeler-avatar.svg?url'; 28 - import DefaultUserAvatar from '~/assets/default-user-avatar.svg?url'; 29 28 30 29 export interface ProfileViewHeader { 31 30 /** Expects DID to be static */
+1
src/components/prompt.tsx
··· 1 1 import type { JSX } from 'solid-js'; 2 + 2 3 import { useModalContext } from '~/globals/modals'; 3 4 4 5 import { useMediaQuery } from '~/lib/hooks/media-query';
+1 -1
src/components/settings/app-passwords/add-app-password-prompt.tsx
··· 1 - import { createSignal, Match, Switch } from 'solid-js'; 1 + import { Match, Switch, createSignal } from 'solid-js'; 2 2 3 3 import { createMutation } from '@mary/solid-query'; 4 4
+2 -3
src/components/settings/bluemoji/add-emote-prompt.tsx
··· 11 11 12 12 import { useModalContext } from '~/globals/modals'; 13 13 14 + import { getCompressedEmotes } from '~/lib/bluemoji/compress'; 14 15 import { autofocusNode, modelChecked, modelText } from '~/lib/input-refs'; 15 16 import { useAgent } from '~/lib/states/agent'; 16 17 import { useSession } from '~/lib/states/session'; 17 - import { validate, type Validation } from '~/lib/validation'; 18 - 19 - import { getCompressedEmotes } from '~/lib/bluemoji/compress'; 18 + import { type Validation, validate } from '~/lib/validation'; 20 19 21 20 import CheckboxInput from '../../checkbox-input'; 22 21 import * as Prompt from '../../prompt';
+1 -1
src/components/settings/moderation/labeling/labeler-overflow-menu.tsx
··· 4 4 import { history } from '~/globals/navigation'; 5 5 6 6 import PersonOutlinedIcon from '~/components/icons-central/person-outline'; 7 - import * as Menu from '~/components/menu'; 8 7 import ShieldOffOutlinedIcon from '~/components/icons-central/shield-off-outline'; 8 + import * as Menu from '~/components/menu'; 9 9 10 10 export interface LabelerOverflowMenuProps { 11 11 anchor: HTMLElement;
+4 -5
src/components/threads/highlighted-post.tsx
··· 1 - import { createMemo, Show } from 'solid-js'; 1 + import { Show, createMemo } from 'solid-js'; 2 2 3 3 import type { AppBskyFeedDefs, AppBskyFeedPost } from '@atcute/client/lexicons'; 4 4 ··· 15 15 import { useModerationOptions } from '~/lib/states/moderation'; 16 16 17 17 import Avatar, { getUserAvatarType } from '../avatar'; 18 + import ComposerDialogLazy from '../composer/composer-dialog-lazy'; 18 19 import Divider from '../divider'; 20 + import Embed from '../embeds/embed'; 19 21 import HeartOutlinedIcon from '../icons-central/heart-outline'; 20 22 import HeartSolidIcon from '../icons-central/heart-solid'; 21 23 import MoreHorizOutlinedIcon from '../icons-central/more-horiz-outline'; 22 24 import RepeatOutlinedIcon from '../icons-central/repeat-outline'; 23 25 import ReplyOutlinedIcon from '../icons-central/reply-outline'; 24 26 import ShareOutlinedIcon from '../icons-central/share-outline'; 25 - import RichText from '../rich-text'; 26 - 27 - import ComposerDialogLazy from '../composer/composer-dialog-lazy'; 28 - import Embed from '../embeds/embed'; 29 27 import ContentHider from '../moderation/content-hider'; 30 28 import ModerationAlerts from '../moderation/moderation-alerts'; 29 + import RichText from '../rich-text'; 31 30 import PostOverflowMenu from '../timeline/post-overflow-menu'; 32 31 import RepostMenu from '../timeline/repost-menu'; 33 32
+2 -3
src/components/threads/post-thread-item.tsx
··· 1 - import { createMemo, type JSX, Show } from 'solid-js'; 1 + import { type JSX, Show, createMemo } from 'solid-js'; 2 2 3 3 import type { AppBskyFeedPost } from '@atcute/client/lexicons'; 4 4 import { useQueryClient } from '@mary/solid-query'; ··· 17 17 import { useSession } from '~/lib/states/session'; 18 18 19 19 import Avatar, { getUserAvatarType } from '../avatar'; 20 - import RichText from '../rich-text'; 21 - 22 20 import Embed from '../embeds/embed'; 23 21 import ContentHider from '../moderation/content-hider'; 22 + import RichText from '../rich-text'; 24 23 import PostActions from '../timeline/post-actions'; 25 24 import PostMeta from '../timeline/post-meta'; 26 25
+1 -1
src/components/threads/thread-lines.tsx
··· 1 - import { createMemo, type JSX } from 'solid-js'; 1 + import { type JSX, createMemo } from 'solid-js'; 2 2 3 3 import { LineType } from '~/api/models/post-thread'; 4 4 import { EQUALS_DEQUAL } from '~/api/utils/dequal';
+1 -1
src/components/time-ago.tsx
··· 1 - import { createRenderEffect, createSignal, type Accessor, type JSX } from 'solid-js'; 1 + import { type Accessor, type JSX, createRenderEffect, createSignal } from 'solid-js'; 2 2 3 3 import { formatAbsDateTime, formatReltime } from '~/lib/intl/time'; 4 4 import { requestIdle } from '~/lib/utils/misc';
+1 -1
src/components/timeline/post-deleted-gate.tsx
··· 1 - import { Show, type JSX } from 'solid-js'; 1 + import { type JSX, Show } from 'solid-js'; 2 2 3 3 export interface PostDeletedGateProps { 4 4 deleted: boolean;
+3 -3
src/components/timeline/post-feed-item.tsx
··· 17 17 import { useSession } from '~/lib/states/session'; 18 18 19 19 import Avatar, { getUserAvatarType } from '../avatar'; 20 - import RepeatOutlinedIcon from '../icons-central/repeat-outline'; 21 - import RichText from '../rich-text'; 22 - 23 20 import Embed from '../embeds/embed'; 21 + import RepeatOutlinedIcon from '../icons-central/repeat-outline'; 24 22 import ContentHider from '../moderation/content-hider'; 25 23 import ModerationAlerts from '../moderation/moderation-alerts'; 24 + import RichText from '../rich-text'; 25 + 26 26 import PostActions from './post-actions'; 27 27 import PostDeletedGate from './post-deleted-gate'; 28 28 import PostMeta from './post-meta';
+3 -4
src/components/timeline/post-overflow-menu.tsx
··· 10 10 11 11 import { openModal, useModalContext } from '~/globals/modals'; 12 12 13 + import { useAgent } from '~/lib/states/agent'; 13 14 import { useBookmarks } from '~/lib/states/bookmarks'; 14 15 import { useSession } from '~/lib/states/session'; 15 16 17 + import AddPostToFolderDialogLazy from '../bookmarks/add-post-to-folder-dialog-lazy'; 16 18 import BookmarkCheckOutlinedIcon from '../icons-central/bookmark-check-outline'; 17 19 import BookmarkOutlinedIcon from '../icons-central/bookmark-outline'; 18 20 import FolderAddOutlinedIcon from '../icons-central/folder-add-outline'; 21 + import OpenInNewOutlinedIcon from '../icons-central/open-in-new-outline'; 19 22 import TrashOutlinedIcon from '../icons-central/trash-outline'; 20 23 import * as Menu from '../menu'; 21 24 import * as Prompt from '../prompt'; 22 - 23 - import { useAgent } from '~/lib/states/agent'; 24 - import AddPostToFolderDialogLazy from '../bookmarks/add-post-to-folder-dialog-lazy'; 25 - import OpenInNewOutlinedIcon from '../icons-central/open-in-new-outline'; 26 25 27 26 export interface PostOverflowMenuProps { 28 27 anchor: HTMLElement;
+2 -1
src/components/timeline/timeline-list.tsx
··· 1 1 import type { At } from '@atcute/client/lexicons'; 2 2 3 - import { useTimelineQuery, type TimelineParams } from '~/api/queries/timeline'; 3 + import { type TimelineParams, useTimelineQuery } from '~/api/queries/timeline'; 4 4 5 5 import PagedList from '../paged-list'; 6 6 import VirtualItem from '../virtual-item'; 7 + 7 8 import PostFeedItem from './post-feed-item'; 8 9 9 10 export interface TimelineListProps {
+1 -1
src/components/virtual-item.tsx
··· 1 - import { createSignal, onCleanup, runWithOwner, type JSX } from 'solid-js'; 1 + import { type JSX, createSignal, onCleanup, runWithOwner } from 'solid-js'; 2 2 3 3 import { UNSAFE_routerEvents, UNSAFE_useViewContext } from '~/lib/navigation/router'; 4 4 import { intersectionCallback } from '~/lib/observer';
+2 -1
src/globals/modals.tsx
··· 1 - import { createContext, createSignal, useContext, type JSX } from 'solid-js'; 1 + import { type JSX, createContext, createSignal, useContext } from 'solid-js'; 2 + 2 3 import { assert } from '~/lib/utils/invariant'; 3 4 4 5 type ModalRenderer = (context: ModalContext) => JSX.Element;
+1 -2
src/globals/preferences.ts
··· 1 1 import { createRoot } from 'solid-js'; 2 2 3 + import { createReactiveLocalStorage } from '~/lib/hooks/local-storage'; 3 4 import type { GlobalPreferenceSchema } from '~/lib/preferences/global'; 4 5 import type { SessionPreferenceSchema } from '~/lib/preferences/sessions'; 5 - 6 - import { createReactiveLocalStorage } from '~/lib/hooks/local-storage'; 7 6 8 7 export const sessions = createRoot(() => { 9 8 return createReactiveLocalStorage<SessionPreferenceSchema>('sessions', (version, prev) => {
+1
src/lib/aglais-bookmarks/search.ts
··· 1 1 import type { AppBskyFeedDefs, AppBskyFeedPost } from '@atcute/client/lexicons'; 2 + 2 3 import { DID_RE, HANDLE_RE } from '~/api/utils/strings'; 3 4 4 5 const SIMPLE_DATE_RE = /^\d{4}-[01]\d-[0-3]\d$/;
+1 -2
src/lib/atproto/labeler.ts
··· 1 - import { buildFetchHandler, type FetchHandler } from '@atcute/client'; 1 + import { type FetchHandler, buildFetchHandler } from '@atcute/client'; 2 2 import type { At } from '@atcute/client/lexicons'; 3 - 4 3 import { mergeHeaders } from '@atcute/client/utils/http'; 5 4 6 5 export interface Labeler {
+1 -2
src/lib/bsky-oauth/agents/server-agent.ts
··· 4 4 import { CLIENT_ID, REDIRECT_URI } from '../env'; 5 5 import { FetchResponseError, OAuthResponseError, TokenRefreshError } from '../errors'; 6 6 import { resolveFromIdentity } from '../resolver'; 7 - import { extractContentType } from '../utils'; 8 - 9 7 import type { DPoPKey } from '../types/dpop'; 10 8 import type { OAuthParResponse } from '../types/par'; 11 9 import type { AuthorizationServerMetadata } from '../types/server'; 12 10 import type { OAuthTokenResponse, TokenSet } from '../types/token'; 11 + import { extractContentType } from '../utils'; 13 12 14 13 export class OAuthServerAgent { 15 14 #fetch: typeof fetch;
+2 -2
src/lib/bsky-oauth/agents/session.ts
··· 4 4 import { database } from '../globals'; 5 5 import { getMetadataFromAuthorizationServer } from '../resolver'; 6 6 import { CachedGetter } from '../store/getter'; 7 - import { OAuthServerAgent } from './server-agent'; 8 - 9 7 import type { DPoPKey } from '../types/dpop'; 10 8 import type { TokenSet } from '../types/token'; 9 + 10 + import { OAuthServerAgent } from './server-agent'; 11 11 12 12 export interface Session { 13 13 dpopKey: DPoPKey;
-1
src/lib/bsky-oauth/agents/user-agent.ts
··· 3 3 import { createDPoPFetch } from '../dpop'; 4 4 import { CLIENT_ID } from '../env'; 5 5 import { authorizationServerMetadataResolver } from '../resolver'; 6 - 7 6 import type { DPoPKey } from '../types/dpop'; 8 7 import type { TokenSet } from '../types/token'; 9 8
+1 -2
src/lib/bsky-oauth/dpop.ts
··· 1 1 import { database } from './globals'; 2 + import type { DPoPKey } from './types/dpop'; 2 3 import { encoder, extractContentType, randomBytes, toBase64Url, toSha256 } from './utils'; 3 - 4 - import type { DPoPKey } from './types/dpop'; 5 4 6 5 export const createES256Key = async (): Promise<DPoPKey> => { 7 6 const algorithm = { name: 'ECDSA', namedCurve: 'P-256' } as const;
+2 -2
src/lib/bsky-oauth/resolver.ts
··· 1 1 import type { At, ComAtprotoIdentityResolveHandle } from '@atcute/client/lexicons'; 2 - import { getPdsEndpoint, type DidDocument } from '@atcute/client/utils/did'; 2 + import { type DidDocument, getPdsEndpoint } from '@atcute/client/utils/did'; 3 3 4 4 import { isDid } from '~/api/utils/strings'; 5 5 6 6 import { database } from './globals'; 7 7 import { CachedGetter, type GetCachedOptions } from './store/getter'; 8 + import type { ResolvedIdentity } from './types/identity'; 8 9 import type { AuthorizationServerMetadata, ProtectedResourceMetadata } from './types/server'; 9 10 import { extractContentType } from './utils'; 10 - import type { ResolvedIdentity } from './types/identity'; 11 11 12 12 const DID_WEB_RE = 13 13 /^([a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*(?:\.[a-zA-Z]{2,}))((?::[a-zA-Z0-9._%-]*[a-zA-Z0-9._-])*)$/;
+1 -1
src/lib/bsky-oauth/store/db.ts
··· 1 - import { openDB, type IDBPDatabase } from 'idb'; 1 + import { type IDBPDatabase, openDB } from 'idb'; 2 2 3 3 import type { At } from '@atcute/client/lexicons'; 4 4 import type { DidDocument } from '@atcute/client/utils/did';
+1 -1
src/lib/hooks/debounced-value.ts
··· 1 - import { createEffect, createSignal, onCleanup, type Accessor } from 'solid-js'; 1 + import { type Accessor, createEffect, createSignal, onCleanup } from 'solid-js'; 2 2 3 3 export const createDebouncedValue = <T>( 4 4 accessor: Accessor<T>,
+1 -1
src/lib/hooks/derived-signal.ts
··· 1 - import { createMemo, createSignal, type Accessor, type Signal } from 'solid-js'; 1 + import { type Accessor, type Signal, createMemo, createSignal } from 'solid-js'; 2 2 3 3 export const createDerivedSignal = <T>(accessor: Accessor<T>): Signal<T> => { 4 4 const computable = createMemo(() => createSignal(accessor()));
+1
src/lib/hooks/escape.ts
··· 1 1 import { createEffect } from 'solid-js'; 2 + 2 3 import { createEventListener } from './event-listener'; 3 4 4 5 export const useEscape = (callback: () => void, enabled: () => boolean) => {
+2 -1
src/lib/hooks/local-storage.ts
··· 1 1 import { createEffect } from 'solid-js'; 2 - import { createMutable, modifyMutable, reconcile, type StoreNode } from 'solid-js/store'; 2 + import { type StoreNode, createMutable, modifyMutable, reconcile } from 'solid-js/store'; 3 + 3 4 import { createEventListener } from '../hooks/event-listener'; 4 5 5 6 type MigrateFn<T> = (version: number, prev: any) => T;
+1 -1
src/lib/hooks/media-query.ts
··· 1 - import { createSignal, onCleanup, type Accessor } from 'solid-js'; 1 + import { type Accessor, createSignal, onCleanup } from 'solid-js'; 2 2 3 3 interface MediaStore { 4 4 /** State backing */
-1
src/lib/hooks/textarea-autosize.ts
··· 1 1 // Based off Andarist's react-textarea-autosize, licensed under MIT License 2 2 // Commit reference: 5953e024310ab0b6ad1c26b2bc36addb9cc23afa 3 - 4 3 import { createRenderEffect, onCleanup, onMount } from 'solid-js'; 5 4 6 5 import { createEventListener } from './event-listener';
+4 -4
src/lib/keyed.tsx
··· 1 1 import { 2 2 $TRACK, 3 + type Accessor, 4 + type JSX, 5 + type Setter, 6 + type SignalOptions, 3 7 createMemo, 4 8 createRoot, 5 9 createSignal, 6 10 onCleanup, 7 11 untrack, 8 - type Accessor, 9 - type JSX, 10 - type Setter, 11 - type SignalOptions, 12 12 } from 'solid-js'; 13 13 14 14 function dispose(list: Iterable<{ d: VoidFunction }>) {
-2
src/lib/navigation/history.ts
··· 1 1 // Fork of `history` npm package 2 2 // Repository: github.com/remix-run/history 3 3 // Commit: 3e9dab413f4eda8d6bce565388c5ddb7aeff9f7e 4 - 5 4 // Most of the changes are just trimming it down to only include the browser 6 5 // history implementation. 7 - 8 6 import { nanoid } from 'nanoid/non-secure'; 9 7 10 8 export type Action = 'traverse' | 'push' | 'replace' | 'update';
-2
src/lib/navigation/logger.ts
··· 1 1 // Keeps a best-effort log of history entries. 2 - 3 2 // To simplify our stack router implementation on dealing with PWA-specific 4 3 // aspects, `createHistoryLogger` is set to drop forward entries by default. 5 - 6 4 import type { History, Location } from './history'; 7 5 8 6 export interface HistoryLogger {
+4 -4
src/lib/navigation/router.tsx
··· 1 1 /* @refresh reload */ 2 - 3 2 import { 3 + type Component, 4 4 For, 5 + type JSX, 6 + type Owner, 5 7 createContext, 6 8 createMemo, 7 9 createRoot, ··· 9 11 getOwner, 10 12 onCleanup, 11 13 useContext, 12 - type Component, 13 - type JSX, 14 - type Owner, 15 14 } from 'solid-js'; 16 15 import { delegateEvents } from 'solid-js/web'; 17 16 ··· 19 18 import { Freeze } from '@mary/solid-freeze'; 20 19 21 20 import { createEventListener } from '../hooks/event-listener'; 21 + 22 22 import type { History, Location } from './history'; 23 23 import type { HistoryLogger } from './logger'; 24 24
+2 -2
src/lib/states/agent.tsx
··· 1 - import { createContext, createMemo, useContext, type JSX, type ParentProps } from 'solid-js'; 1 + import { type JSX, type ParentProps, createContext, createMemo, useContext } from 'solid-js'; 2 2 3 - import { simpleFetchHandler, XRPC } from '@atcute/client'; 3 + import { XRPC, simpleFetchHandler } from '@atcute/client'; 4 4 import type { At } from '@atcute/client/lexicons'; 5 5 import { QueryClient, QueryClientProvider } from '@mary/solid-query'; 6 6
+3 -5
src/lib/states/bookmarks.tsx
··· 1 - import { createContext, onCleanup, useContext, type ParentProps } from 'solid-js'; 2 - 3 - import { openDB, type IDBPDatabase } from 'idb'; 1 + import { type IDBPDatabase, openDB } from 'idb'; 2 + import { type ParentProps, createContext, onCleanup, useContext } from 'solid-js'; 4 3 4 + import type { BookmarkDBSchema } from '../aglais-bookmarks/db'; 5 5 import { assert } from '../utils/invariant'; 6 6 7 7 import { useSession } from './session'; 8 - 9 - import type { BookmarkDBSchema } from '../aglais-bookmarks/db'; 10 8 11 9 export interface BookmarkContext { 12 10 open(): Promise<IDBPDatabase<BookmarkDBSchema>>;
+2 -2
src/lib/states/moderation.tsx
··· 1 - import { createContext, createMemo, useContext, type ParentProps } from 'solid-js'; 1 + import { type ParentProps, createContext, createMemo, useContext } from 'solid-js'; 2 2 import { unwrap } from 'solid-js/store'; 3 3 4 4 import type { AppBskyLabelerDefs, At } from '@atcute/client/lexicons'; ··· 8 8 import type { ModerationLabeler, ModerationOptions, ModerationPreferences } from '~/api/moderation'; 9 9 import { interpretLabelerDefinition } from '~/api/moderation/labeler'; 10 10 11 + import { createBatchedFetch } from '~/lib/utils/batch-fetch'; 11 12 import { assert } from '~/lib/utils/invariant'; 12 13 import { mapDefined } from '~/lib/utils/misc'; 13 - import { createBatchedFetch } from '~/lib/utils/batch-fetch'; 14 14 15 15 import { useAgent } from './agent'; 16 16 import { useSession } from './session';
+4 -6
src/lib/states/session.tsx
··· 1 1 import { 2 + type ParentProps, 2 3 batch, 3 4 createContext, 4 5 createEffect, ··· 7 8 createSignal, 8 9 untrack, 9 10 useContext, 10 - type ParentProps, 11 11 } from 'solid-js'; 12 12 13 13 import { XRPC } from '@atcute/client'; ··· 17 17 18 18 import { sessions } from '~/globals/preferences'; 19 19 20 - import { attachLabelerHeaders, type Labeler } from '../atproto/labeler'; 20 + import { type Labeler, attachLabelerHeaders } from '../atproto/labeler'; 21 21 import { OAuthServerAgent } from '../bsky-oauth/agents/server-agent'; 22 22 import { getSession } from '../bsky-oauth/agents/session'; 23 23 import { OAuthUserAgent } from '../bsky-oauth/agents/user-agent'; 24 24 import { database } from '../bsky-oauth/globals'; 25 25 import { getMetadataFromAuthorizationServer } from '../bsky-oauth/resolver'; 26 - 26 + import { makeAbortable } from '../hooks/abortable'; 27 + import { createReactiveLocalStorage, isExternalWriting } from '../hooks/local-storage'; 27 28 import type { PerAccountPreferenceSchema } from '../preferences/account'; 28 29 import type { AccountData } from '../preferences/sessions'; 29 - 30 - import { makeAbortable } from '../hooks/abortable'; 31 - import { createReactiveLocalStorage, isExternalWriting } from '../hooks/local-storage'; 32 30 import { assert } from '../utils/invariant'; 33 31 import { mapDefined } from '../utils/misc'; 34 32
+1 -1
src/lib/states/theme.tsx
··· 1 - import { createContext, createRenderEffect, createSignal, useContext, type ParentProps } from 'solid-js'; 1 + import { type ParentProps, createContext, createRenderEffect, createSignal, useContext } from 'solid-js'; 2 2 3 3 import * as preferences from '~/globals/preferences'; 4 4
+2 -1
src/lib/utils/misc.ts
··· 1 + import { createMemo, untrack } from 'solid-js'; 2 + 1 3 import { replaceEqualDeep } from '@mary/solid-query'; 2 - import { createMemo, untrack } from 'solid-js'; 3 4 4 5 export const mapDefined = <T, R>(array: T[], mapper: (value: T) => R | undefined): R[] => { 5 6 var mapped: R[] = [];
+13 -14
src/main.tsx
··· 1 1 /* @refresh reload */ 2 - 3 - import './styles/app.css'; 4 - 5 - import { createSignal, onMount, type JSX } from 'solid-js'; 2 + import { type JSX, createSignal, onMount } from 'solid-js'; 6 3 import { render } from 'solid-js/web'; 7 4 8 5 import type { At } from '@atcute/client/lexicons'; 9 6 10 - import * as navigation from './globals/navigation'; 11 - import * as preferences from './globals/preferences'; 7 + import * as navigation from '~/globals/navigation'; 8 + import * as preferences from '~/globals/preferences'; 12 9 13 - import { on } from './lib/utils/misc'; 14 - import { configureRouter } from './lib/navigation/router'; 10 + import { configureRouter } from '~/lib/navigation/router'; 11 + import { AgentProvider } from '~/lib/states/agent'; 12 + import { BookmarksProvider } from '~/lib/states/bookmarks'; 13 + import { ModerationProvider } from '~/lib/states/moderation'; 14 + import { SessionProvider, useSession } from '~/lib/states/session'; 15 + import { ThemeProvider } from '~/lib/states/theme'; 16 + import { on } from '~/lib/utils/misc'; 15 17 16 - import { AgentProvider } from './lib/states/agent'; 17 - import { BookmarksProvider } from './lib/states/bookmarks'; 18 - import { ModerationProvider } from './lib/states/moderation'; 19 - import { SessionProvider, useSession } from './lib/states/session'; 20 - import { ThemeProvider } from './lib/states/theme'; 18 + import ModalRenderer from '~/components/main/modal-renderer'; 21 19 22 - import ModalRenderer from './components/main/modal-renderer'; 23 20 import routes from './routes'; 24 21 import Shell from './shell'; 22 + 23 + import './styles/app.css'; 25 24 26 25 // Configure routing 27 26 configureRouter({
+1
src/routes.ts
··· 1 1 import { lazy } from 'solid-js'; 2 + 2 3 import type { RouteDefinition } from './lib/navigation/router'; 3 4 4 5 const DID_RE = /^did:[a-z]+:[a-zA-Z0-9._:%-]*[a-zA-Z0-9._-]$/;
+20 -19
src/shell.tsx
··· 1 1 import { 2 + type Accessor, 3 + type Component, 4 + type ComponentProps, 2 5 ErrorBoundary, 3 6 Suspense, 4 7 createMemo, 5 8 lazy, 6 - type Accessor, 7 - type Component, 8 - type ComponentProps, 9 9 } from 'solid-js'; 10 10 11 11 import type { AppBskyNotificationGetUnreadCount } from '@atcute/client/lexicons'; 12 12 import type { DefinedCreateQueryResult } from '@mary/solid-query'; 13 13 14 - import { createNotificationCountQuery } from './api/queries/notification-count'; 14 + import { createNotificationCountQuery } from '~/api/queries/notification-count'; 15 15 16 - import { globalEvents } from './globals/events'; 17 - import { hasModals } from './globals/modals'; 18 - import { history } from './globals/navigation'; 16 + import { globalEvents } from '~/globals/events'; 17 + import { hasModals } from '~/globals/modals'; 18 + import { history } from '~/globals/navigation'; 19 19 20 - import { RouterView, useMatchedRoute, type MatchedRouteState } from './lib/navigation/router'; 21 - import { useSession } from './lib/states/session'; 20 + import { type MatchedRouteState, RouterView, useMatchedRoute } from '~/lib/navigation/router'; 21 + import { useSession } from '~/lib/states/session'; 22 + 23 + import BellOutlinedIcon from '~/components/icons-central/bell-outline'; 24 + import BellSolidIcon from '~/components/icons-central/bell-solid'; 25 + import HashtagOutlinedIcon from '~/components/icons-central/hashtag-outline'; 26 + import HomeOutlinedIcon from '~/components/icons-central/home-outline'; 27 + import HomeSolidIcon from '~/components/icons-central/home-solid'; 28 + import MagnifyingGlassOutlinedIcon from '~/components/icons-central/magnifying-glass-outline'; 29 + import MailOutlinedIcon from '~/components/icons-central/mail-outline'; 30 + import MailSolidIcon from '~/components/icons-central/mail-solid'; 22 31 23 - import BellOutlinedIcon from './components/icons-central/bell-outline'; 24 - import BellSolidIcon from './components/icons-central/bell-solid'; 25 - import HashtagOutlinedIcon from './components/icons-central/hashtag-outline'; 26 - import HomeOutlinedIcon from './components/icons-central/home-outline'; 27 - import HomeSolidIcon from './components/icons-central/home-solid'; 28 - import MagnifyingGlassOutlinedIcon from './components/icons-central/magnifying-glass-outline'; 29 - import MailOutlinedIcon from './components/icons-central/mail-outline'; 30 - import MailSolidIcon from './components/icons-central/mail-solid'; 31 - import ErrorPage from './views/_error'; 32 + import ErrorPage from '~/views/_error'; 32 33 33 - const SignedOutView = lazy(() => import('./views/_signed-out')); 34 + const SignedOutView = lazy(() => import('~/views/_signed-out')); 34 35 35 36 const Shell = () => { 36 37 const { currentAccount } = useSession();
+1 -1
src/views/_signed-out/index.tsx
··· 1 - import Button from '~/components/button'; 2 1 import { openModal } from '~/globals/modals'; 3 2 3 + import Button from '~/components/button'; 4 4 import SignInDialogLazy from '~/components/main/sign-in-dialog-lazy'; 5 5 6 6 const SignedOutPage = () => {
+4 -6
src/views/bluemoji-emotes.tsx
··· 1 - import { createEffect, createSignal, type JSX } from 'solid-js'; 1 + import { type JSX, createEffect, createSignal } from 'solid-js'; 2 2 3 3 import { remove as removeExif } from '@mary/exif-rm'; 4 4 import { createInfiniteQuery } from '@mary/solid-query'; ··· 7 7 8 8 import { hasModals, openModal } from '~/globals/modals'; 9 9 10 + import { MAX_ORIGINAL_SIZE, SUPPORTED_IMAGE_TYPES } from '~/lib/bluemoji/compress'; 11 + import { getCdnUrl } from '~/lib/bluemoji/render'; 10 12 import { createEventListener } from '~/lib/hooks/event-listener'; 11 - import { on } from '~/lib/utils/misc'; 12 13 import { useAgent } from '~/lib/states/agent'; 13 14 import { useSession } from '~/lib/states/session'; 14 - 15 - import { MAX_ORIGINAL_SIZE, SUPPORTED_IMAGE_TYPES } from '~/lib/bluemoji/compress'; 16 - import { getCdnUrl } from '~/lib/bluemoji/render'; 15 + import { on } from '~/lib/utils/misc'; 17 16 18 17 import IconButton from '~/components/icon-button'; 19 18 import AddOutlinedIcon from '~/components/icons-central/add-outline'; 20 19 import * as Page from '~/components/page'; 21 20 import PagedList from '~/components/paged-list'; 22 21 import * as Prompt from '~/components/prompt'; 23 - 24 22 import AddEmotePrompt from '~/components/settings/bluemoji/add-emote-prompt'; 25 23 26 24 const BluemojiEmotesPage = () => {
+1 -2
src/views/bookmarks-listing.tsx
··· 4 4 5 5 import { useParams } from '~/lib/navigation/router'; 6 6 7 + import BookmarkFeedItem from '~/components/bookmarks/bookmark-feed-item'; 7 8 import MagnifyingGlassOutlinedIcon from '~/components/icons-central/magnifying-glass-outline'; 8 9 import * as Page from '~/components/page'; 9 10 import PagedList from '~/components/paged-list'; 10 11 import VirtualItem from '~/components/virtual-item'; 11 - 12 - import BookmarkFeedItem from '~/components/bookmarks/bookmark-feed-item'; 13 12 14 13 const BookmarksPage = () => { 15 14 const { tagId } = useParams();
+3 -4
src/views/bookmarks.tsx
··· 6 6 7 7 import { formatCompact } from '~/lib/intl/number'; 8 8 9 + import BookmarkFolderAvatar from '~/components/bookmarks/bookmark-folder-avatar'; 10 + import BookmarkFolderFormDialogLazy from '~/components/bookmarks/bookmark-folder-form-dialog-lazy'; 11 + import BookmarkFolderMenu from '~/components/bookmarks/bookmark-folder-menu'; 9 12 import Divider from '~/components/divider'; 10 13 import IconButton from '~/components/icon-button'; 11 14 import ChevronRightOutlinedIcon from '~/components/icons-central/chevron-right-outline'; 12 15 import FolderAddOutlinedIcon from '~/components/icons-central/folder-add-outline'; 13 16 import MoreHorizOutlinedIcon from '~/components/icons-central/more-horiz-outline'; 14 17 import * as Page from '~/components/page'; 15 - 16 - import BookmarkFolderAvatar from '~/components/bookmarks/bookmark-folder-avatar'; 17 - import BookmarkFolderFormDialogLazy from '~/components/bookmarks/bookmark-folder-form-dialog-lazy'; 18 - import BookmarkFolderMenu from '~/components/bookmarks/bookmark-folder-menu'; 19 18 20 19 const BookmarksPage = () => { 21 20 const query = createBookmarkMetaQuery();
+2 -1
src/views/main/explore.tsx
··· 1 + import { history } from '~/globals/navigation'; 2 + 1 3 import IconButton from '~/components/icon-button'; 2 4 import GearOutlinedIcon from '~/components/icons-central/gear-outline'; 3 5 import SearchBar from '~/components/main/search-bar'; 4 6 import * as Page from '~/components/page'; 5 - import { history } from '~/globals/navigation'; 6 7 7 8 const SearchPage = () => { 8 9 return (
+1 -2
src/views/main/home.tsx
··· 1 + import ComposeFAB from '~/components/composer/compose-fab'; 1 2 import IconButton from '~/components/icon-button'; 2 3 import ChevronRightOutlinedIcon from '~/components/icons-central/chevron-right-outline'; 3 4 import GearOutlinedIcon from '~/components/icons-central/gear-outline'; 4 5 import * as Page from '~/components/page'; 5 - 6 - import ComposeFAB from '~/components/composer/compose-fab'; 7 6 import TimelineList from '~/components/timeline/timeline-list'; 8 7 9 8 const HomePage = () => {
+1 -2
src/views/main/notifications.tsx
··· 6 6 import { onRouteEnter } from '~/lib/navigation/router'; 7 7 8 8 import ComposeFAB from '~/components/composer/compose-fab'; 9 + import NotificationItem from '~/components/notifications/notification-item'; 9 10 import * as Page from '~/components/page'; 10 11 import PagedList from '~/components/paged-list'; 11 12 import VirtualItem from '~/components/virtual-item'; 12 - 13 - import NotificationItem from '~/components/notifications/notification-item'; 14 13 15 14 const NotificationsPage = () => { 16 15 const { feed, reset, firstFetchedAt } = createNotificationFeedQuery();
+3 -3
src/views/oauth-callback.tsx
··· 1 - import { createResource, Match, Switch } from 'solid-js'; 1 + import { Match, Switch, createResource } from 'solid-js'; 2 + 3 + import * as preferences from '~/globals/preferences'; 2 4 3 5 import { OAuthServerAgent } from '~/lib/bsky-oauth/agents/server-agent'; 4 6 import { sessions } from '~/lib/bsky-oauth/agents/session'; 5 7 import { OAuthUserAgent } from '~/lib/bsky-oauth/agents/user-agent'; 6 8 import { database } from '~/lib/bsky-oauth/globals'; 7 9 import { getMetadataFromAuthorizationServer } from '~/lib/bsky-oauth/resolver'; 8 - 9 - import * as preferences from '~/globals/preferences'; 10 10 11 11 import Button from '~/components/button'; 12 12 import CircularProgress from '~/components/circular-progress';
+1 -2
src/views/post-likes.tsx
··· 4 4 5 5 import * as Page from '~/components/page'; 6 6 import PagedList from '~/components/paged-list'; 7 - import VirtualItem from '~/components/virtual-item'; 8 - 9 7 import ProfileFollowButton from '~/components/profiles/profile-follow-button'; 10 8 import ProfileItem from '~/components/profiles/profile-item'; 9 + import VirtualItem from '~/components/virtual-item'; 11 10 12 11 const PostLikesPage = () => { 13 12 const { did, rkey } = useParams();
+1 -2
src/views/post-reposts.tsx
··· 4 4 5 5 import * as Page from '~/components/page'; 6 6 import PagedList from '~/components/paged-list'; 7 - import VirtualItem from '~/components/virtual-item'; 8 - 9 7 import ProfileFollowButton from '~/components/profiles/profile-follow-button'; 10 8 import ProfileItem from '~/components/profiles/profile-item'; 9 + import VirtualItem from '~/components/virtual-item'; 11 10 12 11 const PostLikesPage = () => { 13 12 const { did, rkey } = useParams();
+2 -3
src/views/post-thread.tsx
··· 5 5 import { useQueryClient } from '@mary/solid-query'; 6 6 7 7 import { 8 - createThreadData, 9 8 type OverflowDescendantItem, 10 9 type PostDescendantItem, 10 + createThreadData, 11 11 } from '~/api/models/post-thread'; 12 12 import { usePostThreadQuery } from '~/api/queries/post-thread'; 13 13 import { isDid } from '~/api/utils/strings'; ··· 26 26 import ErrorView from '~/components/error-view'; 27 27 import Keyed from '~/components/keyed'; 28 28 import * as Page from '~/components/page'; 29 - import VirtualItem from '~/components/virtual-item'; 30 - 31 29 import HighlightedPost from '~/components/threads/highlighted-post'; 32 30 import OverflowThreadItem from '~/components/threads/overflow-thread-item'; 33 31 import PostThreadItem from '~/components/threads/post-thread-item'; 34 32 import ThreadLines from '~/components/threads/thread-lines'; 33 + import VirtualItem from '~/components/virtual-item'; 35 34 36 35 const PostThreadPage = () => { 37 36 const { didOrHandle, rkey } = useParams();
+1 -2
src/views/profile-followers.tsx
··· 6 6 7 7 import * as Page from '~/components/page'; 8 8 import PagedList from '~/components/paged-list'; 9 - import VirtualItem from '~/components/virtual-item'; 10 - 11 9 import ProfileFollowButton from '~/components/profiles/profile-follow-button'; 12 10 import ProfileItem from '~/components/profiles/profile-item'; 11 + import VirtualItem from '~/components/virtual-item'; 13 12 14 13 const ProfileFollowersPage = () => { 15 14 const { did } = useParams();
+1 -2
src/views/profile-following.tsx
··· 6 6 7 7 import * as Page from '~/components/page'; 8 8 import PagedList from '~/components/paged-list'; 9 - import VirtualItem from '~/components/virtual-item'; 10 - 11 9 import ProfileFollowButton from '~/components/profiles/profile-follow-button'; 12 10 import ProfileItem from '~/components/profiles/profile-item'; 11 + import VirtualItem from '~/components/virtual-item'; 13 12 14 13 const ProfileFollowingPage = () => { 15 14 const { did } = useParams();
+1 -2
src/views/profile-known-followers.tsx
··· 6 6 7 7 import * as Page from '~/components/page'; 8 8 import PagedList from '~/components/paged-list'; 9 - import VirtualItem from '~/components/virtual-item'; 10 - 11 9 import ProfileFollowButton from '~/components/profiles/profile-follow-button'; 12 10 import ProfileItem from '~/components/profiles/profile-item'; 11 + import VirtualItem from '~/components/virtual-item'; 13 12 14 13 const ProfileKnownFollowersPage = () => { 15 14 const { did } = useParams();
+7 -8
src/views/profile-labels.tsx
··· 1 - import { createMemo, Match, Show, Switch } from 'solid-js'; 1 + import { Match, Show, Switch, createMemo } from 'solid-js'; 2 2 3 3 import type { At } from '@atcute/client/lexicons'; 4 4 ··· 6 6 BlurContent, 7 7 BlurMedia, 8 8 BlurNone, 9 - getLocalizedLabel, 10 9 GLOBAL_LABELS, 10 + type LabelDefinition, 11 + type LabelPreference, 12 + type ModerationLabeler, 13 + type ModerationLabelerPreferences, 11 14 PreferenceHide, 12 15 PreferenceIgnore, 13 16 PreferenceWarn, 14 17 SeverityAlert, 15 18 SeverityInform, 16 19 SeverityNone, 17 - type LabelDefinition, 18 - type LabelPreference, 19 - type ModerationLabeler, 20 - type ModerationLabelerPreferences, 20 + getLocalizedLabel, 21 21 } from '~/api/moderation'; 22 22 import { createLabelerMetaQuery } from '~/api/queries/labeler'; 23 23 ··· 25 25 26 26 import { formatAbsDateTime } from '~/lib/intl/time'; 27 27 import { Key } from '~/lib/keyed'; 28 - import { mapDefined } from '~/lib/utils/misc'; 29 28 import { useParams } from '~/lib/navigation/router'; 30 29 import { useSession } from '~/lib/states/session'; 30 + import { mapDefined } from '~/lib/utils/misc'; 31 31 32 32 import Avatar from '~/components/avatar'; 33 33 import * as Boxed from '~/components/boxed'; ··· 41 41 import * as Menu from '~/components/menu'; 42 42 import * as Page from '~/components/page'; 43 43 import * as Prompt from '~/components/prompt'; 44 - 45 44 import LabelerOverflowMenu from '~/components/settings/moderation/labeling/labeler-overflow-menu'; 46 45 47 46 const ProfileLabelsPage = () => {
+2 -3
src/views/profile.tsx
··· 1 - import { createSignal, Match, Show, Switch } from 'solid-js'; 1 + import { Match, Show, Switch, createSignal } from 'solid-js'; 2 2 3 3 import { XRPCError } from '@atcute/client'; 4 4 import type { AppBskyActorDefs } from '@atcute/client/lexicons'; ··· 22 22 import MoreHorizOutlinedIcon from '~/components/icons-central/more-horiz-outline'; 23 23 import ShieldOutlinedIcon from '~/components/icons-central/shield-outline'; 24 24 import * as Page from '~/components/page'; 25 - import VirtualItem from '~/components/virtual-item'; 26 - 27 25 import ProfileOverflowMenu from '~/components/profiles/profile-overflow-menu'; 28 26 import ProfileViewHeader from '~/components/profiles/profile-view-header'; 29 27 import TimelineList from '~/components/timeline/timeline-list'; 28 + import VirtualItem from '~/components/virtual-item'; 30 29 31 30 const ProfilePage = () => { 32 31 const { didOrHandle } = useParams();
+1 -2
src/views/search.tsx
··· 1 - import { createMemo, createSignal, Match, Switch } from 'solid-js'; 1 + import { Match, Switch, createMemo, createSignal } from 'solid-js'; 2 2 3 3 import type { UnwrapArray } from '~/api/utils/types'; 4 4 ··· 9 9 import SearchBar from '~/components/main/search-bar'; 10 10 import * as Page from '~/components/page'; 11 11 import TabBar from '~/components/tab-bar'; 12 - 13 12 import TimelineList from '~/components/timeline/timeline-list'; 14 13 15 14 const SearchPage = () => {
+1 -2
src/views/settings-app-passwords.tsx
··· 6 6 import { openModal } from '~/globals/modals'; 7 7 8 8 import { formatAbsDateTime } from '~/lib/intl/time'; 9 - import { reconcile } from '~/lib/utils/misc'; 10 9 import { useAgent } from '~/lib/states/agent'; 10 + import { reconcile } from '~/lib/utils/misc'; 11 11 12 12 import * as Boxed from '~/components/boxed'; 13 13 import CircularProgressView from '~/components/circular-progress-view'; ··· 18 18 import TrashOutlinedIcon from '~/components/icons-central/trash-outline'; 19 19 import * as Page from '~/components/page'; 20 20 import * as Prompt from '~/components/prompt'; 21 - 22 21 import AddAppPasswordPrompt from '~/components/settings/app-passwords/add-app-password-prompt'; 23 22 24 23 const AppPasswordsSettingsPage = () => {
+1 -1
src/views/settings-content.tsx
··· 1 1 import { primarySystemLanguage } from '~/globals/locales'; 2 2 3 - import { getEnglishLanguageName, LANGUAGE_CODES } from '~/lib/intl/languages'; 3 + import { LANGUAGE_CODES, getEnglishLanguageName } from '~/lib/intl/languages'; 4 4 import { useSession } from '~/lib/states/session'; 5 5 import { mapDefined } from '~/lib/utils/misc'; 6 6
+1 -1
vite.config.js
··· 3 3 import { defineConfig } from 'vite'; 4 4 import solid from 'vite-plugin-solid'; 5 5 6 - import metadata from './public/oauth/client-metadata.json' with { type: 'json' }; 6 + import metadata from './public/oauth/client-metadata.json'; 7 7 8 8 const SERVER_HOST = '127.0.0.1'; 9 9 const SERVER_PORT = 52222;