From: abias Date: Fri, 16 Jun 2023 22:17:17 +0000 (-0400) Subject: Merge branch 'main' into route-data-refactor X-Git-Url: http://these/git/?a=commitdiff_plain;h=4d716e039b8b96e6f4296f7e1ba7ae25d578741e;hp=-c;p=lemmy-ui.git Merge branch 'main' into route-data-refactor --- 4d716e039b8b96e6f4296f7e1ba7ae25d578741e diff --combined package.json index df264eb,b7c48c7..20e5645 --- a/package.json +++ b/package.json @@@ -17,16 -17,9 +17,16 @@@ "start": "yarn build:dev --watch" }, "lint-staged": { - "*.{ts,tsx,js}": ["prettier --write", "eslint --fix"], - "*.{css, scss}": ["prettier --write"], - "package.json": ["sortpack"] + "*.{ts,tsx,js}": [ + "prettier --write", + "eslint --fix" + ], + "*.{css, scss}": [ + "prettier --write" + ], + "package.json": [ + "sortpack" + ] }, "dependencies": { "@babel/plugin-proposal-decorators": "^7.21.0", @@@ -61,7 -54,7 +61,7 @@@ "inferno-server": "^8.1.1", "isomorphic-cookie": "^1.2.4", "jwt-decode": "^3.1.2", - "lemmy-js-client": "0.17.2-rc.24", + "lemmy-js-client": "0.18.0-rc.1", "lodash": "^4.17.21", "markdown-it": "^13.0.1", "markdown-it-container": "^3.0.0", diff --combined src/shared/components/community/community.tsx index 6b4eecf,f2d7ad7..6f3c911 --- a/src/shared/components/community/community.tsx +++ b/src/shared/components/community/community.tsx @@@ -63,7 -63,6 +63,7 @@@ import { FirstLoadService } from "../.. import { HttpService, RequestState } from "../../services/HttpService"; import { QueryParams, + RouteDataResponse, commentsToFlatNodes, communityRSSUrl, editComment, @@@ -101,12 -100,6 +101,12 @@@ import { SiteSidebar } from "../home/si import { PostListings } from "../post/post-listings"; import { CommunityLink } from "./community-link"; +type CommunityData = RouteDataResponse<{ + communityRes: GetCommunityResponse; + postsRes: GetPostsResponse; + commentsRes: GetCommentsResponse; +}>; + interface State { communityRes: RequestState; postsRes: RequestState; @@@ -147,7 -140,7 +147,7 @@@ export class Community extends Componen RouteComponentProps<{ name: string }>, State > { - private isoData = setIsoData(this.context); + private isoData = setIsoData(this.context); state: State = { communityRes: { state: "empty" }, postsRes: { state: "empty" }, @@@ -201,14 -194,13 +201,14 @@@ // Only fetch the data if coming from another route if (FirstLoadService.isFirstLoad) { - const [communityRes, postsRes, commentsRes] = this.isoData.routeData; + const { communityRes, commentsRes, postsRes } = this.isoData.routeData; + this.state = { ...this.state, + isIsomorphic: true, + commentsRes, communityRes, postsRes, - commentsRes, - isIsomorphic: true, }; } } @@@ -235,21 -227,23 +235,21 @@@ saveScrollPosition(this.context); } - static fetchInitialData({ + static async fetchInitialData({ client, path, query: { dataType: urlDataType, page: urlPage, sort: urlSort }, auth, }: InitialFetchRequest>): Promise< - RequestState - >[] { + Promise + > { const pathSplit = path.split("/"); - const promises: Promise>[] = []; const communityName = pathSplit[2]; const communityForm: GetCommunity = { name: communityName, auth, }; - promises.push(client.getCommunity(communityForm)); const dataType = getDataTypeFromQuery(urlDataType); @@@ -257,11 -251,6 +257,11 @@@ const page = getPageFromString(urlPage); + let postsResponse: RequestState = { state: "empty" }; + let commentsResponse: RequestState = { + state: "empty", + }; + if (dataType === DataType.Post) { const getPostsForm: GetPosts = { community_name: communityName, @@@ -272,8 -261,8 +272,8 @@@ saved_only: false, auth, }; - promises.push(client.getPosts(getPostsForm)); - promises.push(Promise.resolve({ state: "empty" })); + + postsResponse = await client.getPosts(getPostsForm); } else { const getCommentsForm: GetComments = { community_name: communityName, @@@ -284,15 -273,11 +284,15 @@@ saved_only: false, auth, }; - promises.push(Promise.resolve({ state: "empty" })); - promises.push(client.getComments(getCommentsForm)); + + commentsResponse = await client.getComments(getCommentsForm); } - return promises; + return { + communityRes: await client.getCommunity(communityForm), + commentsRes: commentsResponse, + postsRes: postsResponse, + }; } get documentTitle(): string { @@@ -375,7 -360,6 +375,6 @@@ community_view={res.community_view} moderators={res.moderators} admins={site_res.admins} - online={res.online} enableNsfw={enableNsfw(site_res)} editable allLanguages={site_res.all_languages} @@@ -662,6 -646,12 +661,12 @@@ const blockCommunityRes = await HttpService.client.blockCommunity(form); if (blockCommunityRes.state == "success") { updateCommunityBlock(blockCommunityRes.data); + this.setState(s => { + if (s.communityRes.state == "success") { + s.communityRes.data.community_view.blocked = + blockCommunityRes.data.blocked; + } + }); } } diff --combined src/shared/components/home/admin-settings.tsx index 91ba727,302e96b..ad7ac93 --- a/src/shared/components/home/admin-settings.tsx +++ b/src/shared/components/home/admin-settings.tsx @@@ -14,7 -14,6 +14,7 @@@ import { InitialFetchRequest } from ".. import { FirstLoadService } from "../../services/FirstLoadService"; import { HttpService, RequestState } from "../../services/HttpService"; import { + RouteDataResponse, capitalizeFirstLetter, fetchThemeList, myAuthRequired, @@@ -33,11 -32,6 +33,11 @@@ import RateLimitForm from "./rate-limit import { SiteForm } from "./site-form"; import { TaglineForm } from "./tagline-form"; +type AdminSettingsData = RouteDataResponse<{ + bannedRes: BannedPersonsResponse; + instancesRes: GetFederatedInstancesResponse; +}>; + interface AdminSettingsState { siteRes: GetSiteResponse; banned: PersonView[]; @@@ -45,12 -39,14 +45,14 @@@ instancesRes: RequestState; bannedRes: RequestState; leaveAdminTeamRes: RequestState; + emojiLoading: boolean; + loading: boolean; themeList: string[]; isIsomorphic: boolean; } export class AdminSettings extends Component { - private isoData = setIsoData(this.context); + private isoData = setIsoData(this.context); state: AdminSettingsState = { siteRes: this.isoData.site_res, banned: [], @@@ -58,6 -54,8 +60,8 @@@ bannedRes: { state: "empty" }, instancesRes: { state: "empty" }, leaveAdminTeamRes: { state: "empty" }, + emojiLoading: false, + loading: false, themeList: [], isIsomorphic: false, }; @@@ -72,8 -70,7 +76,8 @@@ // Only fetch the data if coming from another route if (FirstLoadService.isFirstLoad) { - const [bannedRes, instancesRes] = this.isoData.routeData; + const { bannedRes, instancesRes } = this.isoData.routeData; + this.state = { ...this.state, bannedRes, @@@ -83,18 -80,47 +87,18 @@@ } } - async fetchData() { - this.setState({ - bannedRes: { state: "loading" }, - instancesRes: { state: "loading" }, - themeList: [], - loading: true, - }); - - const auth = myAuthRequired(); - - const [bannedRes, instancesRes, themeList] = await Promise.all([ - HttpService.client.getBannedPersons({ auth }), - HttpService.client.getFederatedInstances({ auth }), - fetchThemeList(), - ]); - - this.setState({ - bannedRes, - instancesRes, - themeList, - loading: false, - }); - } - - static fetchInitialData({ + static async fetchInitialData({ auth, client, - }: InitialFetchRequest): Promise[] { - const promises: Promise>[] = []; - - if (auth) { - promises.push(client.getBannedPersons({ auth })); - promises.push(client.getFederatedInstances({ auth })); - } else { - promises.push( - Promise.resolve({ state: "empty" }), - Promise.resolve({ state: "empty" }) - ); - } - - return promises; + }: InitialFetchRequest): Promise { + return { + bannedRes: await client.getBannedPersons({ + auth: auth as string, + }), + instancesRes: await client.getFederatedInstances({ + auth: auth as string, + }), + }; } async componentDidMount() { @@@ -136,6 -162,7 +140,7 @@@ onSaveSite={this.handleEditSite} siteRes={this.state.siteRes} themeList={this.state.themeList} + loading={this.state.loading} />
@@@ -154,6 -181,7 +159,7 @@@ this.state.siteRes.site_view.local_site_rate_limit } onSaveSite={this.handleEditSite} + loading={this.state.loading} /> ), }, @@@ -165,6 -193,7 +171,7 @@@
), @@@ -178,6 -207,7 +185,7 @@@ onCreate={this.handleCreateEmoji} onDelete={this.handleDeleteEmoji} onEdit={this.handleEditEmoji} + loading={this.state.emojiLoading} /> ), @@@ -188,28 -218,6 +196,28 @@@ ); } + async fetchData() { + this.setState({ + bannedRes: { state: "loading" }, + instancesRes: { state: "loading" }, + themeList: [], + }); + + const auth = myAuthRequired(); + + const [bannedRes, instancesRes, themeList] = await Promise.all([ + HttpService.client.getBannedPersons({ auth }), + HttpService.client.getFederatedInstances({ auth }), + fetchThemeList(), + ]); + + this.setState({ + bannedRes, + instancesRes, + themeList, + }); + } + admins() { return ( <> @@@ -268,6 -276,8 +276,8 @@@ } async handleEditSite(form: EditSite) { + this.setState({ loading: true }); + const editRes = await HttpService.client.editSite(form); if (editRes.state === "success") { @@@ -280,6 -290,8 +290,8 @@@ toast(i18n.t("site_saved")); } + this.setState({ loading: false }); + return editRes; } @@@ -302,23 -314,35 +314,35 @@@ } async handleEditEmoji(form: EditCustomEmoji) { + this.setState({ emojiLoading: true }); + const res = await HttpService.client.editCustomEmoji(form); if (res.state === "success") { updateEmojiDataModel(res.data.custom_emoji); } + + this.setState({ emojiLoading: false }); } async handleDeleteEmoji(form: DeleteCustomEmoji) { + this.setState({ emojiLoading: true }); + const res = await HttpService.client.deleteCustomEmoji(form); if (res.state === "success") { removeFromEmojiDataModel(res.data.id); } + + this.setState({ emojiLoading: false }); } async handleCreateEmoji(form: CreateCustomEmoji) { + this.setState({ emojiLoading: true }); + const res = await HttpService.client.createCustomEmoji(form); if (res.state === "success") { updateEmojiDataModel(res.data.custom_emoji); } + + this.setState({ emojiLoading: false }); } } diff --combined src/shared/components/home/home.tsx index ed379b8,215075d..67b02e4 --- a/src/shared/components/home/home.tsx +++ b/src/shared/components/home/home.tsx @@@ -77,7 -77,6 +77,7 @@@ import QueryParams, relTags, restoreScrollPosition, + RouteDataResponse, saveScrollPosition, setIsoData, setupTippy, @@@ -118,45 -117,6 +118,45 @@@ interface HomeProps page: number; } +type HomeData = RouteDataResponse<{ + postsRes: GetPostsResponse; + commentsRes: GetCommentsResponse; + trendingCommunitiesRes: ListCommunitiesResponse; +}>; + +function getRss(listingType: ListingType) { + const { sort } = getHomeQueryParams(); + const auth = myAuth(); + + let rss: string | undefined = undefined; + + switch (listingType) { + case "All": { + rss = `/feeds/all.xml?sort=${sort}`; + break; + } + case "Local": { + rss = `/feeds/local.xml?sort=${sort}`; + break; + } + case "Subscribed": { + rss = auth ? `/feeds/front/${auth}.xml?sort=${sort}` : undefined; + break; + } + } + + return ( + rss && ( + <> + + + + + + ) + ); +} + function getDataTypeFromQuery(type?: string): DataType { return type ? DataType[type] : DataType.Post; } @@@ -216,7 -176,7 +216,7 @@@ const LinkButton = ( ); export class Home extends Component { - private isoData = setIsoData(this.context); + private isoData = setIsoData(this.context); state: HomeState = { postsRes: { state: "empty" }, commentsRes: { state: "empty" }, @@@ -268,14 -228,14 +268,14 @@@ // Only fetch the data if coming from another route if (FirstLoadService.isFirstLoad) { - const [postsRes, commentsRes, trendingCommunitiesRes] = + const { trendingCommunitiesRes, commentsRes, postsRes } = this.isoData.routeData; this.state = { ...this.state, - postsRes, - commentsRes, trendingCommunitiesRes, + commentsRes, + postsRes, tagline: getRandomFromList(this.state?.siteRes?.taglines ?? []) ?.content, isIsomorphic: true, @@@ -284,12 -244,7 +284,12 @@@ } async componentDidMount() { - if (!this.state.isIsomorphic || !this.isoData.routeData.length) { + if ( + !this.state.isIsomorphic || + !Object.values(this.isoData.routeData).some( + res => res.state === "success" || res.state === "failed" + ) + ) { await Promise.all([this.fetchTrendingCommunities(), this.fetchData()]); } @@@ -300,11 -255,13 +300,11 @@@ saveScrollPosition(this.context); } - static fetchInitialData({ + static async fetchInitialData({ client, auth, query: { dataType: urlDataType, listingType, page: urlPage, sort: urlSort }, - }: InitialFetchRequest>): Promise< - RequestState - >[] { + }: InitialFetchRequest>): Promise { const dataType = getDataTypeFromQuery(urlDataType); // TODO figure out auth default_listingType, default_sort_type @@@ -313,10 -270,7 +313,10 @@@ const page = urlPage ? Number(urlPage) : 1; - const promises: Promise>[] = []; + let postsRes: RequestState = { state: "empty" }; + let commentsRes: RequestState = { + state: "empty", + }; if (dataType === DataType.Post) { const getPostsForm: GetPosts = { @@@ -328,7 -282,8 +328,7 @@@ auth, }; - promises.push(client.getPosts(getPostsForm)); - promises.push(Promise.resolve({ state: "empty" })); + postsRes = await client.getPosts(getPostsForm); } else { const getCommentsForm: GetComments = { page, @@@ -338,8 -293,8 +338,8 @@@ saved_only: false, auth, }; - promises.push(Promise.resolve({ state: "empty" })); - promises.push(client.getComments(getCommentsForm)); + + commentsRes = await client.getComments(getCommentsForm); } const trendingCommunitiesForm: ListCommunities = { @@@ -348,14 -303,9 +348,14 @@@ limit: trendingFetchLimit, auth, }; - promises.push(client.listCommunities(trendingCommunitiesForm)); - return promises; + return { + trendingCommunitiesRes: await client.listCommunities( + trendingCommunitiesForm + ), + commentsRes, + postsRes, + }; } get documentTitle(): string { @@@ -390,7 -340,7 +390,7 @@@ > )}
{this.mobileView}
- {this.posts()} + {this.posts}