Settings: clarify Codex 만료=결제, drop Claude expiry badge (#49)
- Codex expiry badge now says "결제 만료/까지" so it's unambiguous that this is the ChatGPT Pro/Team subscription end-date, not an OAuth access-token TTL. - Claude rows no longer show an expiry badge: Claude credentials only expose an OAuth access_token TTL (auto-refreshed every few minutes by the existing claude token refresh loop), which is meaningless to the user. Replace it with a static "토큰 자동갱신" tag so the column alignment stays consistent. Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -1340,16 +1340,19 @@ function formatExpiry(
|
|||||||
});
|
});
|
||||||
if (days < 0) {
|
if (days < 0) {
|
||||||
const ago = Math.ceil(-days);
|
const ago = Math.ceil(-days);
|
||||||
return { label: `${dateStr} 만료 (${ago}일 전)`, cls: 'is-expired' };
|
return {
|
||||||
|
label: `결제 만료 ${dateStr} (${ago}일 전)`,
|
||||||
|
cls: 'is-expired',
|
||||||
|
};
|
||||||
}
|
}
|
||||||
if (days < 7) {
|
if (days < 7) {
|
||||||
return {
|
return {
|
||||||
label: `${dateStr}까지 (${Math.floor(days)}일)`,
|
label: `결제 ${dateStr}까지 (${Math.floor(days)}일)`,
|
||||||
cls: 'is-soon',
|
cls: 'is-soon',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
label: `${dateStr}까지 (${Math.floor(days)}일)`,
|
label: `결제 ${dateStr}까지 (${Math.floor(days)}일)`,
|
||||||
cls: 'is-active',
|
cls: 'is-active',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -1475,39 +1478,33 @@ function AccountSettings({ onRestartStack }: { onRestartStack: () => void }) {
|
|||||||
<p className="settings-hint">계정 없음</p>
|
<p className="settings-hint">계정 없음</p>
|
||||||
) : (
|
) : (
|
||||||
<ul className="settings-account-list">
|
<ul className="settings-account-list">
|
||||||
{data.claude.map((acc) => {
|
{data.claude.map((acc) => (
|
||||||
const expiry = formatExpiry(
|
<li key={acc.index} className="settings-account-row">
|
||||||
acc.expiresAt ? new Date(acc.expiresAt).toISOString() : null,
|
<div className="settings-account-main">
|
||||||
);
|
<span className="settings-account-tag">#{acc.index}</span>
|
||||||
return (
|
<span className="settings-account-email">
|
||||||
<li key={acc.index} className="settings-account-row">
|
{acc.subscriptionType ?? 'unknown'}
|
||||||
<div className="settings-account-main">
|
{acc.rateLimitTier ? ` · ${acc.rateLimitTier}` : ''}
|
||||||
<span className="settings-account-tag">#{acc.index}</span>
|
</span>
|
||||||
<span className="settings-account-email">
|
<span className="settings-account-plan">claude</span>
|
||||||
{acc.subscriptionType ?? 'unknown'}
|
<span className="settings-account-badge is-active">
|
||||||
{acc.rateLimitTier ? ` · ${acc.rateLimitTier}` : ''}
|
토큰 자동갱신
|
||||||
</span>
|
</span>
|
||||||
{expiry ? (
|
</div>
|
||||||
<span className={`settings-account-badge ${expiry.cls}`}>
|
{acc.index > 0 ? (
|
||||||
{expiry.label}
|
<button
|
||||||
</span>
|
className="settings-delete"
|
||||||
) : null}
|
disabled={busy}
|
||||||
</div>
|
onClick={() => void handleDelete('claude', acc.index)}
|
||||||
{acc.index > 0 ? (
|
type="button"
|
||||||
<button
|
>
|
||||||
className="settings-delete"
|
삭제
|
||||||
disabled={busy}
|
</button>
|
||||||
onClick={() => void handleDelete('claude', acc.index)}
|
) : (
|
||||||
type="button"
|
<span className="settings-account-default">기본</span>
|
||||||
>
|
)}
|
||||||
삭제
|
</li>
|
||||||
</button>
|
))}
|
||||||
) : (
|
|
||||||
<span className="settings-account-default">기본</span>
|
|
||||||
)}
|
|
||||||
</li>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</ul>
|
</ul>
|
||||||
)}
|
)}
|
||||||
<div className="settings-add-token">
|
<div className="settings-add-token">
|
||||||
|
|||||||
Reference in New Issue
Block a user