kopia lustrzana https://gitlab.com/soapbox-pub/soapbox
				
				
				
			Normalize Card entity
							rodzic
							
								
									5c8e8d9f99
								
							
						
					
					
						commit
						28ecb9d912
					
				| 
						 | 
				
			
			@ -0,0 +1,210 @@
 | 
			
		|||
{
 | 
			
		||||
  "account": {
 | 
			
		||||
    "acct": "alex",
 | 
			
		||||
    "avatar": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png",
 | 
			
		||||
    "avatar_static": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png",
 | 
			
		||||
    "bot": false,
 | 
			
		||||
    "created_at": "2020-01-08T01:25:43.000Z",
 | 
			
		||||
    "display_name": "Alex Gleason",
 | 
			
		||||
    "emojis": [
 | 
			
		||||
      {
 | 
			
		||||
        "shortcode": "soapbox",
 | 
			
		||||
        "static_url": "https://gleasonator.com/emoji/Gleasonator/soapbox.png",
 | 
			
		||||
        "url": "https://gleasonator.com/emoji/Gleasonator/soapbox.png",
 | 
			
		||||
        "visible_in_picker": false
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "fields": [
 | 
			
		||||
      {
 | 
			
		||||
        "name": "Website",
 | 
			
		||||
        "value": "<a href=\"https://alexgleason.me\" rel=\"ugc\">https://alexgleason.me</a>"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "Soapbox :soapbox:",
 | 
			
		||||
        "value": "<a href=\"https://soapbox.pub\" rel=\"ugc\">https://soapbox.pub</a>"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "Email",
 | 
			
		||||
        "value": "alex@alexgleason.me"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "Gender identity",
 | 
			
		||||
        "value": "Soyboy"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "Donate (PayPal)",
 | 
			
		||||
        "value": "<a href=\"https://paypal.me/gleasonator\" rel=\"ugc\">https://paypal.me/gleasonator</a>"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "$BTC",
 | 
			
		||||
        "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "$ETH",
 | 
			
		||||
        "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "$DOGE",
 | 
			
		||||
        "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "$XMR",
 | 
			
		||||
        "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "followers_count": 2476,
 | 
			
		||||
    "following_count": 1584,
 | 
			
		||||
    "fqn": "alex@gleasonator.com",
 | 
			
		||||
    "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png",
 | 
			
		||||
    "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png",
 | 
			
		||||
    "id": "9v5bmRalQvjOy0ECcC",
 | 
			
		||||
    "last_status_at": "2022-03-12T16:35:10",
 | 
			
		||||
    "locked": false,
 | 
			
		||||
    "note": "I create Fediverse software that empowers people online. :soapbox:<br/><br/>I'm vegan btw<br/><br/>Note: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.",
 | 
			
		||||
    "pleroma": {
 | 
			
		||||
      "accepts_chat_messages": true,
 | 
			
		||||
      "also_known_as": [
 | 
			
		||||
        "https://mitra.social/users/alex"
 | 
			
		||||
      ],
 | 
			
		||||
      "ap_id": "https://gleasonator.com/users/alex",
 | 
			
		||||
      "background_image": null,
 | 
			
		||||
      "birthday": "1993-07-03",
 | 
			
		||||
      "favicon": "https://gleasonator.com/favicon.png",
 | 
			
		||||
      "hide_favorites": true,
 | 
			
		||||
      "hide_followers": false,
 | 
			
		||||
      "hide_followers_count": false,
 | 
			
		||||
      "hide_follows": false,
 | 
			
		||||
      "hide_follows_count": false,
 | 
			
		||||
      "is_admin": true,
 | 
			
		||||
      "is_confirmed": true,
 | 
			
		||||
      "is_moderator": false,
 | 
			
		||||
      "is_suggested": true,
 | 
			
		||||
      "relationship": {},
 | 
			
		||||
      "skip_thread_containment": false,
 | 
			
		||||
      "tags": []
 | 
			
		||||
    },
 | 
			
		||||
    "source": {
 | 
			
		||||
      "fields": [
 | 
			
		||||
        {
 | 
			
		||||
          "name": "Website",
 | 
			
		||||
          "value": "https://alexgleason.me"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "name": "Soapbox :soapbox:",
 | 
			
		||||
          "value": "https://soapbox.pub"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "name": "Email",
 | 
			
		||||
          "value": "alex@alexgleason.me"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "name": "Gender identity",
 | 
			
		||||
          "value": "Soyboy"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "name": "Donate (PayPal)",
 | 
			
		||||
          "value": "https://paypal.me/gleasonator"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "name": "$BTC",
 | 
			
		||||
          "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "name": "$ETH",
 | 
			
		||||
          "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "name": "$DOGE",
 | 
			
		||||
          "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "name": "$XMR",
 | 
			
		||||
          "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
      "note": "I create Fediverse software that empowers people online. :soapbox:\r\n\r\nI'm vegan btw\r\n\r\nNote: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.",
 | 
			
		||||
      "pleroma": {
 | 
			
		||||
        "actor_type": "Person",
 | 
			
		||||
        "discoverable": false
 | 
			
		||||
      },
 | 
			
		||||
      "sensitive": false
 | 
			
		||||
    },
 | 
			
		||||
    "statuses_count": 23674,
 | 
			
		||||
    "url": "https://gleasonator.com/users/alex",
 | 
			
		||||
    "username": "alex"
 | 
			
		||||
  },
 | 
			
		||||
  "application": null,
 | 
			
		||||
  "bookmarked": false,
 | 
			
		||||
  "card": {
 | 
			
		||||
    "author_name": "Alex Gleason",
 | 
			
		||||
    "author_url": "https://soapbox.pub/author/alex/",
 | 
			
		||||
    "blurhash": null,
 | 
			
		||||
    "description": "On cryptocurrency I’ve always believed integrated donations would be a necessary part of the Fediverse. Admins do all the heavy lifting; it’s a thankless job. Meanwhile users want to help secure their new online home, but feel powerless to do so. I have been running an experimental payment platform based on Stripe alongside my Soapbox […]",
 | 
			
		||||
    "embed_url": null,
 | 
			
		||||
    "height": 338,
 | 
			
		||||
    "html": "",
 | 
			
		||||
    "image": "https://gleasonator.com/proxy/L2kUi5uxMdoC6LYYrnAdlJviPGQ/aHR0cHM6Ly9tZWRpYS5zb2FwYm94LnB1Yi91cGxvYWRzLzIwMjEvMDcvdi0xLTMtdGh1bWIucG5n/v-1-3-thumb.png",
 | 
			
		||||
    "provider_name": "Soapbox",
 | 
			
		||||
    "provider_url": "https://soapbox.pub",
 | 
			
		||||
    "title": "Soapbox FE v1.3: The Crypto Release - Soapbox",
 | 
			
		||||
    "type": "link",
 | 
			
		||||
    "url": "https://soapbox.pub/blog/soapbox-fe-v1.3-cryptocurrency-release/",
 | 
			
		||||
    "width": 600
 | 
			
		||||
  },
 | 
			
		||||
  "content": "<p>Soapbox FE v1.3 released. Read about it here: <a href=\"https://soapbox.pub/blog/soapbox-fe-v1.3-cryptocurrency-release/\">https://soapbox.pub/blog/soapbox-fe-v1.3-cryptocurrency-release/</a></p><p>Enjoy!</p>",
 | 
			
		||||
  "created_at": "2021-07-02T20:49:39.000Z",
 | 
			
		||||
  "emojis": [],
 | 
			
		||||
  "favourited": false,
 | 
			
		||||
  "favourites_count": 29,
 | 
			
		||||
  "id": "A8tEMYF2GNnfPcL4dc",
 | 
			
		||||
  "in_reply_to_account_id": null,
 | 
			
		||||
  "in_reply_to_id": null,
 | 
			
		||||
  "language": null,
 | 
			
		||||
  "media_attachments": [],
 | 
			
		||||
  "mentions": [],
 | 
			
		||||
  "muted": false,
 | 
			
		||||
  "pinned": true,
 | 
			
		||||
  "pleroma": {
 | 
			
		||||
    "content": {
 | 
			
		||||
      "text/plain": "Soapbox FE v1.3 released. Read about it here: https://soapbox.pub/blog/soapbox-fe-v1.3-cryptocurrency-release/Enjoy!"
 | 
			
		||||
    },
 | 
			
		||||
    "conversation_id": "16496668",
 | 
			
		||||
    "direct_conversation_id": null,
 | 
			
		||||
    "emoji_reactions": [
 | 
			
		||||
      {
 | 
			
		||||
        "count": 5,
 | 
			
		||||
        "me": false,
 | 
			
		||||
        "name": "❤️"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "count": 1,
 | 
			
		||||
        "me": false,
 | 
			
		||||
        "name": "👍"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "expires_at": null,
 | 
			
		||||
    "in_reply_to_account_acct": null,
 | 
			
		||||
    "local": true,
 | 
			
		||||
    "parent_visible": false,
 | 
			
		||||
    "pinned_at": "2021-11-23T01:38:44.000Z",
 | 
			
		||||
    "quote": null,
 | 
			
		||||
    "quote_url": null,
 | 
			
		||||
    "quote_visible": false,
 | 
			
		||||
    "spoiler_text": {
 | 
			
		||||
      "text/plain": ""
 | 
			
		||||
    },
 | 
			
		||||
    "thread_muted": false
 | 
			
		||||
  },
 | 
			
		||||
  "poll": null,
 | 
			
		||||
  "reblog": null,
 | 
			
		||||
  "reblogged": false,
 | 
			
		||||
  "reblogs_count": 16,
 | 
			
		||||
  "replies_count": 7,
 | 
			
		||||
  "sensitive": false,
 | 
			
		||||
  "spoiler_text": "",
 | 
			
		||||
  "tags": [],
 | 
			
		||||
  "text": null,
 | 
			
		||||
  "uri": "https://gleasonator.com/objects/3eabaf63-47f4-4314-9ddb-ce7dbf46b393",
 | 
			
		||||
  "url": "https://gleasonator.com/notice/A8tEMYF2GNnfPcL4dc",
 | 
			
		||||
  "visibility": "public"
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
import { Record as ImmutableRecord, fromJS } from 'immutable';
 | 
			
		||||
 | 
			
		||||
import { normalizeCard } from '../card';
 | 
			
		||||
 | 
			
		||||
describe('normalizeCard()', () => {
 | 
			
		||||
  it('adds base fields', () => {
 | 
			
		||||
    const card = fromJS({});
 | 
			
		||||
    const result = normalizeCard(card);
 | 
			
		||||
 | 
			
		||||
    expect(ImmutableRecord.isRecord(result)).toBe(true);
 | 
			
		||||
    expect(result.type).toEqual('link');
 | 
			
		||||
    expect(result.url).toEqual('');
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -186,4 +186,13 @@ describe('normalizeStatus()', () => {
 | 
			
		|||
    expect(ImmutableRecord.isRecord(result.poll.emojis.get(0))).toBe(true);
 | 
			
		||||
    expect(result.poll.emojis.get(1).shortcode).toEqual('soapbox');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('normalizes a card', () => {
 | 
			
		||||
    const status = fromJS(require('soapbox/__fixtures__/status-with-card.json'));
 | 
			
		||||
    const result = normalizeStatus(status);
 | 
			
		||||
 | 
			
		||||
    expect(ImmutableRecord.isRecord(result.card)).toBe(true);
 | 
			
		||||
    expect(result.card.type).toEqual('link');
 | 
			
		||||
    expect(result.card.provider_url).toEqual('https://soapbox.pub');
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,28 @@
 | 
			
		|||
/**
 | 
			
		||||
 * Card normalizer:
 | 
			
		||||
 * Converts API cards into our internal format.
 | 
			
		||||
 * @see {@link https://docs.joinmastodon.org/entities/card/}
 | 
			
		||||
 */
 | 
			
		||||
import { Record as ImmutableRecord, Map as ImmutableMap } from 'immutable';
 | 
			
		||||
 | 
			
		||||
// https://docs.joinmastodon.org/entities/card/
 | 
			
		||||
const CardRecord = ImmutableRecord({
 | 
			
		||||
  author_name: '',
 | 
			
		||||
  author_url: '',
 | 
			
		||||
  blurhash: null,
 | 
			
		||||
  description: '',
 | 
			
		||||
  embed_url: '',
 | 
			
		||||
  height: 0,
 | 
			
		||||
  html: '',
 | 
			
		||||
  image: null,
 | 
			
		||||
  provider_name: '',
 | 
			
		||||
  provider_url: '',
 | 
			
		||||
  title: '',
 | 
			
		||||
  type: 'link',
 | 
			
		||||
  url: '',
 | 
			
		||||
  width: 0,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export const normalizeCard = (card: ImmutableMap<string, any>) => {
 | 
			
		||||
  return CardRecord(card);
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -10,6 +10,7 @@ import {
 | 
			
		|||
} from 'immutable';
 | 
			
		||||
 | 
			
		||||
import { normalizeAttachment } from 'soapbox/normalizers/attachment';
 | 
			
		||||
import { normalizeCard } from 'soapbox/normalizers/card';
 | 
			
		||||
import { normalizeEmoji } from 'soapbox/normalizers/emoji';
 | 
			
		||||
import { normalizeMention } from 'soapbox/normalizers/mention';
 | 
			
		||||
import { normalizePoll } from 'soapbox/normalizers/poll';
 | 
			
		||||
| 
						 | 
				
			
			@ -83,6 +84,15 @@ const normalizeStatusPoll = (status: ImmutableMap<string, any>) => {
 | 
			
		|||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Normalize card
 | 
			
		||||
const normalizeStatusCard = (status: ImmutableMap<string, any>) => {
 | 
			
		||||
  if (status.get('card')) {
 | 
			
		||||
    return status.update('card', ImmutableMap(), normalizeCard);
 | 
			
		||||
  } else {
 | 
			
		||||
    return status.set('card', null);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Fix order of mentions
 | 
			
		||||
const fixMentionsOrder = (status: ImmutableMap<string, any>) => {
 | 
			
		||||
  const mentions = status.get('mentions', ImmutableList());
 | 
			
		||||
| 
						 | 
				
			
			@ -132,6 +142,7 @@ export const normalizeStatus = (status: ImmutableMap<string, any>): IStatus => {
 | 
			
		|||
      normalizeMentions(status);
 | 
			
		||||
      normalizeEmojis(status);
 | 
			
		||||
      normalizeStatusPoll(status);
 | 
			
		||||
      normalizeStatusCard(status);
 | 
			
		||||
      fixMentionsOrder(status);
 | 
			
		||||
      addSelfMention(status);
 | 
			
		||||
      fixQuote(status);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue