9router/src/shared/components/IFlowCookieModal.js
decolua 573b0f0241 - Refines the overall structure of the CLI tools and MITM server functionalities.
- Add buildQwenBaseUrl function to construct URLs for Qwen resources.
- Update buildProviderUrl to support Qwen model requests.
- Enhance token refresh logic to include provider-specific data for Qwen.
- Refactor CLI Tools page to exclude MITM tools and streamline model retrieval.
- Introduce new components for MITM server management.
- Update API routes to handle Qwen-specific resource URLs and improve error handling.
2026-03-05 11:25:03 +07:00

132 lines
4.2 KiB
JavaScript

"use client";
import { useState } from "react";
import PropTypes from "prop-types";
import { Modal, Button, Input } from "@/shared/components";
/**
* iFlow Cookie Authentication Modal
* User pastes browser cookie to get fresh API key
*/
export default function IFlowCookieModal({ isOpen, onSuccess, onClose }) {
const [cookie, setCookie] = useState("");
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const [success, setSuccess] = useState(false);
const handleSubmit = async () => {
if (!cookie.trim()) {
setError("Please paste your cookie");
return;
}
setLoading(true);
setError(null);
try {
const res = await fetch("/api/oauth/iflow/cookie", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ cookie: cookie.trim() }),
});
const data = await res.json();
if (!res.ok) {
throw new Error(data.error || "Authentication failed");
}
setSuccess(true);
setTimeout(() => {
onSuccess?.();
handleClose();
}, 1500);
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
};
const handleClose = () => {
setCookie("");
setError(null);
setSuccess(false);
onClose?.();
};
return (
<Modal isOpen={isOpen} onClose={handleClose} title="iFlow Cookie Authentication">
<div className="space-y-4">
{success ? (
<div className="text-center py-8">
<div className="text-6xl mb-4"></div>
<p className="text-lg font-medium text-text-primary">Authentication Successful!</p>
<p className="text-sm text-text-muted mt-2">Fresh API key obtained</p>
</div>
) : (
<>
<div className="space-y-2">
<p className="text-sm text-text-muted">
To get a fresh API key, paste your browser cookie from{" "}
<a
href="https://platform.iflow.cn"
target="_blank"
rel="noopener noreferrer"
className="text-primary hover:underline"
>
platform.iflow.cn
</a>
</p>
<div className="bg-surface-secondary p-3 rounded-lg text-xs space-y-2">
<p className="font-medium text-text-primary">How to get cookie:</p>
<ol className="list-decimal list-inside space-y-1 text-text-muted">
<li>Open platform.iflow.cn in your browser</li>
<li>Login to your account</li>
<li>Open DevTools (F12) Application/Storage Cookies</li>
<li>Copy the entire cookie string (must include BXAuth)</li>
<li>Paste it below</li>
</ol>
</div>
</div>
<div className="space-y-2">
<label className="block text-sm font-medium text-text-primary">
Cookie String
</label>
<textarea
value={cookie}
onChange={(e) => setCookie(e.target.value)}
placeholder="BXAuth=xxx; ..."
className="w-full px-3 py-2 bg-surface-secondary border border-border rounded-lg text-sm text-text-primary placeholder-text-muted focus:outline-none focus:ring-2 focus:ring-primary resize-none"
rows={4}
disabled={loading}
/>
</div>
{error && (
<div className="p-3 bg-error/10 border border-error/20 rounded-lg">
<p className="text-sm text-error">{error}</p>
</div>
)}
<div className="flex gap-3 pt-2">
<Button variant="secondary" onClick={handleClose} disabled={loading} fullWidth>
Cancel
</Button>
<Button onClick={handleSubmit} loading={loading} fullWidth>
Authenticate
</Button>
</div>
</>
)}
</div>
</Modal>
);
}
IFlowCookieModal.propTypes = {
isOpen: PropTypes.bool.isRequired,
onSuccess: PropTypes.func,
onClose: PropTypes.func,
};