@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.
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codingfactory/socialkit-vue",
3
- "version": "0.7.19",
3
+ "version": "0.7.21",
4
4
  "description": "Shared Vue 3 utilities for SocialKit-powered frontends",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -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
 
@@ -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`, { data: { user_id: userId } })
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 payloadAvailability ?? rootAvailability ?? true
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)
@@ -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
  }
@@ -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),
@@ -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 responseData = (err as {
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
- }).response?.data
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
 
@@ -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
- const stopListeningToEchoReconnect = onEchoReconnected(() => {
2295
- const savedSpace = activeSpaceChannel
2296
- const savedThread = activeThreadChannel
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 (savedSpace) {
2302
- const spaceId = savedSpace.replace('discussions.space.', '')
2388
+ if (spaceId) {
2303
2389
  subscribeToSpaceRealtime(spaceId)
2304
2390
  }
2305
2391
 
2306
- if (savedThread) {
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 || 0)
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
- userStats.value.current_level = event.new_level
1382
- userStats.value.level_progress = 0
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
 
@@ -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'>