Stories Core

@reelkit/react-stories-player के पीछे का इंजन। शुद्ध TypeScript, किसी फ़्रेमवर्क पर निर्भर नहीं। Angular, Vue या vanilla JS के लिए stories प्लेयर बनाने में इसका इस्तेमाल करें।

फ़्रेमवर्क से स्वतंत्र
शुद्ध TypeScript, किसी DOM फ़्रेमवर्क पर निर्भरता नहीं
दो-स्तर का नेविगेशन
ग्रुप + हर ग्रुप के अंदर की stories
RAF टाइमर
pause/resume के साथ requestAnimationFrame से अपने-आप आगे बढ़ना
Canvas प्रोग्रेस
खिसकती विंडो वाला, Retina के लिए तैयार segmented प्रोग्रेस बार
टैप ज़ोन
बाएँ/दाएँ टैप की पहचान, जिसे कॉन्फ़िगर किया जा सकता है
Reactive सिग्नल
@reelkit/core के signal primitives पर बना

इंस्टॉलेशन

bash

Stories कंट्रोलर

createStoriesController(config, events?) ग्रुप और stories के बीच नेविगेशन संभालता है। यह pause/resume स्टेट पर नज़र रखता है, हर ग्रुप में आख़िरी देखी गई story याद रखता है, और हर बदलाव पर callbacks चलाता है।

कॉन्फ़िग (StoriesControllerConfig)

प्रॉपर्टीटाइपडिफ़ॉल्टविवरण
groupCountnumberज़रूरीstory ग्रुप की कुल संख्या
storyCountsnumber[]ज़रूरीहर ग्रुप में stories की संख्या
initialGroupIndexnumber0शुरुआती ग्रुप index
initialStoryIndexnumberresumeStoryIndex(initialGroupIndex), नहीं तो 0ग्रुप के अंदर शुरुआती story index। इसे देने पर यह याद रखी गई किसी भी स्थिति से ऊपर रहता है; न देने पर खुलने वाला ग्रुप भी बाकी ग्रुप की तरह वहीं से शुरू होता है।
defaultImageDurationnumber5000इमेज stories के अपने-आप आगे बढ़ने की डिफ़ॉल्ट अवधि, ms में
resumeStoryIndex(groupIndex: number) => numberundefinedवह story जिस पर न देखा गया ग्रुप खुलता है, ग्रुप में मौजूद stories तक सीमित

इवेंट (StoriesControllerEvents)

इवेंटटाइपविवरण
onStoryChange(groupIndex, storyIndex) => voidसक्रिय story बदलने पर चलता है
onGroupChange(groupIndex) => voidसक्रिय ग्रुप बदलने पर चलता है
onStoryViewed(groupIndex, storyIndex) => voidकिसी story के दिखने पर चलता है
onStoryComplete(groupIndex, storyIndex) => voidstory का टाइमर पूरा होने पर चलता है (आगे बढ़ने से पहले)
onComplete() => voidआख़िरी ग्रुप की आख़िरी story ख़त्म होने पर चलता है
onClose() => voidजब overlay बंद होना चाहिए, तब चलता है

स्टेट (reactive signals)

सिग्नलटाइपविवरण
state.activeGroupIndexSignal<number>अभी सक्रिय ग्रुप का index
state.activeStoryIndexSignal<number>ग्रुप के अंदर अभी सक्रिय story का index
state.isPausedSignal<boolean>अपने-आप आगे बढ़ना रुका है या नहीं

मेथड

मेथडटाइपविवरण
nextStory()() => voidग्रुप के अंदर आगे बढ़ता है; सीमा पार करके अगले ग्रुप में जाता है
prevStory()() => voidग्रुप के अंदर पीछे जाता है; सीमा पार करके पिछले ग्रुप में जाता है
nextGroup()() => voidअगले ग्रुप पर जाता है, आख़िरी देखी गई story से शुरू करके
prevGroup()() => voidपिछले ग्रुप पर जाता है, आख़िरी देखी गई story से शुरू करके
goToGroup(index)(number) => voidindex से किसी खास ग्रुप पर सीधे जाता है
pause()() => voidअपने-आप आगे बढ़ना रोकता है
resume()() => voidअपने-आप आगे बढ़ना फिर शुरू करता है
onStoryTimerComplete()() => voidटाइमर पूरा होने पर कॉल होता है; पहले onStoryComplete चलाता है, फिर आगे बढ़ता है
getLastStoryIndex(groupIndex)(number) => numberग्रुप कहाँ खुलेगा: इस सेशन में जिस story पर छोड़ा गया, नहीं तो वह जो resumeStoryIndex बताए
reportInitialView()() => voidप्लेयर जिस story पर खुला, उसे एक बार देखी गई के रूप में दर्ज करता है। mount के बाद कॉल करें, रेंडर के दौरान नहीं।

उदाहरण

typescript

टाइमर कंट्रोलर

createTimerController(config) एक requestAnimationFrame loop से अपने-आप आगे बढ़ना चलाता है। प्रोग्रेस signal (0 से 1) प्रोग्रेस बार को भरता है। Pause और resume ठीक वही स्थिति बनाए रखते हैं।

कॉन्फ़िग (TimerControllerConfig)

प्रॉपर्टीटाइपडिफ़ॉल्टविवरण
durationnumberज़रूरीमिलीसेकंड में डिफ़ॉल्ट अवधि
onComplete() => voidundefinedटाइमर 100% पर पहुँचने पर कॉल होता है

स्टेट

सिग्नलटाइपविवरण
progressSignal<number>प्रोग्रेस signal (0 से 1)
isRunningSignal<boolean>टाइमर अभी चल रहा है या नहीं

मेथड

मेथडटाइपविवरण
start(duration?)(number?) => voidटाइमर शुरू (या दोबारा शुरू) करता है, वैकल्पिक रूप से अलग अवधि के साथ
pause()() => voidप्रोग्रेस को मौजूदा स्थिति पर रोक देता है
resume()() => voidरुकी हुई स्थिति से आगे चलता है
reset()() => voidप्रोग्रेस को 0 पर लाकर रोक देता है
dispose()() => voidसंसाधन साफ़ करता है

उदाहरण

typescript

Canvas प्रोग्रेस रेंडरर

createCanvasProgressRenderer(config?) canvas पर segmented प्रोग्रेस बार बनाता है। यह Retina डिस्प्ले के हिसाब से स्केल होता है, ResizeObserver से अपना कंटेनर नापता है, और segments न समाने पर खिसकती विंडो इस्तेमाल करता है।

कॉन्फ़िग (CanvasProgressRendererConfig)

प्रॉपर्टीटाइपडिफ़ॉल्टविवरण
gapnumber2segments के बीच पिक्सेल में दूरी
barHeightnumber2पिक्सेल में बार की ऊँचाई
minSegmentWidthnumber8segment की न्यूनतम चौड़ाई, जिसके बाद खिसकती विंडो शुरू होती है
bgColorstring'rgba(255,255,255,0.3)'न भरे segments का बैकग्राउंड रंग
fillColorstring'#ffffff'पूरे/सक्रिय segments का भरने वाला रंग

मेथड

सदस्यटाइपविवरण
attach(canvas)(HTMLCanvasElement) => voidcanvas एलिमेंट से जुड़ता है; parent पर ResizeObserver शुरू करता है
draw(totalStories, activeIndex, progress)(number, number, number) => voidदी गई स्टेट के लिए प्रोग्रेस बार बनाता है
widthnumber (readonly)CSS पिक्सेल में अभी नापी गई चौड़ाई
dispose()() => voidResizeObserver और अंदरूनी स्टेट साफ़ करता है

उदाहरण

typescript

देखे गए आइटम की स्टेट

createStoriesViewedState(controller, groups) core के ViewedStateController को प्लेयर की भाषा में पढ़ता है — ग्रुप, लेखक, story index — जबकि store खुद इनमें से किसी के बारे में नहीं जानता। यह StoriesViewedState लौटाता है। Store को उसी key से बनाएँ जो address bar इस्तेमाल करता है, हर ग्रुप के लिए अलग track करके, तो सहेजी गई entry ठीक शेयर किए गए लिंक के parameter जैसी पढ़ी जाती है।

पैरामीटरटाइपविवरण
controllerViewedStateController<TwoAxisPosition>address bar वाली key से बना core store, twoAxisViewedTracking के साथ spread किया गया ताकि हर ग्रुप की अपनी entry रहे
groups() => StoriesGroup<T>[]मौजूदा ग्रुप पढ़ता है। यह getter है, इसलिए setup के बाद पेज लोड करने या क्रम बदलने वाली फ़ीड कॉल के समय नापी जाती है।

StoriesViewedState

मेथडटाइपविवरण
viewedCounts()() => Map<string, number>हर ग्रुप में देखी गई stories, लेखक की id से — वही रूप जो StoriesRingList viewedState के रूप में लेता है
resumeStoryIndex(groupIndex)(number) => numberपहली न देखी गई story, या ग्रुप पूरा देख लेने पर 0
markViewed(groupIndex, storyIndex)(number, number) => voidstory को देखी गई के रूप में दर्ज करता है। इसे onStoryViewed से जोड़ें।

उदाहरण

typescript

Entry देखे जाने की गिनती नहीं, बल्कि सबसे दूर पहुँची story का नाम है, इसलिए id से पहचानने वाली key फ़ीड का क्रम बदलने पर भी ग्रुप की जगह बनाए रखती है, जबकि ग्रुप के बीच से हटाई गई story उसकी गिनती घटा देती है और उसकी ring फिर से जल उठती है।

यूटिलिटी फ़ंक्शन

टैप ज़ोन पहचानने और प्रोग्रेस बार के हिसाब के लिए शुद्ध फ़ंक्शन।

फ़ंक्शनटाइपविवरण
getTapAction(tapX, containerWidth, splitRatio?)(number, number, number?) => 'prev' | 'next'स्थिति के आधार पर तय करता है कि टैप 'prev' चलाएगा या 'next'। डिफ़ॉल्ट splitRatio 0.3 है।
getSegments(totalStories, activeIndex, progress)(number, number, number) => SegmentState[]प्रोग्रेस बार के हर segment की स्थिति और भराव का प्रतिशत निकालता है
getVisibleWindow(totalStories, activeIndex, progress, containerWidth, minSegmentWidth?, gap?)(number, number, number, number, number?, number?) => VisibleWindowकुल संख्या कंटेनर की क्षमता से ज़्यादा होने पर segments की दिखने वाली खिसकती विंडो निकालता है

टाइप

@reelkit/stories-core से export होने वाली सभी टाइप डेफ़िनिशन।

typescript