bugfix
This commit is contained in:
@@ -8,8 +8,11 @@ import React from 'react';
|
||||
interface Suggestion {
|
||||
command: string;
|
||||
description: string;
|
||||
plugin: string;
|
||||
syntax: string;
|
||||
dangerous: boolean;
|
||||
danger_reason?: string;
|
||||
plugin: string;
|
||||
examples: string[];
|
||||
}
|
||||
|
||||
interface Props {
|
||||
|
||||
@@ -25,8 +25,8 @@ export default function DiffViewer({ serverUuid, revision, onClose }: Props) {
|
||||
const [loading, setLoading] = useState(true);
|
||||
|
||||
useEffect(() => {
|
||||
http.get(`/api/client/servers/${serverUuid}/addons/files/revisions/${revision.id}/diff`)
|
||||
.then(({ data }) => {
|
||||
http.get<{ binary: boolean; lines: DiffLine[] }>(`/api/client/servers/${serverUuid}/addons/files/revisions/${revision.id}/diff`)
|
||||
.then(({ data }: { data: { binary: boolean; lines: DiffLine[] } }) => {
|
||||
setBinary(data.binary);
|
||||
setLines(data.lines ?? []);
|
||||
})
|
||||
@@ -34,8 +34,8 @@ export default function DiffViewer({ serverUuid, revision, onClose }: Props) {
|
||||
}, [serverUuid, revision.id]);
|
||||
|
||||
return (
|
||||
<div className='addon-modal-overlay' onClick={onClose} role='dialog' aria-modal='true'>
|
||||
<div className='addon-modal addon-modal-wide' onClick={e => e.stopPropagation()}>
|
||||
<div className='addon-modal-overlay' onClick={(_e: React.MouseEvent) => onClose()} role='dialog' aria-modal='true'>
|
||||
<div className='addon-modal addon-modal-wide' onClick={(e: React.MouseEvent) => e.stopPropagation()}>
|
||||
<div className='addon-modal-header'>
|
||||
<span>Diff — Revision #{revision.revision_number}</span>
|
||||
<button className='addon-modal-close' onClick={onClose} aria-label='Close'>✕</button>
|
||||
@@ -44,7 +44,7 @@ export default function DiffViewer({ serverUuid, revision, onClose }: Props) {
|
||||
{!loading && binary && <div className='addon-empty'>Binary file — diff not available.</div>}
|
||||
{!loading && !binary && (
|
||||
<pre className='addon-diff'>
|
||||
{lines.map((line, i) => (
|
||||
{lines.map((line: DiffLine, i: number) => (
|
||||
<div
|
||||
key={i}
|
||||
className={`addon-diff-line addon-diff-${line.type}`}
|
||||
|
||||
@@ -30,16 +30,16 @@ export default function RevisionSidebar({ serverUuid, filePath, onClose }: Props
|
||||
const [restoring, setRestoring] = useState<Revision | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
http.get(`/api/client/servers/${serverUuid}/addons/files/revisions`, {
|
||||
http.get<{ data: Revision[] }>(`/api/client/servers/${serverUuid}/addons/files/revisions`, {
|
||||
params: { path: filePath },
|
||||
})
|
||||
.then(({ data }) => setRevisions(data.data ?? []))
|
||||
.then(({ data }: { data: { data: Revision[] } }) => setRevisions(data.data ?? []))
|
||||
.finally(() => setLoading(false));
|
||||
}, [serverUuid, filePath]);
|
||||
|
||||
return (
|
||||
<div className='addon-sidebar-overlay' onClick={onClose} aria-modal='true' role='dialog'>
|
||||
<div className='addon-sidebar' onClick={e => e.stopPropagation()}>
|
||||
<div className='addon-sidebar-overlay' onClick={(_e: React.MouseEvent) => onClose()} aria-modal='true' role='dialog'>
|
||||
<div className='addon-sidebar' onClick={(e: React.MouseEvent) => e.stopPropagation()}>
|
||||
<div className='addon-sidebar-header'>
|
||||
<span>🕐 File History — <code>{filePath}</code></span>
|
||||
<button className='addon-sidebar-close' onClick={onClose} aria-label='Close'>✕</button>
|
||||
@@ -52,7 +52,7 @@ export default function RevisionSidebar({ serverUuid, filePath, onClose }: Props
|
||||
)}
|
||||
|
||||
<ul className='addon-revision-list'>
|
||||
{revisions.map(rev => (
|
||||
{revisions.map((rev: Revision) => (
|
||||
<li key={rev.id} className='addon-revision-item'>
|
||||
<div className='addon-revision-meta'>
|
||||
<span className='addon-revision-num'>#{rev.revision_number}</span>
|
||||
|
||||
26
resources/scripts/api/http.ts
Normal file
26
resources/scripts/api/http.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* Type stub for Pterodactyl's internal @/api/http module.
|
||||
* This file exists ONLY for IDE type resolution in the standalone addon repo.
|
||||
* When installed into Pterodactyl Panel, the real module is used from the panel's src.
|
||||
*
|
||||
* @author Ball Studios <https://git.balls.studio>
|
||||
*/
|
||||
|
||||
export interface ApiResponse<T = unknown> {
|
||||
data: T;
|
||||
status: number;
|
||||
statusText: string;
|
||||
headers: Record<string, string>;
|
||||
}
|
||||
|
||||
/** Minimal Axios-compatible interface sufficient for IDE resolution. */
|
||||
interface HttpClient {
|
||||
get<T = any>(url: string, config?: object): Promise<ApiResponse<T>>;
|
||||
post<T = any>(url: string, data?: unknown, config?: object): Promise<ApiResponse<T>>;
|
||||
put<T = any>(url: string, data?: unknown, config?: object): Promise<ApiResponse<T>>;
|
||||
patch<T = any>(url: string, data?: unknown, config?: object): Promise<ApiResponse<T>>;
|
||||
delete<T = any>(url: string, config?: object): Promise<ApiResponse<T>>;
|
||||
}
|
||||
|
||||
declare const http: HttpClient;
|
||||
export default http;
|
||||
Reference in New Issue
Block a user