ui/src/services/common.ts (273 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import qs from 'qs';
import useSWR from 'swr';
import request from '@/utils/request';
import type * as Type from '@/common/interface';
export const uploadImage = (params: { file: File; type: Type.UploadType }) => {
const form = new FormData();
form.append('source', String(params.type));
form.append('file', params.file);
return request.post('/answer/api/v1/file', form);
};
export const queryQuestionByTitle = (title: string) => {
return request.get(`/answer/api/v1/question/similar?title=${title}`);
};
export const useQueryTags = (params) => {
const apiUrl = `/answer/api/v1/tags/page?${qs.stringify(params, {
skipNulls: true,
})}`;
const { data, error, mutate } = useSWR<Type.ListResult>(apiUrl, (url) =>
request.get(url, { allow404: true }),
);
return {
data,
isLoading: !data && !error,
error,
mutate,
};
};
export const useQueryRevisions = (object_id: string | undefined) => {
return useSWR<Record<string, any>>(
object_id ? `/answer/api/v1/revisions?object_id=${object_id}` : '',
request.instance.get,
);
};
export const useQueryComments = (params) => {
if (params.page === 0) {
params.query_cond = 'vote';
params.page = 1;
} else {
// only first page need commentId
params.query_cond = '';
delete params.comment_id;
}
return useSWR<Type.ListResult>(
`/answer/api/v1/comment/page?${qs.stringify(params, {
skipNulls: true,
})}`,
request.instance.get,
);
};
export const updateComment = (params) => {
return request.put('/answer/api/v1/comment', params);
};
export const deleteComment = (id, imgCode: Type.ImgCodeReq = {}) => {
return request.delete('/answer/api/v1/comment', {
comment_id: id,
...imgCode,
});
};
export const addComment = (params) => {
return request.post('/answer/api/v1/comment', params);
};
export const updateReaction = (params) => {
return request.put('/answer/api/v1/meta/reaction', params);
};
export const queryReactions = (object_id: string) => {
return request.get<Type.ReactionItems>(
`/answer/api/v1/meta/reaction?object_id=${object_id}`,
);
};
export const queryTags = (tag: string) => {
return request.get(
`/answer/api/v1/question/tags?tag=${encodeURIComponent(tag)}`,
);
};
export const useQueryAnswerInfo = (id: string) => {
return useSWR<{
info;
question;
}>(`/answer/api/v1/answer/info?id=${id}`, request.instance.get);
};
export const modifyQuestion = (
params: Type.QuestionParams & { id: string; edit_summary: string },
) => {
return request.put(`/answer/api/v1/question`, params);
};
export const modifyAnswer = (params: Type.AnswerParams) => {
return request.put(`/answer/api/v1/answer`, params);
};
export const login = (params: Type.LoginReqParams) => {
return request.post<Type.UserInfoRes>(
'/answer/api/v1/user/login/email',
params,
);
};
export const register = (params: Type.RegisterReqParams) => {
return request.post<any>('/answer/api/v1/user/register/email', params);
};
export const logout = () => {
return request.get('/answer/api/v1/user/logout');
};
export const resendEmail = (params?: Type.ImgCodeReq) => {
params = qs.parse(
qs.stringify(params, {
skipNulls: true,
}),
);
return request.post('/answer/api/v1/user/email/verification/send', {
...params,
});
};
/**
* @description get login userinfo
* @returns {UserInfo}
*/
export const getLoggedUserInfo = (config = { passingError: false }) => {
return request.get<Type.UserInfoRes>('/answer/api/v1/user/info', config);
};
export const modifyUserInfo = (params: Type.ModifyUserReq) => {
return request.put('/answer/api/v1/user/info', params);
};
export const modifyPassword = (params: Type.ModifyPasswordReq) => {
return request.put('/answer/api/v1/user/password', params);
};
export const resetPassword = (params: Type.PasswordResetReq) => {
return request.post('/answer/api/v1/user/password/reset', params);
};
export const replacementPassword = (params: Type.PasswordReplaceReq) => {
return request.post('/answer/api/v1/user/password/replacement', params);
};
export const activateAccount = (code: string) => {
return request.post(`/answer/api/v1/user/email/verification`, { code });
};
export const checkImgCode = (k: Type.CaptchaKey) => {
const apiUrl = `/answer/api/v1/user/action/record`;
return request.get<Type.ImgCodeRes>(apiUrl, {
params: {
action: k,
},
});
};
export const setNotice = (params: Type.SetNoticeReq) => {
return request.post('/answer/api/v1/user/notice/set', params);
};
export const saveQuestion = (params: Type.QuestionParams) => {
return request.post('/answer/api/v1/question', params);
};
export const questionDetail = (id: string) => {
return request.get<Type.QuestionDetailRes>(
`/answer/api/v1/question/info?id=${id}`,
{ allow404: true },
);
};
export const useQuestionLink = (params: {
question_id: string;
page: number;
page_size: number;
order?: string;
}) => {
const apiUrl = `/answer/api/v1/question/link?${qs.stringify(params)}`;
const { data, error } = useSWR<Type.ListResult, Error>(
[apiUrl, params],
request.instance.get,
);
return {
data,
isLoading: !data && !error,
error,
};
};
export const getAnswers = (params: Type.AnswersReq) => {
const apiUrl = `/answer/api/v1/answer/page?${qs.stringify(params)}`;
return request.get<Type.ListResult<Type.AnswerItem>>(apiUrl);
};
export const postAnswer = (params: Type.PostAnswerReq) => {
return request.post('/answer/api/v1/answer', params);
};
export const bookmark = (params: {
group_id: string;
object_id: string;
bookmark: boolean;
}) => {
return request.post('/answer/api/v1/collection/switch', params);
};
export const postVote = (
params: { object_id: string; is_cancel: boolean } & Type.ImgCodeReq,
type: 'down' | 'up',
) => {
return request.post(`/answer/api/v1/vote/${type}`, params);
};
export const following = (params: {
object_id: string;
is_cancel: boolean;
}) => {
return request.post<{ follows: number; is_followed: boolean }>(
'/answer/api/v1/follow',
params,
);
};
export const acceptanceAnswer = (params: {
answer_id?: string;
question_id: string;
}) => {
return request.post('/answer/api/v1/answer/acceptance', params);
};
export const reportList = ({
type,
action,
isBackend = false,
}: Type.ReportParams & { isBackend }) => {
let api = '/answer/api/v1/reasons';
if (isBackend) {
api = '/answer/admin/api/reasons';
}
return request.get(`${api}?object_type=${type}&action=${action}`);
};
export const postReport = (
params: {
source: Type.ReportType;
content: string;
object_id: string;
report_type: number;
} & Type.ImgCodeReq,
) => {
return request.post('/answer/api/v1/report', params);
};
export const deleteQuestion = (params: {
id: string;
captcha_code?: string;
captcha_id?: string;
}) => {
return request.delete('/answer/api/v1/question', params);
};
export const deleteAnswer = (params: {
id: string;
captcha_code?: string;
captcha_id?: string;
}) => {
return request.delete('/answer/api/v1/answer', params);
};
export const closeQuestion = (params: {
id: string;
close_msg?: string;
close_type: number;
}) => {
return request.put('/answer/api/v1/question/status', params);
};
export const changeEmail = (params: { e_mail: string; pass?: string }) => {
return request.post('/answer/api/v1/user/email/change/code', params);
};
export const changeEmailVerify = (params: { code: string }) => {
return request.put('/answer/api/v1/user/email', params);
};
export const getAppSettings = () => {
return request.get<Type.SiteSettings>('/answer/api/v1/siteinfo');
};
export const reopenQuestion = (params: { question_id: string }) => {
return request.put('/answer/api/v1/question/reopen', params);
};
export const unsubscribe = (code: string) => {
const apiUrl = '/answer/api/v1/user/notification/unsubscribe';
return request.put(apiUrl, { code });
};
export const markdownToHtml = (content: string) => {
const apiUrl = '/answer/api/v1/post/render';
return request.post(apiUrl, { content });
};
export const saveQuestionWithAnswer = (params: Type.QuestionWithAnswer) => {
return request.post('/answer/api/v1/question/answer', params);
};
export const questionOperation = (params: Type.QuestionOperationReq) => {
return request.put('/answer/api/v1/question/operation', params);
};
export const getPluginsStatus = () => {
return request.get<Type.ActivatedPlugin[]>('/answer/api/v1/plugin/status');
};
export const deletePermanently = (type: string) => {
return request.delete('/answer/admin/api/delete/permanently', { type });
};