Skip to content
This repository was archived by the owner on Feb 6, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions studio/src/app/models/data/user.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ export interface UserSocial {
dev?: string;
medium?: string;
github?: string;

custom?: string;
custom_logo_url?: string;
}

export interface UserData {
Expand Down
5 changes: 5 additions & 0 deletions studio/src/app/pages/core/app-settings/app-settings.scss
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@ app-settings {
div.avatar {
--deckgo-avatar-size: 3rem;

deckgo-lazy-img {
width: 3rem;
height: 3rem;
}

input {
padding-left: 8px;
padding-right: 8px;
Expand Down
100 changes: 87 additions & 13 deletions studio/src/app/pages/core/app-settings/app-settings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ import {StorageService} from '../../../services/storage/storage.service';
import {ApiUserFactoryService} from '../../../services/api/user/api.user.factory.service';
import {ThemeService} from '../../../services/theme/theme.service';

import {EnvironmentDeckDeckGoConfig} from '../../../services/core/environment/environment-config';
import {EnvironmentConfigService} from '../../../services/core/environment/environment-config.service';

@Component({
tag: 'app-settings',
styleUrl: 'app-settings.scss',
Expand Down Expand Up @@ -56,6 +59,8 @@ export class AppHome {

private profilePicture: File;

private customLogo: File;

private storageService: StorageService;

private themeService: ThemeService;
Expand All @@ -81,6 +86,8 @@ export class AppHome {
private destroyUserListener;
private destroyApiUserListener;

private config: EnvironmentDeckDeckGoConfig = EnvironmentConfigService.getInstance().get('deckdeckgo');

constructor() {
this.apiUserService = ApiUserFactoryService.getInstance();
this.imageHistoryService = ImageHistoryService.getInstance();
Expand Down Expand Up @@ -243,6 +250,8 @@ export class AppHome {
this.saving = true;

await this.uploadProfilePicture();
await this.uploadCustomLogo();

await this.saveUser();
await this.saveApiUser();

Expand Down Expand Up @@ -323,6 +332,37 @@ export class AppHome {
});
}

private uploadCustomLogo(): Promise<void> {
return new Promise<void>(async (resolve, reject) => {
if (!this.valid || !this.user || !this.user.data) {
resolve();
return;
}

if (!this.user.data.social || !this.user.data.social.custom) {
resolve();
return;
}

if (!this.customLogo) {
resolve();
return;
}

try {
const storageFile: StorageFile = await this.storageService.uploadFile(this.customLogo, 'images', 524288);

if (storageFile) {
this.user.data.social.custom_logo_url = storageFile.downloadUrl;
}

resolve();
} catch (err) {
reject('Could not upload your profile picture!');
}
});
}

private async presentConfirmDelete() {
const modal: HTMLIonModalElement = await modalController.create({
component: 'app-user-delete',
Expand Down Expand Up @@ -377,21 +417,28 @@ export class AppHome {
});
}

private selectProfilePicture(): Promise<void> {
return new Promise<void>(async (resolve) => {
const filePicker: HTMLInputElement = this.el.querySelector('input#inputProfilePicture');
private async selectProfilePicture() {
const filePicker: HTMLInputElement = this.el.querySelector('input#inputProfilePicture');

if (!filePicker) {
resolve();
return;
}
if (!filePicker) {
return;
}

if (filePicker.files && filePicker.files.length > 0) {
this.profilePicture = filePicker.files[0];
}
if (filePicker.files && filePicker.files.length > 0) {
this.profilePicture = filePicker.files[0];
}
}

resolve();
});
private async selectCustomLogo() {
const filePicker: HTMLInputElement = this.el.querySelector('input#inputCustomLogo');

if (!filePicker) {
return;
}

if (filePicker.files && filePicker.files.length > 0) {
this.customLogo = filePicker.files[0];
}
}

render() {
Expand Down Expand Up @@ -732,7 +779,7 @@ export class AppHome {
</ion-item>,
<p>
<small>
Your website or any custom url (for example: <strong>{this.custom ? this.custom : 'https://yourwebsite.com'}</strong>)
Your website or any url (for example: <strong>{this.custom ? this.custom : 'https://yourwebsite.com'}</strong>)
</small>
</p>,
<ion-item>
Expand All @@ -744,6 +791,33 @@ export class AppHome {
disabled={this.saving}
onIonInput={($event: CustomEvent<KeyboardEvent>) => this.handleSocialInput($event, 'custom')}></ion-input>
</ion-item>,

this.renderCustomLogo(),
];
}

private renderCustomLogo() {
return [
<p class="ion-margin-top">
<small>A logo for this custom address</small>
</p>,
<div class="avatar">
{this.user && this.user.data && this.user.data.social && this.user.data.social.custom_logo_url ? (
<deckgo-lazy-img slot="icon" img-src={this.user.data.social.custom_logo_url} aria-label="Custom logo"></deckgo-lazy-img>
) : (
<deckgo-lazy-img
slot="icon"
svg-src={`${this.config.globalAssetsUrl}/icons/ionicons/globe.svg`}
aria-label="Custom logo image placeholder"></deckgo-lazy-img>
)}
<input
id="inputCustomLogo"
type="file"
accept="image/x-png,image/jpeg,image/gif"
onChange={() => this.selectCustomLogo()}
disabled={this.saving || !this.user || !this.user.data || !this.user.data.social || !this.user.data.social.custom}
/>
</div>,
];
}
}
6 changes: 4 additions & 2 deletions studio/src/app/utils/editor/header-footer.utils.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export class HeaderFooterUtils {
deck.removeChild(currentSlotElement);
}

const promises: Promise<HTMLElement>[] = [this.createContainer(slotName), this.createSocial(user, type), this.createImg(type)];
const promises: Promise<HTMLElement>[] = [this.createContainer(slotName), this.createSocial(user, type), this.createImg(user, type)];
const [div, social, deckgoImg] = await Promise.all(promises);

social.appendChild(deckgoImg);
Expand Down Expand Up @@ -60,7 +60,7 @@ export class HeaderFooterUtils {
return socialElement;
}

private static async createImg(type: 'twitter' | 'linkedin' | 'dev' | 'medium' | 'github' | 'custom'): Promise<HTMLElement> {
private static async createImg(user: User, type: 'twitter' | 'linkedin' | 'dev' | 'medium' | 'github' | 'custom'): Promise<HTMLElement> {
const deckgoImg: HTMLElement = document.createElement(SlotType.IMG);
deckgoImg.setAttribute('slot', 'icon');
deckgoImg.setAttribute('aria-label', type);
Expand All @@ -71,6 +71,8 @@ export class HeaderFooterUtils {
deckgoImg.setAttribute('svg-src', `${config.globalAssetsUrl}/icons/ionicons/${type}.svg`);
} else if (type === 'medium' || type === 'dev') {
deckgoImg.setAttribute('svg-src', `${config.globalAssetsUrl}/icons/${type}.svg`);
} else if (user.data.social.custom_logo_url !== undefined && user.data.social.custom_logo_url !== '') {
deckgoImg.setAttribute('img-src', user.data.social.custom_logo_url);
} else {
deckgoImg.setAttribute('svg-src', `${config.globalAssetsUrl}/icons/ionicons/globe.svg`);
}
Expand Down
14 changes: 11 additions & 3 deletions studio/src/app/utils/editor/social.utils.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,23 @@ export class SocialUtils {
}

static createCustom(user: User): JSX.IntrinsicElements {
const config: EnvironmentDeckDeckGoConfig = EnvironmentConfigService.getInstance().get('deckdeckgo');

return (
<deckgo-social slot={`social-link`} fullUrl={user.data.social.custom}>
<deckgo-lazy-img slot="icon" svg-src={`${config.globalAssetsUrl}/icons/ionicons/globe.svg`} aria-label="Web"></deckgo-lazy-img>
{this.createCustomLogo(user)}
</deckgo-social>
);
}

private static createCustomLogo(user: User): JSX.IntrinsicElements {
if (user.data.social.custom_logo_url) {
return <deckgo-lazy-img slot="icon" img-src={user.data.social.custom_logo_url} aria-label="Web"></deckgo-lazy-img>;
}

const config: EnvironmentDeckDeckGoConfig = EnvironmentConfigService.getInstance().get('deckdeckgo');

return <deckgo-lazy-img slot="icon" svg-src={`${config.globalAssetsUrl}/icons/ionicons/globe.svg`} aria-label="Web"></deckgo-lazy-img>;
}

static createGitHub(user: User): JSX.IntrinsicElements {
const config: EnvironmentDeckDeckGoConfig = EnvironmentConfigService.getInstance().get('deckdeckgo');

Expand Down