/** * Hey! * * SGithubRepoCount component used for Github social network * @link https://github.com/ */ import { defineComponent } from 'vue'; import BaseCount from '@/mixins/BaseCount/BaseCount'; import JSONP from '@/utils/jsonp'; const GITHUB_LINK_TYPES = { watch: 'watch', star: 'star', fork: 'fork', issues: 'issues', }; export type TSGithubLinkType = typeof GITHUB_LINK_TYPES[keyof typeof GITHUB_LINK_TYPES]; /** * Share parameters for link */ export interface ISGithubRepoCountShareOptions { username: string; repository: string; type: TSGithubLinkType; } export interface ISGithubRepoCountSuccessResponse { archive_url: string archived: boolean assignees_url: string blobs_url: string branches_url: string clone_url: string collaborators_url: string comments_url: string commits_url: string compare_url: string contents_url: string contributors_url: string created_at: string default_branch: string deployments_url: string description: string disabled: boolean downloads_url: string events_url: string fork: boolean forks: number forks_count: number forks_url: string full_name: string git_commits_url: string git_refs_url: string git_tags_url: string git_url: string has_downloads: boolean has_issues: boolean has_pages: boolean has_projects: boolean has_wiki: boolean homepage: string hooks_url: string html_url: string id: number issue_comment_url: string issue_events_url: string issues_url: string keys_url: string labels_url: string language: string languages_url: string license: { key: string, name: string, spdx_id: string, url: string, node_id: string } merges_url: string milestones_url: string mirror_url: string | null name: string network_count: number node_id: string notifications_url: string open_issues: number open_issues_count: number owner: { avatar_url: string events_url: string followers_url: string following_url: string gists_url: string gravatar_id: string html_url: string id: number login: string node_id: string organizations_url: string received_events_url: string repos_url: string site_admin: boolean starred_url: string subscriptions_url: string type: string url: string } private: boolean pulls_url: string pushed_at: string releases_url: string size: number ssh_url: string stargazers_count: number stargazers_url: string statuses_url: string subscribers_count: number subscribers_url: string subscription_url: string svn_url: string tags_url: string teams_url: string temp_clone_token: string | null trees_url: string updated_at: string url: string watchers: number watchers_count: number } export interface ISGithubRepoCountErrorResponse { documentation_url: string; message: string; } export interface ISGithubRepoCountResult { meta: { 'Content-Type': string; 'Cache-Control': string; Vary: string; ETag: string; 'Last-Modified': string; 'X-GitHub-Media-Type': string; status: number; 'X-RateLimit-Limit': string; 'X-RateLimit-Remaining': string; 'X-RateLimit-Reset': string; 'X-RateLimit-Used': string; }; data: ISGithubRepoCountSuccessResponse | ISGithubRepoCountErrorResponse; } export default /* #__PURE__ */ defineComponent({ name: 'SGithubRepoCount', mixins: [BaseCount( 'GitHub', )], methods: { handleGithubResponse(data: ISGithubRepoCountResult): void { const { shareOptions } = this; const { type } = shareOptions; this.handleResult(data); let count; switch (type) { case GITHUB_LINK_TYPES.watch: if ('subscribers_count' in data.data) { count = data.data.subscribers_count; } break; case GITHUB_LINK_TYPES.fork: if ('forks_count' in data.data) { count = data.data.forks_count; } break; case GITHUB_LINK_TYPES.issues: if ('open_issues_count' in data.data) { count = data.data.open_issues_count; } break; case GITHUB_LINK_TYPES.star: default: if ('stargazers_count' in data.data) { count = data.data.stargazers_count; } break; } this.handleCount(count); }, }, mounted() { const { shareOptions } = this; const { username, repository } = shareOptions; const BASE_URL = 'https://api.github.com/'; const finalURL = `${BASE_URL}repos/${username}/${repository}`; this.handleLoading(true); JSONP(finalURL, (err, data) => { this.handleLoading(false); if (err) { this.handleError(err); } if (data) { this.handleGithubResponse(data); } }); }, });