@codingfactory/socialkit-vue 0.7.19 → 0.7.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/services/auth.d.ts.map +1 -1
- package/dist/services/auth.js +1 -3
- package/dist/services/auth.js.map +1 -1
- package/dist/services/circles.d.ts +8 -0
- package/dist/services/circles.d.ts.map +1 -1
- package/dist/services/circles.js +15 -3
- package/dist/services/circles.js.map +1 -1
- package/dist/services/echo.d.ts.map +1 -1
- package/dist/services/echo.js +12 -0
- package/dist/services/echo.js.map +1 -1
- package/dist/stores/circles.d.ts.map +1 -1
- package/dist/stores/circles.js +16 -0
- package/dist/stores/circles.js.map +1 -1
- package/dist/stores/content.d.ts.map +1 -1
- package/dist/stores/content.js +33 -3
- package/dist/stores/content.js.map +1 -1
- package/dist/stores/discussion.d.ts +12 -0
- package/dist/stores/discussion.d.ts.map +1 -1
- package/dist/stores/discussion.js +91 -12
- package/dist/stores/discussion.js.map +1 -1
- package/dist/stores/gamification.d.ts.map +1 -1
- package/dist/stores/gamification.js +6 -3
- package/dist/stores/gamification.js.map +1 -1
- package/dist/types/discussion.d.ts +2 -0
- package/dist/types/discussion.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/services/auth.ts +1 -5
- package/src/services/circles.ts +20 -3
- package/src/services/echo.ts +13 -0
- package/src/stores/circles.ts +20 -0
- package/src/stores/content.ts +40 -3
- package/src/stores/discussion.ts +108 -13
- package/src/stores/gamification.ts +6 -3
- package/src/types/discussion.ts +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discussion.d.ts","sourceRoot":"","sources":["../../src/types/discussion.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"discussion.d.ts","sourceRoot":"","sources":["../../src/types/discussion.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/services/auth.ts
CHANGED
|
@@ -742,11 +742,7 @@ export function configureTokenAuthClient(config: TokenAuthClientConfig): Configu
|
|
|
742
742
|
authFailureQueuedToken = null
|
|
743
743
|
const currentToken = tokenStorage.getToken()
|
|
744
744
|
|
|
745
|
-
if (
|
|
746
|
-
queuedToken !== null &&
|
|
747
|
-
currentToken !== null &&
|
|
748
|
-
currentToken !== queuedToken
|
|
749
|
-
) {
|
|
745
|
+
if (currentToken !== null && currentToken !== queuedToken) {
|
|
750
746
|
return
|
|
751
747
|
}
|
|
752
748
|
|
package/src/services/circles.ts
CHANGED
|
@@ -328,7 +328,11 @@ export interface CircleModerationAuditLogEntry {
|
|
|
328
328
|
id: string
|
|
329
329
|
action: string
|
|
330
330
|
actor_id: string
|
|
331
|
+
actor_name?: string | null
|
|
332
|
+
actor_handle?: string | null
|
|
331
333
|
target_user_id: string | null
|
|
334
|
+
target_name?: string | null
|
|
335
|
+
target_handle?: string | null
|
|
332
336
|
report_id: string | null
|
|
333
337
|
meta: Record<string, unknown>
|
|
334
338
|
created_at: string
|
|
@@ -1538,7 +1542,11 @@ function normalizeAuditLogEntry(value: unknown): CircleModerationAuditLogEntry |
|
|
|
1538
1542
|
id,
|
|
1539
1543
|
action,
|
|
1540
1544
|
actor_id: actorId,
|
|
1545
|
+
actor_name: readNullableString(value.actor_name),
|
|
1546
|
+
actor_handle: readNullableString(value.actor_handle),
|
|
1541
1547
|
target_user_id: readNullableString(value.target_user_id),
|
|
1548
|
+
target_name: readNullableString(value.target_name),
|
|
1549
|
+
target_handle: readNullableString(value.target_handle),
|
|
1542
1550
|
report_id: readNullableString(value.report_id),
|
|
1543
1551
|
meta: isRecord(value.meta) ? value.meta : {},
|
|
1544
1552
|
created_at: createdAt,
|
|
@@ -2319,7 +2327,7 @@ class CirclesService {
|
|
|
2319
2327
|
|
|
2320
2328
|
public async removeMember(circleId: string, userId: string): Promise<void> {
|
|
2321
2329
|
try {
|
|
2322
|
-
await this.client.delete(`${this.baseURL}/${circleId}/members
|
|
2330
|
+
await this.client.delete(`${this.baseURL}/${circleId}/members/${userId}`)
|
|
2323
2331
|
this.emitNotification({
|
|
2324
2332
|
description: `Member removed from ${this.getCircleTerm()}.`,
|
|
2325
2333
|
color: 'success',
|
|
@@ -3047,6 +3055,11 @@ class CirclesService {
|
|
|
3047
3055
|
}
|
|
3048
3056
|
|
|
3049
3057
|
public async checkSlugAvailability(slug: string): Promise<boolean> {
|
|
3058
|
+
const result = await this.checkSlugAvailabilityWithSuggestion(slug)
|
|
3059
|
+
return result.available
|
|
3060
|
+
}
|
|
3061
|
+
|
|
3062
|
+
public async checkSlugAvailabilityWithSuggestion(slug: string): Promise<{ available: boolean; suggestion?: string }> {
|
|
3050
3063
|
try {
|
|
3051
3064
|
const sanitizedSlug = this.sanitizeInput(slug)
|
|
3052
3065
|
const response = await this.client.get(`${this.baseURL}/check-slug`, {
|
|
@@ -3056,11 +3069,15 @@ class CirclesService {
|
|
|
3056
3069
|
const data = readRecord(response.data, 'data')
|
|
3057
3070
|
const payloadAvailability = readBoolean(data?.available)
|
|
3058
3071
|
const rootAvailability = readBoolean(isRecord(response.data) ? response.data.available : undefined)
|
|
3072
|
+
const available = payloadAvailability ?? rootAvailability ?? true
|
|
3073
|
+
const suggestion = !available && data?.suggestion && typeof data.suggestion === 'string'
|
|
3074
|
+
? data.suggestion
|
|
3075
|
+
: undefined
|
|
3059
3076
|
|
|
3060
|
-
return
|
|
3077
|
+
return { available, suggestion }
|
|
3061
3078
|
} catch (error: unknown) {
|
|
3062
3079
|
if (this.isHttpStatus(error, 404)) {
|
|
3063
|
-
return true
|
|
3080
|
+
return { available: true }
|
|
3064
3081
|
}
|
|
3065
3082
|
|
|
3066
3083
|
return await this.handleError(error)
|
package/src/services/echo.ts
CHANGED
|
@@ -430,9 +430,22 @@ export function createEchoService<TInstance extends EchoInstanceLike = EchoInsta
|
|
|
430
430
|
return
|
|
431
431
|
}
|
|
432
432
|
|
|
433
|
+
if (connection.state === 'disconnected' || connection.state === 'unavailable') {
|
|
434
|
+
logger.debug('Reconciled stale connecting state to disconnected', {
|
|
435
|
+
state: connection.state
|
|
436
|
+
})
|
|
437
|
+
updateConnectionStatus('disconnected')
|
|
438
|
+
scheduleReconnect()
|
|
439
|
+
clearConnectionStateReconcile()
|
|
440
|
+
return
|
|
441
|
+
}
|
|
442
|
+
|
|
433
443
|
connectionStateReconcileAttempt += 1
|
|
434
444
|
const nextDelay = CONNECTION_STATE_RECONCILE_DELAYS_MS[connectionStateReconcileAttempt]
|
|
435
445
|
if (typeof nextDelay !== 'number') {
|
|
446
|
+
logger.debug('Connection remained in connecting state beyond reconcile window; forcing reconnect')
|
|
447
|
+
updateConnectionStatus('disconnected')
|
|
448
|
+
scheduleReconnect()
|
|
436
449
|
clearConnectionStateReconcile()
|
|
437
450
|
return
|
|
438
451
|
}
|
package/src/stores/circles.ts
CHANGED
|
@@ -1360,6 +1360,16 @@ export function createCirclesStoreDefinition(config: CirclesStoreConfig) {
|
|
|
1360
1360
|
|
|
1361
1361
|
try {
|
|
1362
1362
|
await circlesService.muteMember(circleId, userId, options)
|
|
1363
|
+
|
|
1364
|
+
const circleMembers = this.members[circleId]
|
|
1365
|
+
if (circleMembers) {
|
|
1366
|
+
const member = circleMembers.find(m => m.user_id === userId || m.user?.id === userId)
|
|
1367
|
+
if (member) {
|
|
1368
|
+
member.is_muted = true
|
|
1369
|
+
member.muted_until = options?.muted_until ?? null
|
|
1370
|
+
}
|
|
1371
|
+
}
|
|
1372
|
+
|
|
1363
1373
|
await Promise.allSettled([
|
|
1364
1374
|
this.fetchMutes(circleId, true),
|
|
1365
1375
|
this.fetchAuditLog(circleId, true),
|
|
@@ -1832,6 +1842,16 @@ export function createCirclesStoreDefinition(config: CirclesStoreConfig) {
|
|
|
1832
1842
|
|
|
1833
1843
|
try {
|
|
1834
1844
|
await circlesService.unmuteMember(circleId, userId)
|
|
1845
|
+
|
|
1846
|
+
const circleMembers = this.members[circleId]
|
|
1847
|
+
if (circleMembers) {
|
|
1848
|
+
const member = circleMembers.find(m => m.user_id === userId || m.user?.id === userId)
|
|
1849
|
+
if (member) {
|
|
1850
|
+
member.is_muted = false
|
|
1851
|
+
member.muted_until = null
|
|
1852
|
+
}
|
|
1853
|
+
}
|
|
1854
|
+
|
|
1835
1855
|
await Promise.allSettled([
|
|
1836
1856
|
this.fetchMutes(circleId, true),
|
|
1837
1857
|
this.fetchAuditLog(circleId, true),
|
package/src/stores/content.ts
CHANGED
|
@@ -57,11 +57,30 @@ const LEGACY_CLIENT_RETRYABLE_ERROR_FRAGMENTS = [
|
|
|
57
57
|
'ensureCsrf is not a function',
|
|
58
58
|
]
|
|
59
59
|
const TRANSIENT_PUBLISH_RETRYABLE_ERROR_FRAGMENTS = [
|
|
60
|
+
'request failed with status code 500',
|
|
60
61
|
'request failed with status code 502',
|
|
61
62
|
'request failed with status code 503',
|
|
62
63
|
'request failed with status code 504',
|
|
64
|
+
'something went wrong. please try again.',
|
|
63
65
|
]
|
|
64
66
|
|
|
67
|
+
const SERVER_ERROR_MESSAGE_PATTERNS = [
|
|
68
|
+
/sqlstate\[/i,
|
|
69
|
+
/relation ".*" does not exist/i,
|
|
70
|
+
/undefined table/i,
|
|
71
|
+
/column ".*" does not exist/i,
|
|
72
|
+
/duplicate key value violates/i,
|
|
73
|
+
/deadlock detected/i,
|
|
74
|
+
/connection refused/i,
|
|
75
|
+
/too many connections/i,
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
const GENERIC_SERVER_ERROR_MESSAGE = 'Something went wrong. Please try again.'
|
|
79
|
+
|
|
80
|
+
function isInternalServerError(message: string): boolean {
|
|
81
|
+
return SERVER_ERROR_MESSAGE_PATTERNS.some((pattern) => pattern.test(message))
|
|
82
|
+
}
|
|
83
|
+
|
|
65
84
|
function normalizePageSize(pageSize: number | undefined): number {
|
|
66
85
|
const parsed = Number(pageSize ?? 10)
|
|
67
86
|
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
@@ -131,11 +150,13 @@ export function createContentStoreDefinition(config: ContentStoreConfig) {
|
|
|
131
150
|
}
|
|
132
151
|
|
|
133
152
|
const DISCIPLINE_ERROR_CODES = new Set([
|
|
153
|
+
'ACCOUNT_LIMITED',
|
|
134
154
|
'ACCOUNT_WRITE_TIMEOUT',
|
|
135
155
|
'ACCOUNT_BANNED',
|
|
136
156
|
])
|
|
137
157
|
|
|
138
158
|
const DISCIPLINE_ERROR_MESSAGES: Record<string, string> = {
|
|
159
|
+
ACCOUNT_LIMITED: 'Your account is temporarily limited',
|
|
139
160
|
ACCOUNT_WRITE_TIMEOUT: 'Your account is temporarily suspended. You cannot post at this time.',
|
|
140
161
|
ACCOUNT_BANNED: 'Your account has been suspended. You cannot post.',
|
|
141
162
|
}
|
|
@@ -161,6 +182,7 @@ export function createContentStoreDefinition(config: ContentStoreConfig) {
|
|
|
161
182
|
const lower = errorMessage.toLowerCase()
|
|
162
183
|
return LEGACY_CLIENT_RETRYABLE_ERROR_FRAGMENTS.some((fragment) => lower.includes(fragment.toLowerCase()))
|
|
163
184
|
|| TRANSIENT_PUBLISH_RETRYABLE_ERROR_FRAGMENTS.some((fragment) => lower.includes(fragment))
|
|
185
|
+
|| isInternalServerError(errorMessage)
|
|
164
186
|
}
|
|
165
187
|
|
|
166
188
|
const isDisciplineAxiosError = (err: unknown): boolean => {
|
|
@@ -174,15 +196,18 @@ export function createContentStoreDefinition(config: ContentStoreConfig) {
|
|
|
174
196
|
}
|
|
175
197
|
|
|
176
198
|
const resolvePendingPostErrorMessage = (err: unknown): string => {
|
|
177
|
-
const
|
|
199
|
+
const errorShape = err as {
|
|
178
200
|
response?: {
|
|
201
|
+
status?: number
|
|
179
202
|
data?: {
|
|
180
203
|
message?: string
|
|
181
204
|
code?: string
|
|
182
205
|
errors?: Record<string, string[] | string>
|
|
183
206
|
}
|
|
184
207
|
}
|
|
185
|
-
}
|
|
208
|
+
}
|
|
209
|
+
const responseData = errorShape.response?.data
|
|
210
|
+
const httpStatus = errorShape.response?.status
|
|
186
211
|
|
|
187
212
|
if (typeof responseData?.code === 'string' && responseData.code in DISCIPLINE_ERROR_MESSAGES) {
|
|
188
213
|
return DISCIPLINE_ERROR_MESSAGES[responseData.code] ?? 'Failed to create post'
|
|
@@ -198,14 +223,26 @@ export function createContentStoreDefinition(config: ContentStoreConfig) {
|
|
|
198
223
|
typeof message === 'string' && message.trim() !== ''
|
|
199
224
|
))
|
|
200
225
|
if (firstFieldError) {
|
|
201
|
-
return firstFieldError
|
|
226
|
+
return isInternalServerError(firstFieldError) ? GENERIC_SERVER_ERROR_MESSAGE : firstFieldError
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (typeof httpStatus === 'number' && httpStatus >= 500) {
|
|
230
|
+
return GENERIC_SERVER_ERROR_MESSAGE
|
|
202
231
|
}
|
|
203
232
|
|
|
204
233
|
if (typeof responseData?.message === 'string' && responseData.message.trim() !== '') {
|
|
234
|
+
if (isInternalServerError(responseData.message)) {
|
|
235
|
+
return GENERIC_SERVER_ERROR_MESSAGE
|
|
236
|
+
}
|
|
237
|
+
|
|
205
238
|
return responseData.message
|
|
206
239
|
}
|
|
207
240
|
|
|
208
241
|
if (err instanceof Error && err.message.trim() !== '') {
|
|
242
|
+
if (isInternalServerError(err.message)) {
|
|
243
|
+
return GENERIC_SERVER_ERROR_MESSAGE
|
|
244
|
+
}
|
|
245
|
+
|
|
209
246
|
return err.message
|
|
210
247
|
}
|
|
211
248
|
|
package/src/stores/discussion.ts
CHANGED
|
@@ -219,6 +219,18 @@ function isTransientThreadListError(error: unknown): boolean {
|
|
|
219
219
|
return status === 502 || status === 503 || status === 504
|
|
220
220
|
}
|
|
221
221
|
|
|
222
|
+
const DISCUSSION_SPACE_CHANNEL_PREFIX = 'discussions.space.'
|
|
223
|
+
const DISCUSSION_THREAD_CHANNEL_PREFIX = 'discussions.thread.'
|
|
224
|
+
|
|
225
|
+
function extractRealtimeChannelId(channelName: string | null, prefix: string): string | null {
|
|
226
|
+
if (!channelName || !channelName.startsWith(prefix)) {
|
|
227
|
+
return null
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const channelId = channelName.slice(prefix.length)
|
|
231
|
+
return channelId.length > 0 ? channelId : null
|
|
232
|
+
}
|
|
233
|
+
|
|
222
234
|
export type DiscussionStoreReturn = ReturnType<ReturnType<typeof createDiscussionStoreDefinition>>
|
|
223
235
|
|
|
224
236
|
export function createDiscussionStoreDefinition(config: DiscussionStoreConfig) {
|
|
@@ -226,6 +238,7 @@ export function createDiscussionStoreDefinition(config: DiscussionStoreConfig) {
|
|
|
226
238
|
client,
|
|
227
239
|
getCurrentUserId,
|
|
228
240
|
getEcho,
|
|
241
|
+
onEchoInitialized,
|
|
229
242
|
onEchoReconnected,
|
|
230
243
|
createLoadingState,
|
|
231
244
|
logger = console,
|
|
@@ -257,6 +270,8 @@ export function createDiscussionStoreDefinition(config: DiscussionStoreConfig) {
|
|
|
257
270
|
|
|
258
271
|
let activeSpaceChannel: string | null = null
|
|
259
272
|
let activeThreadChannel: string | null = null
|
|
273
|
+
let desiredSpaceChannel: string | null = null
|
|
274
|
+
let desiredThreadChannel: string | null = null
|
|
260
275
|
|
|
261
276
|
const locallyCreatedReplyIds = new Set<string>()
|
|
262
277
|
const pendingReplyCreations = new Map<string, number>()
|
|
@@ -420,6 +435,71 @@ export function createDiscussionStoreDefinition(config: DiscussionStoreConfig) {
|
|
|
420
435
|
return mergedItems
|
|
421
436
|
}
|
|
422
437
|
|
|
438
|
+
/**
|
|
439
|
+
* Reorder a flat list of replies (which may arrive in chronological or
|
|
440
|
+
* score order from the API) into depth-first tree order so that children
|
|
441
|
+
* always appear directly after their parent branch. The relative order
|
|
442
|
+
* of siblings (as returned by the backend sort) is preserved.
|
|
443
|
+
*/
|
|
444
|
+
function reorderIntoTreeOrder(flatReplies: Reply[]): Reply[] {
|
|
445
|
+
if (flatReplies.length <= 1) {
|
|
446
|
+
return flatReplies
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
const replyIds = new Set<string>()
|
|
450
|
+
for (const reply of flatReplies) {
|
|
451
|
+
replyIds.add(reply.id)
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// Group children by their parent. Replies whose parent is not in the
|
|
455
|
+
// current list are treated as roots (parentKey = '').
|
|
456
|
+
const childrenMap = new Map<string, Reply[]>()
|
|
457
|
+
childrenMap.set('', [])
|
|
458
|
+
|
|
459
|
+
for (const reply of flatReplies) {
|
|
460
|
+
const parentId = reply.parent_reply_id
|
|
461
|
+
const key = typeof parentId === 'string' && parentId !== '' && replyIds.has(parentId)
|
|
462
|
+
? parentId
|
|
463
|
+
: ''
|
|
464
|
+
|
|
465
|
+
const siblings = childrenMap.get(key)
|
|
466
|
+
if (siblings) {
|
|
467
|
+
siblings.push(reply)
|
|
468
|
+
} else {
|
|
469
|
+
childrenMap.set(key, [reply])
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
const result: Reply[] = []
|
|
474
|
+
|
|
475
|
+
function dfs(parentKey: string): void {
|
|
476
|
+
const children = childrenMap.get(parentKey)
|
|
477
|
+
if (!children) {
|
|
478
|
+
return
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
for (const child of children) {
|
|
482
|
+
result.push(child)
|
|
483
|
+
dfs(child.id)
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
dfs('')
|
|
488
|
+
|
|
489
|
+
// If some replies were unreachable (orphaned cycles), append them so
|
|
490
|
+
// nothing is silently dropped.
|
|
491
|
+
if (result.length < flatReplies.length) {
|
|
492
|
+
const included = new Set(result.map((reply) => reply.id))
|
|
493
|
+
for (const reply of flatReplies) {
|
|
494
|
+
if (!included.has(reply.id)) {
|
|
495
|
+
result.push(reply)
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
return result
|
|
501
|
+
}
|
|
502
|
+
|
|
423
503
|
function extractResponsePayload(responseData: unknown): unknown {
|
|
424
504
|
const responseRecord = toRecord(responseData)
|
|
425
505
|
if (!responseRecord) {
|
|
@@ -1026,9 +1106,9 @@ export function createDiscussionStoreDefinition(config: DiscussionStoreConfig) {
|
|
|
1026
1106
|
currentReplySort.value = sortBy
|
|
1027
1107
|
|
|
1028
1108
|
if (cursor) {
|
|
1029
|
-
replies.value = mergeUniqueById(replies.value, filteredReplyBatch)
|
|
1109
|
+
replies.value = reorderIntoTreeOrder(mergeUniqueById(replies.value, filteredReplyBatch))
|
|
1030
1110
|
} else {
|
|
1031
|
-
replies.value = filteredReplyBatch
|
|
1111
|
+
replies.value = reorderIntoTreeOrder(filteredReplyBatch)
|
|
1032
1112
|
hiddenOpeningReplyCountByThread.set(threadId, openingRepliesFilteredInBatch)
|
|
1033
1113
|
subscribeToThreadRealtime(threadId)
|
|
1034
1114
|
}
|
|
@@ -1217,6 +1297,9 @@ export function createDiscussionStoreDefinition(config: DiscussionStoreConfig) {
|
|
|
1217
1297
|
}
|
|
1218
1298
|
|
|
1219
1299
|
function cleanupRealtimeChannels(): void {
|
|
1300
|
+
desiredSpaceChannel = null
|
|
1301
|
+
desiredThreadChannel = null
|
|
1302
|
+
|
|
1220
1303
|
const echo = getEcho()
|
|
1221
1304
|
if (!echo) {
|
|
1222
1305
|
activeSpaceChannel = null
|
|
@@ -1328,13 +1411,14 @@ export function createDiscussionStoreDefinition(config: DiscussionStoreConfig) {
|
|
|
1328
1411
|
}
|
|
1329
1412
|
|
|
1330
1413
|
function subscribeToSpaceRealtime(spaceId: string): void {
|
|
1414
|
+
const channelName = `${DISCUSSION_SPACE_CHANNEL_PREFIX}${spaceId}`
|
|
1415
|
+
desiredSpaceChannel = channelName
|
|
1416
|
+
|
|
1331
1417
|
const echo = getEcho()
|
|
1332
1418
|
if (!echo) {
|
|
1333
1419
|
return
|
|
1334
1420
|
}
|
|
1335
1421
|
|
|
1336
|
-
const channelName = `discussions.space.${spaceId}`
|
|
1337
|
-
|
|
1338
1422
|
if (activeSpaceChannel === channelName) {
|
|
1339
1423
|
return
|
|
1340
1424
|
}
|
|
@@ -1358,13 +1442,14 @@ export function createDiscussionStoreDefinition(config: DiscussionStoreConfig) {
|
|
|
1358
1442
|
}
|
|
1359
1443
|
|
|
1360
1444
|
function subscribeToThreadRealtime(threadId: string): void {
|
|
1445
|
+
const channelName = `${DISCUSSION_THREAD_CHANNEL_PREFIX}${threadId}`
|
|
1446
|
+
desiredThreadChannel = channelName
|
|
1447
|
+
|
|
1361
1448
|
const echo = getEcho()
|
|
1362
1449
|
if (!echo) {
|
|
1363
1450
|
return
|
|
1364
1451
|
}
|
|
1365
1452
|
|
|
1366
|
-
const channelName = `discussions.thread.${threadId}`
|
|
1367
|
-
|
|
1368
1453
|
if (activeThreadChannel === channelName) {
|
|
1369
1454
|
return
|
|
1370
1455
|
}
|
|
@@ -2291,28 +2376,38 @@ export function createDiscussionStoreDefinition(config: DiscussionStoreConfig) {
|
|
|
2291
2376
|
error.value = message
|
|
2292
2377
|
}
|
|
2293
2378
|
|
|
2294
|
-
|
|
2295
|
-
const
|
|
2296
|
-
const
|
|
2379
|
+
function rehydrateRealtimeSubscriptions(): void {
|
|
2380
|
+
const savedDesiredSpaceChannel = desiredSpaceChannel
|
|
2381
|
+
const savedDesiredThreadChannel = desiredThreadChannel
|
|
2382
|
+
const spaceId = extractRealtimeChannelId(savedDesiredSpaceChannel, DISCUSSION_SPACE_CHANNEL_PREFIX)
|
|
2383
|
+
const threadId = extractRealtimeChannelId(savedDesiredThreadChannel, DISCUSSION_THREAD_CHANNEL_PREFIX)
|
|
2297
2384
|
|
|
2298
2385
|
activeSpaceChannel = null
|
|
2299
2386
|
activeThreadChannel = null
|
|
2300
2387
|
|
|
2301
|
-
if (
|
|
2302
|
-
const spaceId = savedSpace.replace('discussions.space.', '')
|
|
2388
|
+
if (spaceId) {
|
|
2303
2389
|
subscribeToSpaceRealtime(spaceId)
|
|
2304
2390
|
}
|
|
2305
2391
|
|
|
2306
|
-
if (
|
|
2307
|
-
const threadId = savedThread.replace('discussions.thread.', '')
|
|
2392
|
+
if (threadId) {
|
|
2308
2393
|
subscribeToThreadRealtime(threadId)
|
|
2309
2394
|
}
|
|
2395
|
+
}
|
|
2396
|
+
|
|
2397
|
+
const stopListeningToEchoReconnect = onEchoReconnected(() => {
|
|
2398
|
+
rehydrateRealtimeSubscriptions()
|
|
2399
|
+
})
|
|
2400
|
+
const stopListeningToEchoInitialized = onEchoInitialized?.(() => {
|
|
2401
|
+
rehydrateRealtimeSubscriptions()
|
|
2310
2402
|
})
|
|
2311
2403
|
|
|
2312
2404
|
onScopeDispose(() => {
|
|
2313
2405
|
if (typeof stopListeningToEchoReconnect === 'function') {
|
|
2314
2406
|
stopListeningToEchoReconnect()
|
|
2315
2407
|
}
|
|
2408
|
+
if (typeof stopListeningToEchoInitialized === 'function') {
|
|
2409
|
+
stopListeningToEchoInitialized()
|
|
2410
|
+
}
|
|
2316
2411
|
cleanupRealtimeChannels()
|
|
2317
2412
|
})
|
|
2318
2413
|
|
|
@@ -704,7 +704,7 @@ export function createGamificationStoreDefinition(config: GamificationStoreConfi
|
|
|
704
704
|
const currentXP = computed(() => userStats.value?.lifetime_points || 0)
|
|
705
705
|
const currentLevel = computed(() => userStats.value?.current_level || 1)
|
|
706
706
|
const nextLevel = computed(() => userStats.value?.next_level)
|
|
707
|
-
const levelProgress = computed(() => userStats.value?.level_progress
|
|
707
|
+
const levelProgress = computed(() => userStats.value?.level_progress ?? 0)
|
|
708
708
|
const recentXPGain = computed(() => userStats.value?.points_this_week || 0)
|
|
709
709
|
|
|
710
710
|
function setQuestFilter(nextFilter: string): void {
|
|
@@ -1378,8 +1378,11 @@ export function createGamificationStoreDefinition(config: GamificationStoreConfi
|
|
|
1378
1378
|
debugLog('Gamification: Level up event', event)
|
|
1379
1379
|
|
|
1380
1380
|
if (userStats.value) {
|
|
1381
|
-
|
|
1382
|
-
userStats.value.
|
|
1381
|
+
// Only reset progress if the user actually leveled up
|
|
1382
|
+
if (event.new_level !== userStats.value.current_level) {
|
|
1383
|
+
userStats.value.current_level = event.new_level
|
|
1384
|
+
userStats.value.level_progress = 0
|
|
1385
|
+
}
|
|
1383
1386
|
}
|
|
1384
1387
|
}
|
|
1385
1388
|
|
package/src/types/discussion.ts
CHANGED
|
@@ -131,6 +131,7 @@ export interface Thread {
|
|
|
131
131
|
meta?: ThreadMeta
|
|
132
132
|
tags?: DiscussionTag[]
|
|
133
133
|
is_subscribed?: boolean
|
|
134
|
+
can_moderate?: boolean
|
|
134
135
|
media?: DiscussionAttachment[]
|
|
135
136
|
deleted_at?: string | null
|
|
136
137
|
}
|
|
@@ -267,6 +268,7 @@ export interface DiscussionStoreConfig {
|
|
|
267
268
|
client: AxiosInstance
|
|
268
269
|
getCurrentUserId: () => string | null
|
|
269
270
|
getEcho: () => DiscussionRealtimeClientLike | null
|
|
271
|
+
onEchoInitialized?: (callback: () => void) => (() => void) | void
|
|
270
272
|
onEchoReconnected: (callback: () => void) => (() => void) | void
|
|
271
273
|
createLoadingState: () => DiscussionLoadingState
|
|
272
274
|
logger?: Pick<Console, 'error'>
|