fix post-page rkey
This commit is contained in:
Binary file not shown.
@ -1,3 +1,3 @@
|
|||||||
<!-- OAuth Comment System - Load globally for session management -->
|
<!-- OAuth Comment System - Load globally for session management -->
|
||||||
<script type="module" crossorigin src="/assets/comment-atproto-C3utAhPv.js"></script>
|
<script type="module" crossorigin src="/assets/comment-atproto-C2nhj09r.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="/assets/comment-atproto-BH-72ESb.css">
|
<link rel="stylesheet" crossorigin href="/assets/comment-atproto-6vwaM28e.css">
|
@ -1,3 +1,3 @@
|
|||||||
<!-- OAuth Comment System - Load globally for session management -->
|
<!-- OAuth Comment System - Load globally for session management -->
|
||||||
<script type="module" crossorigin src="/assets/comment-atproto-C3utAhPv.js"></script>
|
<script type="module" crossorigin src="/assets/comment-atproto-C2nhj09r.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="/assets/comment-atproto-BH-72ESb.css">
|
<link rel="stylesheet" crossorigin href="/assets/comment-atproto-6vwaM28e.css">
|
@ -499,9 +499,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.comments-list {
|
.comments-list {
|
||||||
border: 1px solid #ddd;
|
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
padding: 20px;
|
padding: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.comments-header {
|
.comments-header {
|
||||||
@ -860,28 +859,6 @@
|
|||||||
background: #f6f8fa;
|
background: #f6f8fa;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* AI Chat History */
|
|
||||||
.ai-chat-list {
|
|
||||||
max-width: 100%;
|
|
||||||
border: 1px solid #ddd;
|
|
||||||
border-radius: 8px;
|
|
||||||
padding: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-item {
|
|
||||||
border: 1px solid #d1d9e0;
|
|
||||||
border-radius: 8px;
|
|
||||||
padding: 16px;
|
|
||||||
margin-bottom: 16px;
|
|
||||||
background: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-header {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
margin-bottom: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-actions {
|
.chat-actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -259,8 +259,8 @@ function App() {
|
|||||||
if (appConfig.rkey) {
|
if (appConfig.rkey) {
|
||||||
// On post page: show only chats for this specific post
|
// On post page: show only chats for this specific post
|
||||||
filteredRecords = allChatRecords.filter(record => {
|
filteredRecords = allChatRecords.filter(record => {
|
||||||
const recordPath = record.value.post?.url ? new URL(record.value.post.url).pathname : '';
|
const recordRkey = record.value.post?.url ? new URL(record.value.post.url).pathname.split('/').pop()?.replace(/\.html$/, '') : '';
|
||||||
return recordPath === window.location.pathname;
|
return recordRkey === appConfig.rkey;
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// On top page: show latest 3 records from all pages
|
// On top page: show latest 3 records from all pages
|
||||||
@ -302,13 +302,12 @@ function App() {
|
|||||||
const langData = await langResponse.json();
|
const langData = await langResponse.json();
|
||||||
const langRecords = langData.records || [];
|
const langRecords = langData.records || [];
|
||||||
|
|
||||||
// Filter by current page path if on post page
|
// Filter by current page rkey if on post page
|
||||||
const filteredLangRecords = appConfig.rkey
|
const filteredLangRecords = appConfig.rkey
|
||||||
? langRecords.filter(record => {
|
? langRecords.filter(record => {
|
||||||
// Compare path only, not full URL to support localhost vs production
|
// Compare rkey only (last part of path)
|
||||||
const recordPath = record.value.post?.url ? new URL(record.value.post.url).pathname :
|
const recordRkey = record.value.post?.url ? new URL(record.value.post.url).pathname.split('/').pop()?.replace(/\.html$/, '') : '';
|
||||||
record.value.url ? new URL(record.value.url).pathname : '';
|
return recordRkey === appConfig.rkey;
|
||||||
return recordPath === window.location.pathname;
|
|
||||||
})
|
})
|
||||||
: langRecords.slice(0, 3); // Top page: latest 3
|
: langRecords.slice(0, 3); // Top page: latest 3
|
||||||
|
|
||||||
@ -321,13 +320,12 @@ function App() {
|
|||||||
const commentData = await commentResponse.json();
|
const commentData = await commentResponse.json();
|
||||||
const commentRecords = commentData.records || [];
|
const commentRecords = commentData.records || [];
|
||||||
|
|
||||||
// Filter by current page path if on post page
|
// Filter by current page rkey if on post page
|
||||||
const filteredCommentRecords = appConfig.rkey
|
const filteredCommentRecords = appConfig.rkey
|
||||||
? commentRecords.filter(record => {
|
? commentRecords.filter(record => {
|
||||||
// Compare path only, not full URL to support localhost vs production
|
// Compare rkey only (last part of path)
|
||||||
const recordPath = record.value.post?.url ? new URL(record.value.post.url).pathname :
|
const recordRkey = record.value.post?.url ? new URL(record.value.post.url).pathname.split('/').pop()?.replace(/\.html$/, '') : '';
|
||||||
record.value.url ? new URL(record.value.url).pathname : '';
|
return recordRkey === appConfig.rkey;
|
||||||
return recordPath === window.location.pathname;
|
|
||||||
})
|
})
|
||||||
: commentRecords.slice(0, 3); // Top page: latest 3
|
: commentRecords.slice(0, 3); // Top page: latest 3
|
||||||
|
|
||||||
@ -540,16 +538,14 @@ function App() {
|
|||||||
|
|
||||||
|
|
||||||
// ページpathでフィルタリング(指定された場合)
|
// ページpathでフィルタリング(指定された場合)
|
||||||
const filteredComments = pageUrl
|
const filteredComments = pageUrl && appConfig.rkey
|
||||||
? userComments.filter(record => {
|
? userComments.filter(record => {
|
||||||
try {
|
try {
|
||||||
// Compare path only, not full URL to support localhost vs production
|
// Compare rkey only (last part of path)
|
||||||
const recordPath = record.value.url ? new URL(record.value.url).pathname : '';
|
const recordRkey = record.value.url ? new URL(record.value.url).pathname.split('/').pop() : '';
|
||||||
const currentPath = new URL(pageUrl).pathname;
|
return recordRkey === appConfig.rkey;
|
||||||
return recordPath === currentPath;
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// Fallback to exact match if URL parsing fails
|
return false;
|
||||||
return record.value.url === pageUrl;
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
: userComments;
|
: userComments;
|
||||||
@ -1053,6 +1049,8 @@ function App() {
|
|||||||
<div className="username-input-section">
|
<div className="username-input-section">
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
|
id="handle-input"
|
||||||
|
name="handle"
|
||||||
placeholder="user.bsky.social"
|
placeholder="user.bsky.social"
|
||||||
className="handle-input"
|
className="handle-input"
|
||||||
value={handleInput}
|
value={handleInput}
|
||||||
@ -1094,6 +1092,8 @@ function App() {
|
|||||||
{/* User List Form */}
|
{/* User List Form */}
|
||||||
<div className="user-list-form">
|
<div className="user-list-form">
|
||||||
<textarea
|
<textarea
|
||||||
|
id="user-list-input"
|
||||||
|
name="userList"
|
||||||
value={userListInput}
|
value={userListInput}
|
||||||
onChange={(e) => setUserListInput(e.target.value)}
|
onChange={(e) => setUserListInput(e.target.value)}
|
||||||
placeholder="ユーザーハンドルをカンマ区切りで入力 例: syui.ai, yui.syui.ai, user.bsky.social"
|
placeholder="ユーザーハンドルをカンマ区切りで入力 例: syui.ai, yui.syui.ai, user.bsky.social"
|
||||||
@ -1188,13 +1188,13 @@ function App() {
|
|||||||
className={`tab-button ${activeTab === 'ai-chat' ? 'active' : ''}`}
|
className={`tab-button ${activeTab === 'ai-chat' ? 'active' : ''}`}
|
||||||
onClick={() => setActiveTab('ai-chat')}
|
onClick={() => setActiveTab('ai-chat')}
|
||||||
>
|
>
|
||||||
AI Chat History ({aiChatHistory.length})
|
AI Chat ({aiChatHistory.length})
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
className={`tab-button ${activeTab === 'lang-en' ? 'active' : ''}`}
|
className={`tab-button ${activeTab === 'lang-en' ? 'active' : ''}`}
|
||||||
onClick={() => setActiveTab('lang-en')}
|
onClick={() => setActiveTab('lang-en')}
|
||||||
>
|
>
|
||||||
Lang: EN ({langEnRecords.length})
|
AI Lang:en ({langEnRecords.length})
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
className={`tab-button ${activeTab === 'ai-comment' ? 'active' : ''}`}
|
className={`tab-button ${activeTab === 'ai-comment' ? 'active' : ''}`}
|
||||||
@ -1304,10 +1304,7 @@ function App() {
|
|||||||
|
|
||||||
{/* AI Chat History List */}
|
{/* AI Chat History List */}
|
||||||
{activeTab === 'ai-chat' && (
|
{activeTab === 'ai-chat' && (
|
||||||
<div className="ai-chat-list">
|
<div className="comments-list">
|
||||||
<div className="chat-header">
|
|
||||||
<h3>AI Chat History</h3>
|
|
||||||
</div>
|
|
||||||
{aiChatHistory.length === 0 ? (
|
{aiChatHistory.length === 0 ? (
|
||||||
<p className="no-chat">No AI conversations yet. Start chatting with Ask AI!</p>
|
<p className="no-chat">No AI conversations yet. Start chatting with Ask AI!</p>
|
||||||
) : (
|
) : (
|
||||||
@ -1319,8 +1316,8 @@ function App() {
|
|||||||
const displayName = isAiResponse ? 'AI' : (record.value.author?.displayName || record.value.author?.handle);
|
const displayName = isAiResponse ? 'AI' : (record.value.author?.displayName || record.value.author?.handle);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div key={index} className="chat-item">
|
<div key={index} className="comment-item">
|
||||||
<div className="chat-header">
|
<div className="comment-header">
|
||||||
<img
|
<img
|
||||||
src={generatePlaceholderAvatar(displayHandle || 'unknown')}
|
src={generatePlaceholderAvatar(displayHandle || 'unknown')}
|
||||||
alt={isAiResponse ? "AI Avatar" : "User Avatar"}
|
alt={isAiResponse ? "AI Avatar" : "User Avatar"}
|
||||||
@ -1404,7 +1401,7 @@ function App() {
|
|||||||
|
|
||||||
{/* Lang: EN List */}
|
{/* Lang: EN List */}
|
||||||
{activeTab === 'lang-en' && (
|
{activeTab === 'lang-en' && (
|
||||||
<div className="lang-en-list">
|
<div className="comments-list">
|
||||||
{langEnRecords.length === 0 ? (
|
{langEnRecords.length === 0 ? (
|
||||||
<p className="no-content">No English translations yet</p>
|
<p className="no-content">No English translations yet</p>
|
||||||
) : (
|
) : (
|
||||||
@ -1501,6 +1498,8 @@ function App() {
|
|||||||
<div className="comment-form">
|
<div className="comment-form">
|
||||||
<h3>Post a Comment</h3>
|
<h3>Post a Comment</h3>
|
||||||
<textarea
|
<textarea
|
||||||
|
id="comment-text"
|
||||||
|
name="commentText"
|
||||||
value={commentText}
|
value={commentText}
|
||||||
onChange={(e) => setCommentText(e.target.value)}
|
onChange={(e) => setCommentText(e.target.value)}
|
||||||
placeholder="Write your comment..."
|
placeholder="Write your comment..."
|
||||||
|
@ -62,11 +62,15 @@ function generateBaseCollectionFromHost(host: string): string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Extract rkey from current URL
|
// Extract rkey from current URL
|
||||||
// /posts/xxx -> xxx
|
// /posts/xxx -> xxx (remove .html if present)
|
||||||
function extractRkeyFromUrl(): string | undefined {
|
function extractRkeyFromUrl(): string | undefined {
|
||||||
const pathname = window.location.pathname;
|
const pathname = window.location.pathname;
|
||||||
const match = pathname.match(/\/posts\/([^/]+)\/?$/);
|
const match = pathname.match(/\/posts\/([^/]+)\/?$/);
|
||||||
return match ? match[1] : undefined;
|
if (match) {
|
||||||
|
// Remove .html extension if present
|
||||||
|
return match[1].replace(/\.html$/, '');
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get application configuration from environment variables
|
// Get application configuration from environment variables
|
||||||
|
Reference in New Issue
Block a user