20 KiB
Redux Store Map
A big part of what makes soapbox-fe function is the Redux store. Redux is basically a database of everything your frontend needs to know about in the form of a giant JSON object.
To work with Redux, you will want to install the Redux browser extension. This will allow you to see the full Redux store when working in development.
Due to the large size of the Redux store in soapbox-fe, it's worth documenting the purpose of each path.
If it's not documented, it's because I inherited it from Mastodon and I don't know what it does yet.
-
dropdown_menu
Sample:
dropdown_menu: { openId: null, placement: null, keyboard: false }
-
timelines
Sample:
timelines: { home: { items: [ '9uiMtlRMLHBnRg8tMG', '9uiLe5Q6Bsb8p8VslU', '9uiLMqdbtfE03Tc4uW', '9uiLEal13YvYUB8lN2', '9uiKwwSPdc0iZg1SUK', '9uiKq5TRiRJGVoEmau', '9uiKbTN4aHsmHgHtsO', '9ugVkEfNKtvGSpJGLI' ], totalQueuedItemsCount: 0, queuedItems: [], hasMore: true, unread: 0, isLoading: false, online: true, top: true, isPartial: false } }
-
meta
- User-specific data that is not a frontend setting (see:settings
).Sample:
meta: { pleroma: { unread_conversation_count: 0, hide_follows: false, hide_followers_count: false, background_image: 'https://dev.teci.world/media/74644a40461bb85fa41db02547b656fa382e0e2ada29021059ff2a2956c1bbab.jpg', confirmation_pending: false, is_moderator: false, deactivated: false, chat_token: 'SFMyNTY.g3QAAAACZAAEZGF0YW0AAAASOXRvMU5QeVM5OEo4Y2RpY1JFZAAGc2lnbmVkbgYAcH3yxnEB.qD9qQzEfRH4sfJQfPCJQKHayVUQ6_1m6t5iqE7jB17Q', allow_following_move: true, hide_follows_count: false, notification_settings: { followers: true, follows: true, non_followers: true, non_follows: true, privacy_option: false }, hide_followers: false, relationship: { showing_reblogs: true, followed_by: false, subscribing: false, blocked_by: false, requested: false, domain_blocking: false, following: false, endorsed: false, blocking: false, muting: false, id: '9to1NPyS98J8cdicRE', muting_notifications: false }, tags: [], hide_favorites: true, is_admin: true, skip_thread_containment: false } }
-
pleroma
- Pleroma specific metadata about the user pulled from/api/v1/accounts/verify_credentials
(excluding the pleroma_settings_store) -
alerts
Sample:
alerts: []
-
modal
Sample:
modal: { modalType: null, modalProps: {} }
-
user_lists
Sample:
user_lists: { reblogged_by: {}, blocks: {}, groups_removed_accounts: {}, following: {}, follow_requests: {}, groups: {}, followers: {}, mutes: {}, favourited_by: {}, birthday_reminders: {} }
-
domain_lists
Sample:
domain_lists: { blocks: { items: [] } }
-
status_lists
Sample:
status_lists: { favourites: { next: null, loaded: false, items: [ '9uh7FiM4hViVp59hSa', '9uhsxmGKEMBkWoykng' ] }, pins: { next: null, loaded: false, items: [] } }
-
accounts
- Data for all accounts you've viewed since launching the page, so they don't have to be downloaded twice.Sample:
accounts: { '9to1NPyS98J8cdicRE': { header_static: 'https://dev.teci.world/media/27272c6f53a8a535d2c11a98d3b3473833bf80192e82347548b9f1b6dc4027ab.jpg', display_name_html: 'crockwave', follow_requests_count: 0, bot: false, display_name: 'crockwave', created_at: '2020-04-07T16:29:04.000Z', locked: false, emojis: [], header: 'https://dev.teci.world/media/27272c6f53a8a535d2c11a98d3b3473833bf80192e82347548b9f1b6dc4027ab.jpg', url: 'https://dev.teci.world/users/curtis', note: '', acct: 'curtis', avatar_static: 'https://dev.teci.world/media/3e41f0e4e0b7e673959061f90c69a57ff547bd48ccca90df5d46be87a874febd.png', username: 'curtis', avatar: 'https://dev.teci.world/media/3e41f0e4e0b7e673959061f90c69a57ff547bd48ccca90df5d46be87a874febd.png', fields: [], pleroma: { unread_conversation_count: 0, hide_follows: false, hide_followers_count: false, background_image: 'https://dev.teci.world/media/74644a40461bb85fa41db02547b656fa382e0e2ada29021059ff2a2956c1bbab.jpg', confirmation_pending: false, is_moderator: false, deactivated: false, allow_following_move: true, hide_follows_count: false, notification_settings: { followers: true, follows: true, non_followers: true, non_follows: true, privacy_option: false }, hide_followers: false, relationship: { showing_reblogs: true, followed_by: false, subscribing: false, blocked_by: false, requested: false, domain_blocking: false, following: false, endorsed: false, blocking: false, muting: false, id: '9to1NPyS98J8cdicRE', muting_notifications: false }, tags: [], hide_favorites: true, is_admin: true, skip_thread_containment: false }, source: { fields: [], note: '', pleroma: { actor_type: 'Person', discoverable: false, no_rich_text: false, show_role: true }, privacy: 'public', sensitive: false }, id: '9to1NPyS98J8cdicRE', note_emojified: '' } }
-
accounts_counters
Sample:
accounts_counters: { '9tyANut1gDEkHqrvo8': { followers_count: 0, following_count: 0, statuses_count: 11 }, '9toQ7nsnbhnTcNVBxI': { followers_count: 342, following_count: 800, statuses_count: 721 }, '9tqzs9mEQIBxYPBk0G': { followers_count: 0, following_count: 0, statuses_count: 48 } }
-
statuses
- Data for all statuses you've viewed since launching the page, so they don't have to be downloaded twice.Sample:
statuses: { '9uVxGSYFo6ooon0ebQ': { in_reply_to_account_id: null, contentHtml: '<p>jpg test <span class="h-card"><a href="https://dev.teci.world/users/curtis" class="u-url mention">@<span>curtis</span></a></span></p>', mentions: [ { acct: 'curtis', id: '9to1NPyS98J8cdicRE', url: 'https://dev.teci.world/users/curtis', username: 'curtis' } ], created_at: '2020-04-28T21:10:16.000Z', spoiler_text: '', hidden: false, muted: false, uri: 'https://gleasonator.com/users/crockwave/statuses/104078260079111405', spoilerHtml: '', emojis: [], account: '9toTIlRPKG2j5obki8', reblogs_count: 0, url: 'https://gleasonator.com/@crockwave/posts/104078260079111405', application: { name: 'Web', website: null }, card: null, in_reply_to_id: null, reblogged: false, visibility: 'public', bookmarked: false, reblog: null, media_attachments: [ { description: null, id: '1375732379', pleroma: { mime_type: 'image/jpeg' }, preview_url: 'https://media.gleasonator.com/media_attachments/files/000/853/856/original/7035d67937053e1d.jpg', remote_url: 'https://media.gleasonator.com/media_attachments/files/000/853/856/original/7035d67937053e1d.jpg', text_url: 'https://media.gleasonator.com/media_attachments/files/000/853/856/original/7035d67937053e1d.jpg', type: 'image', url: 'https://media.gleasonator.com/media_attachments/files/000/853/856/original/7035d67937053e1d.jpg' } ], sensitive: false, replies_count: 0, language: null, pinned: false, tags: [], content: '<p>jpg test <span class="h-card"><a href="https://dev.teci.world/users/curtis" class="u-url mention">@<span>curtis</span></a></span></p>', favourites_count: 0, pleroma: { direct_conversation_id: null, spoiler_text: { 'text/plain': '' }, local: false, emoji_reactions: [], thread_muted: false, conversation_id: 1951, content: { 'text/plain': 'jpg test @curtis' }, in_reply_to_account_acct: null, expires_at: null }, favourited: false, id: '9uVxGSYFo6ooon0ebQ', search_index: 'jpg test @curtis', poll: null } }
-
relationships
Sample:
relationships: {}
-
settings
- Any frontend configuration values that should be persisted to the backend database. This includes user preferences as well as metadata such as emoji usage counters. It usespleroma_settings_store
to do it if it's available. If there's some other endpoint that handles your value, it doesn't belong here.Sample:
settings: { autoPlayGif: true, displayMedia: 'default', deleteModal: true, unfollowModal: false, frequentlyUsedEmojis: { grinning: 1, 'star-struck': 1 }, onboarded: false, defaultPrivacy: 'private', demetricator: false, saved: true, notifications: { alerts: { favourite: true, follow: true, mention: true, poll: true, reblog: true }, quickFilter: { active: 'all', advanced: false, show: true }, shows: { favourite: true, follow: true, mention: true, poll: true, reblog: true }, sounds: { favourite: true, follow: true, mention: true, poll: true, reblog: true }, birthdays: { show: true } }, theme: 'azure', 'public': { other: { onlyMedia: false }, regex: { body: '' } }, direct: { regex: { body: '' } }, community: { other: { onlyMedia: false }, regex: { body: '' } }, boostModal: false, dyslexicFont: false, expandSpoilers: false, skinTone: 1, trends: { show: true }, reduceMotion: false, columns: [ { id: 'COMPOSE', params: {}, uuid: '8200299a-f689-45ad-ad33-c9eb20b6286c' }, { id: 'HOME', params: {}, uuid: '1b1f69f4-d024-4d31-b5cd-b45fe77f4dc1' }, { id: 'NOTIFICATIONS', params: {}, uuid: 'e8c3904c-bf54-4047-baaa-aa786afebb3b' } ], systemFont: false, underlineLinks: false, home: { regex: { body: '' }, shows: { reblog: true, reply: true } } }
-
push_notifications
Sample:
push_notifications: { subscription: null, alerts: { follow: false, favourite: false, reblog: false, mention: false, poll: false }, isSubscribed: false, browserSupport: false }
-
mutes
Sample:
mutes: { 'new': { isSubmitting: false, account: null, notifications: true } }
-
reports
Sample:
reports: { 'new': { isSubmitting: false, account_id: null, status_ids: [], comment: '', forward: false } }
-
contexts
Sample:
contexts: { inReplyTos: { '9uhsxm9adOniBvpNIm': '9uh7FiM4hViVp59hSa', '9uiMtlRMLHBnRg8tMG': '9uiIk2f13yfg8mdfhg', '9uiLe5Q6Bsb8p8VslU': '9uiIk2f13yfg8mdfhg', '9uhBdzVeyImLnGTDZQ': '9uhB399i946ozmdRGC', '9uiKLrbohWVWp5k0Su': '9uiJzdGZLWjBy9Ca24', '9ui47WONBnvPhQalgu': '9ui47WHdaqXNMXROC0', '9ui5t93pL19HC0FppI': '9ui5qe5DXbA8XQiFyS', }, replies: { '9uhsxm9adOniBvpNIm': [ '9uhsxmGKEMBkWoykng' ], '9ui8gFu0tBewVfD38y': [ '9ui8gG1SRVc8skgzkO' ], '9uiIk2f13yfg8mdfhg': [ '9uiJxjFm7BylxVvHPc', '9uiJzdGZLWjBy9Ca24', '9uiLe5Q6Bsb8p8VslU', '9uiMtlRMLHBnRg8tMG' ], '9uiKLrbohWVWp5k0Su': [ '9uiKbTN4aHsmHgHtsO' ], '9ui68mCA7SZwuSbfqi': [ '9ui6Fz6cW4kGyiS3lo' ] } }
-
compose
Sample:
compose: { spoiler: false, focusDate: null, privacy: 'private', spoiler_text: '', in_reply_to: null, default_privacy: 'private', is_uploading: false, caretPosition: null, text: '', preselectDate: null, progress: 0, idempotencyKey: '046ddfb7-ce76-4dbd-ae43-e6e8417947fd', suggestions: [], resetFileKey: 53748, media_attachments: [], sensitive: false, default_sensitive: false, mounted: 0, is_composing: false, tagHistory: [], id: null, is_submitting: false, is_changing_upload: false, suggestion_token: null, poll: null }
-
search
Sample:
search: { value: '', submitted: false, hidden: false, results: {} }
-
media_attachments
Sample:
media_attachments: { accept_content_types: [ '.jpg', '.jpeg', '.png', '.gif', '.webp', '.webm', '.mp4', '.m4v', '.mov', 'image/jpeg', 'image/png', 'image/gif', 'image/webp', 'video/webm', 'video/mp4', 'video/quicktime' ] }
-
notifications
Sample:
notifications: { items: [ { id: '27', type: 'mention', account: '9uXUwPp1pwGsA2Qh3A', created_at: '2020-04-29T15:11:54.000Z', status: '9uXVnHKu7Lu9BrXvCC' }, { id: '8', type: 'mention', account: '9toQ7nsnbhnTcNVBxI', created_at: '2020-04-27T19:16:44.000Z', status: '9uTicLRt0ZoVX25ZvE' }, { id: '7', type: 'favourite', account: '9toQ7nsnbhnTcNVBxI', created_at: '2020-04-27T19:16:25.000Z', status: '9uThsXbbTg6luknEmG' } ], hasMore: true, top: false, unread: 0, isLoading: false, queuedNotifications: [], totalQueuedNotificationsCount: 0, lastRead: -1 }
-
height_cache
Sample:
height_cache: { '9t06sd:home_timeline': { '9uXhrY530I85jJvpwW': 164.171875, '9uXVdgMQDqa1uGgESG': 300.140625, '9uXWs4FmHnJW17zncW': 852.171875, '9uXX4IfAXO0yBNhmQy': 166.171875, '9uXXThi8XzE56gCtE0': 145.140625 } }
-
custom_emojis
Sample:
custom_emojis: [ { category: 'Fun', shortcode: 'blank', static_url: 'https://dev.teci.world/emoji/blank.png', tags: [ 'Fun' ], url: 'https://dev.teci.world/emoji/blank.png', visible_in_picker: true }, { category: 'Gif,Fun', shortcode: 'firefox', static_url: 'https://dev.teci.world/emoji/Firefox.gif', tags: [ 'Gif', 'Fun' ], url: 'https://dev.teci.world/emoji/Firefox.gif', visible_in_picker: true } ]
-
lists
Sample:
lists: {},
-
listEditor
Sample:
listEditor: { listId: null, isSubmitting: false, isChanged: false, title: '', accounts: { items: [], loaded: false, isLoading: false }, suggestions: { value: '', items: [] } }
-
listAdder
Sample:
listAdder: { accountId: null, lists: { items: [], loaded: false, isLoading: false } }
-
filters
Sample:
filters: [],
-
conversations
Sample:
conversations: { items: [], isLoading: false, hasMore: true, mounted: false }
-
suggestions
Sample:
suggestions: { items: [], isLoading: false },
-
polls
Sample:
polls: {}
-
trends
Sample:
trends: { items: [], isLoading: false }
-
groups
Sample:
groups: {}
-
group_relationships
Sample:
group_relationships: {}
-
group_lists
Sample:
group_lists: { featured: [], member: [], admin: [] }
-
group_editor
Sample:
group_editor: { groupId: null, isSubmitting: false, isChanged: false, title: '', description: '', coverImage: null }
-
sidebar
Sample:
sidebar: {}
-
patron
- Data related to soapbox-patronSample:
patron: {}
-
soapbox
- Soapbox specific configuration pulled from/instance/soapbox.json
. The configuration file isn't required and this map can be empty.Sample:
soapbox: { logo: 'https://support.wirelessmessaging.com/temp/tga/teci_social_logo.svg', promoPanel: { items: [ { icon: 'comment-o', text: 'TECI blog', url: 'https://www.teci.world/blog' } ] }, extensions: { patron: false } }
-
instance
- Instance data pulled from/api/v1/instance
Sample:
instance: { avatar_upload_limit: 2000000, urls: { streaming_api: 'wss://dev.teci.world' }, thumbnail: 'https://dev.teci.world/instance/thumbnail.jpeg', uri: 'https://dev.teci.world', background_upload_limit: 4000000, banner_upload_limit: 4000000, poll_limits: { max_expiration: 31536000, max_option_chars: 200, max_options: 20, min_expiration: 0 }, version: '2.7.2 (compatible; Pleroma 2.0.1)', title: 'TECI Dev', max_toot_chars: 5000, registrations: true, languages: [ 'en' ], email: 'curtis.rock@gmail.com', description: 'A Pleroma instance, an alternative fediverse server', upload_limit: 16000000, stats: { domain_count: 161, status_count: 1, user_count: 5 } }
-
me
- The account ID of the currently logged in user, 'null' if loading, and 'false' if no user is logged in.Sample:
me: '9to1NPyS98J8cdicRE'
-
auth
- Data used for authenticationSample:
auth: { app: { vapid_key: 'BEm4LT3n_cxFsGIqI-iG-Uea0OXgnjTtQAa4sPhkguP2rCbFfqL6xHOzo-cS3j9G7kG9eQ3deIQdkXbvTwgcLAk', token_type: 'Bearer', client_secret: 'ZuCeHoYy43MGifOnZyjWn82Kuq1YkeVAlwlxqvnGR6Q', redirect_uri: 'urn:ietf:wg:oauth:2.0:oob', created_at: 1587504650, name: 'SoapboxFE_2020-04-21T21:30:45.889Z', client_id: 'OyjobYI1RQcx3G6RIJ7brm2RmIy6M2hbme2oEwByjvI', expires_in: 600, scope: 'read write follow push admin', refresh_token: 'TNFBq7Dp6ryLkUoHHbnUp3y5c-U6ya_c7DcSnfM86wo', website: null, id: '23', access_token: 'aN65U4SXw2JjOeOyko1-w7KIxaJnOqtU-Z3izpdKqcg' }, user: { access_token: 'UeWx_MgQckL993--BetNsJHcwxq1BVmtxc4qJtb-DM8', created_at: 1588607387, expires_in: 600, me: 'https://dev.teci.world/users/curtis', refresh_token: '2mbb3ZqZ9w8eeSiLRDC2SsQ86-UmVDrScmFXPx4opvw', scope: 'read write follow push admin', token_type: 'Bearer' } }
-
app
- Map containing the app used to make app requests such as register/login and its access token. -
user
- Map containing the access token of the logged in user.