X-Git-Url: http://these/git/?a=blobdiff_plain;f=src%2Fshared%2Fcomponents%2Fperson%2Fregistration-applications.tsx;h=757170f833f801a503e33d5ce41ea21ec267c55c;hb=b45c24537db2c0618626ff15a5d76ee836697e72;hp=39b659000c940e188acc4fc98386716d4a48f046;hpb=8d0b2e0bf15cfdca97606722d18ceb274d333d90;p=lemmy-ui.git diff --git a/src/shared/components/person/registration-applications.tsx b/src/shared/components/person/registration-applications.tsx index 39b6590..757170f 100644 --- a/src/shared/components/person/registration-applications.tsx +++ b/src/shared/components/person/registration-applications.tsx @@ -1,28 +1,23 @@ +import { + editRegistrationApplication, + myAuthRequired, + setIsoData, +} from "@utils/app"; +import { randomStr } from "@utils/helpers"; +import { RouteDataResponse } from "@utils/types"; +import classNames from "classnames"; import { Component, linkEvent } from "inferno"; import { + ApproveRegistrationApplication, GetSiteResponse, - ListRegistrationApplications, ListRegistrationApplicationsResponse, - RegistrationApplicationResponse, - UserOperation, - wsJsonToRes, - wsUserOp, + RegistrationApplicationView, } from "lemmy-js-client"; -import { Subscription } from "rxjs"; -import { i18n } from "../../i18next"; +import { fetchLimit } from "../../config"; import { InitialFetchRequest } from "../../interfaces"; -import { UserService, WebSocketService } from "../../services"; -import { - fetchLimit, - isBrowser, - myAuth, - setIsoData, - setupTippy, - toast, - updateRegistrationApplicationRes, - wsClient, - wsSubscribe, -} from "../../utils"; +import { FirstLoadService, I18NextService, UserService } from "../../services"; +import { HttpService, RequestState } from "../../services/HttpService"; +import { setupTippy } from "../../tippy"; import { HtmlTags } from "../common/html-tags"; import { Spinner } from "../common/icon"; import { Paginator } from "../common/paginator"; @@ -33,123 +28,141 @@ enum UnreadOrAll { All, } +type RegistrationApplicationsData = RouteDataResponse<{ + listRegistrationApplicationsResponse: ListRegistrationApplicationsResponse; +}>; + interface RegistrationApplicationsState { - listRegistrationApplicationsResponse?: ListRegistrationApplicationsResponse; + appsRes: RequestState; siteRes: GetSiteResponse; unreadOrAll: UnreadOrAll; page: number; - loading: boolean; + isIsomorphic: boolean; } export class RegistrationApplications extends Component< any, RegistrationApplicationsState > { - private isoData = setIsoData(this.context); - private subscription?: Subscription; + private isoData = setIsoData(this.context); state: RegistrationApplicationsState = { + appsRes: { state: "empty" }, siteRes: this.isoData.site_res, unreadOrAll: UnreadOrAll.Unread, page: 1, - loading: true, + isIsomorphic: false, }; constructor(props: any, context: any) { super(props, context); this.handlePageChange = this.handlePageChange.bind(this); - - this.parseMessage = this.parseMessage.bind(this); - this.subscription = wsSubscribe(this.parseMessage); + this.handleApproveApplication = this.handleApproveApplication.bind(this); // Only fetch the data if coming from another route - if (this.isoData.path == this.context.router.route.match.url) { + if (FirstLoadService.isFirstLoad) { this.state = { ...this.state, - listRegistrationApplicationsResponse: this.isoData - .routeData[0] as ListRegistrationApplicationsResponse, - loading: false, + appsRes: this.isoData.routeData.listRegistrationApplicationsResponse, + isIsomorphic: true, }; - } else { - this.refetch(); } } - componentDidMount() { - setupTippy(); - } - - componentWillUnmount() { - if (isBrowser()) { - this.subscription?.unsubscribe(); + async componentDidMount() { + if (!this.state.isIsomorphic) { + await this.refetch(); } + setupTippy(); } get documentTitle(): string { - let mui = UserService.Instance.myUserInfo; + const mui = UserService.Instance.myUserInfo; return mui - ? `@${mui.local_user_view.person.name} ${i18n.t( + ? `@${mui.local_user_view.person.name} ${I18NextService.i18n.t( "registration_applications" )} - ${this.state.siteRes.site_view.site.name}` : ""; } - render() { - return ( -
- {this.state.loading ? ( + renderApps() { + switch (this.state.appsRes.state) { + case "loading": + return (
- ) : ( + ); + case "success": { + const apps = this.state.appsRes.data.registration_applications; + return (
-
{i18n.t("registration_applications")}
+

+ {I18NextService.i18n.t("registration_applications")} +

{this.selects()} - {this.applicationList()} + {this.applicationList(apps)}
- )} + ); + } + } + } + + render() { + return ( +
+ {this.renderApps()}
); } unreadOrAllRadios() { + const radioId = randomStr(); + return ( -
+
+ + +
); @@ -158,27 +171,25 @@ export class RegistrationApplications extends Component< selects() { return (
- {this.unreadOrAllRadios()} + {this.unreadOrAllRadios()}
); } - applicationList() { - let res = this.state.listRegistrationApplicationsResponse; + applicationList(apps: RegistrationApplicationView[]) { return ( - res && ( -
- {res.registration_applications.map(ra => ( - <> -
- - - ))} -
- ) +
+ {apps.map(ra => ( + <> +
+ + + ))} +
); } @@ -192,65 +203,49 @@ export class RegistrationApplications extends Component< this.refetch(); } - static fetchInitialData(req: InitialFetchRequest): Promise[] { - let promises: Promise[] = []; - - let auth = req.auth; - if (auth) { - let form: ListRegistrationApplications = { - unread_only: true, - page: 1, - limit: fetchLimit, - auth, - }; - promises.push(req.client.listRegistrationApplications(form)); - } - - return promises; + static async fetchInitialData({ + auth, + client, + }: InitialFetchRequest): Promise { + return { + listRegistrationApplicationsResponse: auth + ? await client.listRegistrationApplications({ + unread_only: true, + page: 1, + limit: fetchLimit, + auth: auth as string, + }) + : { state: "empty" }, + }; } - refetch() { - let unread_only = this.state.unreadOrAll == UnreadOrAll.Unread; - let auth = myAuth(); - if (auth) { - let form: ListRegistrationApplications = { + async refetch() { + const unread_only = this.state.unreadOrAll == UnreadOrAll.Unread; + this.setState({ + appsRes: { state: "loading" }, + }); + this.setState({ + appsRes: await HttpService.client.listRegistrationApplications({ unread_only: unread_only, page: this.state.page, limit: fetchLimit, - auth, - }; - WebSocketService.Instance.send( - wsClient.listRegistrationApplications(form) - ); - } + auth: myAuthRequired(), + }), + }); } - parseMessage(msg: any) { - let op = wsUserOp(msg); - console.log(msg); - if (msg.error) { - toast(i18n.t(msg.error), "danger"); - return; - } else if (msg.reconnect) { - this.refetch(); - } else if (op == UserOperation.ListRegistrationApplications) { - let data = wsJsonToRes(msg); - this.setState({ - listRegistrationApplicationsResponse: data, - loading: false, - }); - window.scrollTo(0, 0); - } else if (op == UserOperation.ApproveRegistrationApplication) { - let data = wsJsonToRes(msg); - updateRegistrationApplicationRes( - data.registration_application, - this.state.listRegistrationApplicationsResponse - ?.registration_applications - ); - let uacs = UserService.Instance.unreadApplicationCountSub; - // Minor bug, where if the application switches from deny to approve, the count will still go down - uacs.next(uacs.getValue() - 1); - this.setState(this.state); - } + async handleApproveApplication(form: ApproveRegistrationApplication) { + const approveRes = await HttpService.client.approveRegistrationApplication( + form + ); + this.setState(s => { + if (s.appsRes.state == "success" && approveRes.state == "success") { + s.appsRes.data.registration_applications = editRegistrationApplication( + approveRes.data.registration_application, + s.appsRes.data.registration_applications + ); + } + return s; + }); } }