move webUI out of Tachidesk
This commit is contained in:
14
src/util/ListItemLink.tsx
Normal file
14
src/util/ListItemLink.tsx
Normal file
@@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import React from 'react';
|
||||
import ListItem, { ListItemProps } from '@material-ui/core/ListItem';
|
||||
|
||||
export default function ListItemLink(props: ListItemProps<'a', { button?: true }>) {
|
||||
// eslint-disable-next-line react/jsx-props-no-spreading
|
||||
return <ListItem button component="a" {...props} />;
|
||||
}
|
||||
29
src/util/client.tsx
Normal file
29
src/util/client.tsx
Normal file
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import axios from 'axios';
|
||||
import storage from './localStorage';
|
||||
|
||||
const { hostname, port, protocol } = window.location;
|
||||
|
||||
// if port is 3000 it's probably running from webpack devlopment server
|
||||
let inferredPort;
|
||||
if (port === '3000') { inferredPort = '4567'; } else { inferredPort = port; }
|
||||
|
||||
const client = axios.create({
|
||||
// baseURL must not have traling slash
|
||||
baseURL: storage.getItem('serverBaseURL', `${protocol}//${hostname}:${inferredPort}`),
|
||||
});
|
||||
|
||||
client.interceptors.request.use((config) => {
|
||||
if (config.data instanceof FormData) {
|
||||
Object.assign(config.headers, { 'Content-Type': 'multipart/form-data' });
|
||||
}
|
||||
return config;
|
||||
});
|
||||
|
||||
export default client;
|
||||
10
src/util/cloneObject.tsx
Normal file
10
src/util/cloneObject.tsx
Normal file
@@ -0,0 +1,10 @@
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
export default function cloneObject<T extends object>(obj: T) {
|
||||
return JSON.parse(JSON.stringify(obj)) as T;
|
||||
}
|
||||
88
src/util/language.tsx
Normal file
88
src/util/language.tsx
Normal file
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
export const ISOLanguages = [
|
||||
{ code: 'all', name: 'All', nativeName: 'All' },
|
||||
{ code: 'installed', name: 'Installed', nativeName: 'Installed' },
|
||||
{ code: 'updates pending', name: 'Updates pending', nativeName: 'Updates pending' },
|
||||
|
||||
// full list: https://github.com/meikidd/iso-639-1/blob/master/src/data.js
|
||||
{ code: 'en', name: 'English', nativeName: 'English' },
|
||||
{ code: 'ca', name: 'Catalan; Valencian', nativeName: 'Català' },
|
||||
{ code: 'de', name: 'German', nativeName: 'Deutsch' },
|
||||
{ code: 'es', name: 'Spanish; Castilian', nativeName: 'Español' },
|
||||
{ code: 'fr', name: 'French', nativeName: 'Français' },
|
||||
{ code: 'id', name: 'Indonesian', nativeName: 'Indonesia' },
|
||||
{ code: 'it', name: 'Italian', nativeName: 'Italiano' },
|
||||
{ code: 'pt', name: 'Portuguese', nativeName: 'Português' },
|
||||
{ code: 'vi', name: 'Vietnamese', nativeName: 'Tiếng Việt' },
|
||||
{ code: 'tr', name: 'Turkish', nativeName: 'Türkçe' },
|
||||
{ code: 'ru', name: 'Russian', nativeName: 'русский' },
|
||||
{ code: 'ar', name: 'Arabic', nativeName: 'العربية' },
|
||||
{ code: 'hi', name: 'Hindi', nativeName: 'हिन्दी' },
|
||||
{ code: 'th', name: 'Thai', nativeName: 'ไทย' },
|
||||
{ code: 'zh', name: 'Chinese', nativeName: '中文' },
|
||||
{ code: 'ja', name: 'Japanese', nativeName: '日本語' },
|
||||
{ code: 'ko', name: 'Korean', nativeName: '한국어' },
|
||||
{ code: 'zu', name: 'Zulu', nativeName: 'isiZulu' },
|
||||
{ code: 'xh', name: 'Xhosa', nativeName: 'isiXhosa' },
|
||||
{ code: 'uk', name: 'Ukrainian', nativeName: 'Українська' },
|
||||
{ code: 'ro', name: 'Romanian', nativeName: 'Română' },
|
||||
{ code: 'bg', name: 'Bulgarian', nativeName: 'български' },
|
||||
{ code: 'cs', name: 'Czech', nativeName: 'čeština' },
|
||||
{ code: 'pl', name: 'Polish', nativeName: 'polski' },
|
||||
{ code: 'no', name: 'Norwegian', nativeName: 'Norsk' },
|
||||
{ code: 'nl', name: 'Dutch', nativeName: 'Nederlands' },
|
||||
{ code: 'my', name: 'Burmese', nativeName: 'ဗမာစာ' },
|
||||
{ code: 'ms', name: 'Malay', nativeName: 'Malaysia' },
|
||||
{ code: 'mn', name: 'Mongolian', nativeName: 'Монгол' },
|
||||
{ code: 'ml', name: 'Malayalam', nativeName: 'മലയാളം' },
|
||||
{ code: 'ku', name: 'Kurdish', nativeName: 'Kurdî' },
|
||||
{ code: 'hu', name: 'Hungarian', nativeName: 'Magyar' },
|
||||
{ code: 'hr', name: 'Croatian', nativeName: 'Hrvatski' },
|
||||
{ code: 'he', name: 'Hebrew', nativeName: 'עברית' },
|
||||
{ code: 'fil', name: 'Filipino', nativeName: 'Filipino' },
|
||||
{ code: 'fi', name: 'Finnish', nativeName: 'suomi' },
|
||||
{ code: 'fa', name: 'Persian', nativeName: 'فارسی' },
|
||||
{ code: 'eu', name: 'Basque', nativeName: 'euskara' },
|
||||
{ code: 'el', name: 'Greek', nativeName: 'Ελληνικά' },
|
||||
{ code: 'da', name: 'Danish', nativeName: 'dansk' },
|
||||
];
|
||||
|
||||
export function langCodeToName(code: string): string {
|
||||
const whereToCut = code.indexOf('-') !== -1 ? code.indexOf('-') : code.length;
|
||||
|
||||
const proccessedCode = code.toLocaleLowerCase().substring(0, whereToCut);
|
||||
let result = 'Error';
|
||||
|
||||
for (let i = 0; i < ISOLanguages.length; i++) {
|
||||
if (ISOLanguages[i].code === proccessedCode) result = ISOLanguages[i].nativeName;
|
||||
}
|
||||
|
||||
if (code.indexOf('-') !== -1) {
|
||||
result = `${result} (${code.substring(whereToCut + 1)})`;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
export function defualtLangs() {
|
||||
return [
|
||||
// todo: infer this from the browser
|
||||
'en',
|
||||
];
|
||||
}
|
||||
|
||||
export const langSortCmp = (a: string, b: string) => {
|
||||
// puts english first for convience
|
||||
const aLang = langCodeToName(a);
|
||||
const bLang = langCodeToName(b);
|
||||
|
||||
if (a === 'en') return -1;
|
||||
if (b === 'en') return 1;
|
||||
return aLang > bLang ? 1 : -1;
|
||||
};
|
||||
31
src/util/localStorage.tsx
Normal file
31
src/util/localStorage.tsx
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
function getItem<T>(key: string, defaultValue: T) : T {
|
||||
try {
|
||||
const item = window.localStorage.getItem(key);
|
||||
|
||||
if (item !== null) {
|
||||
return JSON.parse(item);
|
||||
}
|
||||
|
||||
window.localStorage.setItem(key, JSON.stringify(defaultValue));
|
||||
|
||||
/* eslint-disable no-empty */
|
||||
} finally { }
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
function setItem<T>(key: string, value: T): void {
|
||||
try {
|
||||
window.localStorage.setItem(key, JSON.stringify(value));
|
||||
|
||||
// eslint-disable-next-line no-empty
|
||||
} finally { }
|
||||
}
|
||||
|
||||
export default { getItem, setItem };
|
||||
24
src/util/useLocalStorage.tsx
Normal file
24
src/util/useLocalStorage.tsx
Normal file
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import React, { useState, Dispatch, SetStateAction } from 'react';
|
||||
import storage from './localStorage';
|
||||
|
||||
// eslint-disable-next-line max-len
|
||||
export default function useLocalStorage<T>(key: string, defaultValue: T | (() => T)) : [T, Dispatch<SetStateAction<T>>] {
|
||||
const initialState = defaultValue instanceof Function ? defaultValue() : defaultValue;
|
||||
const [storedValue, setStoredValue] = useState<T>(storage.getItem(key, initialState));
|
||||
|
||||
const setValue = ((value: T | ((prevState: T) => T)) => {
|
||||
// Allow value to be a function so we have same API as useState
|
||||
const valueToStore = value instanceof Function ? value(storedValue) : value;
|
||||
setStoredValue(valueToStore);
|
||||
storage.setItem(key, valueToStore);
|
||||
}) as React.Dispatch<React.SetStateAction<T>>;
|
||||
|
||||
return [storedValue, setValue];
|
||||
}
|
||||
Reference in New Issue
Block a user