Started implementing Chatenium Pictures
This commit is contained in:
35
src/app/chat/picture/see/see.html
Normal file
35
src/app/chat/picture/see/see.html
Normal file
@@ -0,0 +1,35 @@
|
||||
<main>
|
||||
@defer (when store) {
|
||||
<navbar backButtonDest="/chat">
|
||||
<div class="data">
|
||||
<oimg [src]="store.uploaderData().pfp" height="50px" width="50px" [radius]="15"></oimg>
|
||||
<div class="uploader-data">
|
||||
@if (store.uploaderData().displayName == "") {
|
||||
<span class="main-name">{{'@'+store.uploaderData().username}}</span>
|
||||
} @else {
|
||||
<span class="main-name">{{store.uploaderData().displayName}}</span>
|
||||
<span class="alt-name">{{'@'+store.uploaderData().username}}</span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="items-right">
|
||||
</div>
|
||||
</navbar>
|
||||
|
||||
<main>
|
||||
@for (album of store.albums(); track album) {
|
||||
<div class="album">
|
||||
<masonry [maxColSize]="3" style="height: 300px; pointer-events: none;">
|
||||
@for (file of album.images; track file) {
|
||||
<img [src]="file.path+'_thumbnail.png'" style="filter: blur(5px)"/>
|
||||
}
|
||||
</masonry>
|
||||
<div class="album-name">
|
||||
<h2>{{album.name}}</h2>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</main>
|
||||
}
|
||||
</main>
|
||||
69
src/app/chat/picture/see/see.scss
Normal file
69
src/app/chat/picture/see/see.scss
Normal file
@@ -0,0 +1,69 @@
|
||||
main {
|
||||
height: 98svh;
|
||||
display: grid;
|
||||
grid-template-rows: 70px minmax(0, 1fr) auto;
|
||||
padding: 15px;
|
||||
|
||||
navbar {
|
||||
.uploader-data {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.main-name {
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.alt-name {
|
||||
margin-top: -5px;
|
||||
color: gray;
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
.items-right {
|
||||
margin-top: -10px;
|
||||
|
||||
button {
|
||||
width: 35px;
|
||||
height: 35px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
main {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
flex-wrap: wrap;
|
||||
align-content: flex-start;
|
||||
|
||||
.album {
|
||||
width: 300px;
|
||||
height: 300px;
|
||||
background: var(--tui-background-base-alt);
|
||||
border: 2px solid var(--tui-border-normal);
|
||||
border-radius: 30px;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
|
||||
.album-name {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
background: color-mix(in srgb, var(--tui-background-base) 50%, transparent);
|
||||
padding: 10px;
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
|
||||
h2 {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
22
src/app/chat/picture/see/see.spec.ts
Normal file
22
src/app/chat/picture/see/see.spec.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { See } from './see';
|
||||
|
||||
describe('See', () => {
|
||||
let component: See;
|
||||
let fixture: ComponentFixture<See>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
imports: [See],
|
||||
}).compileComponents();
|
||||
|
||||
fixture = TestBed.createComponent(See);
|
||||
component = fixture.componentInstance;
|
||||
await fixture.whenStable();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
||||
66
src/app/chat/picture/see/see.ts
Normal file
66
src/app/chat/picture/see/see.ts
Normal file
@@ -0,0 +1,66 @@
|
||||
import {Component, inject, signal} from '@angular/core';
|
||||
import {DmStorage, PictureStorage, ServiceManager} from '../../../service-manager';
|
||||
import {ActivatedRoute} from '@angular/router';
|
||||
import {IndexedDB} from '../../../storage/indexed-db';
|
||||
import {TUI_BREAKPOINT, TuiButton, TuiIcon} from '@taiga-ui/core';
|
||||
import {PictureService} from '@chatenium/chatenium-sdk/services/pictureService';
|
||||
import {Navbar} from '../../elements/navbar/navbar';
|
||||
import {Oimg} from '../../elements/oimg/oimg';
|
||||
import {Masonry} from '../../elements/masonry/masonry';
|
||||
|
||||
@Component({
|
||||
selector: 'app-see',
|
||||
imports: [
|
||||
Navbar,
|
||||
Oimg,
|
||||
TuiButton,
|
||||
TuiIcon,
|
||||
Masonry
|
||||
],
|
||||
templateUrl: './see.html',
|
||||
styleUrl: './see.scss',
|
||||
})
|
||||
export class See {
|
||||
serviceManager = inject(ServiceManager)
|
||||
route = inject(ActivatedRoute)
|
||||
indexedDb = inject(IndexedDB)
|
||||
breakpoint = inject(TUI_BREAKPOINT)
|
||||
|
||||
uploaderId = ""
|
||||
|
||||
get store(): PictureStorage {
|
||||
return this.serviceManager.pictureServices()[this.uploaderId]
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
this.route.params.subscribe(async params => {
|
||||
const uploaderId = params['uploaderId'];
|
||||
this.uploaderId = uploaderId;
|
||||
|
||||
const session = this.serviceManager.currentSession();
|
||||
if (!session) {
|
||||
return
|
||||
}
|
||||
|
||||
if (!this.serviceManager.pictureServices()[uploaderId]) {
|
||||
const newService = new PictureService(
|
||||
session.token,
|
||||
uploaderId,
|
||||
session.userData.userid,
|
||||
this.indexedDb.getApi(),
|
||||
);
|
||||
|
||||
const uploaderInfo = await newService.get()
|
||||
|
||||
this.serviceManager.pictureServices.update(services => ({
|
||||
...services,
|
||||
[uploaderId]: {
|
||||
albums: signal(uploaderInfo.pictures),
|
||||
uploaderData: signal(uploaderInfo.userData),
|
||||
service: newService,
|
||||
} as PictureStorage
|
||||
}));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user