UNPKG

@stackend/api

Version:

JS bindings to api.stackend.com

293 lines (268 loc) 6.74 kB
// @flow import { getJson as apiGetJson, post as apiPost, createCommunityUrl, XcapJsonResult, Thunk, XcapOptionalParameters } from '../api'; import * as searchApi from '../search'; import { Request } from '../request'; import { SearchAbleType } from '../search'; /** * Xcap QNA API constants and methods. * * @since 2 mar 2017 */ /** * Community context used for QNA */ export const CONTEXT = 'question'; /** * Permalink of the question forum */ export const QUESTION_FORUM_PERMALINK = 'question'; export type ContentType = 'askQuestion' | 'tags' | 'searchSearchInput'; //which redux filter group should this effect? export enum QnaSearchType { All = 'All', Trending = 'Trending', Solved = 'Solved', Answered = 'Answered', Recent = 'Recent', Posted = 'Posted', Search = 'search' // FIXME: Hack } export const COMPONENT_NAME = 'forum'; function getJson(args: any): Thunk<Promise<XcapJsonResult>> { return (dispatch: any): Promise<XcapJsonResult> => { return dispatch( apiGetJson({ ...args, componentName: COMPONENT_NAME, context: CONTEXT }) ); }; } function post(args: any): Thunk<Promise<XcapJsonResult>> { return (dispatch: any): Promise<XcapJsonResult> => { return dispatch( apiPost({ ...args, componentName: COMPONENT_NAME, context: CONTEXT }) ); }; } export function QnaTypeConverter(type: QnaSearchType): string { return type ? type.toLowerCase() : 'search'; } export function getQnaSearchSortOrders(): Array<string> { return ['search', 'trending', 'solved', 'answered', 'recent']; } /** * returns the url to view the Qnas. */ export function getQnaUrl({ request, section = '', article = '' }: { request: Request; section?: string; article?: string; }): string { if (!!section && !article) { return searchApi.getSearchUrl({ request, type: SearchAbleType.QUESTION, searchType: QnaSearchType.Search, filter: section }); } return createCommunityUrl({ request, path: '/support' + (article ? '/question/' + article : '') }); } /** * returns the url to Ask a question in the Qnas. */ export function getQnaAskUrl({ request }: { request: Request }): string { // FIXME: Why absolute? return createCommunityUrl({ request, path: '/support/ask-a-question', absolute: true }); } /** * returns the url to view the Qnas. */ export function getQnaQuestionUrl({ request, permalink, absolute }: { request: Request; permalink: string; absolute?: boolean; }): string { // FIXME: Why absolute by default? return createCommunityUrl({ request, absolute: absolute ? absolute : true, path: '/support/question/' + permalink }); } /** * List trending questions * * @param p Page number (optional) * @param pageSize Page size (optional) * @returns {Promise} */ export function listTrendingQuestions({ p, pageSize }: { p: number; pageSize: number } & XcapOptionalParameters): Thunk<Promise<XcapJsonResult>> { return getJson({ url: '/question/trending', parameters: arguments }); } /** * List solved questions * * @param p Page number (optional) * @param pageSize Page size (optional) * @returns {Promise} */ export function listSolvedQuestions({ p, pageSize }: { p: number; pageSize: number } & XcapOptionalParameters): Thunk<Promise<XcapJsonResult>> { return getJson({ url: '/question/solved', parameters: arguments }); } /** * List answered questions * * @param p Page number (optional) * @param pageSize Page size (optional) */ export function listAnsweredQuestions({ p, pageSize }: { p: number; pageSize: number } & XcapOptionalParameters): Thunk<Promise<XcapJsonResult>> { return getJson({ url: '/question/answered', parameters: arguments }); } /** * List posted questions * * @param p Page number (optional) * @param pageSize Page size (optional) */ export function listPostedQuestions({ p, pageSize }: { p: number; pageSize: number } & XcapOptionalParameters): Thunk<Promise<XcapJsonResult>> { return getJson({ url: '/question/posted', parameters: arguments }); } /** * Get a question */ export function getQuestion({ id, forumThreadPermalink }: { id?: number; forumThreadPermalink?: string; } & XcapOptionalParameters): Thunk<Promise<XcapJsonResult>> { return getJson({ url: '/question/view', parameters: arguments }); } /** * Ask a question */ export function askQuestion({ subject, text, categoryId = [], recaptchaSolved, recpatchaAnswer, gamePermalink, entryId, forumThreadPermalink, forumPermalink = 'question' }: { subject: string; text: string; categoryId?: Array<number>; //Category Ids recaptchaSolved?: boolean; //is it solved?. recpatchaAnswer?: string; //The answer. gamePermalink?: string; //Game permalink entryId?: string; //Allows moderators to edit an existing question. forumThreadPermalink?: any; // Allows moderators to edit an existing question. forumPermalink?: string; // which forum should this post to? } & XcapOptionalParameters): Thunk<Promise<XcapJsonResult>> { return post({ url: '/question/ask-save', parameters: arguments }); } /** * Submit an answer */ export function submitAnswer({ subject, text, categoryId = [], gamePermalink, entryId, forumThreadPermalink = null, forumPermalink = 'question' }: { text: string; subject?: string; categoryId?: Array<number>; gamePermalink?: string; entryId?: number; //Allows moderators to edit an existing question. forumThreadPermalink?: any; //Allows moderators to edit an existing question. forumPermalink?: string; } & XcapOptionalParameters): Thunk<Promise<XcapJsonResult>> { return post({ url: '/question/answer-save', parameters: arguments }); } /** * Solve question * * @param answerId {int} Id. */ export function solveQuestion({ answerId }: { answerId: number } & XcapOptionalParameters): Thunk<Promise<XcapJsonResult>> { return post({ url: '/question/solve', parameters: arguments }); } /** * Get question categories * @returns {Thunk.<*>} */ export function getCategories({}: XcapOptionalParameters): Thunk<Promise<XcapJsonResult>> { return getJson({ url: '/question/list-categories' }); } /** * Search */ export function search({ searchType, q, issue, p, pageSize, game }: { searchType: QnaSearchType; q: string; //Search term p?: number; //Page number pageSize?: number; issue?: string; platform?: number; game?: string; // qna-gamePermalink device?: string; // "ios" || "android" } & XcapOptionalParameters): Thunk<Promise<XcapJsonResult>> { return getJson({ url: '/question/' + searchType, parameters: arguments }); }