123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- const { div, h2, p, section, button, form, a, span, textarea, br, input, h1 } = require("../server/node_modules/hyperaxe");
- const { template, i18n } = require('./main_views');
- const { config } = require('../server/SSB_server.js');
- const { renderTextWithStyles } = require('../backend/renderTextWithStyles');
- const generateFilterButtons = (filters, currentFilter, action) => {
- return filters.map(mode =>
- form({ method: 'GET', action },
- input({ type: 'hidden', name: 'filter', value: mode }),
- button({ type: 'submit', class: currentFilter === mode.toLowerCase() ? 'filter-btn active' : 'filter-btn' }, i18n[mode + 'Button'] || mode)
- )
- );
- };
- const renderFeedCard = (feed, alreadyRefeeded, alreadyVoted) => {
- const content = feed.value.content;
- const totalVotes = Object.entries(content.opinions || {});
- const totalCount = totalVotes.reduce((sum, [, count]) => sum + count, 0);
- const createdAt = feed.value.timestamp ? new Date(feed.value.timestamp).toLocaleString() : '';
- return div({ class: 'feed-card' },
- div({ class: 'feed-row' },
- div({ class: 'refeed-column' },
- h1(`${content.refeeds || 0}`),
- !alreadyRefeeded
- ? form({ method: 'POST', action: `/feed/refeed/${encodeURIComponent(feed.key)}` },
- button({ class: 'refeed-btn' }, i18n.refeedButton)
- )
- : p(i18n.alreadyRefeeded)
- ),
- div({ class: 'feed-main' },
- div({ class: 'feed-text', innerHTML: renderTextWithStyles(content.text) }),
- h2(`${i18n.totalOpinions}: ${totalCount}`),
- p({ class: 'card-footer' },
- span({ class: 'date-link' }, `${createdAt} ${i18n.performed} `),
- a({ href: `/author/${encodeURIComponent(feed.value.author)}`, class: 'user-link' }, `${feed.value.author}`)
- )
- )
- ),
- div({ class: 'votes-wrapper' },
- totalVotes.length > 0
- ? div({ class: 'votes' },
- totalVotes.map(([category, count]) =>
- span({ class: 'vote-category' }, `${category}: ${count}`)
- )
- )
- : null,
- !alreadyVoted
- ? div({ class: 'voting-buttons' },
- ['interesting','necessary','funny','disgusting','sensible','propaganda','adultOnly','boring','confusing','inspiring','spam'].map(cat =>
- form({ method: 'POST', action: `/feed/opinions/${encodeURIComponent(feed.key)}/${cat}` },
- button({ class: 'vote-btn' }, `${i18n['vote'+cat.charAt(0).toUpperCase()+cat.slice(1)] || cat} [${content.opinions?.[cat]||0}]`)
- )
- )
- )
- : p(i18n.alreadyVoted)
- )
- );
- };
- exports.feedView = (feeds, filter) => {
- const title =
- filter === 'MINE' ? i18n.MINEButton :
- filter === 'TODAY' ? i18n.TODAYButton :
- filter === 'TOP' ? i18n.TOPButton :
- filter === 'CREATE' ? i18n.createFeedTitle :
- filter === 'tag' ? i18n.filteredByTag :
- i18n.feedTitle;
- if (filter !== 'TOP') {
- feeds = feeds.sort((a, b) => b.value.timestamp - a.value.timestamp);
- } else {
- feeds = feeds.sort((a, b) => {
- const aRefeeds = a.value.content.refeeds || 0;
- const bRefeeds = b.value.content.refeeds || 0;
- return bRefeeds - aRefeeds;
- });
- }
- const header = div({ class: 'tags-header' },
- h2(title),
- p(i18n.FeedshareYourOpinions)
- );
- return template(
- title,
- section(
- header,
- div({ class: 'mode-buttons-row' },
- generateFilterButtons(['ALL', 'MINE', 'TODAY', 'TOP'], filter, '/feed'),
- form({ method: 'GET', action: '/feed/create' },
- button({
- type: 'submit',
- class: 'create-button filter-btn'
- }, i18n.createFeedTitle || "Create Feed")
- )
- ),
- section(
- filter === 'CREATE'
- ? form({ method: 'POST', action: '/feed/create' },
- textarea({
- name: 'text',
- placeholder: i18n.feedPlaceholder,
- maxlength: 280,
- rows: 4,
- cols: 50
- }),
- br(),
- button({ type: 'submit' }, i18n.createFeedButton)
- )
- : feeds && feeds.length > 0
- ? div({ class: 'feed-container' },
- feeds.map(feed => {
- const content = feed.value.content;
- const alreadyRefeeded = content.refeeds_inhabitants?.includes(config.keys.id);
- const alreadyVoted = content.opinions_inhabitants?.includes(config.keys.id);
- return renderFeedCard(feed, alreadyRefeeded, alreadyVoted);
- })
- )
- : div({ class: 'no-results' }, p(i18n.noFeedsFound))
- )
- )
- );
- };
- exports.feedCreateView = () => {
- return template(
- i18n.createFeedTitle,
- section(
- div({ class: 'tags-header' },
- h2(i18n.createFeedTitle),
- p(i18n.FeedshareYourOpinions)
- ),
- div({ class: 'mode-buttons', style: 'display:flex; gap:8px; margin-bottom:24px;' },
- generateFilterButtons(['ALL', 'MINE', 'TODAY', 'TOP'], 'CREATE', '/feed')
- ),
- form({ method: 'POST', action: '/feed/create' },
- textarea({
- name: 'text',
- maxlength: '280',
- rows: 5,
- cols: 50,
- placeholder: i18n.feedPlaceholder
- }),
- br(),
- button({ type: 'submit', class: 'create-button' }, i18n.createFeedButton || 'Send Feed!')
- )
- )
- );
- };
|