+18
-1
.prettierrc
+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
+1
package.json
+110
-2
pnpm-lock.yaml
+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
+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
+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
-1
src/api/cache/utils.ts
+1
-1
src/api/models/post-thread.tsx
+1
-1
src/api/models/post-thread.tsx
+1
-1
src/api/moderation/entities/generic.ts
+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
-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
+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
-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
+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
+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
+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
-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
-1
src/api/queries/composer-gif.ts
+1
src/api/queries/feed.ts
+1
src/api/queries/feed.ts
+1
src/api/queries/list.ts
+1
src/api/queries/list.ts
+3
-3
src/api/queries/notification-feed.tsx
+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
-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
+1
src/api/queries/post.ts
+2
-1
src/api/queries/profile-followers.ts
+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
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
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
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
+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
src/api/richtext/parser/parse.ts
+1
src/api/richtext/segment.ts
+1
src/api/richtext/segment.ts
+1
-1
src/components/avatar.tsx
+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
+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
-1
src/components/boxed.tsx
+18
-21
src/components/composer/composer-dialog.tsx
+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
+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
-1
src/components/composer/dialogs/gif-alt-dialog.tsx
+2
-2
src/components/composer/embeds/external-embed.tsx
+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
+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
+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
-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
+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
+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
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
+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
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
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
+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
-1
src/components/embeds/external-embed.tsx
+1
-2
src/components/embeds/players/video-player.tsx
+1
-2
src/components/embeds/players/video-player.tsx
+2
-1
src/components/embeds/quote-embed.tsx
+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
-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
-1
src/components/embeds/video-embed.tsx
+1
-1
src/components/fieldset.tsx
+1
-1
src/components/fieldset.tsx
+1
-1
src/components/images/image-viewer-modal.tsx
+1
-1
src/components/images/image-viewer-modal.tsx
+1
src/components/inline-link.tsx
+1
src/components/inline-link.tsx
+2
-1
src/components/keyed.tsx
+2
-1
src/components/keyed.tsx
+1
-1
src/components/list.tsx
+1
-1
src/components/list.tsx
+2
-2
src/components/main/modal-renderer.tsx
+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
+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';
+1
-1
src/components/moderation/block-account-prompt.tsx
+1
-1
src/components/moderation/block-account-prompt.tsx
+3
-3
src/components/moderation/content-hider.tsx
+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
-1
src/components/moderation/label-details-prompt.tsx
+2
-2
src/components/moderation/moderation-alerts.tsx
+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
-1
src/components/moderation/mute-account-prompt.tsx
+2
-3
src/components/notifications/notification-item.tsx
+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
-1
src/components/paged-list.tsx
+1
-1
src/components/profiles/edit-profile-dialog.tsx
+1
-1
src/components/profiles/edit-profile-dialog.tsx
+1
-1
src/components/profiles/profile-item.tsx
+1
-1
src/components/profiles/profile-item.tsx
+4
-5
src/components/profiles/profile-view-header.tsx
+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
src/components/prompt.tsx
+1
-1
src/components/settings/app-passwords/add-app-password-prompt.tsx
+1
-1
src/components/settings/app-passwords/add-app-password-prompt.tsx
+2
-3
src/components/settings/bluemoji/add-emote-prompt.tsx
+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';
+4
-5
src/components/threads/highlighted-post.tsx
+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
+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
-1
src/components/threads/thread-lines.tsx
+1
-1
src/components/time-ago.tsx
+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
-1
src/components/timeline/post-deleted-gate.tsx
+3
-3
src/components/timeline/post-feed-item.tsx
+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';
+2
-1
src/components/timeline/timeline-list.tsx
+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
-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
+2
-1
src/globals/modals.tsx
+1
-2
src/globals/preferences.ts
+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
src/lib/aglais-bookmarks/search.ts
+1
-2
src/lib/atproto/labeler.ts
+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
+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
+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
-1
src/lib/bsky-oauth/agents/user-agent.ts
+1
-2
src/lib/bsky-oauth/dpop.ts
+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
+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
-1
src/lib/bsky-oauth/store/db.ts
+1
-1
src/lib/hooks/debounced-value.ts
+1
-1
src/lib/hooks/debounced-value.ts
+1
-1
src/lib/hooks/derived-signal.ts
+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
src/lib/hooks/escape.ts
+2
-1
src/lib/hooks/local-storage.ts
+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
-1
src/lib/hooks/media-query.ts
-1
src/lib/hooks/textarea-autosize.ts
-1
src/lib/hooks/textarea-autosize.ts
+4
-4
src/lib/keyed.tsx
+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
-2
src/lib/states/agent.tsx
+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
+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
+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
+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
-1
src/lib/states/theme.tsx
+2
-1
src/lib/utils/misc.ts
+2
-1
src/lib/utils/misc.ts
+13
-14
src/main.tsx
+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
src/routes.ts
+20
-19
src/shell.tsx
+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
-1
src/views/_signed-out/index.tsx
+4
-6
src/views/bluemoji-emotes.tsx
+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
+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
+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
+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
-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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
-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
+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
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
+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;