chore: remove share opinion sidebar prompt

Delete the share opinion dialog and its sidebar trigger.
Remove the related toast and footer action wiring.
Clean up unused i18n entries in all supported languages.
This commit is contained in:
Bohdan Triapitsyn
2026-07-14 14:29:32 +03:00
parent e1fc3882e3
commit d069b02931
13 changed files with 5 additions and 187 deletions
@@ -1,65 +0,0 @@
import React from 'react';
import { Icon } from '@/components/icon/Icon';
import { SimpleMarkdownRenderer } from '@/components/chat/MarkdownRenderer';
import { Dialog, DialogContent, DialogTitle } from '@/components/ui/dialog';
import { useI18n } from '@/lib/i18n';
import { openExternalUrl } from '@/lib/url';
type ShareOpinionDialogProps = {
open: boolean;
onOpenChange: (open: boolean) => void;
};
const SHARE_OPINION_MARKDOWN = `**Help shape what OpenChamber becomes next!**
Hey 👋,
OpenChamber has grown mostly through word of mouth, GitHub issues, Discord feedback, and people telling me what is broken, confusing, or surprisingly useful.
I'm planning the next chapter now - mobile, better remote access, a tighter VS Code ↔ desktop/web/mobile flow, and more, but before building too much, I want to hear from the people actually using it.
I'm doing a round of short 1-on-1 calls. No sales pitch, no formal script - just a real conversation about how you use OpenChamber, what you love, what frustrates you, and what would make it much more valuable.
You can book a call or use the short survey below.
What you get:
- A direct chance to influence the roadmap
- Your pain points and feature requests prioritized with more context
- A Power User role in Discord for people helping shape the product
- My genuine thanks for helping make OpenChamber better
**This project is what it is because of your feedback. Thank you, genuinely.**
I'll remove this button in 10 days 🙂`;
export function ShareOpinionDialog({ open, onOpenChange }: ShareOpinionDialogProps): React.ReactNode {
const { t } = useI18n();
return (
<Dialog open={open} onOpenChange={onOpenChange}>
<DialogContent className="max-h-[85vh] max-w-2xl overflow-y-auto">
<DialogTitle className="sr-only">{t('shareOpinion.dialog.title')}</DialogTitle>
<SimpleMarkdownRenderer content={SHARE_OPINION_MARKDOWN} className="typography-markdown-body" enableFileReferences={false} />
<div className="mt-4 flex flex-wrap gap-2">
<button
type="button"
className="inline-flex items-center gap-2 rounded-xl border border-[var(--interactive-border)] bg-[var(--surface-elevated)] px-4 py-2.5 typography-ui-label text-foreground hover:bg-[var(--interactive-hover)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--interactive-focus-ring)]"
onClick={() => void openExternalUrl('https://calendly.com/artmore/30min')}
>
<Icon name="video-chat" className="size-5 text-[var(--status-warning)]" />
{t('shareOpinion.actions.bookCall')}
</button>
<button
type="button"
className="inline-flex items-center gap-2 rounded-xl border border-[var(--interactive-border)] bg-[var(--surface-elevated)] px-4 py-2.5 typography-ui-label text-foreground hover:bg-[var(--interactive-hover)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--interactive-focus-ring)]"
onClick={() => void openExternalUrl('https://forms.gle/cdMVKUGs5QuLWkA86')}
>
<Icon name="survey" className="size-5 text-[var(--pr-merged)]" />
{t('shareOpinion.actions.shortSurvey')}
</button>
</div>
</DialogContent>
</Dialog>
);
}
@@ -36,7 +36,6 @@ import { useStickyProjectHeaders } from './sidebar/hooks/useStickyProjectHeaders
import { getGitHubPrStatusKey, usePrVisualSummaryByKeys, useGitHubPrStatusStore } from '@/stores/useGitHubPrStatusStore';
import { ProjectEditDialog } from '@/components/layout/ProjectEditDialog';
import { UpdateDialog } from '@/components/ui/UpdateDialog';
import { ShareOpinionDialog } from '@/components/feedback/ShareOpinionDialog';
import { SessionGroupSection } from './sidebar/SessionGroupSection';
import { SidebarHeader } from './sidebar/SidebarHeader';
import { SidebarActivitySections } from './sidebar/SidebarActivitySections';
@@ -82,7 +81,6 @@ import { useRuntimeAPIs } from '@/hooks/useRuntimeAPIs';
import { useGitHubAuthStore } from '@/stores/useGitHubAuthStore';
import { subscribeOpenchamberEvents } from '@/lib/openchamberEvents';
const SHARE_OPINION_TOAST_STORAGE_KEY = 'openchamber.shareOpinionToast.dismissed.v2';
const PROJECT_COLLAPSE_STORAGE_KEY = 'oc.sessions.projectCollapse';
const GROUP_ORDER_STORAGE_KEY = 'oc.sessions.groupOrder';
const GROUP_COLLAPSE_STORAGE_KEY = 'oc.sessions.groupCollapse';
@@ -199,7 +197,6 @@ export const SessionSidebar: React.FC<SessionSidebarProps> = ({
const newWorktreeDialogOpen = useUIStore((state) => state.isNewWorktreeDialogOpen);
const setNewWorktreeDialogOpen = useUIStore((state) => state.setNewWorktreeDialogOpen);
const [updateDialogOpen, setUpdateDialogOpen] = React.useState(false);
const [shareOpinionDialogOpen, setShareOpinionDialogOpen] = React.useState(false);
const [openSidebarMenuKey, setOpenSidebarMenuKey] = React.useState<string | null>(null);
const [renamingFolderId, setRenamingFolderId] = React.useState<string | null>(null);
const [renameFolderDraft, setRenameFolderDraft] = React.useState('');
@@ -678,36 +675,6 @@ export const SessionSidebar: React.FC<SessionSidebarProps> = ({
});
}, [t, updateStore]);
const handleOpenShareOpinionDialog = React.useCallback(() => {
setShareOpinionDialogOpen(true);
}, []);
React.useEffect(() => {
if (typeof window === 'undefined') {
return;
}
try {
if (window.localStorage.getItem(SHARE_OPINION_TOAST_STORAGE_KEY) === 'true') {
return;
}
window.localStorage.setItem(SHARE_OPINION_TOAST_STORAGE_KEY, 'true');
} catch {
// If storage is unavailable, still show once for this sidebar mount.
}
const timeoutId = window.setTimeout(() => {
toast.info(t('shareOpinion.toast.title'), {
description: t('shareOpinion.toast.description'),
action: {
label: t('shareOpinion.actions.shareOpinion'),
onClick: () => setShareOpinionDialogOpen(true),
},
duration: 12_000,
});
}, 1_000);
return () => window.clearTimeout(timeoutId);
}, [t]);
const handleOpenSettings = React.useCallback(() => {
if (mobileVariant) {
setSessionSwitcherOpen(false);
@@ -1733,16 +1700,10 @@ export const SessionSidebar: React.FC<SessionSidebarProps> = ({
onOpenShortcuts={toggleHelpDialog}
onOpenAbout={() => setAboutDialogOpen(true)}
onOpenUpdate={handleOpenUpdateDialog}
onOpenShareOpinion={handleOpenShareOpinionDialog}
showRuntimeButtons={!isVSCode}
showUpdateButton={showSidebarUpdateButton}
/>
<ShareOpinionDialog
open={shareOpinionDialogOpen}
onOpenChange={setShareOpinionDialogOpen}
/>
<UpdateDialog
open={updateDialogOpen}
onOpenChange={setUpdateDialogOpen}
@@ -9,7 +9,6 @@ type Props = {
onOpenShortcuts: () => void;
onOpenAbout: () => void;
onOpenUpdate: () => void;
onOpenShareOpinion: () => void;
showRuntimeButtons?: boolean;
showUpdateButton?: boolean;
};
@@ -21,12 +20,15 @@ export function SidebarFooter({
onOpenShortcuts,
onOpenAbout,
onOpenUpdate,
onOpenShareOpinion,
showRuntimeButtons = true,
showUpdateButton = true,
}: Props): React.ReactNode {
const { t } = useI18n();
if (!showRuntimeButtons && !showUpdateButton) {
return null;
}
return (
<div className="flex shrink-0 items-center justify-start gap-1 px-2.5 py-2">
{showRuntimeButtons ? (
@@ -67,17 +69,7 @@ export function SidebarFooter({
>
{t('sessions.sidebar.footer.actions.update')}
</Button>
) : (
<Button
type="button"
variant="default"
size="xs"
className="ml-auto border-[var(--primary-base)]/15 bg-[var(--primary-base)]/5 text-[var(--primary-base)]/60 hover:bg-[var(--primary-base)]/10 hover:text-[var(--primary-base)]/75"
onClick={onOpenShareOpinion}
>
{t('sessions.sidebar.footer.actions.shareOpinion')}
</Button>
)}
) : null}
</div>
);
}
-7
View File
@@ -22,13 +22,6 @@ export const dict = {
'pwa.installPrompt.dismiss': 'Dismiss',
'pwa.installPrompt.started': 'Install started',
'pwa.installPrompt.installed': 'OpenChamber installed',
'shareOpinion.actions.shareOpinion': 'Share opinion',
'shareOpinion.actions.bookCall': 'Book a call',
'shareOpinion.actions.shortSurvey': 'Short survey',
'shareOpinion.dialog.title': 'Share your opinion',
'shareOpinion.toast.title': 'Help shape OpenChamber',
'shareOpinion.toast.description': 'Share what is useful, confusing, or missing to help shape what comes next.',
'sessions.sidebar.footer.actions.shareOpinion': 'Share opinion',
'layout.mainTab.chat': 'Chat',
'layout.mainTab.plan': 'Plan',
'layout.mainTab.diff': 'Diff',
-7
View File
@@ -23,13 +23,6 @@ export const dict: Record<I18nKey, string> = {
"pwa.installPrompt.dismiss": "Descartar",
"pwa.installPrompt.started": "Instalación iniciada",
"pwa.installPrompt.installed": "OpenChamber se instaló",
"shareOpinion.actions.shareOpinion": "Compartir opinión",
"shareOpinion.actions.bookCall": "Reservar llamada",
"shareOpinion.actions.shortSurvey": "Encuesta breve",
"shareOpinion.dialog.title": "Comparte tu opinión",
"shareOpinion.toast.title": "Ayuda a dar forma a OpenChamber",
"shareOpinion.toast.description": "Cuenta qué es útil, confuso o falta para ayudar a definir lo que viene después.",
"sessions.sidebar.footer.actions.shareOpinion": "Compartir opinión",
"layout.mainTab.chat": "Chat",
"layout.mainTab.plan": "Plan",
"layout.mainTab.diff": "Diff",
-7
View File
@@ -22,13 +22,6 @@ export const dict = {
'pwa.installPrompt.dismiss': 'Ignorer',
'pwa.installPrompt.started': 'Installation démarrée',
'pwa.installPrompt.installed': 'OpenChamber installé',
'shareOpinion.actions.shareOpinion': 'Donner son avis',
'shareOpinion.actions.bookCall': 'Réserver un appel',
'shareOpinion.actions.shortSurvey': 'Court sondage',
'shareOpinion.dialog.title': 'Donnez votre avis',
'shareOpinion.toast.title': 'Aidez à façonner OpenChamber',
'shareOpinion.toast.description': 'Dites ce qui est utile, confus ou manquant pour aider à définir la suite.',
'sessions.sidebar.footer.actions.shareOpinion': 'Donner son avis',
'layout.mainTab.chat': 'Chat',
'layout.mainTab.plan': 'Plan',
'layout.mainTab.diff': 'Diff',
-7
View File
@@ -23,13 +23,6 @@ export const dict: Record<I18nKey, string> = {
'pwa.installPrompt.dismiss': '閉じる',
'pwa.installPrompt.started': 'インストールを開始しました',
'pwa.installPrompt.installed': 'OpenChamberをインストールしました',
'shareOpinion.actions.shareOpinion': '意見を共有',
'shareOpinion.actions.bookCall': '通話を予約',
'shareOpinion.actions.shortSurvey': '短いアンケート',
'shareOpinion.dialog.title': 'ご意見をお聞かせください',
'shareOpinion.toast.title': 'OpenChamber の次を一緒に作る',
'shareOpinion.toast.description': '便利な点、分かりにくい点、足りない点を教えて、次の方向づくりに参加してください。',
'sessions.sidebar.footer.actions.shareOpinion': '意見を共有',
'layout.mainTab.chat': 'チャット',
'layout.mainTab.plan': '計画',
'layout.mainTab.diff': '差分',
-7
View File
@@ -23,13 +23,6 @@ export const dict: Record<I18nKey, string> = {
'pwa.installPrompt.dismiss': '닫기',
'pwa.installPrompt.started': '설치가 시작되었습니다',
'pwa.installPrompt.installed': 'OpenChamber가 설치되었습니다',
'shareOpinion.actions.shareOpinion': '의견 공유',
'shareOpinion.actions.bookCall': '통화 예약',
'shareOpinion.actions.shortSurvey': '짧은 설문',
'shareOpinion.dialog.title': '의견을 공유해 주세요',
'shareOpinion.toast.title': 'OpenChamber의 방향을 함께 만들어 주세요',
'shareOpinion.toast.description': '유용한 점, 혼란스러운 점, 부족한 점을 알려 주셔서 다음 방향을 함께 만들어 주세요.',
'sessions.sidebar.footer.actions.shareOpinion': '의견 공유',
'layout.mainTab.chat': '채팅',
'layout.mainTab.plan': '계획',
'layout.mainTab.diff': '변경사항',
-7
View File
@@ -24,13 +24,6 @@ export const dict: Record<I18nKey, string> = {
'pwa.installPrompt.dismiss': 'Odrzuć',
'pwa.installPrompt.started': 'Instalacja rozpoczęta',
'pwa.installPrompt.installed': 'OpenChamber został zainstalowany',
'shareOpinion.actions.shareOpinion': 'Podziel się opinią',
'shareOpinion.actions.bookCall': 'Umów rozmowę',
'shareOpinion.actions.shortSurvey': 'Krótka ankieta',
'shareOpinion.dialog.title': 'Podziel się opinią',
'shareOpinion.toast.title': 'Pomóż kształtować OpenChamber',
'shareOpinion.toast.description': 'Powiedz, co jest przydatne, mylące albo czego brakuje, aby pomóc kształtować kolejne kroki.',
'sessions.sidebar.footer.actions.shareOpinion': 'Podziel się opinią',
'layout.mainTab.chat': 'Czat',
'layout.mainTab.plan': 'Plan',
'layout.mainTab.diff': 'Różnice',
@@ -23,13 +23,6 @@ export const dict: Record<I18nKey, string> = {
"pwa.installPrompt.dismiss": "Dispensar",
"pwa.installPrompt.started": "Instalação iniciada",
"pwa.installPrompt.installed": "OpenChamber instalado",
"shareOpinion.actions.shareOpinion": "Compartilhar opinião",
"shareOpinion.actions.bookCall": "Agendar chamada",
"shareOpinion.actions.shortSurvey": "Pesquisa breve",
"shareOpinion.dialog.title": "Compartilhe sua opinião",
"shareOpinion.toast.title": "Ajude a moldar o OpenChamber",
"shareOpinion.toast.description": "Conte o que é útil, confuso ou está faltando para ajudar a definir os próximos passos.",
"sessions.sidebar.footer.actions.shareOpinion": "Compartilhar opinião",
"layout.mainTab.chat": "Chat",
"layout.mainTab.plan": "Plano",
"layout.mainTab.diff": "Diff",
-7
View File
@@ -23,13 +23,6 @@ export const dict: Record<I18nKey, string> = {
"pwa.installPrompt.dismiss": "Сховати",
"pwa.installPrompt.started": "Установлення розпочато",
"pwa.installPrompt.installed": "OpenChamber встановлено",
"shareOpinion.actions.shareOpinion": "Поділитися думкою",
"shareOpinion.actions.bookCall": "Забронювати дзвінок",
"shareOpinion.actions.shortSurvey": "Коротке опитування",
"shareOpinion.dialog.title": "Поділіться своєю думкою",
"shareOpinion.toast.title": "Допоможіть сформувати OpenChamber",
"shareOpinion.toast.description": "Розкажіть, що корисне, незрозуміле чи відсутнє, щоб допомогти сформувати наступні кроки.",
"sessions.sidebar.footer.actions.shareOpinion": "Поділитися думкою",
"layout.mainTab.chat": "Чат",
"layout.mainTab.plan": "План",
"layout.mainTab.diff": "Diff",
@@ -23,13 +23,6 @@ export const dict: Record<I18nKey, string> = {
'pwa.installPrompt.dismiss': '忽略',
'pwa.installPrompt.started': '已开始安装',
'pwa.installPrompt.installed': 'OpenChamber 已安装',
'shareOpinion.actions.shareOpinion': '分享意见',
'shareOpinion.actions.bookCall': '预约通话',
'shareOpinion.actions.shortSurvey': '简短问卷',
'shareOpinion.dialog.title': '分享你的意见',
'shareOpinion.toast.title': '帮助塑造 OpenChamber',
'shareOpinion.toast.description': '告诉我们哪些有用、令人困惑或缺失,帮助塑造下一步。',
'sessions.sidebar.footer.actions.shareOpinion': '分享意见',
'layout.mainTab.chat': '聊天',
'layout.mainTab.plan': '计划',
'layout.mainTab.diff': '差异',
@@ -23,13 +23,6 @@ export const dict: Record<I18nKey, string> = {
'pwa.installPrompt.dismiss': '忽略',
'pwa.installPrompt.started': '已開始安裝',
'pwa.installPrompt.installed': 'OpenChamber 已安裝',
'shareOpinion.actions.shareOpinion': '分享意見',
'shareOpinion.actions.bookCall': '預約通話',
'shareOpinion.actions.shortSurvey': '簡短問卷',
'shareOpinion.dialog.title': '分享你的意見',
'shareOpinion.toast.title': '協助塑造 OpenChamber',
'shareOpinion.toast.description': '告訴我們哪些有用、令人困惑或缺少什麼,協助塑造下一步。',
'sessions.sidebar.footer.actions.shareOpinion': '分享意見',
'layout.mainTab.chat': '聊天',
'layout.mainTab.plan': '計畫',
'layout.mainTab.diff': '差異',