Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/core/analytics/analytics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
*/

import taxonomy from "./taxonomy.json"
import { isAnalyticsOptedOut } from "./preferences"

type AnalyticsTaxonomy = typeof taxonomy
type AnalyticsEventName = keyof AnalyticsTaxonomy["events"]
Expand Down Expand Up @@ -101,6 +102,7 @@ function safeSourcePage(value?: string | null): string | undefined {
}

export const isAnalyticsEnabled = (): boolean => false
export { getAnalyticsPreference, isAnalyticsOptedOut, setAnalyticsOptOut } from "./preferences"

export function detectInteractionAnalyticsAction(
signal: string,
Expand Down Expand Up @@ -132,7 +134,12 @@ export function buildAnalyticsPayload(event: AnalyticsEventName, params: Analyti
) as AnalyticsPayload
}

export function shouldTrackAnalyticsEvent(enabled = isAnalyticsEnabled(), optedOut = isAnalyticsOptedOut()): boolean {
return enabled && !optedOut
}

export function trackAllowlistedEvent(_event: AnalyticsEventName, _params: AnalyticsPayload = {}): void {
if (!shouldTrackAnalyticsEvent()) return
// No-op by design. Future providers must call buildAnalyticsPayload first.
void _event
void _params
Expand Down
21 changes: 21 additions & 0 deletions src/core/analytics/preferences.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { readStorageString, removeStorageKey, writeStorageString } from "@/core/storage/tool-persistence"

export type AnalyticsPreference = "default" | "opted_out"

const ANALYTICS_OPT_OUT_KEY = "byteflow:analytics:opt-out"

export function getAnalyticsPreference(): AnalyticsPreference {
return readStorageString(ANALYTICS_OPT_OUT_KEY) === "1" ? "opted_out" : "default"
}

export function setAnalyticsOptOut(optedOut: boolean): void {
if (optedOut) {
writeStorageString(ANALYTICS_OPT_OUT_KEY, "1")
} else {
removeStorageKey(ANALYTICS_OPT_OUT_KEY)
}
}

export function isAnalyticsOptedOut(): boolean {
return getAnalyticsPreference() === "opted_out"
}
18 changes: 17 additions & 1 deletion src/core/i18n/translations/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,23 @@
"clear_button": "Gespeicherte Tool-Daten löschen",
"cleared_one_message": "{count} gespeichertes Byteflow-Element wurde gelöscht.",
"cleared_many_message": "{count} gespeicherte Byteflow-Elemente wurden gelöscht.",
"none_found_message": "Es wurden keine gespeicherten Byteflow-Daten gefunden."
"none_found_message": "Es wurden keine gespeicherten Byteflow-Daten gefunden.",
"analytics_title": "Analytics-Status und Steuerung",
"analytics_description": "Analytics sind in dieser Laufzeit standardmaessig deaktiviert. Falls eine spaetere Bereitstellung einen Cookie-freien Aggregationsanbieter aktiviert, verhindert diese lokale Einstellung Analytics-Ereignisse aus diesem Browser.",
"analytics_status_label": "Aktueller Status",
"analytics_status_disabled": "Standardmaessig deaktiviert",
"analytics_status_enabled": "Fuer diese Bereitstellung aktiviert",
"analytics_status_opted_out": "Lokal abgemeldet",
"analytics_opt_out_label": "Analytics in diesem Browser abmelden",
"analytics_opted_out_message": "Analytics-Abmeldung in diesem Browser gespeichert.",
"analytics_default_message": "Analytics-Einstellung auf Bereitstellungsstandard zurueckgesetzt.",
"analytics_allowed_title": "Erlaubte Ereignistaxonomie",
"analytics_allowed_events": "Erlaubte Ereignisse: tool_loaded, tool_action, copy_output, download_output, search_performed, related_tool_click, pipeline_template_opened und pwa_installed.",
"analytics_allowed_fields": "Erlaubte Felder sind nur grobe Werte: Tool-ID, Related-Tool-ID, Aktionstyp, Sprache, Groessen-Bucket, Suchlaengen-Bucket, Ergebniszahl, Quellseite und Plattform.",
"analytics_never_title": "Nie Analytics-Felder",
"analytics_never_fields": "Tool-Eingaben, Ausgaben, Payloads, Tokens, JWTs, Geheimnisse, Dateinamen, Dateiinhalte, Bildinhalte, Logtexte, Hashwerte, Suchtext, vollstaendige URLs, Nutzer-IDs und Sitzungs-IDs sind verboten.",
"analytics_privacy_link": "Datenschutzrichtlinie",
"analytics_trust_link": "Vertrauenszentrum"
},
"privacy_badge": {
"label": "Browser-lokal",
Expand Down
18 changes: 17 additions & 1 deletion src/core/i18n/translations/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,23 @@
"clear_button": "Clear saved tool data",
"cleared_one_message": "Cleared {count} saved Byteflow item.",
"cleared_many_message": "Cleared {count} saved Byteflow items.",
"none_found_message": "No saved Byteflow data was found."
"none_found_message": "No saved Byteflow data was found.",
"analytics_title": "Analytics status and controls",
"analytics_description": "Analytics are disabled by default in this runtime. If a future deployment enables a cookie-free aggregate provider, this local preference prevents analytics events from being sent from this browser.",
"analytics_status_label": "Current status",
"analytics_status_disabled": "Disabled by default",
"analytics_status_enabled": "Enabled for this deployment",
"analytics_status_opted_out": "Locally opted out",
"analytics_opt_out_label": "Opt out of analytics on this browser",
"analytics_opted_out_message": "Analytics opt-out saved on this browser.",
"analytics_default_message": "Analytics preference reset to deployment default.",
"analytics_allowed_title": "Allowed event taxonomy",
"analytics_allowed_events": "Allowed events: tool_loaded, tool_action, copy_output, download_output, search_performed, related_tool_click, pipeline_template_opened, and pwa_installed.",
"analytics_allowed_fields": "Allowed fields are coarse values only: tool ID, related tool ID, action type, language, size bucket, query-length bucket, result count, source page, and platform.",
"analytics_never_title": "Never analytics fields",
"analytics_never_fields": "Tool inputs, outputs, payloads, tokens, JWTs, secrets, file names, file contents, image contents, log bodies, hash values, search text, full URLs, user IDs, and session IDs are forbidden.",
"analytics_privacy_link": "Privacy Policy",
"analytics_trust_link": "Trust Center"
},
"privacy_badge": {
"label": "Browser-local",
Expand Down
18 changes: 17 additions & 1 deletion src/core/i18n/translations/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,23 @@
"clear_button": "Effacer les données d’outils enregistrées",
"cleared_one_message": "{count} élément Byteflow enregistré a été effacé.",
"cleared_many_message": "{count} éléments Byteflow enregistrés ont été effacés.",
"none_found_message": "Aucune donnée Byteflow enregistrée n’a été trouvée."
"none_found_message": "Aucune donnée Byteflow enregistrée n’a été trouvée.",
"analytics_title": "Statut et controles analytics",
"analytics_description": "Les analytics sont desactives par defaut dans ce runtime. Si un futur deploiement active un fournisseur agrege sans cookie, cette preference locale empeche ce navigateur denvoyer des evenements analytics.",
"analytics_status_label": "Statut actuel",
"analytics_status_disabled": "Desactive par defaut",
"analytics_status_enabled": "Active pour ce deploiement",
"analytics_status_opted_out": "Desactive localement",
"analytics_opt_out_label": "Se desinscrire des analytics sur ce navigateur",
"analytics_opted_out_message": "Desinscription analytics enregistree sur ce navigateur.",
"analytics_default_message": "Preference analytics retablie au defaut du deploiement.",
"analytics_allowed_title": "Taxonomie devenements autorisee",
"analytics_allowed_events": "Evenements autorises : tool_loaded, tool_action, copy_output, download_output, search_performed, related_tool_click, pipeline_template_opened et pwa_installed.",
"analytics_allowed_fields": "Les champs autorises sont seulement grossiers : ID outil, ID outil lie, type daction, langue, bucket de taille, bucket de longueur de requete, nombre de resultats, page source et plateforme.",
"analytics_never_title": "Jamais dans les analytics",
"analytics_never_fields": "Entrees doutils, sorties, payloads, tokens, JWT, secrets, noms de fichiers, contenus de fichiers, contenus dimages, corps de logs, hashes, texte de recherche, URL completes, ID utilisateur et ID de session sont interdits.",
"analytics_privacy_link": "Politique de confidentialite",
"analytics_trust_link": "Centre de confiance"
},
"privacy_badge": {
"label": "Local au navigateur",
Expand Down
18 changes: 17 additions & 1 deletion src/core/i18n/translations/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,23 @@
"clear_button": "保存済みツールデータをクリア",
"cleared_one_message": "保存済み Byteflow 項目を {count} 件クリアしました。",
"cleared_many_message": "保存済み Byteflow 項目を {count} 件クリアしました。",
"none_found_message": "保存済み Byteflow データは見つかりませんでした。"
"none_found_message": "保存済み Byteflow データは見つかりませんでした。",
"analytics_title": "分析の状態とコントロール",
"analytics_description": "この実行環境では分析は既定で無効です。将来 Cookie なしの集計プロバイダーを有効にした場合でも、このローカル設定によりこのブラウザーから分析イベントを送信しません。",
"analytics_status_label": "現在の状態",
"analytics_status_disabled": "既定で無効",
"analytics_status_enabled": "このデプロイで有効",
"analytics_status_opted_out": "ローカルでオプトアウト済み",
"analytics_opt_out_label": "このブラウザーで分析をオプトアウト",
"analytics_opted_out_message": "このブラウザーに分析オプトアウトを保存しました。",
"analytics_default_message": "分析設定をデプロイ既定値に戻しました。",
"analytics_allowed_title": "許可されるイベント分類",
"analytics_allowed_events": "許可イベント: tool_loaded、tool_action、copy_output、download_output、search_performed、related_tool_click、pipeline_template_opened、pwa_installed。",
"analytics_allowed_fields": "許可フィールドは粗い値のみです: tool ID、related tool ID、action type、language、size bucket、query-length bucket、result count、source page、platform。",
"analytics_never_title": "分析に含めないフィールド",
"analytics_never_fields": "ツール入力、出力、payload、token、JWT、secret、ファイル名、ファイル内容、画像内容、ログ本文、ハッシュ値、検索テキスト、完全な URL、ユーザー ID、セッション ID は禁止です。",
"analytics_privacy_link": "プライバシーポリシー",
"analytics_trust_link": "信頼センター"
},
"privacy_badge": {
"label": "ブラウザローカル",
Expand Down
18 changes: 17 additions & 1 deletion src/core/i18n/translations/ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,23 @@
"clear_button": "저장된 도구 데이터 지우기",
"cleared_one_message": "저장된 Byteflow 항목 {count}개를 지웠습니다.",
"cleared_many_message": "저장된 Byteflow 항목 {count}개를 지웠습니다.",
"none_found_message": "저장된 Byteflow 데이터를 찾을 수 없습니다."
"none_found_message": "저장된 Byteflow 데이터를 찾을 수 없습니다.",
"analytics_title": "분석 상태 및 제어",
"analytics_description": "이 런타임에서는 분석이 기본적으로 비활성화되어 있습니다. 향후 쿠키 없는 집계 제공자가 활성화되더라도 이 로컬 설정은 이 브라우저에서 분석 이벤트 전송을 막습니다.",
"analytics_status_label": "현재 상태",
"analytics_status_disabled": "기본적으로 비활성화",
"analytics_status_enabled": "이 배포에서 활성화됨",
"analytics_status_opted_out": "로컬에서 옵트아웃됨",
"analytics_opt_out_label": "이 브라우저에서 분석 옵트아웃",
"analytics_opted_out_message": "이 브라우저에 분석 옵트아웃을 저장했습니다.",
"analytics_default_message": "분석 설정을 배포 기본값으로 되돌렸습니다.",
"analytics_allowed_title": "허용 이벤트 분류",
"analytics_allowed_events": "허용 이벤트: tool_loaded, tool_action, copy_output, download_output, search_performed, related_tool_click, pipeline_template_opened, pwa_installed.",
"analytics_allowed_fields": "허용 필드는 거친 값뿐입니다: tool ID, related tool ID, action type, language, size bucket, query-length bucket, result count, source page, platform.",
"analytics_never_title": "분석에 포함하지 않는 필드",
"analytics_never_fields": "도구 입력, 출력, payload, token, JWT, secret, 파일 이름, 파일 내용, 이미지 내용, 로그 본문, 해시값, 검색 텍스트, 전체 URL, 사용자 ID, 세션 ID는 금지됩니다.",
"analytics_privacy_link": "개인정보 처리방침",
"analytics_trust_link": "신뢰 센터"
},
"privacy_badge": {
"label": "브라우저 로컬",
Expand Down
18 changes: 17 additions & 1 deletion src/core/i18n/translations/zh-CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,23 @@
"clear_button": "清除已保存的工具数据",
"cleared_one_message": "已清除 {count} 条保存的 Byteflow 项目。",
"cleared_many_message": "已清除 {count} 条保存的 Byteflow 项目。",
"none_found_message": "未找到已保存的 Byteflow 数据。"
"none_found_message": "未找到已保存的 Byteflow 数据。",
"analytics_title": "分析状态和控制",
"analytics_description": "当前运行时默认禁用分析。如果未来部署启用无 Cookie 聚合提供方,此本地偏好会阻止此浏览器发送分析事件。",
"analytics_status_label": "当前状态",
"analytics_status_disabled": "默认禁用",
"analytics_status_enabled": "此部署已启用",
"analytics_status_opted_out": "已在本地退出",
"analytics_opt_out_label": "在此浏览器退出分析",
"analytics_opted_out_message": "已在此浏览器保存分析退出设置。",
"analytics_default_message": "分析偏好已恢复为部署默认值。",
"analytics_allowed_title": "允许的事件分类",
"analytics_allowed_events": "允许事件:tool_loaded、tool_action、copy_output、download_output、search_performed、related_tool_click、pipeline_template_opened 和 pwa_installed。",
"analytics_allowed_fields": "允许字段仅为粗粒度值:工具 ID、相关工具 ID、操作类型、语言、大小分桶、查询长度分桶、结果数、来源页面和平台。",
"analytics_never_title": "永不进入分析的字段",
"analytics_never_fields": "工具输入、输出、payload、token、JWT、密钥、文件名、文件内容、图片内容、日志正文、哈希值、搜索文本、完整 URL、用户 ID 和会话 ID 均被禁止。",
"analytics_privacy_link": "隐私政策",
"analytics_trust_link": "信任中心"
},
"privacy_badge": {
"label": "浏览器本地",
Expand Down
18 changes: 17 additions & 1 deletion src/core/i18n/translations/zh-TW.json
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,23 @@
"clear_button": "清除已保存的工具資料",
"cleared_one_message": "已清除 {count} 筆保存的 Byteflow 項目。",
"cleared_many_message": "已清除 {count} 筆保存的 Byteflow 項目。",
"none_found_message": "未找到已保存的 Byteflow 資料。"
"none_found_message": "未找到已保存的 Byteflow 資料。",
"analytics_title": "分析狀態和控制",
"analytics_description": "目前執行階段預設停用分析。如果未來部署啟用無 Cookie 聚合提供者,此本機偏好會阻止此瀏覽器傳送分析事件。",
"analytics_status_label": "目前狀態",
"analytics_status_disabled": "預設停用",
"analytics_status_enabled": "此部署已啟用",
"analytics_status_opted_out": "已在本機退出",
"analytics_opt_out_label": "在此瀏覽器退出分析",
"analytics_opted_out_message": "已在此瀏覽器儲存分析退出設定。",
"analytics_default_message": "分析偏好已恢復為部署預設值。",
"analytics_allowed_title": "允許的事件分類",
"analytics_allowed_events": "允許事件:tool_loaded、tool_action、copy_output、download_output、search_performed、related_tool_click、pipeline_template_opened 和 pwa_installed。",
"analytics_allowed_fields": "允許欄位僅為粗粒度值:工具 ID、相關工具 ID、操作類型、語言、大小分桶、查詢長度分桶、結果數、來源頁面和平台。",
"analytics_never_title": "永不進入分析的欄位",
"analytics_never_fields": "工具輸入、輸出、payload、token、JWT、密鑰、檔名、檔案內容、圖片內容、日誌本文、雜湊值、搜尋文字、完整 URL、使用者 ID 和工作階段 ID 均被禁止。",
"analytics_privacy_link": "隱私權政策",
"analytics_trust_link": "信任中心"
},
"privacy_badge": {
"label": "瀏覽器本地",
Expand Down
Loading