diff --git a/marko/page/logs-content/components/log-suggestions/component.js b/marko/page/logs-content/components/log-suggestions/component.js new file mode 100644 index 0000000..771440e --- /dev/null +++ b/marko/page/logs-content/components/log-suggestions/component.js @@ -0,0 +1,93 @@ +const {logHeaderApi} = require("../../../../../rpdata/api/LogHeader") + +module.exports = class { + onCreate(input) { + this.state = { + id: input.log.id, + channelName: input.log.channelName, + eventName: input.log.eventName, + nexts: [], + prevs: [], + loaded: false, + error: null, + } + } + + onMount() { + this.timeout = setTimeout(() => { + logHeaderApi.list().then(logs => { + const index = logs.findIndex(l => l.id === this.state.id); + if (index === -1) { + return Promise.reject("This log not found in list.") + } + const log = logs[index] + const characterIds = log.characters.map(c => c.id); + const nexts = [] + const prevs = [] + const foundGroups = {} + let foundChannel = false + + for (let i = index - 1; i >= 0; --i) { + const log2 = logs[i] + const hasEvent = (log.eventName ? log.eventName === log2.eventName : false) + const hasChannel = (log.channelName === log2.channelName) + + const characters = log2.findCharacters(...characterIds) + const characterIdsKey = characters.map(c => c.id).sort().join(",") + + const suggestion = {log: log2, characters, hasEvent, hasChannel} + + if (hasChannel && !foundChannel) { + foundChannel = true + foundGroups[characterIdsKey] = true + + nexts.push(suggestion) + } else if (hasEvent) { + foundGroups[characterIdsKey] = true + + nexts.push(suggestion) + } else if (nexts.length < 8 && !hasEvent && characters.length > 1 && !foundGroups[characterIdsKey]) { + foundGroups[characterIdsKey] = true + nexts.push(suggestion) + } + } + + for (let i = index + 1; i < logs.length; ++i) { + const log2 = logs[i] + const hasEvent = (log.eventName ? log.eventName === log2.eventName : false) + const hasChannel = (log.channelName === log2.channelName) + + const characters = log2.findCharacters(...characterIds) + const characterIdsKey = characters.map(c => c.id).sort().join(",") + + const suggestion = {log: log2, characters, hasEvent, hasChannel} + + if (hasChannel && !foundChannel) { + foundChannel = true + foundGroups[characterIdsKey] = true + + prevs.push(suggestion) + } else if (hasEvent) { + foundGroups[characterIdsKey] = true + + prevs.push(suggestion) + } else if (prevs.length < 8 && !hasEvent && characters.length > 1 && !foundGroups[characterIdsKey]) { + foundGroups[characterIdsKey] = true + prevs.push(suggestion) + } + } + + this.state.nexts = nexts; + this.state.prevs = prevs; + this.state.loaded = true; + }).catch(err => { + console.warn("Suggestions load error:", err) + this.suggestionsError = "Failed to load suggestions: " + err.toString() + }) + }, 1000) + } + + onUnmount() { + clearTimeout(this.timeout) + } +} diff --git a/marko/page/logs-content/components/log-suggestions/index.marko b/marko/page/logs-content/components/log-suggestions/index.marko new file mode 100644 index 0000000..5cbafb4 --- /dev/null +++ b/marko/page/logs-content/components/log-suggestions/index.marko @@ -0,0 +1,41 @@ +import moment from "moment" + +
p)) class="color-text">${paragraph}