| "use client"; |
|
|
| import { useState } from "react"; |
| import PropTypes from "prop-types"; |
| import { Modal, Button, Input } from "@/shared/components"; |
|
|
| |
| |
| |
| |
| 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, |
| }; |
|
|