Drafts fixes (#9795)
* Allow saving quote post drafts * Remove warning logs for failed media loading * Fix threadgates
This commit is contained in:
@@ -1,13 +1,16 @@
|
|||||||
/**
|
/**
|
||||||
* Type converters for Draft API - convert between ComposerState and server Draft types.
|
* Type converters for Draft API - convert between ComposerState and server Draft types.
|
||||||
*/
|
*/
|
||||||
import {type AppBskyDraftDefs, RichText} from '@atproto/api'
|
import {type AppBskyDraftDefs, AtUri, RichText} from '@atproto/api'
|
||||||
import {nanoid} from 'nanoid/non-secure'
|
import {nanoid} from 'nanoid/non-secure'
|
||||||
|
|
||||||
|
import {resolveLink} from '#/lib/api/resolve'
|
||||||
import {getImageDim} from '#/lib/media/manip'
|
import {getImageDim} from '#/lib/media/manip'
|
||||||
import {mimeToExt} from '#/lib/media/video/util'
|
import {mimeToExt} from '#/lib/media/video/util'
|
||||||
import {type ComposerImage} from '#/state/gallery'
|
import {type ComposerImage} from '#/state/gallery'
|
||||||
import {type Gif} from '#/state/queries/tenor'
|
import {type Gif} from '#/state/queries/tenor'
|
||||||
|
import {threadgateAllowUISettingToAllowRecordValue} from '#/state/queries/threadgate/util'
|
||||||
|
import {createPublicAgent} from '#/state/session/agent'
|
||||||
import {
|
import {
|
||||||
type ComposerState,
|
type ComposerState,
|
||||||
type EmbedDraft,
|
type EmbedDraft,
|
||||||
@@ -61,33 +64,12 @@ export async function composerStateToDraft(state: ComposerState): Promise<{
|
|||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
// Convert threadgate settings to server format
|
|
||||||
const threadgateAllow: AppBskyDraftDefs.Draft['threadgateAllow'] = []
|
|
||||||
for (const setting of state.thread.threadgate) {
|
|
||||||
if (setting.type === 'mention') {
|
|
||||||
threadgateAllow.push({
|
|
||||||
$type: 'app.bsky.feed.threadgate#mentionRule' as const,
|
|
||||||
})
|
|
||||||
} else if (setting.type === 'following') {
|
|
||||||
threadgateAllow.push({
|
|
||||||
$type: 'app.bsky.feed.threadgate#followingRule' as const,
|
|
||||||
})
|
|
||||||
} else if (setting.type === 'followers') {
|
|
||||||
threadgateAllow.push({
|
|
||||||
$type: 'app.bsky.feed.threadgate#followerRule' as const,
|
|
||||||
})
|
|
||||||
} else if (setting.type === 'list') {
|
|
||||||
threadgateAllow.push({
|
|
||||||
$type: 'app.bsky.feed.threadgate#listRule' as const,
|
|
||||||
list: setting.list,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const draft: AppBskyDraftDefs.Draft = {
|
const draft: AppBskyDraftDefs.Draft = {
|
||||||
$type: 'app.bsky.draft.defs#draft',
|
$type: 'app.bsky.draft.defs#draft',
|
||||||
posts,
|
posts,
|
||||||
threadgateAllow: threadgateAllow.length > 0 ? threadgateAllow : undefined,
|
threadgateAllow: threadgateAllowUISettingToAllowRecordValue(
|
||||||
|
state.thread.threadgate,
|
||||||
|
),
|
||||||
postgateEmbeddingRules:
|
postgateEmbeddingRules:
|
||||||
state.thread.postgate.embeddingRules &&
|
state.thread.postgate.embeddingRules &&
|
||||||
state.thread.postgate.embeddingRules.length > 0
|
state.thread.postgate.embeddingRules.length > 0
|
||||||
@@ -140,16 +122,22 @@ async function postDraftToServerPost(
|
|||||||
|
|
||||||
// Add quote record embed
|
// Add quote record embed
|
||||||
if (post.embed.quote) {
|
if (post.embed.quote) {
|
||||||
|
const resolved = await resolveLink(
|
||||||
|
createPublicAgent(),
|
||||||
|
post.embed.quote.uri,
|
||||||
|
)
|
||||||
|
if (resolved && resolved.type === 'record') {
|
||||||
draftPost.embedRecords = [
|
draftPost.embedRecords = [
|
||||||
{
|
{
|
||||||
$type: 'app.bsky.draft.defs#draftEmbedRecord',
|
$type: 'app.bsky.draft.defs#draftEmbedRecord',
|
||||||
record: {
|
record: {
|
||||||
uri: post.embed.quote.uri,
|
uri: resolved.record.uri,
|
||||||
cid: '', // We don't have the CID at draft time
|
cid: resolved.record.cid,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Add external link embed (only if no media, otherwise it's ignored)
|
// Add external link embed (only if no media, otherwise it's ignored)
|
||||||
if (post.embed.link && !post.embed.media) {
|
if (post.embed.link && !post.embed.media) {
|
||||||
@@ -536,7 +524,9 @@ export async function draftToComposerPosts(
|
|||||||
// Restore quote embed
|
// Restore quote embed
|
||||||
if (post.embedRecords && post.embedRecords.length > 0) {
|
if (post.embedRecords && post.embedRecords.length > 0) {
|
||||||
const record = post.embedRecords[0]
|
const record = post.embedRecords[0]
|
||||||
embed.quote = {type: 'link', uri: record.record.uri}
|
const urip = new AtUri(record.record.uri)
|
||||||
|
const url = `https://bsky.app/profile/${urip.host}/post/${urip.rkey}`
|
||||||
|
embed.quote = {type: 'link', uri: url}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore link embed (only if not a GIF)
|
// Restore link embed (only if not a GIF)
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ export async function loadDraft(draft: AppBskyDraftDefs.Draft): Promise<{
|
|||||||
const url = await storage.loadMediaFromLocal(img.localRef.path)
|
const url = await storage.loadMediaFromLocal(img.localRef.path)
|
||||||
loadedMedia.set(img.localRef.path, url)
|
loadedMedia.set(img.localRef.path, url)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logger.warn('Failed to load draft image', {
|
logger.debug('Failed to load draft image', {
|
||||||
path: img.localRef.path,
|
path: img.localRef.path,
|
||||||
error: e,
|
error: e,
|
||||||
})
|
})
|
||||||
@@ -69,7 +69,7 @@ export async function loadDraft(draft: AppBskyDraftDefs.Draft): Promise<{
|
|||||||
const url = await storage.loadMediaFromLocal(vid.localRef.path)
|
const url = await storage.loadMediaFromLocal(vid.localRef.path)
|
||||||
loadedMedia.set(vid.localRef.path, url)
|
loadedMedia.set(vid.localRef.path, url)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logger.warn('Failed to load draft video', {
|
logger.debug('Failed to load draft video', {
|
||||||
path: vid.localRef.path,
|
path: vid.localRef.path,
|
||||||
error: e,
|
error: e,
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user