in src/amo/reducers/addons.js [199:375]
outgoing: selectLocalizedContent(url.outgoing, lang),
};
}
return null;
};
export function createInternalAddon(
apiAddon: ExternalAddonType | PartialExternalAddonType,
lang: string,
): AddonType {
const addon: AddonType = {
authors: apiAddon.authors,
average_daily_users: apiAddon.average_daily_users,
categories: selectCategoryObject(apiAddon),
contributions_url: apiAddon.contributions_url,
created: apiAddon.created,
default_locale: apiAddon.default_locale,
description: selectLocalizedContent(apiAddon.description, lang),
developer_comments: selectLocalizedContent(
apiAddon.developer_comments,
lang,
),
edit_url: apiAddon.edit_url,
guid: apiAddon.guid,
has_eula: apiAddon.has_eula,
has_privacy_policy: apiAddon.has_privacy_policy,
homepage: selectLocalizedUrlWithOutgoing(apiAddon.homepage, lang),
icon_url: apiAddon.icon_url,
icons: apiAddon.icons,
id: apiAddon.id,
is_disabled: apiAddon.is_disabled,
is_experimental: apiAddon.is_experimental,
is_source_public: apiAddon.is_source_public,
last_updated: apiAddon.last_updated,
latest_unlisted_version: apiAddon.latest_unlisted_version,
locale_disambiguation: apiAddon.locale_disambiguation,
name: selectLocalizedContent(apiAddon.name, lang),
previews: apiAddon.previews
? createInternalPreviews(apiAddon.previews, lang)
: undefined,
promoted: makeInternalPromoted(apiAddon.promoted),
ratings: apiAddon.ratings,
requires_payment: apiAddon.requires_payment,
review_url: apiAddon.review_url,
slug: apiAddon.slug,
status: apiAddon.status,
summary: selectLocalizedContent(apiAddon.summary, lang),
support_email: selectLocalizedContent(apiAddon.support_email, lang),
support_url: selectLocalizedUrlWithOutgoing(apiAddon.support_url, lang),
tags: apiAddon.tags,
target_locale: apiAddon.target_locale,
type: apiAddon.type,
url: apiAddon.url,
weekly_downloads: apiAddon.weekly_downloads,
// These are custom properties not in the API response.
currentVersionId: apiAddon.current_version
? apiAddon.current_version.id
: null,
isMozillaSignedExtension: false,
isAndroidCompatible: false,
};
const currentVersion = apiAddon.current_version;
if (currentVersion) {
addon.isMozillaSignedExtension =
currentVersion.file.is_mozilla_signed_extension;
addon.isAndroidCompatible =
addon.type === ADDON_TYPE_EXTENSION &&
!!currentVersion.compatibility[CLIENT_APP_ANDROID] &&
currentVersion.compatibility[CLIENT_APP_ANDROID].max === '*';
}
return addon;
}
export const getAddonByID = (
addons: AddonsState,
id: AddonID,
): AddonType | null => {
return addons.byID[`${id}`] || null;
};
export const getAddonByIdInURL = (
addons: AddonsState,
id: string,
): AddonType | null => {
const addonId = addons.byIdInURL[id];
return getAddonByID(addons, addonId);
};
export const isAddonLoading = (state: AppState, id: string): boolean => {
if (typeof id !== 'string') {
return false;
}
return Boolean(state.addons.loadingByIdInURL[id]);
};
export const getAllAddons = (state: AppState): Array<AddonType> => {
const addons = state.addons.byID;
// $FlowFixMe: see https://github.com/facebook/flow/issues/2221.
return Object.values(addons);
};
type GetBySlugParams = {|
slug: string,
state: AddonsState,
|};
export const getAddonInfoBySlug = ({
slug,
state,
}: GetBySlugParams): AddonInfoType | null => {
invariant(slug, 'slug is required');
invariant(state, 'state is required');
const infoForSlug = state.infoBySlug[slug];
return (infoForSlug && infoForSlug.info) || null;
};
export const isAddonInfoLoading = ({
slug,
state,
}: GetBySlugParams): boolean => {
invariant(slug, 'slug is required');
invariant(state, 'state is required');
const infoForSlug = state.infoBySlug[slug];
return Boolean(infoForSlug && infoForSlug.loading);
};
export const createInternalAddonInfo = (
addonInfo: ExternalAddonInfoType,
lang: string,
): AddonInfoType => {
return {
eula: selectLocalizedContent(addonInfo.eula, lang),
privacyPolicy: selectLocalizedContent(addonInfo.privacy_policy, lang),
};
};
export function createGroupedRatings(
grouping: $Shape<GroupedRatingsType> = {},
): GroupedRatingsType {
return {
/* eslint-disable quote-props */
'1': 0,
'2': 0,
'3': 0,
'4': 0,
'5': 0,
/* eslint-enable quote-props */
...grouping,
};
}
type Action =
| FetchAddonAction
| FetchAddonInfoAction
| LoadAddonInfoAction
| LoadAddonAction
| UnloadAddonReviewsAction
| UpdateRatingCountsAction;
export default function addonsReducer(
// eslint-disable-next-line default-param-last
state: AddonsState = initialState,
action: Action,
): AddonsState {
switch (action.type) {
case SET_LANG:
return {