diff --git a/src/app/editor/project/link-dialog/link-dialog.component.html b/src/app/editor/project/link-dialog/link-dialog.component.html index 06ede5b..aab7b9a 100644 --- a/src/app/editor/project/link-dialog/link-dialog.component.html +++ b/src/app/editor/project/link-dialog/link-dialog.component.html @@ -8,7 +8,10 @@

Link your Project

-

{{ game.name }}

+

+ {{ game.name }} + Shared +

Updated: {{ game.updatedAt | amTimeAgo }}

diff --git a/src/app/editor/project/link-dialog/link-dialog.component.scss b/src/app/editor/project/link-dialog/link-dialog.component.scss new file mode 100644 index 0000000..094372b --- /dev/null +++ b/src/app/editor/project/link-dialog/link-dialog.component.scss @@ -0,0 +1,13 @@ +@import '../../../assets/styles/declarations'; + +.shared { + $font-size: 0.7em; + $vertical-margin: 1em * (1em / $font-size - 1) / 2; + + font-size: $font-size; + display: inline-block; + padding: $vertical-margin 0.3em; + background: $color-primary2; + border-radius: 2px; + margin: $vertical-margin 0; +} diff --git a/src/app/editor/project/link-dialog/link-dialog.component.ts b/src/app/editor/project/link-dialog/link-dialog.component.ts index f033c69..eb6f96b 100644 --- a/src/app/editor/project/link-dialog/link-dialog.component.ts +++ b/src/app/editor/project/link-dialog/link-dialog.component.ts @@ -18,6 +18,7 @@ import * as fromProject from '../project.reducer'; selector: 'link-dialog', templateUrl: './link-dialog.component.html', changeDetection: ChangeDetectionStrategy.OnPush, + styleUrls: ['./link-dialog.component.scss'], }) export class LinkProjectDialogComponent { /** diff --git a/src/app/editor/project/project.actions.ts b/src/app/editor/project/project.actions.ts index 665fcc6..eda159a 100644 --- a/src/app/editor/project/project.actions.ts +++ b/src/app/editor/project/project.actions.ts @@ -27,6 +27,7 @@ export interface IInteractiveVersion { export interface IInteractiveGame { id: number; name: string; + isShared: boolean; versions: IInteractiveVersion[]; } diff --git a/src/server/project-linker.ts b/src/server/project-linker.ts index 6a368ca..0021c14 100644 --- a/src/server/project-linker.ts +++ b/src/server/project-linker.ts @@ -2,7 +2,7 @@ import { IFullInteractiveVersion, IInteractiveGame } from '../app/editor/project import { IWorld } from '../app/editor/schema/schema.actions'; import { UnexpectedHttpError } from './errors'; import { Project } from './project'; -import { Fetcher } from './util'; +import { Fetcher, IRequester } from './util'; const storageKey = 'linkedInteractiveGame'; @@ -20,22 +20,14 @@ export class ProjectLinker { const user = await this.project.profile.user(); const fetcher = new Fetcher().with(await this.project.profile.tokens()); - let output: IInteractiveGame[] = []; - for (let page = 0; true; page++) { - // tslint:disable-line - const next = await fetcher.json( - 'get', - `/interactive/games/owned?user=${user.id}&page=${page}`, - ); - const contents = await next.json(); - if (!contents.length) { - break; - } + const [owned, shared] = await Promise.all([ + this.enumerateUponEndpoint(fetcher, `/interactive/games/owned?user=${user.id}`), + this.enumerateUponEndpoint(fetcher, `/interactive/games/editor?user=${user.id}`), + ]); - output = output.concat(contents); - } - - return output; + return owned + .map(g => ({ ...g, isShared: false })) + .concat(shared.map(g => ({ ...g, isShared: true }))); } /** @@ -99,4 +91,23 @@ export class ProjectLinker { throw new UnexpectedHttpError(response, await response.text()); } } + + private async enumerateUponEndpoint( + fetcher: IRequester, + endpoint: string, + ): Promise { + let output: IInteractiveGame[] = []; + for (let page = 0; true; page++) { + // tslint:disable-line + const next = await fetcher.json('get', `${endpoint}&page=${page}`); + const contents = await next.json(); + if (!contents.length) { + break; + } + + output = output.concat(contents); + } + + return output; + } }