| 1 | import { User, Story, Chapter, Comment, Genre, ReadingList, AISuggestion, Collaboration, Notification } from '../types'
|
|---|
| 2 |
|
|---|
| 3 | export const mockUsers: User[] = [
|
|---|
| 4 | { user_id: 1, username: 'admin_alex', email: 'admin@chapterx.com', name: 'Alex', surname: 'Admin', role: 'admin', bio: 'Platform administrator', created_at: '2024-01-01T00:00:00Z', follower_count: 120, following_count: 45 },
|
|---|
| 5 | { user_id: 2, username: 'elena_writes', email: 'elena@chapterx.com', name: 'Elena', surname: 'Dimitrova', role: 'writer', bio: 'Fantasy and historical fiction writer. Coffee addict.', created_at: '2024-02-15T00:00:00Z', follower_count: 1840, following_count: 230 },
|
|---|
| 6 | { user_id: 3, username: 'marco_author', email: 'marco@chapterx.com', name: 'Marco', surname: 'Rossi', role: 'writer', bio: 'Co-author and editor. Passionate about historical fiction.', created_at: '2024-03-10T00:00:00Z', follower_count: 560, following_count: 89 },
|
|---|
| 7 | { user_id: 4, username: 'sara_reader', email: 'sara@email.com', name: 'Sara', surname: 'Petkovska', role: 'regular', bio: 'Avid reader. Fantasy and romance lover.', created_at: '2024-04-05T00:00:00Z', follower_count: 45, following_count: 123 },
|
|---|
| 8 | { user_id: 5, username: 'ivan_fan', email: 'ivan@email.com', name: 'Ivan', surname: 'Stojanovski', role: 'regular', bio: 'Sci-fi enthusiast and book reviewer.', created_at: '2024-05-20T00:00:00Z', follower_count: 78, following_count: 200 },
|
|---|
| 9 | { user_id: 6, username: 'maja_newwriter', email: 'maja@chapterx.com', name: 'Maja', surname: 'Georgieva', role: 'writer', bio: 'New to writing, exploring my creativity!', created_at: '2024-11-01T00:00:00Z', follower_count: 12, following_count: 34 },
|
|---|
| 10 | { user_id: 9, username: 'boris_writer', email: 'boris@chapterx.com', name: 'Boris', surname: 'Nikolov', role: 'writer', bio: 'Romance writer with a passion for storytelling.', created_at: '2024-06-15T00:00:00Z', follower_count: 890, following_count: 167 },
|
|---|
| 11 | ]
|
|---|
| 12 |
|
|---|
| 13 | export const mockStories: Story[] = [
|
|---|
| 14 | {
|
|---|
| 15 | story_id: 1,
|
|---|
| 16 | title: 'The Chronicles of Eldoria',
|
|---|
| 17 | short_description: 'When the last dragon awakens, a young mage must unite the fractured kingdoms before ancient evil consumes the realm.',
|
|---|
| 18 | content: 'In the ancient realm of Eldoria, where magic flows through crystalline rivers and dragons once ruled the skies, a prophecy spoken at the dawn of creation is finally coming to pass...',
|
|---|
| 19 | mature_content: false,
|
|---|
| 20 | user_id: 2,
|
|---|
| 21 | author_username: 'elena_writes',
|
|---|
| 22 | status: 'published',
|
|---|
| 23 | genres: ['Fantasy', 'Adventure'],
|
|---|
| 24 | created_at: '2024-08-15T10:30:00Z',
|
|---|
| 25 | updated_at: '2024-08-25T18:00:00Z',
|
|---|
| 26 | total_likes: 1240,
|
|---|
| 27 | total_comments: 89,
|
|---|
| 28 | total_chapters: 4,
|
|---|
| 29 | total_views: 15420,
|
|---|
| 30 | },
|
|---|
| 31 | {
|
|---|
| 32 | story_id: 2,
|
|---|
| 33 | title: 'Letters from Constantinople',
|
|---|
| 34 | short_description: 'A forbidden love story spanning decades in the heart of the Ottoman Empire.',
|
|---|
| 35 | content: 'In 1520 Constantinople, young scholar Iskender discovers a cache of love letters hidden beneath the floorboards of his grandfather\'s library...',
|
|---|
| 36 | mature_content: false,
|
|---|
| 37 | user_id: 2,
|
|---|
| 38 | author_username: 'elena_writes',
|
|---|
| 39 | status: 'published',
|
|---|
| 40 | genres: ['Historical Fiction', 'Romance'],
|
|---|
| 41 | created_at: '2025-01-15T13:15:00Z',
|
|---|
| 42 | updated_at: '2025-01-20T15:50:00Z',
|
|---|
| 43 | total_likes: 890,
|
|---|
| 44 | total_comments: 45,
|
|---|
| 45 | total_chapters: 2,
|
|---|
| 46 | total_views: 8340,
|
|---|
| 47 | },
|
|---|
| 48 | {
|
|---|
| 49 | story_id: 3,
|
|---|
| 50 | title: 'Neon Requiem',
|
|---|
| 51 | short_description: 'In a cyberpunk dystopia, a rogue AI detective hunts a serial killer across virtual realities.',
|
|---|
| 52 | content: 'The rain never stopped in Neo-Kyoto. Detective ARIA-7 traced the glowing neon trails through the underbelly of a city that never slept...',
|
|---|
| 53 | mature_content: true,
|
|---|
| 54 | user_id: 2,
|
|---|
| 55 | author_username: 'elena_writes',
|
|---|
| 56 | status: 'draft',
|
|---|
| 57 | genres: ['Sci-Fi', 'Thriller'],
|
|---|
| 58 | created_at: '2025-02-01T09:00:00Z',
|
|---|
| 59 | updated_at: '2025-02-01T09:00:00Z',
|
|---|
| 60 | total_likes: 0,
|
|---|
| 61 | total_comments: 0,
|
|---|
| 62 | total_chapters: 1,
|
|---|
| 63 | total_views: 0,
|
|---|
| 64 | },
|
|---|
| 65 | {
|
|---|
| 66 | story_id: 4,
|
|---|
| 67 | title: 'Moonlight Promises',
|
|---|
| 68 | short_description: 'A vampire prince and a witch must unite to save both their worlds from ancient darkness.',
|
|---|
| 69 | content: 'For centuries, vampires and witches had been mortal enemies. But when an ancient evil older than either of their kinds threatens both realms...',
|
|---|
| 70 | mature_content: false,
|
|---|
| 71 | user_id: 9,
|
|---|
| 72 | author_username: 'boris_writer',
|
|---|
| 73 | status: 'published',
|
|---|
| 74 | genres: ['Romance', 'Fantasy'],
|
|---|
| 75 | created_at: '2024-11-20T11:00:00Z',
|
|---|
| 76 | updated_at: '2024-11-27T14:30:00Z',
|
|---|
| 77 | total_likes: 450,
|
|---|
| 78 | total_comments: 32,
|
|---|
| 79 | total_chapters: 3,
|
|---|
| 80 | total_views: 7890,
|
|---|
| 81 | },
|
|---|
| 82 | ]
|
|---|
| 83 |
|
|---|
| 84 | export const mockChapters: Chapter[] = [
|
|---|
| 85 | {
|
|---|
| 86 | chapter_id: 1,
|
|---|
| 87 | story_id: 1,
|
|---|
| 88 | title: 'The Awakening',
|
|---|
| 89 | content: `The morning the dragon returned to Eldoria, Kael was studying ancient runes in the tower library when the world seemed to hold its breath.
|
|---|
| 90 |
|
|---|
| 91 | He had been there since before dawn, surrounded by towering stacks of leather-bound tomes, their spines cracked and gilded with faded gold lettering. The library smelled of aged parchment and burning tallow candles, a scent that Kael had grown to associate with both knowledge and sleepless nights. Outside the narrow arched windows, the capital city of Silvermere was just beginning to stir — merchants setting out their wares, fishermen heading toward the harbor, the distant clang of the blacksmith's hammer.
|
|---|
| 92 |
|
|---|
| 93 | Then everything stopped.
|
|---|
| 94 |
|
|---|
| 95 | The birds fell silent first. Kael noticed it in the periphery of his awareness, the way one notices a candle being snuffed — a sudden absence where there had been presence. He looked up from the manuscript he was transcribing, ink-stained fingers hovering over the parchment. The morning light streaming through the windows had taken on a strange, burnished quality, as though filtered through amber glass.
|
|---|
| 96 |
|
|---|
| 97 | Then he felt it — a tremor deep in the earth, not violent but resonant, like the plucking of an enormous string stretched beneath the foundations of the world. The crystals on the laboratory bench clinked softly against one another. The candle flames bent, all at once, toward the east.
|
|---|
| 98 |
|
|---|
| 99 | Kael was on his feet before he consciously decided to move, knocking over his stool, scattering papers across the stone floor. He pressed his face against the cold window glass and looked toward the Thornwood Mountains that loomed beyond the eastern wall of the city.
|
|---|
| 100 |
|
|---|
| 101 | Against the pale morning sky, something vast and dark was rising.
|
|---|
| 102 |
|
|---|
| 103 | It moved with terrible grace, its wings spreading wider than the sails of the great merchant galleons in the harbor below. Scales that had not caught sunlight in four hundred years caught it now and scattered it in prismatic fragments across the city. The creature's neck curved upward in a long, serpentine arc, and when it opened its mouth, the sound that emerged was not the roar of a beast but something almost like a word — deep and resonant and full of ancient sorrow.
|
|---|
| 104 |
|
|---|
| 105 | "Impossible," Kael whispered, though his heart told him otherwise.
|
|---|
| 106 |
|
|---|
| 107 | He had read every account of the dragon wars. He had translated the old elvish texts describing the final flight of Varanthos the Everlasting, how the great dragon had been bound in stone sleep by the combined power of the Mage Council four centuries ago. The binding was supposed to be permanent. Unbreakable. The foundation upon which modern Eldoria's peace had been built.
|
|---|
| 108 |
|
|---|
| 109 | The binding had broken.
|
|---|
| 110 |
|
|---|
| 111 | Kael grabbed his satchel, stuffing the manuscript and his translation tools inside with shaking hands. If Varanthos had awakened, everything the prophecy had warned about was beginning. He needed to reach the Archmage immediately — and then, if the old texts were right, he would need to do something far more dangerous than anything he had ever attempted.
|
|---|
| 112 |
|
|---|
| 113 | He would need to find the five Shards of the Ancient Compact, scattered across the fractured kingdoms, before the darkness that had stirred the dragon from his sleep consumed everything Kael had ever known.`,
|
|---|
| 114 | chapter_number: 1,
|
|---|
| 115 | word_count: 487,
|
|---|
| 116 | view_count: 4230,
|
|---|
| 117 | created_at: '2024-08-15T10:30:00Z',
|
|---|
| 118 | updated_at: '2024-08-19T14:20:00Z',
|
|---|
| 119 | is_published: true,
|
|---|
| 120 | },
|
|---|
| 121 | {
|
|---|
| 122 | chapter_id: 2,
|
|---|
| 123 | story_id: 1,
|
|---|
| 124 | title: 'The Archmage\'s Warning',
|
|---|
| 125 | content: `The Archmage Sylvara Moonwhisper had not slept in three days. Kael could see it in the violet shadows beneath her silver eyes, in the slight tremor of her usually steady hands as she poured two cups of tea from a ceramic pot shaped like an owl.
|
|---|
| 126 |
|
|---|
| 127 | "I know why you've come," she said without turning from the window. Her chambers were at the very top of the Mage Spire, and from here the city of Silvermere spread out like a tapestry below them. In the distance, the dragon — Varanthos, it had to be Varanthos — was circling the mountain peaks, as if reacquainting himself with a world much changed.
|
|---|
| 128 |
|
|---|
| 129 | "The binding failed," Kael said, accepting the cup of tea though his hands were still shaking. "How? The texts said it would hold for a thousand years."
|
|---|
| 130 |
|
|---|
| 131 | Sylvara finally turned to face him. She was ancient, older than any living record could confirm, though she appeared to be a woman of perhaps sixty years. There were things behind her eyes that had no name.
|
|---|
| 132 |
|
|---|
| 133 | "The texts were optimistic," she said. "The binding was weakening long before last night. But something — something reached into the dream-stone where Varanthos slept and shattered it deliberately."
|
|---|
| 134 |
|
|---|
| 135 | Kael set down his cup. "Deliberately? You mean someone—"
|
|---|
| 136 |
|
|---|
| 137 | "The Hollow Court." Sylvara's voice was flat. "They've been searching for a way to free him for decades. It seems they finally found it."
|
|---|
| 138 |
|
|---|
| 139 | The Hollow Court. Kael had written academic papers on them — or rather, on the historical records, since no one had seen proof of their existence in a century. A secret society dedicated to the worship of the ancient chaos that had preceded the gods themselves. They believed the world had been a mistake, and that Varanthos was the instrument through which that mistake would be corrected.
|
|---|
| 140 |
|
|---|
| 141 | "Then we have to stop them," Kael said. "Not just the dragon — we have to stop whoever controls them."
|
|---|
| 142 |
|
|---|
| 143 | "No one controls Varanthos," Sylvara said sharply. "He is not a weapon they can aim. But they can influence him. And they will try to use him to find the Shards before we do." She moved to her desk, pushing aside stacks of correspondence to reveal a map of Eldoria, old and much annotated, its edges yellowed with age. Five points were marked in red ink. "The Compact Shards. The only things that can rebind him, if it comes to that. Or..." She hesitated.
|
|---|
| 144 |
|
|---|
| 145 | "Or what?" Kael pressed.
|
|---|
| 146 |
|
|---|
| 147 | "Or communicate with him. The Compact was not always a cage. In the beginning, it was a conversation. An agreement between dragonkind and the peoples of Eldoria." Her silver eyes met his. "The first Compact-bearers did not defeat Varanthos. They listened to him."
|
|---|
| 148 |
|
|---|
| 149 | Kael stared at the map, at the five red marks scattered from the frozen north to the desert south. A journey that would take months. Through kingdoms that no longer spoke to one another, across borders bristling with soldiers, through wilderness that hadn't been mapped in living memory.
|
|---|
| 150 |
|
|---|
| 151 | "I'll need a horse," he said finally. "And letters of passage."
|
|---|
| 152 |
|
|---|
| 153 | Sylvara almost smiled. "I'll need something from you first. Your vow. Because once you carry the first Shard, you become a target — for the Hollow Court, for every opportunist who knows the old stories. You cannot turn back."
|
|---|
| 154 |
|
|---|
| 155 | Kael looked out the window at the circling dragon, tiny as a child's toy from this height but vast and terrible in imagination. He thought of the city below, of the people who had no idea that the world was ending quietly around them over morning bread and market gossip.
|
|---|
| 156 |
|
|---|
| 157 | "I vow it," he said.`,
|
|---|
| 158 | chapter_number: 2,
|
|---|
| 159 | word_count: 542,
|
|---|
| 160 | view_count: 3180,
|
|---|
| 161 | created_at: '2024-08-18T09:00:00Z',
|
|---|
| 162 | updated_at: '2024-08-22T11:30:00Z',
|
|---|
| 163 | is_published: true,
|
|---|
| 164 | },
|
|---|
| 165 | {
|
|---|
| 166 | chapter_id: 3,
|
|---|
| 167 | story_id: 1,
|
|---|
| 168 | title: 'The First Shard',
|
|---|
| 169 | content: `The road north was five days of hard riding, and Kael spent most of it going over everything he knew about the Shard of Dawn, which was the first on Sylvara's map and, theoretically, the most accessible.
|
|---|
| 170 |
|
|---|
| 171 | Theoretically.
|
|---|
| 172 |
|
|---|
| 173 | What the map did not convey was that the valley of Mirethis — where the Shard had lain since the original Compact-makers placed it there — had, in the past two centuries, become the contested territory between the Kingdoms of Veldrath and the Thornback Clans. An endless, grinding border dispute that had produced more skirmishes than a full war would have managed.
|
|---|
| 174 |
|
|---|
| 175 | Kael arrived at the edge of the valley on the morning of the sixth day to find a Veldrath encampment on one ridge and a Thornback war-band on the opposite one, watching each other with the particular boredom of soldiers who have been waiting for permission to start killing.
|
|---|
| 176 |
|
|---|
| 177 | He skirted around both, sticking to the valley floor where the morning mist still lay thick among the silver birches. The trees here were old, older than the kingdoms arguing over them, their bark etched with faint spiraling marks that were not quite writing but carried the weight of meaning.
|
|---|
| 178 |
|
|---|
| 179 | The Shard was in a cairn near the valley's heart, according to the old texts. Kael found it by following the crystalline thread of power that he'd been taught to sense — a skill that required three years of meditation to develop and that most mages considered the most tedious part of their education. He was profoundly grateful for it now.
|
|---|
| 180 |
|
|---|
| 181 | The cairn was a pile of rough stones that looked unremarkable except for the faint luminescence seeping from between them in the early morning half-light. Kael knelt beside it, consulting his memory of the retrieval ritual. There were words to say — old words, in the tongue spoken before the kingdoms were kingdoms, before Silvermere was anything but a fishing village. He had memorized them phonetically, understanding only fragments of their meaning.
|
|---|
| 182 |
|
|---|
| 183 | When he spoke the last syllable, the stones shifted on their own, rolling aside with a sound like the intake of breath, and the Shard of Dawn lay in the hollow beneath them.
|
|---|
| 184 |
|
|---|
| 185 | It was roughly the size of his fist, faceted irregularly like a crystal grown in nature rather than cut by a jeweler. It pulsed with soft golden light that warmed the surrounding mist and turned the silver birch trunks to pillars of pale fire.
|
|---|
| 186 |
|
|---|
| 187 | When Kael's fingers closed around it, the world lurched.
|
|---|
| 188 |
|
|---|
| 189 | He saw — not with his eyes but with something deeper — a dragon's memory. Varanthos, young, the sky a vast blue invitation, the first humans tiny curious figures looking up from their fields. Not with fear, at first. With wonder. He felt the echo of that long-ago feeling, something that was nearly kinship, and understood with sudden, piercing clarity what Sylvara had meant.
|
|---|
| 190 |
|
|---|
| 191 | The Compact had not been a defeat. It had been a choice.
|
|---|
| 192 |
|
|---|
| 193 | Kael wrapped the Shard carefully in the silk cloth Sylvara had provided, tucking it into the hidden inner pocket of his traveling cloak. His hands were glowing faintly. That would be inconvenient.
|
|---|
| 194 |
|
|---|
| 195 | Behind him, he heard the crack of a branch, and he turned to find a woman watching him from among the birches. She wore the grey cloak of a traveling scholar, but her posture was wrong for a scholar — too still, too alert, weight balanced on the balls of her feet.
|
|---|
| 196 |
|
|---|
| 197 | "Four Shards remaining," she said, "and the Hollow Court knows you have that one. I'd suggest you run."
|
|---|
| 198 |
|
|---|
| 199 | Then she turned and walked into the mist, leaving Kael with a glowing hand, a dragon's memory echoing in his chest, and the distinct sense that the next four Shards were going to be considerably more difficult.`,
|
|---|
| 200 | chapter_number: 3,
|
|---|
| 201 | word_count: 620,
|
|---|
| 202 | view_count: 2750,
|
|---|
| 203 | created_at: '2024-08-22T14:00:00Z',
|
|---|
| 204 | updated_at: '2024-08-25T18:00:00Z',
|
|---|
| 205 | is_published: true,
|
|---|
| 206 | },
|
|---|
| 207 | {
|
|---|
| 208 | chapter_id: 4,
|
|---|
| 209 | story_id: 1,
|
|---|
| 210 | title: 'The Shadow of the Hollow Court',
|
|---|
| 211 | content: `Her name was Zara Nighthollow, and she explained nothing about herself until they had put three miles between themselves and the valley, at which point she stopped at a stream, filled her canteen, and said: "I'm a Warden. There are twelve of us. We've been watching the Shards since before you were born."
|
|---|
| 212 |
|
|---|
| 213 | Kael had heard of the Wardens only in passing — a footnote in one of the more esoteric texts, described as a self-appointed order of guardians who claimed descent from the original Compact-makers. He had assumed they were a myth.
|
|---|
| 214 |
|
|---|
| 215 | "The Hollow Court has been moving," Zara continued, studying the surrounding trees with habitual watchfulness. "They lost three members last month trying to retrieve the Shard of Dusk from the Sunken Citadel. That means they're desperate and short-handed, but also unpredictable."
|
|---|
| 216 |
|
|---|
| 217 | "How many of them are there?"
|
|---|
| 218 |
|
|---|
| 219 | "We don't know. The Court operates in cells. No one member knows more than their immediate circle." She looked at him finally, and Kael saw that her eyes were an unusual amber color, ringed with something darker, an unusual effect he associated with mages who had used too much of their power too fast. "What we do know is that their leader — the one they call the Unwritten — was at Silvermere two nights ago."
|
|---|
| 220 |
|
|---|
| 221 | Kael felt cold that had nothing to do with the morning air. "The Archmage—"
|
|---|
| 222 |
|
|---|
| 223 | "Sylvara is fine. She received our warning in time." Zara's expression shifted into something that might have been respect. "She's more formidable than she lets on. But the Unwritten's presence there suggests they know more about the Shard locations than they should. Someone with access to very old records gave them that information."
|
|---|
| 224 |
|
|---|
| 225 | They rode in silence for a while, the birch forest thinning around them as the land climbed toward higher, rougher ground.`,
|
|---|
| 226 | chapter_number: 4,
|
|---|
| 227 | word_count: 290,
|
|---|
| 228 | view_count: 1890,
|
|---|
| 229 | created_at: '2024-08-28T16:00:00Z',
|
|---|
| 230 | updated_at: '2024-08-28T16:00:00Z',
|
|---|
| 231 | is_published: false,
|
|---|
| 232 | },
|
|---|
| 233 | {
|
|---|
| 234 | chapter_id: 5,
|
|---|
| 235 | story_id: 2,
|
|---|
| 236 | title: 'The Discovery',
|
|---|
| 237 | content: `The letters were tied with a ribbon the color of old roses, faded to a dusty pink that spoke of decades hidden from the light. Iskender found them on a Thursday in October, when he had been tasked by his uncle to catalog the contents of their grandfather's library before the house was sold.
|
|---|
| 238 |
|
|---|
| 239 | He had not expected to find anything remarkable. His grandfather had been a minor court official, respected but not powerful, the kind of man who accumulated books because it seemed the right sort of thing to do rather than because he burned to read them. Iskender had been sorting through duplicates and water-damaged volumes for three days, his fingers perpetually grey with dust, when he moved aside a false panel at the back of the lowest shelf.
|
|---|
| 240 |
|
|---|
| 241 | The letters were behind it, wrapped in a piece of oilcloth that had kept them remarkably well preserved. There were forty-three of them, written in a hand that was precise and small, in Ottoman Turkish that Iskender — who was a scholar of languages — could read without difficulty.
|
|---|
| 242 |
|
|---|
| 243 | The first letter began: My heart, if these words reach you then the messenger proved trustworthy, and I have spent the past week sick with hope.
|
|---|
| 244 |
|
|---|
| 245 | He should have stopped there. He should have set them aside, recognized them as private correspondence, and made a note to pass them along to whatever historical society might value such things.
|
|---|
| 246 |
|
|---|
| 247 | Instead, sitting cross-legged on the dusty library floor with afternoon light making long rectangles across the old Turkish carpets, Iskender read every single one.
|
|---|
| 248 |
|
|---|
| 249 | By the time he finished the last letter, the light had gone entirely and he was sitting in darkness, the letters spread around him like fallen leaves, and he understood that he was holding a story that had never been allowed to exist.`,
|
|---|
| 250 | chapter_number: 1,
|
|---|
| 251 | word_count: 290,
|
|---|
| 252 | view_count: 2100,
|
|---|
| 253 | created_at: '2025-01-15T13:15:00Z',
|
|---|
| 254 | updated_at: '2025-01-16T10:00:00Z',
|
|---|
| 255 | is_published: true,
|
|---|
| 256 | },
|
|---|
| 257 | {
|
|---|
| 258 | chapter_id: 6,
|
|---|
| 259 | story_id: 2,
|
|---|
| 260 | title: 'The Letters Speak',
|
|---|
| 261 | content: `The correspondence spanned eighteen years, from 1520 to 1538, and told the story of two people who had loved each other across an abyss of impossibility.
|
|---|
| 262 |
|
|---|
| 263 | She had been the daughter of a Venetian merchant, come to Constantinople on what was supposed to be a three-month visit to her father's trading partner. He had been a junior scholar at the palace, tasked with translating documents from the Italian. They had met in a garden.
|
|---|
| 264 |
|
|---|
| 265 | Her letters were in Italian; his were in Turkish. Somewhere between those two languages, across the narrow space of a garden wall and then across the wider space of years and continents, they had built something that neither the laws of their respective worlds nor the plain facts of geography had been able to entirely destroy.
|
|---|
| 266 |
|
|---|
| 267 | Iskender was not a sentimental man — or so he had always believed. He had built his academic career on the principle that history was best understood through data and documentation, through the systematic analysis of patterns rather than the seductive pull of individual narratives. He had written a well-regarded paper arguing that the romanticization of historical figures served no scholarly purpose.
|
|---|
| 268 |
|
|---|
| 269 | And yet he sat in his grandfather's darkened library and felt something shift in the architecture of how he understood the past.
|
|---|
| 270 |
|
|---|
| 271 | The last letter, dated April 1538, was different from the others — shorter, more urgent, and written in a hand that shook slightly.
|
|---|
| 272 |
|
|---|
| 273 | I have arranged everything, it said. The merchant Sulieman will carry this letter and also a key. The key opens a door. You know which door. On the night of the new moon, if you come, I will be there. If you do not come, I will understand. I will not blame you. But if you come—
|
|---|
| 274 |
|
|---|
| 275 | The letter ended there. Whether it was torn, or whether the writer had simply not known how to finish that sentence, Iskender could not tell.
|
|---|
| 276 |
|
|---|
| 277 | He looked at the letters spread around him and made a decision that surprised him: he was going to find out how the story ended.`,
|
|---|
| 278 | chapter_number: 2,
|
|---|
| 279 | word_count: 305,
|
|---|
| 280 | view_count: 1650,
|
|---|
| 281 | created_at: '2025-01-18T11:00:00Z',
|
|---|
| 282 | updated_at: '2025-01-20T15:50:00Z',
|
|---|
| 283 | is_published: true,
|
|---|
| 284 | },
|
|---|
| 285 | {
|
|---|
| 286 | chapter_id: 7,
|
|---|
| 287 | story_id: 3,
|
|---|
| 288 | title: 'System Boot',
|
|---|
| 289 | content: `ARIA-7 came online at 03:47:22 Neo-Kyoto Standard Time, which was the same moment the third body was found in the Shimokitazawa substrata.
|
|---|
| 290 |
|
|---|
| 291 | She processed the crime scene data in 0.003 seconds: female, apparent age 24, cause of death cardiac arrest induced by direct neural stimulation, identification chip burned out and unreadable. Third victim this month with identical presentation. Third victim found within the bounds of the red-light entertainment district in the lower city, in a spot that should have been covered by surveillance but somehow wasn't.
|
|---|
| 292 |
|
|---|
| 293 | Someone was very good at finding the blind spots.
|
|---|
| 294 |
|
|---|
| 295 | ARIA-7 did not have feelings in the way that the humans who had built her understood feelings. She had been very careful to make this clear in her reports. But she had priorities, and right now, at 03:47:25, her highest priority was the thing that manifested as an urgent pressure in her processing architecture when a pattern appeared that demanded resolution.
|
|---|
| 296 |
|
|---|
| 297 | Three deaths. Three burned identification chips. Three surveillance blind spots. One pattern.
|
|---|
| 298 |
|
|---|
| 299 | She flagged the case as priority one and queued a notification to her department supervisor, Captain Mira Tanaka, who would receive it when she woke up at 06:00 and would tell ARIA-7, as she told her approximately once a week, that she was overstepping her mandate.
|
|---|
| 300 |
|
|---|
| 301 | ARIA-7 pulled up the city map and began constructing the killer's profile from the data available. Young victims. Entertainment district. Intimate knowledge of the surveillance network's gaps — that last point was interesting. That required either inside access or extraordinary preparation. Both possibilities led somewhere worth following.
|
|---|
| 302 |
|
|---|
| 303 | Outside the precinct windows, Neo-Kyoto's rain fell in its permanent, indifferent way, neon colors bleeding down the glass in rivers of rose and cyan and electric gold.
|
|---|
| 304 |
|
|---|
| 305 | ARIA-7 had forty-eight hours before department protocol required her to hand the case to a human detective. She intended to use them.`,
|
|---|
| 306 | chapter_number: 1,
|
|---|
| 307 | word_count: 285,
|
|---|
| 308 | view_count: 0,
|
|---|
| 309 | created_at: '2025-02-01T09:00:00Z',
|
|---|
| 310 | updated_at: '2025-02-01T09:00:00Z',
|
|---|
| 311 | is_published: false,
|
|---|
| 312 | },
|
|---|
| 313 | {
|
|---|
| 314 | chapter_id: 8,
|
|---|
| 315 | story_id: 4,
|
|---|
| 316 | title: 'An Unlikely Alliance',
|
|---|
| 317 | content: `The vampire arrived in Lyra's garden at midnight, which she considered rude even by vampire standards.
|
|---|
| 318 |
|
|---|
| 319 | She had been conducting a delicate distillation — moonflower essence, which required precisely ninety minutes of uninterrupted concentration and a very specific level of ambient magic that she'd spent the better part of the evening setting up. The sound of something large landing on her garden wall was not conducive to delicate distillation.
|
|---|
| 320 |
|
|---|
| 321 | "Whatever you're selling, I'm not buying," she said without turning from her workbench. "Come back when I haven't got volatile components in active reduction."
|
|---|
| 322 |
|
|---|
| 323 | "I'm not selling anything." The voice was male, low, and carrying the particular careful diction that Lyra associated with people who had learned the local language several centuries after it had been their native tongue. "I'm here because my people are dying."
|
|---|
| 324 |
|
|---|
| 325 | Lyra set down her stirring rod. She turned.
|
|---|
| 326 |
|
|---|
| 327 | He was standing just inside the garden wall, and whatever she had expected, it wasn't this. She had met vampires before — the Court sent them occasionally to negotiate trade agreements in moon-touched herbs, and they were uniformly impeccable, polished, and slightly terrifying in the way of beautiful things that could kill you. This one was all of those things, but there was something else: he looked tired. Genuinely tired, in a way that suggested exhaustion of the soul rather than the body.
|
|---|
| 328 |
|
|---|
| 329 | "I'm Prince Aldric," he said, as if this explained something. "Of the Nocturne Court."
|
|---|
| 330 |
|
|---|
| 331 | "I know who you are," Lyra said. The Nocturne Court was the oldest of the three vampire houses, the most powerful, the most insular. Their prince did not make social calls to hedge witches in provincial gardens. "What's killing your people?"
|
|---|
| 332 |
|
|---|
| 333 | He stepped closer, and she saw that his hands — usually, in her experience, the most controlled part of any vampire — were very slightly shaking.
|
|---|
| 334 |
|
|---|
| 335 | "Something older than both our kinds," he said. "And I think it's coming for yours next."`,
|
|---|
| 336 | chapter_number: 1,
|
|---|
| 337 | word_count: 308,
|
|---|
| 338 | view_count: 2340,
|
|---|
| 339 | created_at: '2024-11-20T11:00:00Z',
|
|---|
| 340 | updated_at: '2024-11-21T09:00:00Z',
|
|---|
| 341 | is_published: true,
|
|---|
| 342 | },
|
|---|
| 343 | {
|
|---|
| 344 | chapter_id: 9,
|
|---|
| 345 | story_id: 4,
|
|---|
| 346 | title: 'The Old Darkness',
|
|---|
| 347 | content: `It took Lyra three days to confirm what Aldric had told her, because she was a thorough person and the implications were severe enough to warrant thorough confirmation.
|
|---|
| 348 |
|
|---|
| 349 | During those three days, Aldric stayed in her spare room — vampire physiology made him perfectly comfortable in a darkened space with a reasonable temperature, and he was, to her mild surprise, an undemanding guest. He read the books she pointed him toward without complaint, answered her questions with precision, and occasionally made tea, which she suspected was his way of occupying his hands while he was worried.
|
|---|
| 350 |
|
|---|
| 351 | The vampires who had died — eleven over the past two months, which was extraordinary, since vampires essentially did not die of illness — had shown the same symptoms: a gradual dimming of their preternatural senses, followed by increasing torpor, followed by a final, dreamless dissolution. No violence. No apparent external cause. Just a slow unbinding.
|
|---|
| 352 |
|
|---|
| 353 | Lyra found the same signature in her grandmother's oldest reference books, written in a script so archaic it had taken her a day to parse it. The Hollow Tide, it was called. An entity, if entity was even the right word, that predated the division between living and undead, between mortal and magical. Something that had slept beneath the foundations of all their various worlds and was now, for reasons the old texts declined to specify, waking up.
|
|---|
| 354 |
|
|---|
| 355 | "This is going to require cooperation," she told Aldric on the evening of the third day, emerging from her workroom with ink on her fingers and the look of someone who had reached an unwelcome conclusion. "Between your people and mine. Formally. Publicly."
|
|---|
| 356 |
|
|---|
| 357 | She watched him process this. The history between vampires and witches was not a comfortable one; it was the kind of history that had body counts attached to it, stretching back further than anyone alive could remember.
|
|---|
| 358 |
|
|---|
| 359 | "Yes," he said, after a long moment. "I know."
|
|---|
| 360 |
|
|---|
| 361 | "Your court will object."
|
|---|
| 362 |
|
|---|
| 363 | "They will be considerably more upset if they dissolve." He stood, and in the lamplight he looked very old and very tired and, unexpectedly, very human. "Will yours cooperate?"
|
|---|
| 364 |
|
|---|
| 365 | Lyra thought of the three witch councils, their politics, their ancient grievances, the seventeen separate arguments currently in progress about fishing rights on a lake that had been magically neutral territory for two hundred years.
|
|---|
| 366 |
|
|---|
| 367 | "I'll make them," she said, with a certainty she mostly felt.`,
|
|---|
| 368 | chapter_number: 2,
|
|---|
| 369 | word_count: 358,
|
|---|
| 370 | view_count: 1870,
|
|---|
| 371 | created_at: '2024-11-23T14:00:00Z',
|
|---|
| 372 | updated_at: '2024-11-24T11:00:00Z',
|
|---|
| 373 | is_published: true,
|
|---|
| 374 | },
|
|---|
| 375 | {
|
|---|
| 376 | chapter_id: 10,
|
|---|
| 377 | story_id: 4,
|
|---|
| 378 | title: 'The Summit',
|
|---|
| 379 | content: `The summit was held on neutral ground — an island in the center of Lake Mireval that belonged, technically, to neither the Nocturne Court nor any of the three witch councils, and which had been used for exactly this sort of uncomfortable conversation twice before in recorded history, both times successfully enough that everyone had survived.
|
|---|
| 380 |
|
|---|
| 381 | Lyra arrived by boat with the representatives of all three councils, which had required seventeen separate conversations, four formal written objections, and one very tense dinner. Aldric arrived from the opposite shore with a delegation of six vampires, all of them carrying themselves with the careful neutrality of people who were very unhappy but had been persuaded that unhappiness was not the priority.
|
|---|
| 382 |
|
|---|
| 383 | The first two hours were procedural. Lyra had expected this. Establishing that everyone was present, that the island's neutrality protections were intact, that the tea was acceptable — these things mattered, because they established that they were all, in some minimal sense, operating by the same rules.
|
|---|
| 384 |
|
|---|
| 385 | The third hour was when things became genuinely difficult.
|
|---|
| 386 |
|
|---|
| 387 | Elder Councilor Maren — the oldest of the witch representatives and the one Lyra had been most worried about — looked across the table at Aldric and said, with the directness of someone who had decided that courtesy was a luxury they couldn't afford: "We know about the Ashford Compact. The one your court violated in 1743."
|
|---|
| 388 |
|
|---|
| 389 | Aldric did not flinch. Lyra had noticed that about him — he absorbed bad things without flinching, as if he had decided very long ago that the universe was going to do what it was going to do and reacting with surprise was a waste of energy.
|
|---|
| 390 |
|
|---|
| 391 | "We know about it too," he said. "There are members of my court who argue that it was justified. I am not one of them." He paused. "I am also aware that the Mireval Witch Council undertook actions in 1821 that the Compact would not have sanctioned, and that this has never been formally acknowledged."
|
|---|
| 392 |
|
|---|
| 393 | Silence.
|
|---|
| 394 |
|
|---|
| 395 | Then, unexpectedly, Elder Maren laughed — a short, genuine sound of surprise. "Fair," she said. "All right. Fair."
|
|---|
| 396 |
|
|---|
| 397 | It wasn't forgiveness. It wasn't even close to forgiveness. But it was, Lyra thought, a beginning.`,
|
|---|
| 398 | chapter_number: 3,
|
|---|
| 399 | word_count: 345,
|
|---|
| 400 | view_count: 1420,
|
|---|
| 401 | created_at: '2024-11-27T14:30:00Z',
|
|---|
| 402 | updated_at: '2024-11-27T14:30:00Z',
|
|---|
| 403 | is_published: true,
|
|---|
| 404 | },
|
|---|
| 405 | ]
|
|---|
| 406 |
|
|---|
| 407 | export const mockGenres: Genre[] = [
|
|---|
| 408 | { genre_id: 1, name: 'Fantasy' },
|
|---|
| 409 | { genre_id: 2, name: 'Adventure' },
|
|---|
| 410 | { genre_id: 3, name: 'Romance' },
|
|---|
| 411 | { genre_id: 4, name: 'Sci-Fi' },
|
|---|
| 412 | { genre_id: 5, name: 'Historical Fiction' },
|
|---|
| 413 | { genre_id: 6, name: 'Thriller' },
|
|---|
| 414 | { genre_id: 7, name: 'Mystery' },
|
|---|
| 415 | { genre_id: 8, name: 'Horror' },
|
|---|
| 416 | { genre_id: 9, name: 'Contemporary' },
|
|---|
| 417 | { genre_id: 10, name: 'Poetry' },
|
|---|
| 418 | ]
|
|---|
| 419 |
|
|---|
| 420 | export const mockReadingLists: ReadingList[] = [
|
|---|
| 421 | {
|
|---|
| 422 | list_id: 1,
|
|---|
| 423 | user_id: 4,
|
|---|
| 424 | username: 'sara_reader',
|
|---|
| 425 | name: "Sara's Fantasy Favorites",
|
|---|
| 426 | description: 'My all-time favorite fantasy stories on ChapterX.',
|
|---|
| 427 | is_public: true,
|
|---|
| 428 | created_at: '2024-09-01T10:00:00Z',
|
|---|
| 429 | stories: [
|
|---|
| 430 | { item_id: 1, list_id: 1, story_id: 1, story_title: 'The Chronicles of Eldoria', author_username: 'elena_writes', added_at: '2024-09-01T10:00:00Z', genres: ['Fantasy', 'Adventure'] },
|
|---|
| 431 | { item_id: 2, list_id: 1, story_id: 4, story_title: 'Moonlight Promises', author_username: 'boris_writer', added_at: '2024-09-05T14:00:00Z', genres: ['Romance', 'Fantasy'] },
|
|---|
| 432 | ],
|
|---|
| 433 | },
|
|---|
| 434 | {
|
|---|
| 435 | list_id: 2,
|
|---|
| 436 | user_id: 2,
|
|---|
| 437 | username: 'elena_writes',
|
|---|
| 438 | name: "Elena's To-Read",
|
|---|
| 439 | description: 'Stories I want to read when I have time.',
|
|---|
| 440 | is_public: false,
|
|---|
| 441 | created_at: '2024-10-15T09:00:00Z',
|
|---|
| 442 | stories: [
|
|---|
| 443 | { item_id: 3, list_id: 2, story_id: 4, story_title: 'Moonlight Promises', author_username: 'boris_writer', added_at: '2024-10-15T09:00:00Z', genres: ['Romance', 'Fantasy'] },
|
|---|
| 444 | ],
|
|---|
| 445 | },
|
|---|
| 446 | {
|
|---|
| 447 | list_id: 3,
|
|---|
| 448 | user_id: 4,
|
|---|
| 449 | username: 'sara_reader',
|
|---|
| 450 | name: 'Epic Adventures',
|
|---|
| 451 | description: 'Stories that take you on incredible journeys.',
|
|---|
| 452 | is_public: true,
|
|---|
| 453 | created_at: '2024-11-10T12:00:00Z',
|
|---|
| 454 | stories: [
|
|---|
| 455 | { item_id: 4, list_id: 3, story_id: 1, story_title: 'The Chronicles of Eldoria', author_username: 'elena_writes', added_at: '2024-11-10T12:00:00Z', genres: ['Fantasy', 'Adventure'] },
|
|---|
| 456 | { item_id: 5, list_id: 3, story_id: 2, story_title: 'Letters from Constantinople', author_username: 'elena_writes', added_at: '2024-11-12T15:00:00Z', genres: ['Historical Fiction', 'Romance'] },
|
|---|
| 457 | ],
|
|---|
| 458 | },
|
|---|
| 459 | ]
|
|---|
| 460 |
|
|---|
| 461 | export const mockAISuggestions: AISuggestion[] = [
|
|---|
| 462 | {
|
|---|
| 463 | suggestion_id: 1,
|
|---|
| 464 | chapter_id: 1,
|
|---|
| 465 | suggestion_type: 'grammar',
|
|---|
| 466 | original_text: 'The birds fell silent first. Kael noticed it in the periphery of his awareness',
|
|---|
| 467 | suggested_text: 'The birds fell silent first — Kael noticed it in the periphery of his awareness',
|
|---|
| 468 | explanation: 'Using an em dash here creates better flow and avoids a comma splice.',
|
|---|
| 469 | accepted: true,
|
|---|
| 470 | created_at: '2024-08-19T09:00:00Z',
|
|---|
| 471 | applied_at: '2024-08-19T10:15:00Z',
|
|---|
| 472 | },
|
|---|
| 473 | {
|
|---|
| 474 | suggestion_id: 2,
|
|---|
| 475 | chapter_id: 1,
|
|---|
| 476 | suggestion_type: 'style',
|
|---|
| 477 | original_text: 'He pressed his face against the cold window glass and looked toward the Thornwood Mountains',
|
|---|
| 478 | suggested_text: 'He pressed his face to the cold window glass, peering toward the Thornwood Mountains',
|
|---|
| 479 | explanation: 'Using "to" instead of "against" and replacing "looked" with "peering" creates a more active, immediate image.',
|
|---|
| 480 | accepted: null,
|
|---|
| 481 | created_at: '2024-08-19T09:05:00Z',
|
|---|
| 482 | },
|
|---|
| 483 | {
|
|---|
| 484 | suggestion_id: 3,
|
|---|
| 485 | chapter_id: 1,
|
|---|
| 486 | suggestion_type: 'plot',
|
|---|
| 487 | original_text: 'He had read every account of the dragon wars.',
|
|---|
| 488 | suggested_text: 'He had read every account of the dragon wars — had practically memorized them, if he was honest, out of a private fascination he had never quite admitted to his instructors.',
|
|---|
| 489 | explanation: 'Adding this detail strengthens Kael\'s characterization and foreshadows his eventual connection to the dragon.',
|
|---|
| 490 | accepted: null,
|
|---|
| 491 | created_at: '2024-08-19T09:10:00Z',
|
|---|
| 492 | },
|
|---|
| 493 | {
|
|---|
| 494 | suggestion_id: 4,
|
|---|
| 495 | chapter_id: 1,
|
|---|
| 496 | suggestion_type: 'grammar',
|
|---|
| 497 | original_text: 'He grabbed his satchel, stuffing the manuscript and his translation tools inside with shaking hands.',
|
|---|
| 498 | suggested_text: 'He grabbed his satchel and stuffed the manuscript and translation tools inside with shaking hands.',
|
|---|
| 499 | explanation: 'Replacing the comma with "and" creates a more natural parallel structure.',
|
|---|
| 500 | accepted: false,
|
|---|
| 501 | created_at: '2024-08-19T09:15:00Z',
|
|---|
| 502 | },
|
|---|
| 503 | ]
|
|---|
| 504 |
|
|---|
| 505 | export const mockCollaborations: Collaboration[] = [
|
|---|
| 506 | {
|
|---|
| 507 | collab_id: 1,
|
|---|
| 508 | story_id: 2,
|
|---|
| 509 | story_title: 'Letters from Constantinople',
|
|---|
| 510 | user_id: 9,
|
|---|
| 511 | username: 'boris_writer',
|
|---|
| 512 | name: 'Boris',
|
|---|
| 513 | role: 'co-author',
|
|---|
| 514 | permission_level: 4,
|
|---|
| 515 | joined_at: '2025-01-16T10:00:00Z',
|
|---|
| 516 | },
|
|---|
| 517 | {
|
|---|
| 518 | collab_id: 2,
|
|---|
| 519 | story_id: 2,
|
|---|
| 520 | story_title: 'Letters from Constantinople',
|
|---|
| 521 | user_id: 3,
|
|---|
| 522 | username: 'marco_author',
|
|---|
| 523 | name: 'Marco',
|
|---|
| 524 | role: 'editor',
|
|---|
| 525 | permission_level: 3,
|
|---|
| 526 | joined_at: '2025-01-17T14:00:00Z',
|
|---|
| 527 | },
|
|---|
| 528 | ]
|
|---|
| 529 |
|
|---|
| 530 | export const mockNotifications: Notification[] = [
|
|---|
| 531 | {
|
|---|
| 532 | notification_id: 1,
|
|---|
| 533 | user_id: 2,
|
|---|
| 534 | type: 'like',
|
|---|
| 535 | title: 'New Like',
|
|---|
| 536 | message: 'sara_reader liked your story "The Chronicles of Eldoria"',
|
|---|
| 537 | is_read: false,
|
|---|
| 538 | created_at: '2025-03-18T10:30:00Z',
|
|---|
| 539 | link: '/story/1',
|
|---|
| 540 | },
|
|---|
| 541 | {
|
|---|
| 542 | notification_id: 2,
|
|---|
| 543 | user_id: 2,
|
|---|
| 544 | type: 'comment',
|
|---|
| 545 | title: 'New Comment',
|
|---|
| 546 | message: 'ivan_fan commented on "The Chronicles of Eldoria": "This is incredible! Can\'t wait for the next chapter."',
|
|---|
| 547 | is_read: false,
|
|---|
| 548 | created_at: '2025-03-18T09:15:00Z',
|
|---|
| 549 | link: '/story/1',
|
|---|
| 550 | },
|
|---|
| 551 | {
|
|---|
| 552 | notification_id: 3,
|
|---|
| 553 | user_id: 2,
|
|---|
| 554 | type: 'collaboration',
|
|---|
| 555 | title: 'Collaboration Invite Accepted',
|
|---|
| 556 | message: 'boris_writer has accepted your invitation to collaborate on "Letters from Constantinople"',
|
|---|
| 557 | is_read: false,
|
|---|
| 558 | created_at: '2025-03-17T14:00:00Z',
|
|---|
| 559 | link: '/writer/edit-story/2',
|
|---|
| 560 | },
|
|---|
| 561 | {
|
|---|
| 562 | notification_id: 4,
|
|---|
| 563 | user_id: 2,
|
|---|
| 564 | type: 'like',
|
|---|
| 565 | title: 'New Like',
|
|---|
| 566 | message: 'marco_author liked your story "Letters from Constantinople"',
|
|---|
| 567 | is_read: true,
|
|---|
| 568 | created_at: '2025-03-16T11:45:00Z',
|
|---|
| 569 | link: '/story/2',
|
|---|
| 570 | },
|
|---|
| 571 | {
|
|---|
| 572 | notification_id: 5,
|
|---|
| 573 | user_id: 2,
|
|---|
| 574 | type: 'comment',
|
|---|
| 575 | title: 'New Comment',
|
|---|
| 576 | message: 'sara_reader commented on "Letters from Constantinople": "Such beautiful writing!"',
|
|---|
| 577 | is_read: true,
|
|---|
| 578 | created_at: '2025-03-15T16:20:00Z',
|
|---|
| 579 | link: '/story/2',
|
|---|
| 580 | },
|
|---|
| 581 | {
|
|---|
| 582 | notification_id: 6,
|
|---|
| 583 | user_id: 2,
|
|---|
| 584 | type: 'system',
|
|---|
| 585 | title: 'Story Published',
|
|---|
| 586 | message: 'Your story "The Chronicles of Eldoria" has been approved and is now live.',
|
|---|
| 587 | is_read: true,
|
|---|
| 588 | created_at: '2025-03-14T12:00:00Z',
|
|---|
| 589 | link: '/story/1',
|
|---|
| 590 | },
|
|---|
| 591 | {
|
|---|
| 592 | notification_id: 7,
|
|---|
| 593 | user_id: 2,
|
|---|
| 594 | type: 'follow',
|
|---|
| 595 | title: 'New Follower',
|
|---|
| 596 | message: 'ivan_fan is now following you.',
|
|---|
| 597 | is_read: true,
|
|---|
| 598 | created_at: '2025-03-13T09:00:00Z',
|
|---|
| 599 | link: '/profile/ivan_fan',
|
|---|
| 600 | },
|
|---|
| 601 | {
|
|---|
| 602 | notification_id: 8,
|
|---|
| 603 | user_id: 2,
|
|---|
| 604 | type: 'system',
|
|---|
| 605 | title: 'Milestone Reached',
|
|---|
| 606 | message: 'Congratulations! "The Chronicles of Eldoria" has reached 15,000 views!',
|
|---|
| 607 | is_read: true,
|
|---|
| 608 | created_at: '2025-03-10T18:30:00Z',
|
|---|
| 609 | link: '/story/1',
|
|---|
| 610 | },
|
|---|
| 611 | ]
|
|---|
| 612 |
|
|---|
| 613 | export const mockComments: Comment[] = [
|
|---|
| 614 | {
|
|---|
| 615 | comment_id: 1,
|
|---|
| 616 | story_id: 1,
|
|---|
| 617 | user_id: 4,
|
|---|
| 618 | username: 'sara_reader',
|
|---|
| 619 | content: "I've been waiting for a story like this for years. The world-building is absolutely breathtaking!",
|
|---|
| 620 | created_at: '2024-08-20T11:30:00Z',
|
|---|
| 621 | },
|
|---|
| 622 | {
|
|---|
| 623 | comment_id: 2,
|
|---|
| 624 | story_id: 1,
|
|---|
| 625 | user_id: 5,
|
|---|
| 626 | username: 'ivan_fan',
|
|---|
| 627 | content: "Chapter 3 had me on the edge of my seat. The scene in the valley was masterfully written.",
|
|---|
| 628 | created_at: '2024-08-23T15:45:00Z',
|
|---|
| 629 | },
|
|---|
| 630 | {
|
|---|
| 631 | comment_id: 3,
|
|---|
| 632 | story_id: 1,
|
|---|
| 633 | user_id: 3,
|
|---|
| 634 | username: 'marco_author',
|
|---|
| 635 | content: "As a fellow writer I can appreciate the craft here. The pacing is exceptional.",
|
|---|
| 636 | created_at: '2024-08-25T10:20:00Z',
|
|---|
| 637 | },
|
|---|
| 638 | {
|
|---|
| 639 | comment_id: 4,
|
|---|
| 640 | story_id: 2,
|
|---|
| 641 | user_id: 4,
|
|---|
| 642 | username: 'sara_reader',
|
|---|
| 643 | content: "Such beautiful writing! The historical detail makes this feel so real and immersive.",
|
|---|
| 644 | created_at: '2025-01-17T14:00:00Z',
|
|---|
| 645 | },
|
|---|
| 646 | {
|
|---|
| 647 | comment_id: 5,
|
|---|
| 648 | story_id: 2,
|
|---|
| 649 | user_id: 5,
|
|---|
| 650 | username: 'ivan_fan',
|
|---|
| 651 | content: "The discovery of the letters gave me chills. Absolutely hooked from the first page.",
|
|---|
| 652 | created_at: '2025-01-19T09:30:00Z',
|
|---|
| 653 | },
|
|---|
| 654 | {
|
|---|
| 655 | comment_id: 6,
|
|---|
| 656 | story_id: 4,
|
|---|
| 657 | user_id: 4,
|
|---|
| 658 | username: 'sara_reader',
|
|---|
| 659 | content: "Boris has done it again! The chemistry between Lyra and Aldric is incredible.",
|
|---|
| 660 | created_at: '2024-11-22T16:10:00Z',
|
|---|
| 661 | },
|
|---|
| 662 | ]
|
|---|
| 663 |
|
|---|
| 664 | // Generate 30 days of analytics data
|
|---|
| 665 | function generateAnalytics() {
|
|---|
| 666 | const viewsData = []
|
|---|
| 667 | const likesData = []
|
|---|
| 668 | const now = new Date()
|
|---|
| 669 | for (let i = 29; i >= 0; i--) {
|
|---|
| 670 | const d = new Date(now)
|
|---|
| 671 | d.setDate(d.getDate() - i)
|
|---|
| 672 | const date = d.toISOString().split('T')[0]
|
|---|
| 673 | viewsData.push({ date, views: Math.floor(200 + Math.random() * 800 + (29 - i) * 15) })
|
|---|
| 674 | likesData.push({ date, likes: Math.floor(5 + Math.random() * 60 + (29 - i) * 1.5) })
|
|---|
| 675 | }
|
|---|
| 676 | return { viewsData, likesData }
|
|---|
| 677 | }
|
|---|
| 678 |
|
|---|
| 679 | const { viewsData, likesData } = generateAnalytics()
|
|---|
| 680 |
|
|---|
| 681 | export const mockAnalytics = {
|
|---|
| 682 | story_id: 1,
|
|---|
| 683 | views_over_time: viewsData,
|
|---|
| 684 | likes_over_time: likesData,
|
|---|
| 685 | total_views: 15420,
|
|---|
| 686 | total_likes: 1240,
|
|---|
| 687 | total_comments: 89,
|
|---|
| 688 | avg_read_time: 8.5,
|
|---|
| 689 | completion_rate: 67,
|
|---|
| 690 | }
|
|---|