diff options
author | dan <dan.abramov@gmail.com> | 2024-10-08 09:07:40 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-07 17:07:40 -0700 |
commit | e1ca3ae40e8a208ab2ab0b89a96b8e314042c75b (patch) | |
tree | 3552743fa299b00b5f13e31721fa219ec50c136e /src/view/com/composer/state/composer.ts | |
parent | c06040cc209338fc37980648b31d4d64cc0c5c09 (diff) | |
download | voidsky-e1ca3ae40e8a208ab2ab0b89a96b8e314042c75b.tar.zst |
Move remaining composer state into reducer (#5623)
Co-authored-by: Mary <git@mary.my.id> Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com> Co-authored-by: Hailey <me@haileyok.com>
Diffstat (limited to 'src/view/com/composer/state/composer.ts')
-rw-r--r-- | src/view/com/composer/state/composer.ts | 65 |
1 files changed, 60 insertions, 5 deletions
diff --git a/src/view/com/composer/state/composer.ts b/src/view/com/composer/state/composer.ts index 6156d3cfa..e37690342 100644 --- a/src/view/com/composer/state/composer.ts +++ b/src/view/com/composer/state/composer.ts @@ -1,12 +1,17 @@ import {ImagePickerAsset} from 'expo-image-picker' +import {AppBskyFeedPostgate, RichText} from '@atproto/api' +import {insertMentionAt} from '#/lib/strings/mention-manip' import { isBskyPostUrl, postUriToRelativePath, toBskyAppUrl, } from '#/lib/strings/url-helpers' import {ComposerImage, createInitialImages} from '#/state/gallery' +import {createPostgateRecord} from '#/state/queries/postgate/util' import {Gif} from '#/state/queries/tenor' +import {threadgateViewToAllowUISetting} from '#/state/queries/threadgate' +import {ThreadgateAllowUISetting} from '#/state/queries/threadgate' import {ComposerOpts} from '#/state/shell/composer' import {createVideoState, VideoAction, videoReducer, VideoState} from './video' @@ -41,12 +46,19 @@ export type EmbedDraft = { link: Link | undefined } -export type ComposerState = { - // TODO: Other draft data. +export type ComposerDraft = { + richtext: RichText + labels: string[] + postgate: AppBskyFeedPostgate.Record + threadgate: ThreadgateAllowUISetting[] embed: EmbedDraft } export type ComposerAction = + | {type: 'update_richtext'; richtext: RichText} + | {type: 'update_labels'; labels: string[]} + | {type: 'update_postgate'; postgate: AppBskyFeedPostgate.Record} + | {type: 'update_threadgate'; threadgate: ThreadgateAllowUISetting[]} | {type: 'embed_add_images'; images: ComposerImage[]} | {type: 'embed_update_image'; image: ComposerImage} | {type: 'embed_remove_image'; image: ComposerImage} @@ -67,10 +79,34 @@ export type ComposerAction = export const MAX_IMAGES = 4 export function composerReducer( - state: ComposerState, + state: ComposerDraft, action: ComposerAction, -): ComposerState { +): ComposerDraft { switch (action.type) { + case 'update_richtext': { + return { + ...state, + richtext: action.richtext, + } + } + case 'update_labels': { + return { + ...state, + labels: action.labels, + } + } + case 'update_postgate': { + return { + ...state, + postgate: action.postgate, + } + } + case 'update_threadgate': { + return { + ...state, + threadgate: action.threadgate, + } + } case 'embed_add_images': { if (action.images.length === 0) { return state @@ -293,12 +329,16 @@ export function composerReducer( } export function createComposerState({ + initText, + initMention, initImageUris, initQuoteUri, }: { + initText: string | undefined + initMention: string | undefined initImageUris: ComposerOpts['imageUris'] initQuoteUri: string | undefined -}): ComposerState { +}): ComposerDraft { let media: ImagesMedia | undefined if (initImageUris?.length) { media = { @@ -317,7 +357,22 @@ export function createComposerState({ } } } + const initRichText = new RichText({ + text: initText + ? initText + : initMention + ? insertMentionAt( + `@${initMention}`, + initMention.length + 1, + `${initMention}`, + ) + : '', + }) return { + richtext: initRichText, + labels: [], + postgate: createPostgateRecord({post: ''}), + threadgate: threadgateViewToAllowUISetting(undefined), embed: { quote, media, |