UNPKG

vue-socials

Version:

Social media share buttons and counts for Vue.js

182 lines (167 loc) 4.26 kB
/** * Hey! * * SRedditCount component used for Reddit social network * @link https://www.reddit.com/ */ import { defineComponent } from 'vue'; import getSerialisedParams from '@/utils/getSerialisedParams'; import BaseCount from '@/mixins/BaseCount/BaseCount'; import JSONP from '@/utils/jsonp'; /** * Share parameters for link */ export interface ISRedditCountShareOptions { url: string; } export interface ISRedditResultChildren { kind: string; data: { all_awardings: unknown[], allow_live_comments: boolean approved_at_utc: unknown approved_by: unknown archived: boolean author: string author_flair_background_color: unknown author_flair_css_class: unknown author_flair_richtext: unknown author_flair_template_id: unknown author_flair_text: unknown author_flair_text_color: unknown author_flair_type: string; author_fullname: string; author_patreon_flair: boolean author_premium: boolean awarders: unknown banned_at_utc: unknown banned_by: unknown can_gild: boolean can_mod_post: boolean category: unknown clicked: boolean content_categories: unknown contest_mode: boolean created: DOMTimeStamp created_utc: DOMTimeStamp discussion_type: unknown distinguished: unknown domain: string downs: number edited: boolean gilded: number gildings: unknown hidden: boolean hide_score: boolean id: string is_crosspostable: boolean is_meta: boolean is_original_content: boolean is_reddit_media_domain: boolean is_robot_indexable: boolean is_self: boolean is_video: boolean likes: unknown link_flair_background_color: string link_flair_css_class: unknown link_flair_richtext: unknown link_flair_text: unknown link_flair_text_color: string link_flair_type: string locked: boolean media: unknown media_embed: unknown media_only: boolean mod_note: unknown mod_reason_by: unknown mod_reason_title: unknown mod_reports: unknown name: string no_follow: boolean num_comments: number num_crossposts: number num_reports: unknown over_18: boolean parent_whitelist_status: unknown permalink: string pinned: boolean post_hint: string preview: unknown pwls: unknown quarantine: boolean removal_reason: unknown removed_by: unknown removed_by_category: unknown report_reasons: unknown saved: boolean score: number secure_media: unknown secure_media_embed: unknown selftext: string selftext_html: unknown send_replies: boolean spoiler: boolean stickied: boolean subreddit: string subreddit_id: string subreddit_name_prefixed: string subreddit_subscribers: number subreddit_type: string suggested_sort: string thumbnail: string thumbnail_height: number thumbnail_width: number title: string top_awarded_type: unknown total_awards_received: number treatment_tags: unknown ups: number upvote_ratio: number url: string url_overridden_by_dest: string user_reports: unknown view_count: unknown visited: boolean whitelist_status: unknown wls: unknown } } export interface ISRedditResult { data: { after: unknown, before: unknown, children: ISRedditResultChildren[] }, kind: string; } export default /* #__PURE__ */ defineComponent({ name: 'SRedditCount', mixins: [BaseCount<ISRedditCountShareOptions, ISRedditResult>( 'Reddit', )], methods: { handleRedditResponse(data: ISRedditResult): void { this.handleResult(data); this.handleCount(data?.data?.children?.[0]?.data.score); }, }, mounted() { const { shareOptions } = this; const { url } = shareOptions; const BASE_URL = 'https://www.reddit.com/api/info.json'; const finalURL = `${BASE_URL}${getSerialisedParams({ limit: 1, url, })}`; this.handleLoading(true); JSONP<ISRedditResult>(finalURL, (err, data) => { this.handleLoading(false); if (err) { this.handleError(err); } if (data) { this.handleRedditResponse(data); } }, 'jsonp'); }, });