Upgrade to vite build
1
.gitignore
vendored
@ -17,3 +17,4 @@ sw.js
|
|||||||
.idea/
|
.idea/
|
||||||
appsettings.*.json
|
appsettings.*.json
|
||||||
VoidCat.xml
|
VoidCat.xml
|
||||||
|
build/
|
@ -3,13 +3,13 @@
|
|||||||
"LogLevel": {
|
"LogLevel": {
|
||||||
"Default": "Information",
|
"Default": "Information",
|
||||||
"Microsoft.AspNetCore": "Warning",
|
"Microsoft.AspNetCore": "Warning",
|
||||||
"Microsoft.EntityFrameworkCore": "Warning"
|
"Microsoft.EntityFrameworkCore": "Warning",
|
||||||
|
"Microsoft.AspNetCore.Cors.Infrastructure.CorsService": "Information"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"AllowedHosts": "*",
|
"AllowedHosts": "*",
|
||||||
"Settings": {
|
"Settings": {
|
||||||
"SiteUrl": "http://localhost:7195",
|
"SiteUrl": "http://localhost:7195",
|
||||||
"DataDirectory": "./data",
|
"DataDirectory": "./data"
|
||||||
"CorsOrigins": []
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
874
VoidCat/spa/.yarn/releases/yarn-3.6.4.cjs
vendored
893
VoidCat/spa/.yarn/releases/yarn-4.0.2.cjs
vendored
Executable file
@ -1 +1,5 @@
|
|||||||
yarnPath: .yarn/releases/yarn-3.6.4.cjs
|
compressionLevel: mixed
|
||||||
|
|
||||||
|
enableGlobalCache: false
|
||||||
|
|
||||||
|
yarnPath: .yarn/releases/yarn-4.0.2.cjs
|
||||||
|
@ -7,10 +7,10 @@
|
|||||||
"build": "yarn workspace @void-cat/api build && yarn workspace @void-cat/app build",
|
"build": "yarn workspace @void-cat/api build && yarn workspace @void-cat/app build",
|
||||||
"start": "yarn workspace @void-cat/api build && yarn workspace @void-cat/app start"
|
"start": "yarn workspace @void-cat/api build && yarn workspace @void-cat/app start"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@3.6.4",
|
"packageManager": "yarn@4.0.2",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"eslint": "^8.51.0",
|
"eslint": "^8.51.0",
|
||||||
"prettier": "^3.0.3",
|
"prettier": "^3.0.3",
|
||||||
"typescript": "^5.2.2"
|
"typescript": "^5.3.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
{
|
{
|
||||||
"name": "@void-cat/api",
|
"name": "@void-cat/api",
|
||||||
"version": "1.0.10",
|
"version": "1.0.11",
|
||||||
"description": "void.cat API package",
|
"description": "void.cat API package",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"types": "dist/index.d.ts",
|
"types": "dist/index.d.ts",
|
||||||
|
"module": "src/index.ts",
|
||||||
"repository": "https://git.v0l.io/Kieran/void.cat",
|
"repository": "https://git.v0l.io/Kieran/void.cat",
|
||||||
"author": "Kieran",
|
"author": "Kieran",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@ -12,7 +13,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/sjcl": "^1.0.30",
|
"@types/sjcl": "^1.0.30",
|
||||||
"typescript": "^5.0.4"
|
"typescript": "^5.3.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"sjcl": "^1.0.8"
|
"sjcl": "^1.0.8"
|
||||||
|
@ -145,32 +145,32 @@ export interface ApiKey {
|
|||||||
token: string;
|
token: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum PaymentCurrencies {
|
export const enum PaymentCurrencies {
|
||||||
BTC = 0,
|
BTC = 0,
|
||||||
USD = 1,
|
USD = 1,
|
||||||
EUR = 2,
|
EUR = 2,
|
||||||
GBP = 3,
|
GBP = 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum PaymentServices {
|
export const enum PaymentServices {
|
||||||
None = 0,
|
None = 0,
|
||||||
Strike = 1,
|
Strike = 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum PaymentOrderState {
|
export const enum PaymentOrderState {
|
||||||
Unpaid = 0,
|
Unpaid = 0,
|
||||||
Paid = 1,
|
Paid = 1,
|
||||||
Expired = 2,
|
Expired = 2,
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum PagedSortBy {
|
export const enum PagedSortBy {
|
||||||
Name = 0,
|
Name = 0,
|
||||||
Date = 1,
|
Date = 1,
|
||||||
Size = 2,
|
Size = 2,
|
||||||
Id = 3,
|
Id = 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum PageSortOrder {
|
export const enum PageSortOrder {
|
||||||
Asc = 0,
|
Asc = 0,
|
||||||
Dsc = 1,
|
Dsc = 1,
|
||||||
}
|
}
|
||||||
|
@ -1,2 +1 @@
|
|||||||
BROWSER=none
|
VITE_API_HOST=http://localhost:7195
|
||||||
API_HOST=http://localhost:7195
|
|
Before Width: | Height: | Size: 3.2 KiB |
@ -5,9 +5,24 @@
|
|||||||
"description": "Void.cat file hosting",
|
"description": "Void.cat file hosting",
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "voidcat_512.png",
|
"src": "logo_512.jpg",
|
||||||
"type": "image/png",
|
"type": "image/jpg",
|
||||||
"sizes": "512x512"
|
"sizes": "512x512"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "logo_256.jpg",
|
||||||
|
"type": "image/jpg",
|
||||||
|
"sizes": "256x256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "logo_128.jpg",
|
||||||
|
"type": "image/jpg",
|
||||||
|
"sizes": "128x128"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "logo_32.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "32x32"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"start_url": ".",
|
"start_url": ".",
|
||||||
|
Before Width: | Height: | Size: 401 KiB |
@ -1,11 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
webpack: {
|
|
||||||
configure: {
|
|
||||||
resolve: {
|
|
||||||
fallback: {
|
|
||||||
crypto: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
0
VoidCat/spa/src/app/custom.d.ts
vendored
Normal file
@ -1,4 +0,0 @@
|
|||||||
declare module "*.png" {
|
|
||||||
const value: string;
|
|
||||||
export default value;
|
|
||||||
}
|
|
18
VoidCat/spa/src/app/index.html
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<link rel="icon" href="/logo_32.png"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||||
|
<meta name="theme-color" content="#000000"/>
|
||||||
|
<meta name="description" content="void.cat - free, simple file sharing."/>
|
||||||
|
<link rel="apple-touch-icon" href="/logo_256.png"/>
|
||||||
|
<link rel="manifest" href="/manifest.json"/>
|
||||||
|
<title>void.cat</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||||
|
<div id="root"></div>
|
||||||
|
<script src="./src/index.tsx" type="module"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -6,44 +6,38 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@hcaptcha/react-hcaptcha": "^1.1.1",
|
"@hcaptcha/react-hcaptcha": "^1.1.1",
|
||||||
"@reduxjs/toolkit": "^1.7.2",
|
"@reduxjs/toolkit": "^1.7.2",
|
||||||
"@void-cat/api": "workspace:^",
|
"@void-cat/api": "^1.0.10",
|
||||||
"moment": "^2.29.4",
|
"moment": "^2.29.4",
|
||||||
"prop-types": "^15.8.1",
|
"prop-types": "^15.8.1",
|
||||||
"qrcode.react": "^1.0.1",
|
"qrcode.react": "^3.1.0",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"react-helmet": "^6.1.0",
|
"react-helmet": "^6.1.0",
|
||||||
"react-redux": "^7.2.6",
|
"react-redux": "^7.2.6",
|
||||||
"react-router-dom": "^6.2.1",
|
"react-router-dom": "^6.2.1",
|
||||||
"react-scripts": "5.0.0",
|
|
||||||
"recharts": "^2.1.10",
|
"recharts": "^2.1.10",
|
||||||
"sjcl": "^1.0.8"
|
"sjcl": "^1.0.8"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/plugin-syntax-flow": "^7.22.5",
|
|
||||||
"@craco/craco": "^6.4.5",
|
|
||||||
"@types/node": "^20.5.3",
|
"@types/node": "^20.5.3",
|
||||||
"@types/preval.macro": "^3.0.0",
|
|
||||||
"@types/qrcode.react": "^1.0.2",
|
"@types/qrcode.react": "^1.0.2",
|
||||||
"@types/react": "^18.2.0",
|
"@types/react": "^18.2.0",
|
||||||
"@types/react-dom": "^18.2.1",
|
"@types/react-dom": "^18.2.1",
|
||||||
"@types/react-helmet": "^6.1.6",
|
"@types/react-helmet": "^6.1.6",
|
||||||
"@types/react-redux": "^7.1.26",
|
"@types/react-redux": "^7.1.26",
|
||||||
"@types/sjcl": "^1.0.30",
|
"@types/sjcl": "^1.0.30",
|
||||||
"chalk": "^5.3.0",
|
"@vitejs/plugin-react": "^4.2.1",
|
||||||
"cra-bundle-analyzer": "^0.1.1",
|
|
||||||
"eslint": "^8.47.0",
|
"eslint": "^8.47.0",
|
||||||
"eslint-config-react-app": "^7.0.1",
|
"eslint-config-react-app": "^7.0.1",
|
||||||
"http-proxy-middleware": "^2.0.6",
|
"rollup-plugin-visualizer": "^5.11.0",
|
||||||
"preval.macro": "^5.0.0",
|
"typescript": "^5.3.3",
|
||||||
"typescript": "^5.1.6",
|
"vite": "^5.0.10",
|
||||||
"webpack": "^5.88.2"
|
"vite-plugin-pwa": "^0.17.4",
|
||||||
|
"vite-plugin-version-mark": "^0.0.10"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "craco start",
|
"start": "vite start",
|
||||||
"build": "craco build",
|
"build": "vite build"
|
||||||
"test": "craco test",
|
|
||||||
"eject": "react-scripts eject"
|
|
||||||
},
|
},
|
||||||
"eslintConfig": {
|
"eslintConfig": {
|
||||||
"extends": [
|
"extends": [
|
||||||
|
Before Width: | Height: | Size: 3.2 KiB |
@ -1,17 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
||||||
<meta name="theme-color" content="#000000" />
|
|
||||||
<meta name="description" content="void.cat - free, simple file sharing." />
|
|
||||||
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo.png" />
|
|
||||||
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
|
|
||||||
<title>void.cat</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
|
||||||
<div id="root"></div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
BIN
VoidCat/spa/src/app/public/logo.png
Normal file
After Width: | Height: | Size: 1.2 MiB |
BIN
VoidCat/spa/src/app/public/logo_128.jpg
Normal file
After Width: | Height: | Size: 7.0 KiB |
BIN
VoidCat/spa/src/app/public/logo_256.jpg
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
VoidCat/spa/src/app/public/logo_32.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
VoidCat/spa/src/app/public/logo_512.jpg
Normal file
After Width: | Height: | Size: 42 KiB |
@ -5,9 +5,24 @@
|
|||||||
"description": "Void.cat file hosting",
|
"description": "Void.cat file hosting",
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "voidcat_512.png",
|
"src": "logo_512.jpg",
|
||||||
"type": "image/png",
|
"type": "image/jpg",
|
||||||
"sizes": "512x512"
|
"sizes": "512x512"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "logo_256.jpg",
|
||||||
|
"type": "image/jpg",
|
||||||
|
"sizes": "256x256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "logo_128.jpg",
|
||||||
|
"type": "image/jpg",
|
||||||
|
"sizes": "128x128"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "logo_32.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "32x32"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"start_url": ".",
|
"start_url": ".",
|
||||||
|
Before Width: | Height: | Size: 401 KiB |
@ -5,13 +5,13 @@ import { Navigate } from "react-router-dom";
|
|||||||
import { AdminProfile } from "@void-cat/api";
|
import { AdminProfile } from "@void-cat/api";
|
||||||
|
|
||||||
import { UserList } from "./UserList";
|
import { UserList } from "./UserList";
|
||||||
import { VoidButton } from "../Components/Shared/VoidButton";
|
import { VoidButton } from "@/Components/Shared/VoidButton";
|
||||||
import VoidModal from "../Components/Shared/VoidModal";
|
import VoidModal from "@/Components/Shared/VoidModal";
|
||||||
import EditUser from "./EditUser";
|
import EditUser from "./EditUser";
|
||||||
|
|
||||||
import useApi from "Hooks/UseApi";
|
import useApi from "@/Hooks/UseApi";
|
||||||
import { RootState } from "Store";
|
import { RootState } from "@/Store";
|
||||||
import ImageGrid from "../Components/Shared/ImageGrid";
|
import ImageGrid from "@/Components/Shared/ImageGrid";
|
||||||
|
|
||||||
export function Admin() {
|
export function Admin() {
|
||||||
const auth = useSelector((state: RootState) => state.login.jwt);
|
const auth = useSelector((state: RootState) => state.login.jwt);
|
||||||
|
@ -2,9 +2,9 @@ import { useState } from "react";
|
|||||||
import { useSelector } from "react-redux";
|
import { useSelector } from "react-redux";
|
||||||
import { AdminProfile } from "@void-cat/api";
|
import { AdminProfile } from "@void-cat/api";
|
||||||
|
|
||||||
import { VoidButton } from "../Components/Shared/VoidButton";
|
import { VoidButton } from "@/Components/Shared/VoidButton";
|
||||||
import useApi from "Hooks/UseApi";
|
import useApi from "@/Hooks/UseApi";
|
||||||
import { RootState } from "Store";
|
import { RootState } from "@/Store";
|
||||||
|
|
||||||
export default function EditUser({
|
export default function EditUser({
|
||||||
user,
|
user,
|
||||||
|
@ -10,10 +10,10 @@ import {
|
|||||||
PageSortOrder,
|
PageSortOrder,
|
||||||
} from "@void-cat/api";
|
} from "@void-cat/api";
|
||||||
|
|
||||||
import { logout } from "../LoginState";
|
import { logout } from "@/LoginState";
|
||||||
import { PageSelector } from "../Components/Shared/PageSelector";
|
import { PageSelector } from "../Components/Shared/PageSelector";
|
||||||
|
|
||||||
import useApi from "Hooks/UseApi";
|
import useApi from "@/Hooks/UseApi";
|
||||||
|
|
||||||
interface UserListProps {
|
interface UserListProps {
|
||||||
actions: (u: AdminProfile) => ReactNode;
|
actions: (u: AdminProfile) => ReactNode;
|
||||||
|
@ -7,6 +7,7 @@ import {
|
|||||||
RouterProvider,
|
RouterProvider,
|
||||||
} from "react-router-dom";
|
} from "react-router-dom";
|
||||||
import { Provider } from "react-redux";
|
import { Provider } from "react-redux";
|
||||||
|
import { VoidApi } from "@void-cat/api";
|
||||||
|
|
||||||
import store from "./Store";
|
import store from "./Store";
|
||||||
import { FilePreview } from "./Pages/FilePreview";
|
import { FilePreview } from "./Pages/FilePreview";
|
||||||
@ -16,8 +17,6 @@ import { UserLogin } from "./Pages/UserLogin";
|
|||||||
import { ProfilePage } from "./Pages/Profile";
|
import { ProfilePage } from "./Pages/Profile";
|
||||||
import { Header } from "./Components/Shared/Header";
|
import { Header } from "./Components/Shared/Header";
|
||||||
import { Donate } from "./Pages/Donate";
|
import { Donate } from "./Pages/Donate";
|
||||||
import { VoidApi } from "@void-cat/api";
|
|
||||||
import { ApiHost } from "./Const";
|
|
||||||
|
|
||||||
const router = createBrowserRouter([
|
const router = createBrowserRouter([
|
||||||
{
|
{
|
||||||
@ -35,7 +34,7 @@ const router = createBrowserRouter([
|
|||||||
path: "/u/:id",
|
path: "/u/:id",
|
||||||
loader: async ({ params }: LoaderFunctionArgs) => {
|
loader: async ({ params }: LoaderFunctionArgs) => {
|
||||||
const state = store.getState();
|
const state = store.getState();
|
||||||
const api = new VoidApi(ApiHost, state.login.jwt ? () => Promise.resolve(`Bearer ${state.login.jwt}`) : undefined);
|
const api = new VoidApi(import.meta.env.VITE_API_HOST, state.login.jwt ? () => Promise.resolve(`Bearer ${state.login.jwt}`) : undefined);
|
||||||
if (params.id) {
|
if (params.id) {
|
||||||
try {
|
try {
|
||||||
return await api.getUser(params.id);
|
return await api.getUser(params.id);
|
||||||
|
@ -12,8 +12,8 @@ import { StrikePaymentConfig } from "./StrikePaymentConfig";
|
|||||||
import { NoPaymentConfig } from "./NoPaymentConfig";
|
import { NoPaymentConfig } from "./NoPaymentConfig";
|
||||||
import { VoidButton } from "../Shared/VoidButton";
|
import { VoidButton } from "../Shared/VoidButton";
|
||||||
|
|
||||||
import useApi from "Hooks/UseApi";
|
import useApi from "@/Hooks/UseApi";
|
||||||
import { RootState } from "Store";
|
import { RootState } from "@/Store";
|
||||||
|
|
||||||
interface FileEditProps {
|
interface FileEditProps {
|
||||||
file: VoidFileResponse;
|
file: VoidFileResponse;
|
||||||
|
@ -4,8 +4,8 @@ import { LightningPayment } from "./LightningPayment";
|
|||||||
import { VoidButton } from "../Shared/VoidButton";
|
import { VoidButton } from "../Shared/VoidButton";
|
||||||
import { PaymentOrder, PaymentServices, VoidFileResponse } from "@void-cat/api";
|
import { PaymentOrder, PaymentServices, VoidFileResponse } from "@void-cat/api";
|
||||||
|
|
||||||
import useApi from "Hooks/UseApi";
|
import useApi from "@/Hooks/UseApi";
|
||||||
import { FormatCurrency } from "Util";
|
import { FormatCurrency } from "@/Util";
|
||||||
|
|
||||||
interface FilePaymentProps {
|
interface FilePaymentProps {
|
||||||
file: VoidFileResponse;
|
file: VoidFileResponse;
|
||||||
|
@ -8,7 +8,7 @@ import {
|
|||||||
|
|
||||||
import { Countdown } from "../Shared/Countdown";
|
import { Countdown } from "../Shared/Countdown";
|
||||||
|
|
||||||
import useApi from "Hooks/UseApi";
|
import useApi from "@/Hooks/UseApi";
|
||||||
|
|
||||||
interface LightningPaymentProps {
|
interface LightningPaymentProps {
|
||||||
file: VoidFileResponse;
|
file: VoidFileResponse;
|
||||||
|
@ -6,9 +6,9 @@ import { UploadState, VoidFileResponse } from "@void-cat/api";
|
|||||||
import { VoidButton } from "../Shared/VoidButton";
|
import { VoidButton } from "../Shared/VoidButton";
|
||||||
import { useFileTransfer } from "../Shared/FileTransferHook";
|
import { useFileTransfer } from "../Shared/FileTransferHook";
|
||||||
|
|
||||||
import { RootState } from "Store";
|
import { RootState } from "@/Store";
|
||||||
import { ConstName, FormatBytes } from "Util";
|
import { ConstName, FormatBytes } from "@/Util";
|
||||||
import useApi from "Hooks/UseApi";
|
import useApi from "@/Hooks/UseApi";
|
||||||
|
|
||||||
interface FileUploadProps {
|
interface FileUploadProps {
|
||||||
file: File | Blob;
|
file: File | Blob;
|
||||||
|
@ -2,7 +2,7 @@ import "./FooterLinks.css";
|
|||||||
import { useSelector } from "react-redux";
|
import { useSelector } from "react-redux";
|
||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
|
|
||||||
import { RootState } from "Store";
|
import { RootState } from "@/Store";
|
||||||
|
|
||||||
export function FooterLinks() {
|
export function FooterLinks() {
|
||||||
const profile = useSelector((s: RootState) => s.login.profile);
|
const profile = useSelector((s: RootState) => s.login.profile);
|
||||||
|
@ -3,9 +3,9 @@ import { Fragment } from "react";
|
|||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import { useSelector } from "react-redux";
|
import { useSelector } from "react-redux";
|
||||||
|
|
||||||
import Icon from "Components/Shared/Icon";
|
import Icon from "@/Components/Shared/Icon";
|
||||||
import { RootState } from "Store";
|
import { RootState } from "@/Store";
|
||||||
import { FormatBytes } from "Util";
|
import { FormatBytes } from "@/Util";
|
||||||
|
|
||||||
export function GlobalStats() {
|
export function GlobalStats() {
|
||||||
let stats = useSelector((s: RootState) => s.info.info);
|
let stats = useSelector((s: RootState) => s.info.info);
|
||||||
|
@ -2,7 +2,7 @@ import { Bar, BarChart, Tooltip, XAxis } from "recharts";
|
|||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import { BandwidthPoint } from "@void-cat/api";
|
import { BandwidthPoint } from "@void-cat/api";
|
||||||
|
|
||||||
import { FormatBytes } from "Util";
|
import { FormatBytes } from "@/Util";
|
||||||
|
|
||||||
interface MetricsGraphProps {
|
interface MetricsGraphProps {
|
||||||
metrics?: Array<BandwidthPoint>;
|
metrics?: Array<BandwidthPoint>;
|
||||||
|
@ -5,7 +5,7 @@ import { ApiKey } from "@void-cat/api";
|
|||||||
import { VoidButton } from "../Shared/VoidButton";
|
import { VoidButton } from "../Shared/VoidButton";
|
||||||
import VoidModal from "../Shared/VoidModal";
|
import VoidModal from "../Shared/VoidModal";
|
||||||
|
|
||||||
import useApi from "Hooks/UseApi";
|
import useApi from "@/Hooks/UseApi";
|
||||||
|
|
||||||
export default function ApiKeyList() {
|
export default function ApiKeyList() {
|
||||||
const Api = useApi();
|
const Api = useApi();
|
||||||
|
@ -11,10 +11,10 @@ import {
|
|||||||
VoidFileResponse,
|
VoidFileResponse,
|
||||||
} from "@void-cat/api";
|
} from "@void-cat/api";
|
||||||
|
|
||||||
import { logout } from "../../LoginState";
|
import { logout } from "@/LoginState";
|
||||||
import { PageSelector } from "./PageSelector";
|
import { PageSelector } from "./PageSelector";
|
||||||
|
|
||||||
import { FormatBytes } from "Util";
|
import { FormatBytes } from "@/Util";
|
||||||
|
|
||||||
interface FileListProps {
|
interface FileListProps {
|
||||||
actions?: (f: VoidFileResponse) => ReactNode;
|
actions?: (f: VoidFileResponse) => ReactNode;
|
||||||
|
@ -1,16 +1,14 @@
|
|||||||
import "./Header.css";
|
import "./Header.css";
|
||||||
import VoidCat from "../../image/voidcat.png";
|
|
||||||
|
|
||||||
import { useEffect } from "react";
|
import { useEffect } from "react";
|
||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
import { useDispatch, useSelector } from "react-redux";
|
import { useDispatch, useSelector } from "react-redux";
|
||||||
|
|
||||||
import { InlineProfile } from "./InlineProfile";
|
import { InlineProfile } from "./InlineProfile";
|
||||||
import { logout, setAuth, setProfile } from "../../LoginState";
|
import { logout, setAuth, setProfile } from "@/LoginState";
|
||||||
import { setInfo } from "../../SiteInfoStore";
|
import { setInfo } from "@/SiteInfoStore";
|
||||||
|
import useApi from "@/Hooks/UseApi";
|
||||||
import useApi from "Hooks/UseApi";
|
import { RootState } from "@/Store";
|
||||||
import { RootState } from "Store";
|
|
||||||
|
|
||||||
export function Header() {
|
export function Header() {
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
@ -51,7 +49,7 @@ export function Header() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="header page">
|
<div className="header page">
|
||||||
<img src={VoidCat} alt="logo" className="logo" />
|
<img src="/logo_128.jpg" alt="logo" className="logo" />
|
||||||
<div className="title">
|
<div className="title">
|
||||||
<Link to="/">{window.location.hostname}</Link>
|
<Link to="/">{window.location.hostname}</Link>
|
||||||
</div>
|
</div>
|
||||||
|
@ -12,7 +12,7 @@ import { useEffect, useState } from "react";
|
|||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
import { useDispatch } from "react-redux";
|
import { useDispatch } from "react-redux";
|
||||||
|
|
||||||
import { logout } from "../../LoginState";
|
import { logout } from "@/LoginState";
|
||||||
import { PageSelector } from "./PageSelector";
|
import { PageSelector } from "./PageSelector";
|
||||||
|
|
||||||
interface ImageGridProps {
|
interface ImageGridProps {
|
||||||
|
@ -3,7 +3,7 @@ import { CSSProperties } from "react";
|
|||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
import { Profile } from "@void-cat/api";
|
import { Profile } from "@void-cat/api";
|
||||||
|
|
||||||
import { DefaultAvatar } from "Const";
|
import { DefaultAvatar } from "@/Const";
|
||||||
|
|
||||||
const DefaultSize = 64;
|
const DefaultSize = 64;
|
||||||
|
|
||||||
|
@ -3,11 +3,11 @@ import { useDispatch, useSelector } from "react-redux";
|
|||||||
import HCaptcha from "@hcaptcha/react-hcaptcha";
|
import HCaptcha from "@hcaptcha/react-hcaptcha";
|
||||||
|
|
||||||
import "./Login.css";
|
import "./Login.css";
|
||||||
import { setAuth } from "../../LoginState";
|
import { setAuth } from "@/LoginState";
|
||||||
import { VoidButton } from "./VoidButton";
|
import { VoidButton } from "./VoidButton";
|
||||||
|
|
||||||
import useApi from "Hooks/UseApi";
|
import useApi from "@/Hooks/UseApi";
|
||||||
import { RootState } from "Store";
|
import { RootState } from "@/Store";
|
||||||
|
|
||||||
export function Login() {
|
export function Login() {
|
||||||
const Api = useApi();
|
const Api = useApi();
|
||||||
|
@ -1,7 +1,3 @@
|
|||||||
import preval from "preval.macro";
|
|
||||||
|
|
||||||
export const ApiHost = preval`module.exports = process.env.API_HOST || '';`;
|
|
||||||
|
|
||||||
export const DefaultAvatar = "https://i.imgur.com/8A5Fu65.jpeg";
|
export const DefaultAvatar = "https://i.imgur.com/8A5Fu65.jpeg";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
import { useSelector } from "react-redux";
|
import { useSelector } from "react-redux";
|
||||||
import { VoidApi } from "@void-cat/api";
|
import { VoidApi } from "@void-cat/api";
|
||||||
|
|
||||||
import { RootState } from "Store";
|
import { RootState } from "@/Store";
|
||||||
import { ApiHost } from "Const";
|
|
||||||
|
|
||||||
export default function useApi() {
|
export default function useApi() {
|
||||||
const auth = useSelector((s: RootState) => s.login.jwt);
|
const auth = useSelector((s: RootState) => s.login.jwt);
|
||||||
return new VoidApi(ApiHost, auth ? () => Promise.resolve(`Bearer ${auth}`) : undefined);
|
return new VoidApi(import.meta.env.VITE_API_HOST, auth ? () => Promise.resolve(`Bearer ${auth}`) : undefined);
|
||||||
}
|
}
|
||||||
|
@ -8,17 +8,16 @@ import {
|
|||||||
StreamEncryption,
|
StreamEncryption,
|
||||||
} from "@void-cat/api";
|
} from "@void-cat/api";
|
||||||
|
|
||||||
import { TextPreview } from "../Components/FilePreview/TextPreview";
|
import { TextPreview } from "@/Components/FilePreview/TextPreview";
|
||||||
import { FileEdit } from "../Components/FileEdit/FileEdit";
|
import { FileEdit } from "@/Components/FileEdit/FileEdit";
|
||||||
import { FilePayment } from "../Components/FilePreview/FilePayment";
|
import { FilePayment } from "@/Components/FilePreview/FilePayment";
|
||||||
import { InlineProfile } from "../Components/Shared/InlineProfile";
|
import { InlineProfile } from "@/Components/Shared/InlineProfile";
|
||||||
import { VoidButton } from "../Components/Shared/VoidButton";
|
import { VoidButton } from "@/Components/Shared/VoidButton";
|
||||||
import { useFileTransfer } from "../Components/Shared/FileTransferHook";
|
import { useFileTransfer } from "@/Components/Shared/FileTransferHook";
|
||||||
import Icon from "../Components/Shared/Icon";
|
import Icon from "@/Components/Shared/Icon";
|
||||||
|
|
||||||
import useApi from "Hooks/UseApi";
|
import useApi from "@/Hooks/UseApi";
|
||||||
import { FormatBytes } from "Util";
|
import { FormatBytes } from "@/Util";
|
||||||
import { ApiHost } from "Const";
|
|
||||||
|
|
||||||
export function FilePreview() {
|
export function FilePreview() {
|
||||||
const Api = useApi();
|
const Api = useApi();
|
||||||
@ -249,7 +248,7 @@ export function FilePreview() {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (info) {
|
if (info) {
|
||||||
const fileLink = info.metadata?.url ?? `${ApiHost}/d/${info.id}`;
|
const fileLink = info.metadata?.url ?? `${import.meta.env.VITE_API_HOST}/d/${info.id}`;
|
||||||
setFileSize(info.metadata?.size ?? 0);
|
setFileSize(info.metadata?.size ?? 0);
|
||||||
|
|
||||||
const order = window.localStorage.getItem(`payment-${info.id}`);
|
const order = window.localStorage.getItem(`payment-${info.id}`);
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
import { useSelector } from "react-redux";
|
import { useSelector } from "react-redux";
|
||||||
|
|
||||||
import { Dropzone } from "../Components/FileUpload/Dropzone";
|
import { Dropzone } from "@/Components/FileUpload/Dropzone";
|
||||||
import { GlobalStats } from "../Components/HomePage/GlobalStats";
|
import { GlobalStats } from "@/Components/HomePage/GlobalStats";
|
||||||
import { FooterLinks } from "../Components/HomePage/FooterLinks";
|
import { FooterLinks } from "@/Components/HomePage/FooterLinks";
|
||||||
import { MetricsGraph } from "../Components/HomePage/MetricsGraph";
|
import { MetricsGraph } from "@/Components/HomePage/MetricsGraph";
|
||||||
|
|
||||||
import { RootState } from "Store";
|
import { RootState } from "@/Store";
|
||||||
|
|
||||||
export function HomePage() {
|
export function HomePage() {
|
||||||
const metrics = useSelector((s: RootState) => s.info.info);
|
const metrics = useSelector((s: RootState) => s.info.info);
|
||||||
|
@ -5,14 +5,14 @@ import { default as moment } from "moment";
|
|||||||
import { useLoaderData } from "react-router-dom";
|
import { useLoaderData } from "react-router-dom";
|
||||||
import { Profile } from "@void-cat/api";
|
import { Profile } from "@void-cat/api";
|
||||||
|
|
||||||
import useApi from "Hooks/UseApi";
|
import useApi from "@/Hooks/UseApi";
|
||||||
import { RootState } from "Store";
|
import { RootState } from "@/Store";
|
||||||
import { DefaultAvatar } from "Const";
|
import { DefaultAvatar } from "@/Const";
|
||||||
|
|
||||||
import { logout, setProfile as setGlobalProfile } from "../LoginState";
|
import { logout, setProfile as setGlobalProfile } from "@/LoginState";
|
||||||
import { FileList } from "../Components/Shared/FileList";
|
import { FileList } from "@/Components/Shared/FileList";
|
||||||
import { VoidButton } from "../Components/Shared/VoidButton";
|
import { VoidButton } from "@/Components/Shared/VoidButton";
|
||||||
import ApiKeyList from "../Components/Profile/ApiKeyList";
|
import ApiKeyList from "@/Components/Profile/ApiKeyList";
|
||||||
|
|
||||||
export function ProfilePage() {
|
export function ProfilePage() {
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
|
@ -2,8 +2,8 @@ import { useSelector } from "react-redux";
|
|||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import { useEffect } from "react";
|
import { useEffect } from "react";
|
||||||
|
|
||||||
import { Login } from "../Components/Shared/Login";
|
import { Login } from "@/Components/Shared/Login";
|
||||||
import { RootState } from "Store";
|
import { RootState } from "@/Store";
|
||||||
|
|
||||||
export function UserLogin() {
|
export function UserLogin() {
|
||||||
const auth = useSelector((s: RootState) => s.login.jwt);
|
const auth = useSelector((s: RootState) => s.login.jwt);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import * as Const from "Const";
|
import * as Const from "@/Const";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Formats bytes into binary notation
|
* Formats bytes into binary notation
|
||||||
|
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 1.3 MiB |
@ -1,14 +1,18 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"baseUrl": "src",
|
"baseUrl": ".",
|
||||||
"target": "es2020",
|
"target": "ESNext",
|
||||||
|
"module": "ESNext",
|
||||||
"jsx": "react-jsx",
|
"jsx": "react-jsx",
|
||||||
"moduleResolution": "node",
|
"moduleResolution": "Bundler",
|
||||||
|
"sourceMap": true,
|
||||||
"forceConsistentCasingInFileNames": true,
|
"forceConsistentCasingInFileNames": true,
|
||||||
"strict": true,
|
"strict": true,
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
"resolveJsonModule": true,
|
"resolveJsonModule": true,
|
||||||
"allowSyntheticDefaultImports": true,
|
"allowSyntheticDefaultImports": true,
|
||||||
"allowJs": true
|
"paths": {
|
||||||
|
"@/*": ["./src/*"]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
33
VoidCat/spa/src/app/vite.config.ts
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import react from "@vitejs/plugin-react";
|
||||||
|
import {visualizer} from "rollup-plugin-visualizer";
|
||||||
|
import {defineConfig} from "vite";
|
||||||
|
import {vitePluginVersionMark} from "vite-plugin-version-mark";
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
plugins: [
|
||||||
|
react(),
|
||||||
|
visualizer({
|
||||||
|
open: true,
|
||||||
|
gzipSize: true,
|
||||||
|
filename: "build/stats.html",
|
||||||
|
}),
|
||||||
|
vitePluginVersionMark({
|
||||||
|
name: "void_cat",
|
||||||
|
ifGitSHA: true,
|
||||||
|
command: "git describe --always --tags",
|
||||||
|
ifMeta: false,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
assetsInclude: [],
|
||||||
|
build: {
|
||||||
|
outDir: "build",
|
||||||
|
},
|
||||||
|
clearScreen: false,
|
||||||
|
resolve: {
|
||||||
|
alias: {
|
||||||
|
"@": "/src",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
define: {}
|
||||||
|
});
|
||||||
|
|