aboutsummaryrefslogtreecommitdiff
path: root/Timeline/ClientApp/src
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2020-09-01 02:32:06 +0800
committercrupest <crupest@outlook.com>2020-09-01 02:32:06 +0800
commitaa89b6cce7701a57b0c377d938788b4c940013d6 (patch)
treeae95cb16698439ac825eb1d692ce14125b625ecb /Timeline/ClientApp/src
parentc3e95a6cd7322c644159eed6350a20dfd1a002ff (diff)
downloadtimeline-aa89b6cce7701a57b0c377d938788b4c940013d6.tar.gz
timeline-aa89b6cce7701a57b0c377d938788b4c940013d6.tar.bz2
timeline-aa89b6cce7701a57b0c377d938788b4c940013d6.zip
...
Diffstat (limited to 'Timeline/ClientApp/src')
-rw-r--r--Timeline/ClientApp/src/app/App.tsx24
-rw-r--r--Timeline/ClientApp/src/app/index.sass14
-rw-r--r--Timeline/ClientApp/src/app/service-worker.tsx2
-rw-r--r--Timeline/ClientApp/src/app/services/DataHub.ts (renamed from Timeline/ClientApp/src/app/data/DataHub.ts)0
-rw-r--r--Timeline/ClientApp/src/app/services/alert.ts (renamed from Timeline/ClientApp/src/app/common/alert-service.ts)0
-rw-r--r--Timeline/ClientApp/src/app/services/common.ts (renamed from Timeline/ClientApp/src/app/data/common.ts)2
-rw-r--r--Timeline/ClientApp/src/app/services/timeline.ts (renamed from Timeline/ClientApp/src/app/data/timeline.ts)16
-rw-r--r--Timeline/ClientApp/src/app/services/user.ts (renamed from Timeline/ClientApp/src/app/data/user.ts)15
-rw-r--r--Timeline/ClientApp/src/app/timeline/timeline-ui.sass35
-rw-r--r--Timeline/ClientApp/src/app/utilities/type.ts1
-rw-r--r--Timeline/ClientApp/src/app/views/about/about.sass (renamed from Timeline/ClientApp/src/app/about/about.sass)0
-rw-r--r--Timeline/ClientApp/src/app/views/about/author-avatar.png (renamed from Timeline/ClientApp/src/app/about/author-avatar.png)bin12038 -> 12038 bytes
-rw-r--r--Timeline/ClientApp/src/app/views/about/github.png (renamed from Timeline/ClientApp/src/app/about/github.png)bin4268 -> 4268 bytes
-rw-r--r--Timeline/ClientApp/src/app/views/about/index.tsx (renamed from Timeline/ClientApp/src/app/about/About.tsx)4
-rw-r--r--Timeline/ClientApp/src/app/views/admin/Admin.tsx (renamed from Timeline/ClientApp/src/app/admin/Admin.tsx)2
-rw-r--r--Timeline/ClientApp/src/app/views/admin/UserAdmin.tsx (renamed from Timeline/ClientApp/src/app/admin/UserAdmin.tsx)2
-rw-r--r--Timeline/ClientApp/src/app/views/common/AppBar.tsx (renamed from Timeline/ClientApp/src/app/common/AppBar.tsx)2
-rw-r--r--Timeline/ClientApp/src/app/views/common/BlobImage.tsx (renamed from Timeline/ClientApp/src/app/common/BlobImage.tsx)4
-rw-r--r--Timeline/ClientApp/src/app/views/common/FileInput.tsx (renamed from Timeline/ClientApp/src/app/common/FileInput.tsx)7
-rw-r--r--Timeline/ClientApp/src/app/views/common/ImageCropper.tsx (renamed from Timeline/ClientApp/src/app/common/ImageCropper.tsx)4
-rw-r--r--Timeline/ClientApp/src/app/views/common/LoadingPage.tsx (renamed from Timeline/ClientApp/src/app/common/LoadingPage.tsx)0
-rw-r--r--Timeline/ClientApp/src/app/views/common/OperationDialog.tsx (renamed from Timeline/ClientApp/src/app/common/OperationDialog.tsx)4
-rw-r--r--Timeline/ClientApp/src/app/views/common/SearchInput.tsx (renamed from Timeline/ClientApp/src/app/common/SearchInput.tsx)0
-rw-r--r--Timeline/ClientApp/src/app/views/common/TimelineLogo.tsx (renamed from Timeline/ClientApp/src/app/common/TimelineLogo.tsx)0
-rw-r--r--Timeline/ClientApp/src/app/views/common/UserTimelineLogo.tsx (renamed from Timeline/ClientApp/src/app/common/UserTimelineLogo.tsx)0
-rw-r--r--Timeline/ClientApp/src/app/views/common/alert/AlertHost.tsx (renamed from Timeline/ClientApp/src/app/common/AlertHost.tsx)2
-rw-r--r--Timeline/ClientApp/src/app/views/common/alert/alert.sass (renamed from Timeline/ClientApp/src/app/common/alert.sass)0
-rw-r--r--Timeline/ClientApp/src/app/views/common/common.sass (renamed from Timeline/ClientApp/src/app/common/common.sass)0
-rw-r--r--Timeline/ClientApp/src/app/views/home/BoardWithUser.tsx (renamed from Timeline/ClientApp/src/app/home/BoardWithUser.tsx)6
-rw-r--r--Timeline/ClientApp/src/app/views/home/BoardWithoutUser.tsx (renamed from Timeline/ClientApp/src/app/home/BoardWithoutUser.tsx)4
-rw-r--r--Timeline/ClientApp/src/app/views/home/OfflineBoard.tsx (renamed from Timeline/ClientApp/src/app/home/OfflineBoard.tsx)2
-rw-r--r--Timeline/ClientApp/src/app/views/home/TimelineBoard.tsx (renamed from Timeline/ClientApp/src/app/home/TimelineBoard.tsx)2
-rw-r--r--Timeline/ClientApp/src/app/views/home/TimelineCreateDialog.tsx (renamed from Timeline/ClientApp/src/app/home/TimelineCreateDialog.tsx)2
-rw-r--r--Timeline/ClientApp/src/app/views/home/home.sass (renamed from Timeline/ClientApp/src/app/home/home.sass)0
-rw-r--r--Timeline/ClientApp/src/app/views/home/index.tsx (renamed from Timeline/ClientApp/src/app/home/Home.tsx)6
-rw-r--r--Timeline/ClientApp/src/app/views/login/index.tsx (renamed from Timeline/ClientApp/src/app/user/Login.tsx)7
-rw-r--r--Timeline/ClientApp/src/app/views/settings/index.tsx (renamed from Timeline/ClientApp/src/app/settings/Settings.tsx)6
-rw-r--r--Timeline/ClientApp/src/app/views/timeline-common/Timeline.tsx (renamed from Timeline/ClientApp/src/app/timeline/Timeline.tsx)2
-rw-r--r--Timeline/ClientApp/src/app/views/timeline-common/TimelineItem.tsx (renamed from Timeline/ClientApp/src/app/timeline/TimelineItem.tsx)5
-rw-r--r--Timeline/ClientApp/src/app/views/timeline-common/TimelineMember.tsx (renamed from Timeline/ClientApp/src/app/timeline/TimelineMember.tsx)3
-rw-r--r--Timeline/ClientApp/src/app/views/timeline-common/TimelinePageTemplate.tsx (renamed from Timeline/ClientApp/src/app/timeline/TimelinePageTemplate.tsx)11
-rw-r--r--Timeline/ClientApp/src/app/views/timeline-common/TimelinePageTemplateUI.tsx (renamed from Timeline/ClientApp/src/app/timeline/TimelinePageTemplateUI.tsx)9
-rw-r--r--Timeline/ClientApp/src/app/views/timeline-common/TimelinePostEdit.tsx (renamed from Timeline/ClientApp/src/app/timeline/TimelinePostEdit.tsx)8
-rw-r--r--Timeline/ClientApp/src/app/views/timeline-common/TimelinePropertyChangeDialog.tsx (renamed from Timeline/ClientApp/src/app/timeline/TimelinePropertyChangeDialog.tsx)3
-rw-r--r--Timeline/ClientApp/src/app/views/timeline-common/timeline-common.sass (renamed from Timeline/ClientApp/src/app/timeline/timeline.sass)24
-rw-r--r--Timeline/ClientApp/src/app/views/timeline/TimelineDeleteDialog.tsx (renamed from Timeline/ClientApp/src/app/timeline/TimelineDeleteDialog.tsx)3
-rw-r--r--Timeline/ClientApp/src/app/views/timeline/TimelineInfoCard.tsx (renamed from Timeline/ClientApp/src/app/timeline/TimelineInfoCard.tsx)8
-rw-r--r--Timeline/ClientApp/src/app/views/timeline/TimelinePageUI.tsx (renamed from Timeline/ClientApp/src/app/timeline/TimelinePageUI.tsx)7
-rw-r--r--Timeline/ClientApp/src/app/views/timeline/index.tsx (renamed from Timeline/ClientApp/src/app/timeline/TimelinePage.tsx)2
-rw-r--r--Timeline/ClientApp/src/app/views/timeline/timeline.sass14
-rw-r--r--Timeline/ClientApp/src/app/views/user/ChangeAvatarDialog.tsx (renamed from Timeline/ClientApp/src/app/user/ChangeAvatarDialog.tsx)3
-rw-r--r--Timeline/ClientApp/src/app/views/user/ChangeNicknameDialog.tsx (renamed from Timeline/ClientApp/src/app/user/ChangeNicknameDialog.tsx)0
-rw-r--r--Timeline/ClientApp/src/app/views/user/UserInfoCard.tsx (renamed from Timeline/ClientApp/src/app/user/UserInfoCard.tsx)7
-rw-r--r--Timeline/ClientApp/src/app/views/user/UserPageUI.tsx (renamed from Timeline/ClientApp/src/app/user/UserPage.tsx)9
-rw-r--r--Timeline/ClientApp/src/app/views/user/index.tsx (renamed from Timeline/ClientApp/src/app/user/User.tsx)17
-rw-r--r--Timeline/ClientApp/src/app/views/user/user.sass (renamed from Timeline/ClientApp/src/app/user/user-page.sass)0
-rw-r--r--Timeline/ClientApp/src/tsconfig.json8
57 files changed, 161 insertions, 157 deletions
diff --git a/Timeline/ClientApp/src/app/App.tsx b/Timeline/ClientApp/src/app/App.tsx
index 74deddda..b64414b7 100644
--- a/Timeline/ClientApp/src/app/App.tsx
+++ b/Timeline/ClientApp/src/app/App.tsx
@@ -2,17 +2,17 @@ import React from "react";
import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
import { hot } from "react-hot-loader/root";
-import AppBar from "./common/AppBar";
-import LoadingPage from "./common/LoadingPage";
-import Home from "./home/Home";
-import Login from "./user/Login";
-import Settings from "./settings/Settings";
-import About from "./about/About";
-import User from "./user/User";
-import TimelinePage from "./timeline/TimelinePage";
-import AlertHost from "./common/AlertHost";
-import { dataStorage } from "./data/common";
-import { userService, useRawUser } from "./data/user";
+import AppBar from "./views/common/AppBar";
+import LoadingPage from "./views/common/LoadingPage";
+import Home from "./views/home";
+import Login from "./views/login";
+import Settings from "./views/settings";
+import About from "./views/about";
+import User from "./views/user";
+import TimelinePage from "./views/timeline";
+import AlertHost from "./views/common/alert/AlertHost";
+import { dataStorage } from "./services/common";
+import { userService, useRawUser } from "./services/user";
const NoMatch: React.FC = () => {
return (
@@ -25,7 +25,7 @@ const NoMatch: React.FC = () => {
};
const LazyAdmin = React.lazy(
- () => import(/* webpackChunkName: "admin" */ "./admin/Admin")
+ () => import(/* webpackChunkName: "admin" */ "./views/admin/Admin")
);
const App: React.FC = () => {
diff --git a/Timeline/ClientApp/src/app/index.sass b/Timeline/ClientApp/src/app/index.sass
index ef0b03ba..efac4df5 100644
--- a/Timeline/ClientApp/src/app/index.sass
+++ b/Timeline/ClientApp/src/app/index.sass
@@ -1,12 +1,12 @@
@import '~bootstrap/scss/bootstrap'
-@import './common/common'
-@import './common/alert'
-@import './home/home'
-@import './about/about'
-@import './timeline/timeline'
-@import './timeline/timeline-ui'
-@import './user/user-page'
+@import './views/common/common'
+@import './views/common/alert/alert'
+@import './views/home/home'
+@import './views/about/about'
+@import './views/timeline-common/timeline-common'
+@import './views/timeline/timeline'
+@import './views/user/user'
body
margin: 0
diff --git a/Timeline/ClientApp/src/app/service-worker.tsx b/Timeline/ClientApp/src/app/service-worker.tsx
index f71b23b3..e629995a 100644
--- a/Timeline/ClientApp/src/app/service-worker.tsx
+++ b/Timeline/ClientApp/src/app/service-worker.tsx
@@ -2,7 +2,7 @@ import React from "react";
import { Button } from "reactstrap";
import { useTranslation } from "react-i18next";
-import { pushAlert } from "./common/alert-service";
+import { pushAlert } from "./services/alert";
if ("serviceWorker" in navigator) {
let isThisTriggerUpgrade = false;
diff --git a/Timeline/ClientApp/src/app/data/DataHub.ts b/Timeline/ClientApp/src/app/services/DataHub.ts
index 93a9b41f..93a9b41f 100644
--- a/Timeline/ClientApp/src/app/data/DataHub.ts
+++ b/Timeline/ClientApp/src/app/services/DataHub.ts
diff --git a/Timeline/ClientApp/src/app/common/alert-service.ts b/Timeline/ClientApp/src/app/services/alert.ts
index e4c0e653..e4c0e653 100644
--- a/Timeline/ClientApp/src/app/common/alert-service.ts
+++ b/Timeline/ClientApp/src/app/services/alert.ts
diff --git a/Timeline/ClientApp/src/app/data/common.ts b/Timeline/ClientApp/src/app/services/common.ts
index 8d52abe5..3bb6b9d7 100644
--- a/Timeline/ClientApp/src/app/data/common.ts
+++ b/Timeline/ClientApp/src/app/services/common.ts
@@ -1,6 +1,6 @@
import localforage from "localforage";
-import { HttpNetworkError } from "../http/common";
+import { HttpNetworkError } from "@/http/common";
export const dataStorage = localforage.createInstance({
name: "data",
diff --git a/Timeline/ClientApp/src/app/data/timeline.ts b/Timeline/ClientApp/src/app/services/timeline.ts
index 3eda35f9..9db76281 100644
--- a/Timeline/ClientApp/src/app/data/timeline.ts
+++ b/Timeline/ClientApp/src/app/services/timeline.ts
@@ -4,7 +4,7 @@ import { Observable, from, combineLatest, of } from "rxjs";
import { map, switchMap, startWith } from "rxjs/operators";
import { uniqBy } from "lodash";
-import { convertError } from "../utilities/rxjs";
+import { convertError } from "@/utilities/rxjs";
import {
TimelineVisibility,
HttpTimelineInfo,
@@ -18,18 +18,18 @@ import {
getHttpTimelineClient,
HttpTimelineNotExistError,
HttpTimelineNameConflictError,
-} from "../http/timeline";
-import { BlobWithEtag, NotModified, HttpForbiddenError } from "../http/common";
-import { HttpUser } from "../http/user";
+} from "@/http/timeline";
+import { BlobWithEtag, NotModified, HttpForbiddenError } from "@/http/common";
+import { HttpUser } from "@/http/user";
+
+export { kTimelineVisibilities } from "@/http/timeline";
+
+export type { TimelineVisibility } from "@/http/timeline";
import { dataStorage, throwIfNotNetworkError, BlobOrStatus } from "./common";
import { DataHub, WithSyncStatus } from "./DataHub";
import { UserAuthInfo, checkLogin, userService, userInfoService } from "./user";
-export { kTimelineVisibilities } from "../http/timeline";
-
-export type { TimelineVisibility } from "../http/timeline";
-
export type TimelineInfo = HttpTimelineInfo;
export type TimelineChangePropertyRequest = HttpTimelinePatchRequest;
export type TimelineCreatePostRequest = HttpTimelinePostPostRequest;
diff --git a/Timeline/ClientApp/src/app/data/user.ts b/Timeline/ClientApp/src/app/services/user.ts
index b8f163eb..f253fc19 100644
--- a/Timeline/ClientApp/src/app/data/user.ts
+++ b/Timeline/ClientApp/src/app/services/user.ts
@@ -2,22 +2,23 @@ import React, { useState, useEffect } from "react";
import { BehaviorSubject, Observable, from } from "rxjs";
import { map, filter } from "rxjs/operators";
-import { UiLogicError } from "../common";
-import { convertError } from "../utilities/rxjs";
-import { pushAlert } from "../common/alert-service";
-import { HttpNetworkError, BlobWithEtag, NotModified } from "../http/common";
+import { UiLogicError } from "@/common";
+import { convertError } from "@/utilities/rxjs";
+
+import { HttpNetworkError, BlobWithEtag, NotModified } from "@/http/common";
import {
getHttpTokenClient,
HttpCreateTokenBadCredentialError,
-} from "../http/token";
+} from "@/http/token";
import {
getHttpUserClient,
HttpUserNotExistError,
HttpUser,
-} from "../http/user";
+} from "@/http/user";
-import { DataHub } from "./DataHub";
import { dataStorage, throwIfNotNetworkError } from "./common";
+import { DataHub } from "./DataHub";
+import { pushAlert } from "./alert";
export type User = HttpUser;
diff --git a/Timeline/ClientApp/src/app/timeline/timeline-ui.sass b/Timeline/ClientApp/src/app/timeline/timeline-ui.sass
deleted file mode 100644
index 79be64d3..00000000
--- a/Timeline/ClientApp/src/app/timeline/timeline-ui.sass
+++ /dev/null
@@ -1,35 +0,0 @@
-.info-card-container
- .info-card-collapse-button
- z-index: 1
- position: relative
-
- .info-card-content
- width: 100%
- position: absolute
- transform-origin: right top
- transition: transform 0.5s
-
- &[data-collapse='true']
- .info-card-content
- transform: scale(0)
-
-.timeline-page-top-space
- transition: height 0.5s
-
-.timeline-sync-state-badge
- position: fixed
- top: 0
- right: 0
- z-index: 1
- font-size: 0.8em
- padding: 3px 8px
- border-radius: 5px
- background: #e8fbff
-
-.timeline-sync-state-badge-pin
- display: inline-block
- width: 0.4em
- height: 0.4em
- border-radius: 50%
- vertical-align: middle
- margin-right: 0.6em
diff --git a/Timeline/ClientApp/src/app/utilities/type.ts b/Timeline/ClientApp/src/app/utilities/type.ts
deleted file mode 100644
index 8df9bf0f..00000000
--- a/Timeline/ClientApp/src/app/utilities/type.ts
+++ /dev/null
@@ -1 +0,0 @@
-export type ExcludeKey<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
diff --git a/Timeline/ClientApp/src/app/about/about.sass b/Timeline/ClientApp/src/app/views/about/about.sass
index 3b5840cd..3b5840cd 100644
--- a/Timeline/ClientApp/src/app/about/about.sass
+++ b/Timeline/ClientApp/src/app/views/about/about.sass
diff --git a/Timeline/ClientApp/src/app/about/author-avatar.png b/Timeline/ClientApp/src/app/views/about/author-avatar.png
index d890d8d0..d890d8d0 100644
--- a/Timeline/ClientApp/src/app/about/author-avatar.png
+++ b/Timeline/ClientApp/src/app/views/about/author-avatar.png
Binary files differ
diff --git a/Timeline/ClientApp/src/app/about/github.png b/Timeline/ClientApp/src/app/views/about/github.png
index ea6ff545..ea6ff545 100644
--- a/Timeline/ClientApp/src/app/about/github.png
+++ b/Timeline/ClientApp/src/app/views/about/github.png
Binary files differ
diff --git a/Timeline/ClientApp/src/app/about/About.tsx b/Timeline/ClientApp/src/app/views/about/index.tsx
index 519eef18..21c487da 100644
--- a/Timeline/ClientApp/src/app/about/About.tsx
+++ b/Timeline/ClientApp/src/app/views/about/index.tsx
@@ -71,7 +71,7 @@ const backendCredits: {
},
];
-const About: React.FC = () => {
+const AboutPage: React.FC = () => {
const { t } = useTranslation();
return (
@@ -169,4 +169,4 @@ const About: React.FC = () => {
);
};
-export default About;
+export default AboutPage;
diff --git a/Timeline/ClientApp/src/app/admin/Admin.tsx b/Timeline/ClientApp/src/app/views/admin/Admin.tsx
index e2f71091..51dc5a3c 100644
--- a/Timeline/ClientApp/src/app/admin/Admin.tsx
+++ b/Timeline/ClientApp/src/app/views/admin/Admin.tsx
@@ -10,7 +10,7 @@ import {
import classnames from "classnames";
import AppBar from "../common/AppBar";
-import { UserWithToken } from "../data/user";
+import { UserWithToken } from "@/services/user";
import UserAdmin from "./UserAdmin";
diff --git a/Timeline/ClientApp/src/app/admin/UserAdmin.tsx b/Timeline/ClientApp/src/app/views/admin/UserAdmin.tsx
index 1bf3bda1..bde6b3af 100644
--- a/Timeline/ClientApp/src/app/admin/UserAdmin.tsx
+++ b/Timeline/ClientApp/src/app/views/admin/UserAdmin.tsx
@@ -13,7 +13,7 @@ import {
import axios from "axios";
import OperationDialog from "../common/OperationDialog";
-import { User, UserWithToken } from "../data/user";
+import { User, UserWithToken } from "@/services/user";
const apiBaseUrl = "/api";
diff --git a/Timeline/ClientApp/src/app/common/AppBar.tsx b/Timeline/ClientApp/src/app/views/common/AppBar.tsx
index 59239696..aefe0f27 100644
--- a/Timeline/ClientApp/src/app/common/AppBar.tsx
+++ b/Timeline/ClientApp/src/app/views/common/AppBar.tsx
@@ -5,7 +5,7 @@ import { Navbar, NavbarToggler, Collapse, Nav, NavItem } from "reactstrap";
import { useMediaQuery } from "react-responsive";
import { useTranslation } from "react-i18next";
-import { useUser, useAvatar } from "../data/user";
+import { useUser, useAvatar } from "@/services/user";
import TimelineLogo from "./TimelineLogo";
import BlobImage from "./BlobImage";
diff --git a/Timeline/ClientApp/src/app/common/BlobImage.tsx b/Timeline/ClientApp/src/app/views/common/BlobImage.tsx
index 8602f550..0dd25c52 100644
--- a/Timeline/ClientApp/src/app/common/BlobImage.tsx
+++ b/Timeline/ClientApp/src/app/views/common/BlobImage.tsx
@@ -1,9 +1,7 @@
import React from "react";
-import { ExcludeKey } from "../utilities/type";
-
const BlobImage: React.FC<
- ExcludeKey<React.ImgHTMLAttributes<HTMLImageElement>, "src"> & {
+ Omit<React.ImgHTMLAttributes<HTMLImageElement>, "src"> & {
blob?: Blob | unknown;
}
> = (props) => {
diff --git a/Timeline/ClientApp/src/app/common/FileInput.tsx b/Timeline/ClientApp/src/app/views/common/FileInput.tsx
index 3d1bc2b3..7b053d5c 100644
--- a/Timeline/ClientApp/src/app/common/FileInput.tsx
+++ b/Timeline/ClientApp/src/app/views/common/FileInput.tsx
@@ -1,13 +1,8 @@
import React from "react";
import clsx from "clsx";
-import { ExcludeKey } from "../utilities/type";
-
export interface FileInputProps
- extends ExcludeKey<
- React.InputHTMLAttributes<HTMLInputElement>,
- "type" | "id"
- > {
+ extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "type" | "id"> {
inputId?: string;
labelText: string;
color?: string;
diff --git a/Timeline/ClientApp/src/app/common/ImageCropper.tsx b/Timeline/ClientApp/src/app/views/common/ImageCropper.tsx
index cd510969..b9db8b99 100644
--- a/Timeline/ClientApp/src/app/common/ImageCropper.tsx
+++ b/Timeline/ClientApp/src/app/views/common/ImageCropper.tsx
@@ -1,7 +1,7 @@
-import * as React from "react";
+import React from "react";
import clsx from "clsx";
-import { UiLogicError } from "../common";
+import { UiLogicError } from "@/common";
export interface Clip {
left: number;
diff --git a/Timeline/ClientApp/src/app/common/LoadingPage.tsx b/Timeline/ClientApp/src/app/views/common/LoadingPage.tsx
index a849126d..a849126d 100644
--- a/Timeline/ClientApp/src/app/common/LoadingPage.tsx
+++ b/Timeline/ClientApp/src/app/views/common/LoadingPage.tsx
diff --git a/Timeline/ClientApp/src/app/common/OperationDialog.tsx b/Timeline/ClientApp/src/app/views/common/OperationDialog.tsx
index bca4580c..402ffbec 100644
--- a/Timeline/ClientApp/src/app/common/OperationDialog.tsx
+++ b/Timeline/ClientApp/src/app/views/common/OperationDialog.tsx
@@ -15,7 +15,7 @@ import {
FormText,
} from "reactstrap";
-import { UiLogicError } from "../common";
+import { UiLogicError } from "@/common";
const DefaultProcessPrompt: React.FC = (_) => {
return (
@@ -64,7 +64,7 @@ export interface OperationTextInputInfo {
initValue?: string;
textFieldProps?: Omit<
React.InputHTMLAttributes<HTMLInputElement>,
- "type" | "value" | "onChange"
+ "type" | "value" | "onChange" | "aria-relevant"
>;
helperText?: string;
validator?: OperationInputValidator<string>;
diff --git a/Timeline/ClientApp/src/app/common/SearchInput.tsx b/Timeline/ClientApp/src/app/views/common/SearchInput.tsx
index 5a0b0eaa..5a0b0eaa 100644
--- a/Timeline/ClientApp/src/app/common/SearchInput.tsx
+++ b/Timeline/ClientApp/src/app/views/common/SearchInput.tsx
diff --git a/Timeline/ClientApp/src/app/common/TimelineLogo.tsx b/Timeline/ClientApp/src/app/views/common/TimelineLogo.tsx
index 27d188fc..27d188fc 100644
--- a/Timeline/ClientApp/src/app/common/TimelineLogo.tsx
+++ b/Timeline/ClientApp/src/app/views/common/TimelineLogo.tsx
diff --git a/Timeline/ClientApp/src/app/common/UserTimelineLogo.tsx b/Timeline/ClientApp/src/app/views/common/UserTimelineLogo.tsx
index 29f6a69f..29f6a69f 100644
--- a/Timeline/ClientApp/src/app/common/UserTimelineLogo.tsx
+++ b/Timeline/ClientApp/src/app/views/common/UserTimelineLogo.tsx
diff --git a/Timeline/ClientApp/src/app/common/AlertHost.tsx b/Timeline/ClientApp/src/app/views/common/alert/AlertHost.tsx
index bfcf5c00..31c0fb86 100644
--- a/Timeline/ClientApp/src/app/common/AlertHost.tsx
+++ b/Timeline/ClientApp/src/app/views/common/alert/AlertHost.tsx
@@ -9,7 +9,7 @@ import {
AlertInfoEx,
kAlertHostId,
AlertInfo,
-} from "./alert-service";
+} from "@/services/alert";
interface AutoCloseAlertProps {
alert: AlertInfo;
diff --git a/Timeline/ClientApp/src/app/common/alert.sass b/Timeline/ClientApp/src/app/views/common/alert/alert.sass
index 5b6e65c2..5b6e65c2 100644
--- a/Timeline/ClientApp/src/app/common/alert.sass
+++ b/Timeline/ClientApp/src/app/views/common/alert/alert.sass
diff --git a/Timeline/ClientApp/src/app/common/common.sass b/Timeline/ClientApp/src/app/views/common/common.sass
index 15d34d7c..15d34d7c 100644
--- a/Timeline/ClientApp/src/app/common/common.sass
+++ b/Timeline/ClientApp/src/app/views/common/common.sass
diff --git a/Timeline/ClientApp/src/app/home/BoardWithUser.tsx b/Timeline/ClientApp/src/app/views/home/BoardWithUser.tsx
index 22a4667c..6bff0375 100644
--- a/Timeline/ClientApp/src/app/home/BoardWithUser.tsx
+++ b/Timeline/ClientApp/src/app/views/home/BoardWithUser.tsx
@@ -2,9 +2,9 @@ import React from "react";
import { Row, Col } from "reactstrap";
import { useTranslation } from "react-i18next";
-import { UserWithToken } from "../data/user";
-import { TimelineInfo } from "../data/timeline";
-import { getHttpTimelineClient } from "../http/timeline";
+import { UserWithToken } from "@/services/user";
+import { TimelineInfo } from "@/services/timeline";
+import { getHttpTimelineClient } from "@/http/timeline";
import TimelineBoard from "./TimelineBoard";
import OfflineBoard from "./OfflineBoard";
diff --git a/Timeline/ClientApp/src/app/home/BoardWithoutUser.tsx b/Timeline/ClientApp/src/app/views/home/BoardWithoutUser.tsx
index 972c1b25..2e5c3a42 100644
--- a/Timeline/ClientApp/src/app/home/BoardWithoutUser.tsx
+++ b/Timeline/ClientApp/src/app/views/home/BoardWithoutUser.tsx
@@ -1,8 +1,8 @@
import React from "react";
import { Row, Col } from "reactstrap";
-import { TimelineInfo } from "../data/timeline";
-import { getHttpTimelineClient } from "../http/timeline";
+import { TimelineInfo } from "@/services/timeline";
+import { getHttpTimelineClient } from "@/http/timeline";
import TimelineBoard from "./TimelineBoard";
import OfflineBoard from "./OfflineBoard";
diff --git a/Timeline/ClientApp/src/app/home/OfflineBoard.tsx b/Timeline/ClientApp/src/app/views/home/OfflineBoard.tsx
index fbd37efd..fc05bd74 100644
--- a/Timeline/ClientApp/src/app/home/OfflineBoard.tsx
+++ b/Timeline/ClientApp/src/app/views/home/OfflineBoard.tsx
@@ -2,7 +2,7 @@ import React from "react";
import { Link } from "react-router-dom";
import { Trans } from "react-i18next";
-import { getAllCachedTimelineNames } from "../data/timeline";
+import { getAllCachedTimelineNames } from "@/services/timeline";
import UserTimelineLogo from "../common/UserTimelineLogo";
import TimelineLogo from "../common/TimelineLogo";
diff --git a/Timeline/ClientApp/src/app/home/TimelineBoard.tsx b/Timeline/ClientApp/src/app/views/home/TimelineBoard.tsx
index 21dcac3f..8df5ed9d 100644
--- a/Timeline/ClientApp/src/app/home/TimelineBoard.tsx
+++ b/Timeline/ClientApp/src/app/views/home/TimelineBoard.tsx
@@ -4,7 +4,7 @@ import { Link } from "react-router-dom";
import { Spinner } from "reactstrap";
import { Trans } from "react-i18next";
-import { TimelineInfo } from "../data/timeline";
+import { TimelineInfo } from "@/services/timeline";
import TimelineLogo from "../common/TimelineLogo";
import UserTimelineLogo from "../common/UserTimelineLogo";
diff --git a/Timeline/ClientApp/src/app/home/TimelineCreateDialog.tsx b/Timeline/ClientApp/src/app/views/home/TimelineCreateDialog.tsx
index 911dd60c..d9467719 100644
--- a/Timeline/ClientApp/src/app/home/TimelineCreateDialog.tsx
+++ b/Timeline/ClientApp/src/app/views/home/TimelineCreateDialog.tsx
@@ -1,7 +1,7 @@
import React from "react";
import { useHistory } from "react-router";
-import { validateTimelineName, timelineService } from "../data/timeline";
+import { validateTimelineName, timelineService } from "@/services/timeline";
import OperationDialog from "../common/OperationDialog";
interface TimelineCreateDialogProps {
diff --git a/Timeline/ClientApp/src/app/home/home.sass b/Timeline/ClientApp/src/app/views/home/home.sass
index f5d6ffc3..f5d6ffc3 100644
--- a/Timeline/ClientApp/src/app/home/home.sass
+++ b/Timeline/ClientApp/src/app/views/home/home.sass
diff --git a/Timeline/ClientApp/src/app/home/Home.tsx b/Timeline/ClientApp/src/app/views/home/index.tsx
index 910c9a01..f62cebca 100644
--- a/Timeline/ClientApp/src/app/home/Home.tsx
+++ b/Timeline/ClientApp/src/app/views/home/index.tsx
@@ -3,7 +3,7 @@ import { useHistory } from "react-router";
import { Row, Container, Button, Col } from "reactstrap";
import { useTranslation } from "react-i18next";
-import { useUser } from "../data/user";
+import { useUser } from "@/services/user";
import AppBar from "../common/AppBar";
import SearchInput from "../common/SearchInput";
@@ -11,7 +11,7 @@ import BoardWithoutUser from "./BoardWithoutUser";
import BoardWithUser from "./BoardWithUser";
import TimelineCreateDialog from "./TimelineCreateDialog";
-const Home: React.FC = () => {
+const HomePage: React.FC = () => {
const history = useHistory();
const { t } = useTranslation();
@@ -99,4 +99,4 @@ const Home: React.FC = () => {
);
};
-export default Home;
+export default HomePage;
diff --git a/Timeline/ClientApp/src/app/user/Login.tsx b/Timeline/ClientApp/src/app/views/login/index.tsx
index db6c43c4..e53d0002 100644
--- a/Timeline/ClientApp/src/app/user/Login.tsx
+++ b/Timeline/ClientApp/src/app/views/login/index.tsx
@@ -11,10 +11,11 @@ import {
Button,
} from "reactstrap";
+import { useUser, userService } from "@/services/user";
+
import AppBar from "../common/AppBar";
-import { useUser, userService } from "../data/user";
-const Login: React.FC = (_) => {
+const LoginPage: React.FC = (_) => {
const { t } = useTranslation();
const history = useHistory();
const [username, setUsername] = useState<string>("");
@@ -144,4 +145,4 @@ const Login: React.FC = (_) => {
);
};
-export default Login;
+export default LoginPage;
diff --git a/Timeline/ClientApp/src/app/settings/Settings.tsx b/Timeline/ClientApp/src/app/views/settings/index.tsx
index 64851ce2..04834d39 100644
--- a/Timeline/ClientApp/src/app/settings/Settings.tsx
+++ b/Timeline/ClientApp/src/app/views/settings/index.tsx
@@ -13,7 +13,7 @@ import {
Button,
} from "reactstrap";
-import { useUser, userService } from "../data/user";
+import { useUser, userService } from "@/services/user";
import AppBar from "../common/AppBar";
import OperationDialog, {
OperationInputErrorInfo,
@@ -117,7 +117,7 @@ const ConfirmLogoutDialog: React.FC<{
);
};
-const Settings: React.FC = (_) => {
+const SettingsPage: React.FC = (_) => {
const { i18n, t } = useTranslation();
const user = useUser();
const history = useHistory();
@@ -218,4 +218,4 @@ const Settings: React.FC = (_) => {
);
};
-export default Settings;
+export default SettingsPage;
diff --git a/Timeline/ClientApp/src/app/timeline/Timeline.tsx b/Timeline/ClientApp/src/app/views/timeline-common/Timeline.tsx
index 780588d1..1ad62a51 100644
--- a/Timeline/ClientApp/src/app/timeline/Timeline.tsx
+++ b/Timeline/ClientApp/src/app/views/timeline-common/Timeline.tsx
@@ -1,7 +1,7 @@
import React from "react";
import clsx from "clsx";
-import { TimelinePostInfo } from "../data/timeline";
+import { TimelinePostInfo } from "@/services/timeline";
import TimelineItem from "./TimelineItem";
diff --git a/Timeline/ClientApp/src/app/timeline/TimelineItem.tsx b/Timeline/ClientApp/src/app/views/timeline-common/TimelineItem.tsx
index 33f0741e..f2441612 100644
--- a/Timeline/ClientApp/src/app/timeline/TimelineItem.tsx
+++ b/Timeline/ClientApp/src/app/views/timeline-common/TimelineItem.tsx
@@ -15,9 +15,10 @@ import Svg from "react-inlinesvg";
import chevronDownIcon from "bootstrap-icons/icons/chevron-down.svg";
import trashIcon from "bootstrap-icons/icons/trash.svg";
+import { useAvatar } from "@/services/user";
+import { TimelinePostInfo } from "@/services/timeline";
+
import BlobImage from "../common/BlobImage";
-import { useAvatar } from "../data/user";
-import { TimelinePostInfo } from "../data/timeline";
const TimelinePostDeleteConfirmDialog: React.FC<{
toggle: () => void;
diff --git a/Timeline/ClientApp/src/app/timeline/TimelineMember.tsx b/Timeline/ClientApp/src/app/views/timeline-common/TimelineMember.tsx
index f334c6e9..99605922 100644
--- a/Timeline/ClientApp/src/app/timeline/TimelineMember.tsx
+++ b/Timeline/ClientApp/src/app/views/timeline-common/TimelineMember.tsx
@@ -10,7 +10,8 @@ import {
Button,
} from "reactstrap";
-import { User, useAvatar } from "../data/user";
+import { User, useAvatar } from "@/services/user";
+
import SearchInput from "../common/SearchInput";
import BlobImage from "../common/BlobImage";
diff --git a/Timeline/ClientApp/src/app/timeline/TimelinePageTemplate.tsx b/Timeline/ClientApp/src/app/views/timeline-common/TimelinePageTemplate.tsx
index 62470e63..1b03d5c7 100644
--- a/Timeline/ClientApp/src/app/timeline/TimelinePageTemplate.tsx
+++ b/Timeline/ClientApp/src/app/views/timeline-common/TimelinePageTemplate.tsx
@@ -3,15 +3,14 @@ import { useTranslation } from "react-i18next";
import { of } from "rxjs";
import { catchError } from "rxjs/operators";
-import { ExcludeKey } from "../utilities/type";
-import { pushAlert } from "../common/alert-service";
-import { useUser, userInfoService, UserNotExistError } from "../data/user";
+import { UiLogicError } from "@/common";
+import { pushAlert } from "@/services/alert";
+import { useUser, userInfoService, UserNotExistError } from "@/services/user";
import {
timelineService,
usePostList,
useTimelineInfo,
-} from "../data/timeline";
-import { UiLogicError } from "../common";
+} from "@/services/timeline";
import { TimelineDeleteCallback } from "./Timeline";
import { TimelineMemberDialog } from "./TimelineMember";
@@ -23,7 +22,7 @@ export interface TimelinePageTemplateProps<TManageItem> {
name: string;
onManage: (item: TManageItem) => void;
UiComponent: React.ComponentType<
- ExcludeKey<TimelinePageTemplateUIProps<TManageItem>, "CardComponent">
+ Omit<TimelinePageTemplateUIProps<TManageItem>, "CardComponent">
>;
notFoundI18nKey: string;
}
diff --git a/Timeline/ClientApp/src/app/timeline/TimelinePageTemplateUI.tsx b/Timeline/ClientApp/src/app/views/timeline-common/TimelinePageTemplateUI.tsx
index e6514478..7af11efa 100644
--- a/Timeline/ClientApp/src/app/timeline/TimelinePageTemplateUI.tsx
+++ b/Timeline/ClientApp/src/app/views/timeline-common/TimelinePageTemplateUI.tsx
@@ -7,14 +7,15 @@ import clsx from "clsx";
import arrowsAngleContractIcon from "bootstrap-icons/icons/arrows-angle-contract.svg";
import arrowsAngleExpandIcon from "bootstrap-icons/icons/arrows-angle-expand.svg";
-import { getAlertHost } from "../common/alert-service";
-import { useEventEmiiter, UiLogicError } from "../common";
+import { getAlertHost } from "@/services/alert";
+import { useEventEmiiter, UiLogicError } from "@/common";
import {
TimelineInfo,
TimelinePostsWithSyncState,
timelineService,
-} from "../data/timeline";
-import { userService } from "../data/user";
+} from "@/services/timeline";
+import { userService } from "@/services/user";
+
import AppBar from "../common/AppBar";
import Timeline, {
diff --git a/Timeline/ClientApp/src/app/timeline/TimelinePostEdit.tsx b/Timeline/ClientApp/src/app/views/timeline-common/TimelinePostEdit.tsx
index b30dc8d3..6a8bb000 100644
--- a/Timeline/ClientApp/src/app/timeline/TimelinePostEdit.tsx
+++ b/Timeline/ClientApp/src/app/views/timeline-common/TimelinePostEdit.tsx
@@ -5,10 +5,12 @@ import Svg from "react-inlinesvg";
import textIcon from "bootstrap-icons/icons/card-text.svg";
import imageIcon from "bootstrap-icons/icons/image.svg";
-import { pushAlert } from "../common/alert-service";
-import { TimelineCreatePostRequest } from "../data/timeline";
+import { UiLogicError } from "@/common";
+
+import { pushAlert } from "@/services/alert";
+import { TimelineCreatePostRequest } from "@/services/timeline";
+
import FileInput from "../common/FileInput";
-import { UiLogicError } from "../common";
interface TimelinePostEditImageProps {
onSelect: (blob: Blob | null) => void;
diff --git a/Timeline/ClientApp/src/app/timeline/TimelinePropertyChangeDialog.tsx b/Timeline/ClientApp/src/app/views/timeline-common/TimelinePropertyChangeDialog.tsx
index bb0e3ea2..87638f31 100644
--- a/Timeline/ClientApp/src/app/timeline/TimelinePropertyChangeDialog.tsx
+++ b/Timeline/ClientApp/src/app/views/timeline-common/TimelinePropertyChangeDialog.tsx
@@ -4,7 +4,8 @@ import {
TimelineVisibility,
kTimelineVisibilities,
TimelineChangePropertyRequest,
-} from "../data/timeline";
+} from "@/services/timeline";
+
import OperationDialog, {
OperationSelectInputInfoOption,
} from "../common/OperationDialog";
diff --git a/Timeline/ClientApp/src/app/timeline/timeline.sass b/Timeline/ClientApp/src/app/views/timeline-common/timeline-common.sass
index d431a4c6..960c992d 100644
--- a/Timeline/ClientApp/src/app/timeline/timeline.sass
+++ b/Timeline/ClientApp/src/app/views/timeline-common/timeline-common.sass
@@ -33,7 +33,6 @@ $timeline-line-color-current: #36c2e6
background: color.adjust($timeline-line-color, $lightness: +10%)
box-shadow: 0 0 20px 3px color.adjust($timeline-line-color, $lightness: +10%, $alpha: -0.1)
-
@keyframes timeline-line-node-current
from
background: $timeline-line-color-current
@@ -84,7 +83,6 @@ $timeline-line-color-current: #36c2e6
animation: 1s infinite alternate
animation-name: timeline-line-node-noncurrent
-
.current
.timeline-line
&-segment
@@ -113,7 +111,6 @@ $timeline-line-color-current: #36c2e6
max-width: 60%
max-height: 200px
-
.timeline-post-edit-image
max-width: 100px
max-height: 100px
@@ -129,3 +126,24 @@ textarea.timeline-post-edit
&:focus
outline: none
box-shadow: 0 0 5px 0 $primary
+
+.timeline-page-top-space
+ transition: height 0.5s
+
+.timeline-sync-state-badge
+ position: fixed
+ top: 0
+ right: 0
+ z-index: 1
+ font-size: 0.8em
+ padding: 3px 8px
+ border-radius: 5px
+ background: #e8fbff
+
+.timeline-sync-state-badge-pin
+ display: inline-block
+ width: 0.4em
+ height: 0.4em
+ border-radius: 50%
+ vertical-align: middle
+ margin-right: 0.6em
diff --git a/Timeline/ClientApp/src/app/timeline/TimelineDeleteDialog.tsx b/Timeline/ClientApp/src/app/views/timeline/TimelineDeleteDialog.tsx
index 5ebbf9df..894b8195 100644
--- a/Timeline/ClientApp/src/app/timeline/TimelineDeleteDialog.tsx
+++ b/Timeline/ClientApp/src/app/views/timeline/TimelineDeleteDialog.tsx
@@ -2,8 +2,9 @@ import React from "react";
import { useHistory } from "react-router";
import { Trans } from "react-i18next";
+import { timelineService } from "@/services/timeline";
+
import OperationDialog from "../common/OperationDialog";
-import { timelineService } from "../data/timeline";
interface TimelineDeleteDialog {
open: boolean;
diff --git a/Timeline/ClientApp/src/app/timeline/TimelineInfoCard.tsx b/Timeline/ClientApp/src/app/views/timeline/TimelineInfoCard.tsx
index c11c3376..e3e89057 100644
--- a/Timeline/ClientApp/src/app/timeline/TimelineInfoCard.tsx
+++ b/Timeline/ClientApp/src/app/views/timeline/TimelineInfoCard.tsx
@@ -10,11 +10,11 @@ import {
import { useTranslation } from "react-i18next";
import { fromEvent } from "rxjs";
-import { useAvatar } from "../data/user";
-import { timelineVisibilityTooltipTranslationMap } from "../data/timeline";
-import BlobImage from "../common/BlobImage";
+import { useAvatar } from "@/services/user";
+import { timelineVisibilityTooltipTranslationMap } from "@/services/timeline";
-import { TimelineCardComponentProps } from "./TimelinePageTemplateUI";
+import BlobImage from "../common/BlobImage";
+import { TimelineCardComponentProps } from "../timeline-common/TimelinePageTemplateUI";
export type OrdinaryTimelineManageItem = "delete";
diff --git a/Timeline/ClientApp/src/app/timeline/TimelinePageUI.tsx b/Timeline/ClientApp/src/app/views/timeline/TimelinePageUI.tsx
index 63751eeb..67ea699e 100644
--- a/Timeline/ClientApp/src/app/timeline/TimelinePageUI.tsx
+++ b/Timeline/ClientApp/src/app/views/timeline/TimelinePageUI.tsx
@@ -1,15 +1,14 @@
import React from "react";
-import { ExcludeKey } from "../utilities/type";
-
import TimelinePageTemplateUI, {
TimelinePageTemplateUIProps,
-} from "./TimelinePageTemplateUI";
+} from "../timeline-common/TimelinePageTemplateUI";
+
import TimelineInfoCard, {
OrdinaryTimelineManageItem,
} from "./TimelineInfoCard";
-export type TimelinePageUIProps = ExcludeKey<
+export type TimelinePageUIProps = Omit<
TimelinePageTemplateUIProps<OrdinaryTimelineManageItem>,
"CardComponent"
>;
diff --git a/Timeline/ClientApp/src/app/timeline/TimelinePage.tsx b/Timeline/ClientApp/src/app/views/timeline/index.tsx
index 21d52db1..225a1a59 100644
--- a/Timeline/ClientApp/src/app/timeline/TimelinePage.tsx
+++ b/Timeline/ClientApp/src/app/views/timeline/index.tsx
@@ -1,7 +1,7 @@
import React from "react";
import { useParams } from "react-router";
-import TimelinePageTemplate from "../timeline/TimelinePageTemplate";
+import TimelinePageTemplate from "../timeline-common/TimelinePageTemplate";
import TimelinePageUI from "./TimelinePageUI";
import { OrdinaryTimelineManageItem } from "./TimelineInfoCard";
diff --git a/Timeline/ClientApp/src/app/views/timeline/timeline.sass b/Timeline/ClientApp/src/app/views/timeline/timeline.sass
new file mode 100644
index 00000000..0eeec73a
--- /dev/null
+++ b/Timeline/ClientApp/src/app/views/timeline/timeline.sass
@@ -0,0 +1,14 @@
+.info-card-container
+ .info-card-collapse-button
+ z-index: 1
+ position: relative
+
+ .info-card-content
+ width: 100%
+ position: absolute
+ transform-origin: right top
+ transition: transform 0.5s
+
+ &[data-collapse='true']
+ .info-card-content
+ transform: scale(0)
diff --git a/Timeline/ClientApp/src/app/user/ChangeAvatarDialog.tsx b/Timeline/ClientApp/src/app/views/user/ChangeAvatarDialog.tsx
index 7d9f9514..1dd2ee8b 100644
--- a/Timeline/ClientApp/src/app/user/ChangeAvatarDialog.tsx
+++ b/Timeline/ClientApp/src/app/views/user/ChangeAvatarDialog.tsx
@@ -10,8 +10,9 @@ import {
} from "reactstrap";
import { AxiosError } from "axios";
+import { UiLogicError } from "@/common";
+
import ImageCropper, { Clip, applyClipToImage } from "../common/ImageCropper";
-import { UiLogicError } from "../common";
export interface ChangeAvatarDialogProps {
open: boolean;
diff --git a/Timeline/ClientApp/src/app/user/ChangeNicknameDialog.tsx b/Timeline/ClientApp/src/app/views/user/ChangeNicknameDialog.tsx
index 251b18c5..251b18c5 100644
--- a/Timeline/ClientApp/src/app/user/ChangeNicknameDialog.tsx
+++ b/Timeline/ClientApp/src/app/views/user/ChangeNicknameDialog.tsx
diff --git a/Timeline/ClientApp/src/app/user/UserInfoCard.tsx b/Timeline/ClientApp/src/app/views/user/UserInfoCard.tsx
index d6e648cc..1a111877 100644
--- a/Timeline/ClientApp/src/app/user/UserInfoCard.tsx
+++ b/Timeline/ClientApp/src/app/views/user/UserInfoCard.tsx
@@ -10,10 +10,11 @@ import {
import { useTranslation } from "react-i18next";
import { fromEvent } from "rxjs";
-import { timelineVisibilityTooltipTranslationMap } from "../data/timeline";
-import { useAvatar } from "../data/user";
-import { TimelineCardComponentProps } from "../timeline/TimelinePageTemplateUI";
+import { timelineVisibilityTooltipTranslationMap } from "@/services/timeline";
+import { useAvatar } from "@/services/user";
+
import BlobImage from "../common/BlobImage";
+import { TimelineCardComponentProps } from "../timeline-common/TimelinePageTemplateUI";
export type PersonalTimelineManageItem = "avatar" | "nickname";
diff --git a/Timeline/ClientApp/src/app/user/UserPage.tsx b/Timeline/ClientApp/src/app/views/user/UserPageUI.tsx
index ab498f30..d405399c 100644
--- a/Timeline/ClientApp/src/app/user/UserPage.tsx
+++ b/Timeline/ClientApp/src/app/views/user/UserPageUI.tsx
@@ -1,19 +1,18 @@
import React from "react";
-import { ExcludeKey } from "../utilities/type";
import TimelinePageTemplateUI, {
TimelinePageTemplateUIProps,
-} from "../timeline/TimelinePageTemplateUI";
+} from "../timeline-common/TimelinePageTemplateUI";
import UserInfoCard, { PersonalTimelineManageItem } from "./UserInfoCard";
-export type UserPageProps = ExcludeKey<
+export type UserPageUIProps = Omit<
TimelinePageTemplateUIProps<PersonalTimelineManageItem>,
"CardComponent"
>;
-const UserPage: React.FC<UserPageProps> = (props) => {
+const UserPageUI: React.FC<UserPageUIProps> = (props) => {
return <TimelinePageTemplateUI {...props} CardComponent={UserInfoCard} />;
};
-export default UserPage;
+export default UserPageUI;
diff --git a/Timeline/ClientApp/src/app/user/User.tsx b/Timeline/ClientApp/src/app/views/user/index.tsx
index db0a6f76..7c0b1563 100644
--- a/Timeline/ClientApp/src/app/user/User.tsx
+++ b/Timeline/ClientApp/src/app/views/user/index.tsx
@@ -1,16 +1,17 @@
import React, { useState } from "react";
import { useParams } from "react-router";
-import { UiLogicError } from "../common";
-import { useUser, userInfoService } from "../data/user";
-import TimelinePageTemplate from "../timeline/TimelinePageTemplate";
+import { UiLogicError } from "@/common";
+import { useUser, userInfoService } from "@/services/user";
-import UserPage from "./UserPage";
+import TimelinePageTemplate from "../timeline-common/TimelinePageTemplate";
+
+import UserPageUI from "./UserPageUI";
+import { PersonalTimelineManageItem } from "./UserInfoCard";
import ChangeNicknameDialog from "./ChangeNicknameDialog";
import ChangeAvatarDialog from "./ChangeAvatarDialog";
-import { PersonalTimelineManageItem } from "./UserInfoCard";
-const User: React.FC = (_) => {
+const UserPage: React.FC = (_) => {
const { username } = useParams<{ username: string }>();
const user = useUser();
@@ -59,7 +60,7 @@ const User: React.FC = (_) => {
<>
<TimelinePageTemplate
name={`@${username}`}
- UiComponent={UserPage}
+ UiComponent={UserPageUI}
onManage={onManage}
notFoundI18nKey="timeline.userNotExist"
/>
@@ -68,4 +69,4 @@ const User: React.FC = (_) => {
);
};
-export default User;
+export default UserPage;
diff --git a/Timeline/ClientApp/src/app/user/user-page.sass b/Timeline/ClientApp/src/app/views/user/user.sass
index ca2d10f5..ca2d10f5 100644
--- a/Timeline/ClientApp/src/app/user/user-page.sass
+++ b/Timeline/ClientApp/src/app/views/user/user.sass
diff --git a/Timeline/ClientApp/src/tsconfig.json b/Timeline/ClientApp/src/tsconfig.json
index 2820b583..6937be63 100644
--- a/Timeline/ClientApp/src/tsconfig.json
+++ b/Timeline/ClientApp/src/tsconfig.json
@@ -12,6 +12,12 @@
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
- "sourceMap": true
+ "sourceMap": true,
+ "baseUrl": "./",
+ "paths": {
+ "@/*": [
+ "app/*"
+ ]
+ }
}
}