From 0f1f129c0140ebb615a14d96b7bc990de19bf897 Mon Sep 17 00:00:00 2001 From: EnixCoda Date: Sun, 29 Mar 2020 00:40:35 +0800 Subject: [PATCH] refactor: resolve platform async --- src/platforms/index.ts | 40 ++++++++++++++++++++++++++++---------- src/utils/configHelper.ts | 5 +++-- src/utils/storageHelper.ts | 8 ++++++-- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/platforms/index.ts b/src/platforms/index.ts index cd54f77..f12dadd 100644 --- a/src/platforms/index.ts +++ b/src/platforms/index.ts @@ -1,29 +1,49 @@ +import * as storageHelper from 'utils/storageHelper' import { dummyPlatformForTypeSafety } from './dummyPlatformForTypeSafety' import { GitHub } from './GitHub' -const hosts: Record<'GitHub' | 'GitLab' | 'Gitee', string[]> = { - GitHub: ['github.com'], - GitLab: ['gitlab.com'], - Gitee: ['gitee.com'], +const platformsMap: Record< + 'GitHub' | 'GitLab' | 'Gitee', + { platform: Platform; hosts: string[] } +> = { + GitHub: { platform: GitHub, hosts: ['github.com'] }, + GitLab: { platform: GitHub, hosts: ['gitlab.com'] }, + Gitee: { platform: GitHub, hosts: ['gitee.com'] }, } -function isGitHub() { - return hosts.GitHub.includes(window.location.host) +const CustomDomainsStorageKey = 'CUSTOM_DOMAINS' +async function loadCustomDomains() { + const c = await storageHelper.get([CustomDomainsStorageKey]) + if (c) { + const { [CustomDomainsStorageKey]: customDomains } = c + if (customDomains) { + Object.keys(customDomains).forEach(domain => { + if (domain in platformsMap) { + platformsMap[domain as keyof typeof platformsMap].hosts.push(...customDomains[domain]) + } + }) + } + } } +loadCustomDomains() async function resolvePlatform(): Promise { - if (isGitHub()) return GitHub + for (const { hosts, platform } of Object.values(platformsMap)) { + if (hosts.some(host => host === window.location.host)) { + return platform + } + } return dummyPlatformForTypeSafety } -let p: Platform = dummyPlatformForTypeSafety +let $platform: Platform = dummyPlatformForTypeSafety export const resolvePlatformP = resolvePlatform() -resolvePlatformP.then(platform => (p = platform)) +resolvePlatformP.then(platform => ($platform = platform)) export const platform: Platform = new Proxy(dummyPlatformForTypeSafety, { get(target, key: keyof Platform) { - return p[key] + return $platform[key] }, }) diff --git a/src/utils/configHelper.ts b/src/utils/configHelper.ts index 61aab6f..95c0b04 100644 --- a/src/utils/configHelper.ts +++ b/src/utils/configHelper.ts @@ -35,7 +35,7 @@ export const defaultConfigs: Config = { const configKeyArray = Object.values(configKeys) -function applyDefaultConfigs(configs: Config) { +function applyDefaultConfigs(configs: Partial) { return configKeyArray.reduce((applied, configKey) => { const key = configKey as keyof Config Object.assign(applied, { [key]: key in configs ? configs[key] : defaultConfigs[key] }) @@ -44,7 +44,8 @@ function applyDefaultConfigs(configs: Config) { } export async function get(): Promise { - return applyDefaultConfigs(await storageHelper.get(configKeyArray)) + const config = await storageHelper.get(configKeyArray) + return applyDefaultConfigs(config || {}) } export async function set(partialConfig: Partial) { diff --git a/src/utils/storageHelper.ts b/src/utils/storageHelper.ts index 558a041..5125506 100644 --- a/src/utils/storageHelper.ts +++ b/src/utils/storageHelper.ts @@ -1,8 +1,12 @@ const localStorage = browser.storage.local -export function get(mapping: string[] | null): Promise | any { +export async function get< + T extends { + [key: string]: any + } +>(mapping: string[] | null): Promise { try { - return localStorage.get(mapping || undefined) + return (await localStorage.get(mapping || undefined)) as T } catch (err) {} }