add prettier for auto formatting (#231)
* [Prettier] Add "prettier" Makes the formatting of the code consistent. By using the eslint-plugin-prettier formatting issues will be highlighted as a lint error. These errors will be auto fixed by running "lint --fix" (which can be done automatically on file save) * [Prettier] Add "prettier" - Fix formatting
This commit is contained in:
@@ -13,7 +13,11 @@ 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; }
|
||||
if (port === '3000') {
|
||||
inferredPort = '4567';
|
||||
} else {
|
||||
inferredPort = port;
|
||||
}
|
||||
|
||||
const baseURL = storage.getItem('serverBaseURL', `${protocol}//${hostname}:${inferredPort}`);
|
||||
|
||||
@@ -42,10 +46,7 @@ export async function fetcher<T = any>(path: string) {
|
||||
return res.data as T;
|
||||
}
|
||||
|
||||
export const useQuery = <
|
||||
D extends any = any,
|
||||
E extends any = any,
|
||||
>(
|
||||
export const useQuery = <D extends any = any, E extends any = any>(
|
||||
key: string,
|
||||
config?: SWRConfiguration<D, E>,
|
||||
): SWRResponse<D, E> & { loading: boolean } => {
|
||||
|
||||
@@ -47,13 +47,10 @@ export const getUploadDateString = (date: Date | number) => {
|
||||
|
||||
const addTimeString = wasUploadedToday || wasUploadedYesterday;
|
||||
const timeString = addTimeString
|
||||
? uploadDate.toLocaleTimeString(
|
||||
undefined,
|
||||
{
|
||||
hour: '2-digit',
|
||||
minute: '2-digit',
|
||||
},
|
||||
)
|
||||
? uploadDate.toLocaleTimeString(undefined, {
|
||||
hour: '2-digit',
|
||||
minute: '2-digit',
|
||||
})
|
||||
: '';
|
||||
|
||||
if (wasUploadedToday) {
|
||||
|
||||
@@ -74,7 +74,6 @@ export const ISOLanguages = [
|
||||
{ code: 'bs', name: 'Bosnian', nativeName: 'bosanski' },
|
||||
{ code: 'sv', name: 'Swedish', nativeName: 'svenska' },
|
||||
{ code: 'sv', name: 'Swedish', nativeName: 'svenska' },
|
||||
|
||||
];
|
||||
|
||||
export function langCodeToName(code: string): string {
|
||||
@@ -84,8 +83,10 @@ export function langCodeToName(code: string): string {
|
||||
let result = `language with code: ${code}`;
|
||||
|
||||
for (let i = 0; i < ISOLanguages.length; i++) {
|
||||
if (ISOLanguages[i].code === proccessedCode
|
||||
|| ISOLanguages[i].code === code.toLocaleLowerCase()) {
|
||||
if (
|
||||
ISOLanguages[i].code === proccessedCode ||
|
||||
ISOLanguages[i].code === code.toLocaleLowerCase()
|
||||
) {
|
||||
result = ISOLanguages[i].nativeName;
|
||||
}
|
||||
}
|
||||
@@ -98,23 +99,15 @@ function defaultNativeLang() {
|
||||
}
|
||||
|
||||
export function extensionDefaultLangs() {
|
||||
return [
|
||||
defaultNativeLang(),
|
||||
'all',
|
||||
];
|
||||
return [defaultNativeLang(), 'all'];
|
||||
}
|
||||
|
||||
export function sourceDefualtLangs() {
|
||||
return [
|
||||
defaultNativeLang(),
|
||||
'localsourcelang',
|
||||
];
|
||||
return [defaultNativeLang(), 'localsourcelang'];
|
||||
}
|
||||
|
||||
export function sourceForcedDefaultLangs(): string[] {
|
||||
return [
|
||||
'localsourcelang',
|
||||
];
|
||||
return ['localsourcelang'];
|
||||
}
|
||||
|
||||
export const langSortCmp = (a: string, b: string) => {
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* 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 {
|
||||
function getItem<T>(key: string, defaultValue: T): T {
|
||||
try {
|
||||
const item = window.localStorage.getItem(key);
|
||||
|
||||
@@ -16,7 +16,8 @@ function getItem<T>(key: string, defaultValue: T) : T {
|
||||
window.localStorage.setItem(key, JSON.stringify(defaultValue));
|
||||
|
||||
/* eslint-disable no-empty */
|
||||
} finally { }
|
||||
} finally {
|
||||
}
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
@@ -25,7 +26,8 @@ function setItem<T>(key: string, value: T): void {
|
||||
window.localStorage.setItem(key, JSON.stringify(value));
|
||||
|
||||
// eslint-disable-next-line no-empty
|
||||
} finally { }
|
||||
} finally {
|
||||
}
|
||||
}
|
||||
|
||||
export default { getItem, setItem };
|
||||
|
||||
@@ -13,13 +13,12 @@ const APP_METADATA_KEY_PREFIX = 'webUI_';
|
||||
|
||||
const migrations: IMetadataMigration[] = [
|
||||
{
|
||||
keys: [
|
||||
{ oldKey: 'loadNextonEnding', newKey: 'loadNextOnEnding' },
|
||||
],
|
||||
keys: [{ oldKey: 'loadNextonEnding', newKey: 'loadNextOnEnding' }],
|
||||
},
|
||||
];
|
||||
|
||||
const getMetadataKey = (key: string, appPrefix: string = APP_METADATA_KEY_PREFIX) => `${appPrefix}${key}`;
|
||||
const getMetadataKey = (key: string, appPrefix: string = APP_METADATA_KEY_PREFIX) =>
|
||||
`${appPrefix}${key}`;
|
||||
|
||||
const doesMetadataKeyExistIn = (
|
||||
meta: IMetadata | undefined,
|
||||
@@ -27,9 +26,7 @@ const doesMetadataKeyExistIn = (
|
||||
appPrefix?: string,
|
||||
): boolean => Object.prototype.hasOwnProperty.call(meta ?? {}, getMetadataKey(key, appPrefix));
|
||||
|
||||
const convertValueFromMetadata = <
|
||||
T extends AllowedMetadataValueTypes = AllowedMetadataValueTypes,
|
||||
>(
|
||||
const convertValueFromMetadata = <T extends AllowedMetadataValueTypes = AllowedMetadataValueTypes>(
|
||||
value: string,
|
||||
): T => {
|
||||
if (!Number.isNaN(+value)) {
|
||||
@@ -74,8 +71,9 @@ const applyAppKeyPrefixMigration = (meta: IMetadata, migration: IMetadataMigrati
|
||||
const oldAppMetadata = getAppMetadataFrom(meta, oldPrefix);
|
||||
const newAppMetadata = getAppMetadataFrom(meta, newPrefix);
|
||||
|
||||
const missingMetadataKeys = Object.keys(oldAppMetadata)
|
||||
.filter((key) => !Object.keys(newAppMetadata).includes(key));
|
||||
const missingMetadataKeys = Object.keys(oldAppMetadata).filter(
|
||||
(key) => !Object.keys(newAppMetadata).includes(key),
|
||||
);
|
||||
|
||||
const isMissingOldMetadata = missingMetadataKeys.length;
|
||||
if (isMissingOldMetadata) {
|
||||
@@ -219,16 +217,25 @@ export const requestUpdateMetadata = async (
|
||||
keysToValues: [AppMetadataKeys, AllowedMetadataValueTypes][],
|
||||
endpointToMutate?: string,
|
||||
wrapWithMetaKey?: boolean,
|
||||
): Promise<void[]> => Promise.all(keysToValues.map(
|
||||
([key, value]) => requestUpdateMetadataValue(
|
||||
endpoint, metadataHolder, key, value, endpointToMutate, wrapWithMetaKey,
|
||||
),
|
||||
));
|
||||
): Promise<void[]> =>
|
||||
Promise.all(
|
||||
keysToValues.map(([key, value]) =>
|
||||
requestUpdateMetadataValue(
|
||||
endpoint,
|
||||
metadataHolder,
|
||||
key,
|
||||
value,
|
||||
endpointToMutate,
|
||||
wrapWithMetaKey,
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
export const requestUpdateServerMetadata = async (
|
||||
serverMetadata: IMetadata,
|
||||
keysToValues: MetadataKeyValuePair[],
|
||||
): Promise<void[]> => requestUpdateMetadata('', { meta: serverMetadata }, keysToValues, '/meta', false);
|
||||
): Promise<void[]> =>
|
||||
requestUpdateMetadata('', { meta: serverMetadata }, keysToValues, '/meta', false);
|
||||
|
||||
export const requestUpdateMangaMetadata = async (
|
||||
manga: IMangaCard | IManga,
|
||||
@@ -238,7 +245,12 @@ export const requestUpdateMangaMetadata = async (
|
||||
export const requestUpdateChapterMetadata = async (
|
||||
mangaChapter: IMangaChapter,
|
||||
keysToValues: MetadataKeyValuePair[],
|
||||
): Promise<void[]> => requestUpdateMetadata(`/manga/${mangaChapter.manga.id}/chapter/${mangaChapter.chapter.index}`, mangaChapter.chapter, keysToValues);
|
||||
): Promise<void[]> =>
|
||||
requestUpdateMetadata(
|
||||
`/manga/${mangaChapter.manga.id}/chapter/${mangaChapter.chapter.index}`,
|
||||
mangaChapter.chapter,
|
||||
keysToValues,
|
||||
);
|
||||
|
||||
export const requestUpdateCategoryMetadata = async (
|
||||
category: ICategory,
|
||||
|
||||
@@ -6,27 +6,32 @@
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
import { getMetadataFrom, requestUpdateMangaMetadata, requestUpdateServerMetadata } from 'util/metadata';
|
||||
import {
|
||||
getMetadataFrom,
|
||||
requestUpdateMangaMetadata,
|
||||
requestUpdateServerMetadata,
|
||||
} from 'util/metadata';
|
||||
import { useQuery } from 'util/client';
|
||||
|
||||
export const getDefaultSettings = (forceUndefined: boolean = false) => ({
|
||||
staticNav: forceUndefined ? undefined : false,
|
||||
showPageNumber: forceUndefined ? undefined : true,
|
||||
continuesPageGap: forceUndefined ? undefined : false,
|
||||
loadNextOnEnding: forceUndefined ? undefined : false,
|
||||
readerType: forceUndefined ? undefined : 'ContinuesVertical',
|
||||
} as IReaderSettings);
|
||||
export const getDefaultSettings = (forceUndefined: boolean = false) =>
|
||||
({
|
||||
staticNav: forceUndefined ? undefined : false,
|
||||
showPageNumber: forceUndefined ? undefined : true,
|
||||
continuesPageGap: forceUndefined ? undefined : false,
|
||||
loadNextOnEnding: forceUndefined ? undefined : false,
|
||||
readerType: forceUndefined ? undefined : 'ContinuesVertical',
|
||||
} as IReaderSettings);
|
||||
|
||||
const getReaderSettingsWithDefaultValueFallback = (
|
||||
meta?: IMetadata,
|
||||
defaultSettings?: IReaderSettings,
|
||||
applyMetadataMigration: boolean = true,
|
||||
): IReaderSettings => ({
|
||||
...getMetadataFrom(
|
||||
...(getMetadataFrom(
|
||||
{ meta },
|
||||
Object.entries(defaultSettings ?? getDefaultSettings()) as MetadataKeyValuePair[],
|
||||
applyMetadataMigration,
|
||||
) as unknown as IReaderSettings,
|
||||
) as unknown as IReaderSettings),
|
||||
});
|
||||
|
||||
export const getReaderSettingsFromMetadata = (
|
||||
@@ -44,9 +49,9 @@ export const getReaderSettingsFor = (
|
||||
): IReaderSettings => getReaderSettingsFromMetadata(meta, defaultSettings, applyMetadataMigration);
|
||||
|
||||
export const useDefaultReaderSettings = (): {
|
||||
metadata?: IMetadata,
|
||||
settings: IReaderSettings,
|
||||
loading: boolean
|
||||
metadata?: IMetadata;
|
||||
settings: IReaderSettings;
|
||||
loading: boolean;
|
||||
} => {
|
||||
const { data: meta, loading } = useQuery<IMetadata>('/api/v1/meta');
|
||||
const settings = getReaderSettingsWithDefaultValueFallback(meta);
|
||||
@@ -66,12 +71,13 @@ export const checkAndHandleMissingStoredReaderSettings = async (
|
||||
metadataHolderType: 'manga' | 'server',
|
||||
defaultSettings: IReaderSettings,
|
||||
): Promise<void | void[]> => {
|
||||
const meta = metadataHolder.meta ?? metadataHolder as IMetadata;
|
||||
const meta = metadataHolder.meta ?? (metadataHolder as IMetadata);
|
||||
const settingsToCheck = getReaderSettingsFor({ meta }, getDefaultSettings(true), false);
|
||||
const newSettings = getReaderSettingsFor({ meta }, defaultSettings);
|
||||
|
||||
const undefinedSettings = Object.entries(settingsToCheck)
|
||||
.filter((setting) => setting[1] === undefined);
|
||||
const undefinedSettings = Object.entries(settingsToCheck).filter(
|
||||
(setting) => setting[1] === undefined,
|
||||
);
|
||||
|
||||
const settingsToUpdate: MetadataKeyValuePair[] = [];
|
||||
undefinedSettings.forEach((setting) => {
|
||||
|
||||
@@ -10,7 +10,7 @@ import { useLocation } from 'react-router-dom';
|
||||
|
||||
export const BACK = '__BACK__';
|
||||
|
||||
const useBackTo = (): { url?: string, back: boolean } => {
|
||||
const useBackTo = (): { url?: string; back: boolean } => {
|
||||
const location = useLocation<{ backLink?: string }>();
|
||||
const { defaultBackTo } = useNavBarContext();
|
||||
|
||||
|
||||
@@ -5,14 +5,7 @@
|
||||
* 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,
|
||||
useReducer,
|
||||
Reducer,
|
||||
useCallback,
|
||||
} from 'react';
|
||||
import React, { useState, Dispatch, SetStateAction, useReducer, Reducer, useCallback } from 'react';
|
||||
import storage from 'util/localStorage';
|
||||
|
||||
// eslint-disable-next-line max-len
|
||||
@@ -21,19 +14,18 @@ export default function useLocalStorage<T>(
|
||||
defaultValue: T | (() => T),
|
||||
): [T, Dispatch<SetStateAction<T>>] {
|
||||
const initialState = defaultValue instanceof Function ? defaultValue() : defaultValue;
|
||||
const [storedValue, setStoredValue] = useState<T>(
|
||||
storage.getItem(key, initialState),
|
||||
);
|
||||
const [storedValue, setStoredValue] = useState<T>(storage.getItem(key, initialState));
|
||||
|
||||
const setValue = useCallback<React.Dispatch<React.SetStateAction<T>>>(
|
||||
((value) => {
|
||||
(value) => {
|
||||
setStoredValue((prevValue) => {
|
||||
// Allow value to be a function so we have same API as useState
|
||||
const valueToStore = value instanceof Function ? value(prevValue) : value;
|
||||
storage.setItem(key, valueToStore);
|
||||
return valueToStore;
|
||||
});
|
||||
}), [key],
|
||||
},
|
||||
[key],
|
||||
);
|
||||
|
||||
return [storedValue, setValue];
|
||||
|
||||
Reference in New Issue
Block a user