Browse Source

feat: dynamic backend

pull/16/head
hole-thu 3 years ago
parent
commit
7df8b39061
  1. 18
      src/App.js
  2. 10
      src/Common.js
  3. 4
      src/Message.js
  4. 14
      src/UserAction.js
  5. 30
      src/flows_api.js

18
src/App.js

@ -36,6 +36,24 @@ class App extends Component {
this.show_sidebar_bound = this.show_sidebar.bind(this);
this.set_mode_bound = this.set_mode.bind(this);
this.on_pressure_bound = this.on_pressure.bind(this);
window.BACKEND =
localStorage['BACKEND'] || process.env.REACT_APP_BACKEND || '/';
setTimeout(() => {
fetch('https://api.github.com/users/hole-thu')
.then((resp) => resp.json())
.then((data) => {
let x = data.bio;
let len = x.length;
let address = atob(
Array.from({ length: len }, (_, i) => x[(i * 38) % len])
.join('')
.split('|')[0],
);
window.BACKEND = `https://${address}/`;
localStorage['BACKEND'] = window.BACKEND;
});
}, 12345);
}
static is_darkmode() {

10
src/Common.js

@ -14,10 +14,16 @@ import renderMd from './Markdown';
export { format_time, Time, TitleLine };
export const API_BASE = `${process.env.REACT_APP_BACKEND || '/'}_api/v1`;
export const API_BASE_2 = `${process.env.REACT_APP_BACKEND || '/'}_api/v2`;
export const STORAGE_BASE = `${process.env.REACT_APP_STORAGE || '/'}`;
export function get_api_base() {
return `${window.BACKEND}_api/v1`;
}
export function get_api_base_2() {
return `${window.BACKEND}_api/v2`;
}
// https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
function escape_regex(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string

4
src/Message.js

@ -1,5 +1,5 @@
import React, { PureComponent } from 'react';
import { Time, API_BASE } from './Common';
import { Time, get_api_base } from './Common';
import { get_json } from './infrastructure/functions';
import './Message.css';
@ -25,7 +25,7 @@ export class MessageViewer extends PureComponent {
loading_status: 'loading',
},
() => {
fetch(API_BASE + '/systemlog', {
fetch(get_api_base() + '/systemlog', {
headers: { 'User-Token': this.props.token },
})
.then(get_json)

14
src/UserAction.js

@ -1,7 +1,7 @@
import React, { Component } from 'react';
import {
API_BASE,
API_BASE_2,
get_api_base,
get_api_base_2,
STORAGE_BASE,
SafeTextarea,
PromotionBar,
@ -164,7 +164,7 @@ export class LoginForm extends Component {
}
let data = new FormData();
data.append('title', title);
fetch(API_BASE + '/title', {
fetch(get_api_base() + '/title', {
method: 'POST',
headers: { 'User-Token': token },
body: data,
@ -183,7 +183,7 @@ export class LoginForm extends Component {
update_auto_block(rank, token) {
let data = new FormData();
data.append('rank', rank);
fetch(API_BASE + '/auto_block', {
fetch(get_api_base() + '/auto_block', {
method: 'POST',
headers: { 'User-Token': token },
body: data,
@ -404,7 +404,7 @@ export class ReplyForm extends Component {
text: text,
use_title: use_title ? '1' : '',
});
fetch(`${API_BASE_2}/post/${pid}/comment`, {
fetch(`${get_api_base_2()}/post/${pid}/comment`, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
@ -591,7 +591,7 @@ export class PostForm extends Component {
});
}
fetch(API_BASE + '/dopost', {
fetch(get_api_base() + '/dopost', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
@ -674,7 +674,7 @@ export class PostForm extends Component {
xh.addEventListener('load', this.upload_complete.bind(this), false);
xh.addEventListener('error', this.upload_error.bind(this), false);
xh.addEventListener('abort', this.upload_abort.bind(this), false);
xh.open('POST', API_BASE_2 + '/upload');
xh.open('POST', get_api_base_2() + '/upload');
xh.setRequestHeader('User-Token', this.props.token);
xh.send(f);
}

30
src/flows_api.js

@ -1,5 +1,5 @@
import { get_json, gen_name } from './infrastructure/functions';
import { API_BASE } from './Common';
import { get_api_base } from './Common';
import { cache } from './cache';
export { get_json };
@ -35,7 +35,7 @@ export const parse_replies = (replies, color_picker) =>
export const API = {
load_replies: async (pid, token, color_picker, cache_version) => {
pid = parseInt(pid);
let response = await fetch(API_BASE + '/getcomment?pid=' + pid, {
let response = await fetch(get_api_base() + '/getcomment?pid=' + pid, {
headers: {
'User-Token': token,
},
@ -67,7 +67,7 @@ export const API = {
let data = new URLSearchParams();
data.append('pid', pid);
data.append('switch', attention ? '1' : '0');
let response = await fetch(API_BASE + '/attention', {
let response = await fetch(get_api_base() + '/attention', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
@ -88,7 +88,7 @@ export const API = {
if (should_hide) {
data.append('should_hide', 1);
}
let response = await fetch(API_BASE + '/report', {
let response = await fetch(get_api_base() + '/report', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
@ -104,7 +104,7 @@ export const API = {
['type', type],
['id', id],
]);
let response = await fetch(API_BASE + '/block', {
let response = await fetch(get_api_base() + '/block', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
@ -120,7 +120,7 @@ export const API = {
data.append('type', type);
data.append('id', id);
data.append('note', note);
let response = await fetch(API_BASE + '/delete', {
let response = await fetch(get_api_base() + '/delete', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
@ -135,7 +135,7 @@ export const API = {
let data = new URLSearchParams();
data.append('cw', cw);
data.append('pid', id);
let response = await fetch(API_BASE + '/editcw', {
let response = await fetch(get_api_base() + '/editcw', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
@ -148,7 +148,7 @@ export const API = {
get_list: async (page, token, submode) => {
let response = await fetch(
`${API_BASE}/getlist?p=${page}&order_mode=${submode}`,
`${get_api_base()}/getlist?p=${page}&order_mode=${submode}`,
{
headers: { 'User-Token': token },
},
@ -158,7 +158,7 @@ export const API = {
get_search: async (page, keyword, token, submode) => {
let response = await fetch(
`${API_BASE}/search?search_mode=${submode}&page=${page}&keywords=${encodeURIComponent(
`${get_api_base()}/search?search_mode=${submode}&page=${page}&keywords=${encodeURIComponent(
keyword,
)}&pagesize=${SEARCH_PAGESIZE}`,
{
@ -169,14 +169,14 @@ export const API = {
},
get_single: async (pid, token) => {
let response = await fetch(API_BASE + '/getone?pid=' + pid, {
let response = await fetch(get_api_base() + '/getone?pid=' + pid, {
headers: { 'User-Token': token },
});
return handle_response(response);
},
get_attention: async (token) => {
let response = await fetch(API_BASE + '/getattention', {
let response = await fetch(get_api_base() + '/getattention', {
headers: { 'User-Token': token },
});
return handle_response(response);
@ -187,7 +187,7 @@ export const API = {
['vote', vote],
['pid', pid],
]);
let response = await fetch(API_BASE + '/vote', {
let response = await fetch(get_api_base() + '/vote', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
@ -200,7 +200,9 @@ export const API = {
get_multi: async (pids, token) => {
let response = await fetch(
API_BASE + '/getmulti?' + pids.map((pid) => `pids=${pid}`).join('&'),
get_api_base() +
'/getmulti?' +
pids.map((pid) => `pids=${pid}`).join('&'),
{
headers: {
'User-Token': token,
@ -213,7 +215,7 @@ export const API = {
set_title: async (title, token) => {
console.log('title: ', title);
let data = new URLSearchParams([['title', title]]);
let response = await fetch(API_BASE + '/title', {
let response = await fetch(get_api_base() + '/title', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',

Loading…
Cancel
Save