Compare commits

...

2 Commits

Author SHA1 Message Date
CrescentLeaf
376177d78e rename: (User -> My)ProfileDialog 2025-10-03 12:49:28 +08:00
CrescentLeaf
6c9ee005fd fix: 橫豎屏切換 resize 時的大小不當
* 橫屏時, 測試 Via 瀏覽器時 可能是因為全屏不當, 大小不正確, 也因此需要手動縮小, 繼續切豎屏正常
2025-10-03 12:47:19 +08:00
4 changed files with 54 additions and 59 deletions

View File

@@ -26,13 +26,13 @@ import AppMobile from './ui/AppMobile.tsx'
import isMobileUI from "./ui/isMobileUI.ts" import isMobileUI from "./ui/isMobileUI.ts"
ReactDOM.createRoot(document.getElementById('app') as HTMLElement).render(React.createElement(isMobileUI() ? AppMobile : App, null)) ReactDOM.createRoot(document.getElementById('app') as HTMLElement).render(React.createElement(isMobileUI() ? AppMobile : App, null))
const onResize = () => { const onResize = () => setTimeout(() => {
document.body.style.setProperty('--whitesilk-widget-message-maxwidth', breakpoint().down('md') ? "80%" : "70%") document.body.style.setProperty('--whitesilk-widget-message-maxwidth', breakpoint().down('md') ? "80%" : "70%")
// deno-lint-ignore no-window // deno-lint-ignore no-window
document.body.style.setProperty('--whitesilk-window-width', window.innerWidth + 'px') document.body.style.setProperty('--whitesilk-window-width', window.screen.availWidth + 'px')
// deno-lint-ignore no-window // deno-lint-ignore no-window
document.body.style.setProperty('--whitesilk-window-height', window.innerHeight + 'px') document.body.style.setProperty('--whitesilk-window-height', window.screen.availHeight + 'px')
} }, 100)
// deno-lint-ignore no-window no-window-prefix // deno-lint-ignore no-window no-window-prefix
window.addEventListener('resize', onResize) window.addEventListener('resize', onResize)
onResize() onResize()

View File

@@ -14,7 +14,7 @@ import { checkApiSuccessOrSncakbar } from "./snackbar.ts"
import RegisterDialog from "./dialog/RegisterDialog.tsx" import RegisterDialog from "./dialog/RegisterDialog.tsx"
import LoginDialog from "./dialog/LoginDialog.tsx" import LoginDialog from "./dialog/LoginDialog.tsx"
import UserProfileDialog from "./dialog/UserProfileDialog.tsx" import MyProfileDialog from "./dialog/MyProfileDialog.tsx"
import ContactsList from "./main/ContactsList.tsx" import ContactsList from "./main/ContactsList.tsx"
import RecentsList from "./main/RecentsList.tsx" import RecentsList from "./main/RecentsList.tsx"
import useAsyncEffect from "./useAsyncEffect.ts" import useAsyncEffect from "./useAsyncEffect.ts"
@@ -52,10 +52,10 @@ export default function App() {
const registerInputNickNameRef = React.useRef<TextField>(null) const registerInputNickNameRef = React.useRef<TextField>(null)
const registerInputPasswordRef = React.useRef<TextField>(null) const registerInputPasswordRef = React.useRef<TextField>(null)
const userProfileDialogRef = React.useRef<Dialog>(null) const myProfileDialogRef = React.useRef<Dialog>(null)
const openMyUserProfileDialogButtonRef = React.useRef<HTMLElement>(null) const openMyProfileDialogButtonRef = React.useRef<HTMLElement>(null)
useEventListener(openMyUserProfileDialogButtonRef, 'click', (_event) => { useEventListener(openMyProfileDialogButtonRef, 'click', (_event) => {
userProfileDialogRef.current!.open = true myProfileDialogRef.current!.open = true
}) })
const addContactDialogRef = React.useRef<Dialog>(null) const addContactDialogRef = React.useRef<Dialog>(null)
@@ -112,8 +112,8 @@ export default function App() {
loginInputAccountRef={loginInputAccountRef} loginInputAccountRef={loginInputAccountRef}
loginInputPasswordRef={loginInputPasswordRef} /> loginInputPasswordRef={loginInputPasswordRef} />
<UserProfileDialog <MyProfileDialog
userProfileDialogRef={userProfileDialogRef as any} myProfileDialogRef={myProfileDialogRef as any}
user={myUserProfileCache} /> user={myUserProfileCache} />
<ChatInfoDialog <ChatInfoDialog
@@ -129,7 +129,7 @@ export default function App() {
<mdui-navigation-rail contained value="Recents" ref={navigationRailRef}> <mdui-navigation-rail contained value="Recents" ref={navigationRailRef}>
<mdui-button-icon slot="top"> <mdui-button-icon slot="top">
<Avatar src={myUserProfileCache?.avatar} text={myUserProfileCache?.nickname} avatarRef={openMyUserProfileDialogButtonRef} /> <Avatar src={myUserProfileCache?.avatar} text={myUserProfileCache?.nickname} avatarRef={openMyProfileDialogButtonRef} />
</mdui-button-icon> </mdui-button-icon>
<mdui-navigation-rail-item icon="watch_later--outlined" active-icon="watch_later--filled" value="Recents"></mdui-navigation-rail-item> <mdui-navigation-rail-item icon="watch_later--outlined" active-icon="watch_later--filled" value="Recents"></mdui-navigation-rail-item>

View File

@@ -13,7 +13,7 @@ import { checkApiSuccessOrSncakbar } from "./snackbar.ts"
import RegisterDialog from "./dialog/RegisterDialog.tsx" import RegisterDialog from "./dialog/RegisterDialog.tsx"
import LoginDialog from "./dialog/LoginDialog.tsx" import LoginDialog from "./dialog/LoginDialog.tsx"
import UserProfileDialog from "./dialog/UserProfileDialog.tsx" import MyProfileDialog from "./dialog/MyProfileDialog.tsx"
import ContactsList from "./main/ContactsList.tsx" import ContactsList from "./main/ContactsList.tsx"
import RecentsList from "./main/RecentsList.tsx" import RecentsList from "./main/RecentsList.tsx"
import useAsyncEffect from "./useAsyncEffect.ts" import useAsyncEffect from "./useAsyncEffect.ts"
@@ -51,10 +51,10 @@ export default function AppMobile() {
const registerInputNickNameRef = React.useRef<TextField>(null) const registerInputNickNameRef = React.useRef<TextField>(null)
const registerInputPasswordRef = React.useRef<TextField>(null) const registerInputPasswordRef = React.useRef<TextField>(null)
const userProfileDialogRef = React.useRef<Dialog>(null) const myProfileDialogRef = React.useRef<Dialog>(null)
const openMyUserProfileDialogButtonRef = React.useRef<HTMLElement>(null) const openMyProfileDialogButtonRef = React.useRef<HTMLElement>(null)
useEventListener(openMyUserProfileDialogButtonRef, 'click', (_event) => { useEventListener(openMyProfileDialogButtonRef, 'click', (_event) => {
userProfileDialogRef.current!.open = true myProfileDialogRef.current!.open = true
}) })
const addContactDialogRef = React.useRef<Dialog>(null) const addContactDialogRef = React.useRef<Dialog>(null)
@@ -131,8 +131,8 @@ export default function AppMobile() {
loginInputAccountRef={loginInputAccountRef} loginInputAccountRef={loginInputAccountRef}
loginInputPasswordRef={loginInputPasswordRef} /> loginInputPasswordRef={loginInputPasswordRef} />
<UserProfileDialog <MyProfileDialog
userProfileDialogRef={userProfileDialogRef as any} myProfileDialogRef={myProfileDialogRef as any}
user={myUserProfileCache} /> user={myUserProfileCache} />
<ChatInfoDialog <ChatInfoDialog
@@ -164,7 +164,7 @@ export default function AppMobile() {
}}></div> }}></div>
<mdui-button-icon icon="settings"></mdui-button-icon> <mdui-button-icon icon="settings"></mdui-button-icon>
<mdui-button-icon> <mdui-button-icon>
<Avatar src={myUserProfileCache?.avatar} text={myUserProfileCache?.nickname} avatarRef={openMyUserProfileDialogButtonRef} /> <Avatar src={myUserProfileCache?.avatar} text={myUserProfileCache?.nickname} avatarRef={openMyProfileDialogButtonRef} />
</mdui-button-icon> </mdui-button-icon>
</mdui-top-app-bar> </mdui-top-app-bar>
{ {

View File

@@ -10,12 +10,12 @@ import Avatar from "../Avatar.tsx"
import User from "../../api/client_data/User.ts" import User from "../../api/client_data/User.ts"
interface Refs { interface Refs {
userProfileDialogRef: React.MutableRefObject<Dialog> myProfileDialogRef: React.MutableRefObject<Dialog>
user: User user: User
} }
export default function UserProfileDialog({ export default function MyProfileDialog({
userProfileDialogRef, myProfileDialogRef,
user user
}: Refs) { }: Refs) {
const isMySelf = Client.myUserProfile?.id == user?.id const isMySelf = Client.myUserProfile?.id == user?.id
@@ -47,7 +47,7 @@ export default function UserProfileDialog({
{ {
// 公用 - 資料卡 // 公用 - 資料卡
} }
<mdui-dialog close-on-overlay-click close-on-esc ref={userProfileDialogRef}> <mdui-dialog close-on-overlay-click close-on-esc ref={myProfileDialogRef}>
<div style={{ <div style={{
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
@@ -66,41 +66,36 @@ export default function UserProfileDialog({
}}></mdui-divider> }}></mdui-divider>
<mdui-list> <mdui-list>
{!isMySelf && <mdui-list-item icon="edit" rounded></mdui-list-item>} <mdui-list-item icon="edit" rounded onClick={() => userProfileEditDialogRef.current!.open = true}></mdui-list-item>
{ {/*
isMySelf && <> <mdui-list-item icon="settings" rounded></mdui-list-item>
<mdui-list-item icon="edit" rounded onClick={() => userProfileEditDialogRef.current!.open = true}></mdui-list-item> <mdui-list-item icon="lock" rounded></mdui-list-item>
{/* */}
<mdui-list-item icon="settings" rounded></mdui-list-item> <mdui-divider style={{
<mdui-list-item icon="lock" rounded></mdui-list-item> marginTop: "10px",
*/} marginBottom: "10px",
<mdui-divider style={{ }}></mdui-divider>
marginTop: "10px", <mdui-list-item icon="logout" rounded onClick={() => dialog({
marginBottom: "10px", headline: "退出登錄",
}}></mdui-divider> description: "確定要退出登錄嗎? (若您的賬號未設定 用戶名, 請無務必複製 用戶 ID, 以免丟失賬號!)",
<mdui-list-item icon="logout" rounded onClick={() => dialog({ actions: [
headline: "退出登錄", {
description: "確定要退出登錄嗎? (若您的賬號未設定 用戶名, 請無務必複製 用戶 ID, 以免丟失賬號!)", text: "取消",
actions: [ onClick: () => {
{ return true
text: "取消", },
onClick: () => { },
return true {
}, text: "確定",
}, onClick: () => {
{ data.access_token = ''
text: "確定", data.apply()
onClick: () => { location.reload()
data.access_token = '' return true
data.apply() },
location.reload() }
return true ],
}, })}>退</mdui-list-item>
}
],
})}>退</mdui-list-item>
</>
}
</mdui-list> </mdui-list>
</mdui-dialog> </mdui-dialog>
{ {