Files
im_webapp/umd/331.prod.js
T
Your NameandClaude Sonnet 5 eb4c1cd8da 用登录页现有logo重新生成PWA图标/favicon/OG分享图;顺手发现并重建了严重过期的生产构建产物
图标部分:logo.svg/logo96.png/logo192.png/logo32x32.png/logo32x32a.png原来画的是开源Tinode
项目自己的蓝绿橙"t"speech-bubble标志。用登录页AppMark组件的真实CSS参数(白色圆角方卡 + 旋转
-18deg的蓝色squircle + 加粗白色首字母,色值#1677ff,圆角50% 50% 50% 18%)原样重新画成独立
的SVG/PNG资源,不是另起一套新设计——文字/图标/圆角比例/旋转角度均按登录页实测的computed style
数值1:1还原。favicon(32x32)的"未读"变体(右下角绿点)沿用原有的visual language。

og-logo.jpeg(社交分享预览图,og:image meta标签用)问题比图标本身更明显:原图整个背景是金门大桥
照片,前景写着"Tinode / Open Source Instant Messenger",这两行文字是本次engagement里最直接的
一处Tinode品牌泄漏(没有隐藏在代码里,链接分享出去别人就直接看到)。改成深色渐变背景+同一套
logo mark+"MeetingIM"+"即时通讯",不再引用任何第三方项目的名字或素材。

意外发现:umd/index.prod.js(生产构建产物,index.html的<script>直接引用)从很早之前就没有
重新构建过,仍然包含"TinodeWeb"/"web.tinode.co"/tinode.co的隐私政策与服务条款链接/
support@tinode.co邮箱等一整套本轮及更早各轮已经在源码里修掉的Tinode字样——如果这份产物被
原样部署,之前所有品牌清理都不会真正体现在生产环境。已用`npm run build:prod`重新构建(干净
通过,只有两条跟本次改动无关的资源体积警告),确认重建后的产物里"MeetingIM"正确替换了旧品牌名、
真实域名替换了tinode.co。这次只重新生成了产物文件,没有执行任何部署动作。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-05 23:30:11 +08:00

2 lines
9.8 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use strict";(self.webpackChunktinode_webapp=self.webpackChunktinode_webapp||[]).push([[331],{6331:function(e,s,i){i.r(s);var t=i(1594),n=i.n(t),a=i(8181),o=i(3207),l=i(2514),d=i(9022),r=i(4848);const c=(0,a.defineMessages)({delete_account:{id:"delete_account",defaultMessage:"Delete account",description:"Title for delete account warning"},delete_account_warning:{id:"delete_account_warning",defaultMessage:"Are you sure you want to delete your account? It cannot be undone.",description:"Warning message when deleting an account"}});class h extends n().Component{constructor(e){super(e);const s=this.props.tinode.getMeTopic();let i=0;s.contacts(e=>{e.acs&&!e.acs.isJoiner()&&i++});const t=s.getDefaultAccess();this.state={auth:t?t.auth:null,anon:t?t.anon:null,showPermissionEditorFor:void 0,blockedCount:i},this.handlePasswordUpdate=this.handlePasswordUpdate.bind(this),this.handleLaunchPermissionsEditor=this.handleLaunchPermissionsEditor.bind(this),this.handleHidePermissionsEditor=this.handleHidePermissionsEditor.bind(this),this.handlePermissionsChanged=this.handlePermissionsChanged.bind(this),this.handleDeleteAccount=this.handleDeleteAccount.bind(this),this.handleCheckboxClick=this.handleCheckboxClick.bind(this)}handlePasswordUpdate(e){this.setState({password:e}),this.props.onUpdatePassword(e)}handleLaunchPermissionsEditor(e){this.setState({showPermissionEditorFor:e,editedPermissions:this.state[e]})}handleHidePermissionsEditor(){this.setState({showPermissionEditorFor:void 0})}handlePermissionsChanged(e){let s={};s[this.state.showPermissionEditorFor]=e,this.props.onUpdateAccountDesc("me",void 0,void 0,s);let i={showPermissionEditorFor:void 0};i[this.state.showPermissionEditorFor]=e,this.setState(i)}handleCheckboxClick(e,s){this.props.onToggleIncognitoMode(s)}handleDeleteAccount(e){e.preventDefault();const{formatMessage:s}=this.props.intl;this.props.onShowAlert(s(c.delete_account),s(c.delete_account_warning),e=>this.props.onDeleteAccount(),null,!0,null)}render(){return(0,r.jsx)(r.Fragment,{children:this.state.showPermissionEditorFor?(0,r.jsx)(d.A,{mode:this.state.editedPermissions,skip:"O",onSubmit:this.handlePermissionsChanged,onCancel:this.handleHidePermissionsEditor}):(0,r.jsxs)("div",{className:"scrollable-panel",children:[(0,r.jsxs)("div",{className:"panel-form-column",children:[(0,r.jsx)("label",{className:"small",children:(0,r.jsx)(a.FormattedMessage,{id:"label_password",defaultMessage:"Password",description:"Label for password editing"})}),(0,r.jsx)("div",{children:(0,r.jsx)(a.FormattedMessage,{id:"password_unchanged_prompt",defaultMessage:"Unchanged",description:"Message in editor while password is unchanged",children:e=>(0,r.jsx)(l.A,{placeholder:e,type:"password",onFinished:this.handlePasswordUpdate})})})]}),(0,r.jsx)("div",{className:"hr"}),(0,r.jsxs)("div",{className:"panel-form-row",children:[(0,r.jsx)("label",{htmlFor:"incognito-mode",children:(0,r.jsx)(a.FormattedMessage,{id:"label_incognito_mode",defaultMessage:"Incognito mode:",description:"Label for incognito mode toggle"})}),(0,r.jsx)(o.A,{name:"incognito",id:"incognito-mode",checked:this.props.incognitoMode,onChange:this.handleCheckboxClick})]}),(0,r.jsx)("div",{className:"panel-form-row",children:(0,r.jsx)("span",{className:"small gray",children:(0,r.jsx)(a.FormattedMessage,{id:"incognito_mode_description",defaultMessage:"Hide your online status and typing indicators.",description:"Description for incognito mode toggle"})})}),(0,r.jsx)("div",{className:"hr"}),(0,r.jsxs)("div",{className:"panel-form-column security-product-links",children:[(0,r.jsxs)("button",{type:"button",className:"flat-button",onClick:()=>this.props.onNavigate("realname"),children:[(0,r.jsx)("i",{className:"material-icons",children:"verified_user"}),(0,r.jsx)("span",{children:"实名认证"}),(0,r.jsx)("i",{className:"material-icons trailing",children:"chevron_right"})]}),(0,r.jsxs)("button",{type:"button",className:"flat-button",onClick:()=>this.props.onNavigate("identity-check"),children:[(0,r.jsx)("i",{className:"material-icons",children:"phonelink_lock"}),(0,r.jsx)("span",{children:"身份验证"}),(0,r.jsx)("i",{className:"material-icons trailing",children:"chevron_right"})]}),(0,r.jsxs)("button",{type:"button",className:"flat-button",onClick:()=>this.props.onNavigate("independent-password"),children:[(0,r.jsx)("i",{className:"material-icons",children:"password"}),(0,r.jsx)("span",{children:"设置独立密码"}),(0,r.jsx)("i",{className:"material-icons trailing",children:"chevron_right"})]})]}),(0,r.jsx)("div",{className:"hr"}),(0,r.jsxs)("div",{className:"panel-form-column",children:[(0,r.jsxs)("a",{href:"#",className:"danger flat-button",onClick:e=>{e.preventDefault(),this.props.onLogout()},children:[(0,r.jsx)("i",{className:"material-icons",children:"exit_to_app"}),"  ",(0,r.jsx)(a.FormattedMessage,{id:"button_logout",defaultMessage:"Logout",description:"Button [Logout]"})]}),(0,r.jsxs)("a",{href:"#",className:"danger flat-button",onClick:e=>{this.handleDeleteAccount(e)},children:[(0,r.jsx)("i",{className:"material-icons",children:"delete"}),"  ",(0,r.jsx)(a.FormattedMessage,{id:"button_delete_account",defaultMessage:"Delete account",description:"Button [Delete account]"})]})]}),(0,r.jsx)("div",{className:"hr"}),(0,r.jsxs)("div",{className:"panel-form-column",children:[(0,r.jsx)("div",{children:(0,r.jsx)("label",{className:"small",children:(0,r.jsx)(a.FormattedMessage,{id:"label_default_access_mode",defaultMessage:"Default access mode:",description:"Label for default access mode"})})}),(0,r.jsxs)("div",{className:"quoted",children:[(0,r.jsxs)("div",{children:["Auth: ",(0,r.jsx)("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"auth"),children:this.state.auth})]}),(0,r.jsxs)("div",{children:["Anon: ",(0,r.jsx)("tt",{className:"clickable",onClick:this.handleLaunchPermissionsEditor.bind(this,"anon"),children:this.state.anon})]})]})]}),this.state.blockedCount>0?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"hr"}),(0,r.jsxs)("div",{className:"panel-form-row",children:[(0,r.jsx)("i",{className:"material-icons",children:"block"})," ",(0,r.jsx)("a",{href:"#",className:"gray",onClick:e=>{e.preventDefault(),this.props.onShowBlocked()},children:(0,r.jsx)(a.FormattedMessage,{id:"blocked_contacts_link",defaultMessage:"Blocked contacts ({count})",values:{count:this.state.blockedCount},description:"Blocked contacts link"})})]})]}):null]})})}}s.default=(0,a.injectIntl)(h)},9022:function(e,s,i){var t=i(1594),n=i.n(t),a=i(8181),o=i(3207),l=i(1974),d=i(7981),r=i(4848);const c=(0,a.defineMessages)({joiner:{id:"permission_join",defaultMessage:"Join ({val})",description:"Name of J permission"},reader:{id:"permission_read",defaultMessage:"Read ({val})",description:"Name of R permission"},writer:{id:"permission_write",defaultMessage:"Write ({val})",description:"Name of W permission"},preser:{id:"permission_pres",defaultMessage:"Get notified ({val})",description:"Name of P permission"},approver:{id:"permission_admin",defaultMessage:"Approve ({val})",description:"Name of A permission"},sharer:{id:"permission_share",defaultMessage:"Share ({val})",description:"Name of S permission"},deleter:{id:"permission_delete",defaultMessage:"Delete ({val})",description:"Name of D permission"},owner:{id:"permission_owner",defaultMessage:"Owner ({val})",description:"Name of O permission"}});class h extends n().Component{constructor(e){super(e),this.state={mode:(e.mode||"").replace("N","")},this.handleChange=this.handleChange.bind(this),this.handleSubmit=this.handleSubmit.bind(this),this.handleCancel=this.handleCancel.bind(this)}handleChange(e){let s=this.state.mode;-1==s.indexOf(e)?s+=e:s=s.replace(e,""),this.setState({mode:s})}handleSubmit(){const e=(this.state.mode||"N").split("").sort().join("");e!==(this.props.mode||"N").split("").sort().join("")?this.props.onSubmit(e):this.props.onCancel()}handleCancel(){this.props.onCancel()}render(){const{formatMessage:e}=this.props.intl,s={J:e(c.joiner,{val:"J"}),R:e(c.reader,{val:"R"}),W:e(c.writer,{val:"W"}),P:e(c.preser,{val:"P"}),A:e(c.approver,{val:"A"}),S:e(c.sharer,{val:"S"}),D:e(c.deleter,{val:"D"}),O:e(c.owner,{val:"O"})};let i=this.props.skip||"",t=this.state.mode,n=(this.props.compare||"").replace("N",""),h=[];for(let e=0;e<8;e++){let a="JRWPASDO".charAt(e);i.indexOf(a)>=0&&t.indexOf(a)<0||h.push((0,r.jsxs)("tr",{children:[(0,r.jsx)("td",{children:s[a]}),(0,r.jsx)("td",{className:"checkbox",children:i.indexOf(a)<0?(0,r.jsx)(o.A,{name:a,checked:t.indexOf(a)>=0,onChange:this.handleChange}):(0,r.jsx)(o.A,{name:a,checked:t.indexOf(a)>=0})}),this.props.compare?(0,r.jsx)("td",{className:"checkbox",children:(0,r.jsx)(o.A,{name:a,checked:n.indexOf(a)>=0})}):null]},a))}return(0,r.jsxs)("div",{className:"panel-form-column",children:[this.props.userTitle?(0,r.jsx)("ul",{className:"contact-box small",children:(0,r.jsx)(l.A,{tinode:this.props.tinode,item:this.props.item,title:this.props.userTitle,small:!0,avatar:(0,d.to)(this.props.userAvatar?this.props.userAvatar:null)})}):null,(0,r.jsx)("label",{className:"small",children:(0,r.jsx)(a.FormattedMessage,{id:"title_permissions",defaultMessage:"Permissions",description:"Section title"})}),(0,r.jsxs)("table",{className:"permission-editor",children:[this.props.compare?(0,r.jsx)("thead",{children:(0,r.jsxs)("tr",{children:[(0,r.jsx)("th",{}),(0,r.jsx)("th",{children:this.props.modeTitle}),(0,r.jsx)("th",{children:this.props.compareTitle})]})}):null,(0,r.jsx)("tbody",{children:h})]}),(0,r.jsx)("br",{}),(0,r.jsxs)("div",{className:"dialog-buttons",children:[(0,r.jsx)("button",{className:"outline",onClick:this.handleCancel,children:(0,r.jsx)(a.FormattedMessage,{id:"button_cancel",defaultMessage:"Cancel",description:"Button [Cancel]"})}),(0,r.jsx)("button",{className:"primary",onClick:this.handleSubmit,children:(0,r.jsx)(a.FormattedMessage,{id:"button_ok",defaultMessage:"OK",description:"Button [OK]"})})]})]})}}s.A=(0,a.injectIntl)(h)}}]);
//# sourceMappingURL=331.prod.js.map