@wereform/pkgm-wire 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,28 +1,217 @@
1
- # @begenone/pkgm-wire
1
+ # @wereform/pkgm-wire
2
2
 
3
- This package provides all functionality for the **"Wire" feature**, BEGENONE’s short-post or tweet-like system.
3
+ Wire UI components and layouts for short-form text content in the WeReform / BEGENONE platform.
4
4
 
5
- ## Overview
5
+ This package provides building blocks for rendering, composing, and viewing “Wires” — lightweight, text-first posts with optional media, metadata, and interactions. It is designed for mobile-first usage with React Native and integrates seamlessly with shared menu and interaction components.
6
6
 
7
- The Wire is a lightweight social feed for thoughts, links, or discussions. This package handles:
7
+ ---
8
8
 
9
- - Rendering short posts
10
- - Creating and deleting wires
11
- - Displaying like counts and comments
12
- - Basic interactions (likes, replies)
9
+ ## Install
13
10
 
14
- ## Features
11
+ ```bash
12
+ npm install @wereform/pkgm-wire
13
+ # or
14
+ yarn add @wereform/pkgm-wire
15
+ # or
16
+ pnpm add @wereform/pkgm-wire
17
+ ```
15
18
 
16
- - 📝 Compose & post wires
17
- - 🧵 Thread-style replies
18
- - 💬 Comment & like logic
19
- - 📄 Clean and scrollable feed interface
19
+ ---
20
20
 
21
- ## Usage
21
+ ## What this package gives you
22
22
 
23
- Used in the mobile app’s **Wire tab**, and may also appear on user profiles or notifications.
23
+ - Wire UI components:
24
24
 
25
- ## Tech Stack
25
+ - Channel metadata header for wires
26
+ - Compact wire card layout
27
+ - Full wire view layout
28
+ - Wire upload / composer layout
26
29
 
27
- - React Native FlatList
28
- - Shared formatting tools from `@begenone/pkgm-shared`
30
+ - Features:
31
+
32
+ - Multiline text rendering with line preservation
33
+ - Media attachment support (images + videos)
34
+ - Thumbnail generation for video attachments
35
+ - Interaction menu integration (like, comment, share, more)
36
+
37
+ - Built for:
38
+
39
+ - React Native / Expo
40
+ - Text-centric social feeds
41
+ - Composition with shared UI and menu packages
42
+
43
+ ---
44
+
45
+ ## Exports
46
+
47
+ From `@wereform/pkgm-wire` you can import:
48
+
49
+ ```ts
50
+ import {
51
+ WireChannelMetadata,
52
+ WireCardLayout,
53
+ WireUploadLayout,
54
+ WireViewLayout,
55
+ } from "@wereform/pkgm-wire";
56
+ ```
57
+
58
+ ---
59
+
60
+ ## Core components
61
+
62
+ ## WireChannelMetadata
63
+
64
+ Displays channel-level metadata for a wire post.
65
+
66
+ ### Props
67
+
68
+ ```ts
69
+ WireChannelMetadata({
70
+ channelLogo,
71
+ userName,
72
+ subscribersCount,
73
+ timeAgo,
74
+ viewsText,
75
+ containerStyles,
76
+ });
77
+ ```
78
+
79
+ - `channelLogo` Channel profile image URL
80
+ - `userName` Channel or user display name
81
+ - `subscribersCount` Subscriber count text
82
+ - `timeAgo` Relative publish time
83
+ - `viewsText` View count text
84
+ - `containerStyles` Optional style overrides
85
+
86
+ ---
87
+
88
+ ## WireCardLayout
89
+
90
+ Compact wire preview card used in feeds and lists.
91
+
92
+ ### Props
93
+
94
+ ```ts
95
+ WireCardLayout({
96
+ content,
97
+ channelLogo,
98
+ userName,
99
+ subscribersCount,
100
+ timeAgo,
101
+ viewsText,
102
+ onPress,
103
+ });
104
+ ```
105
+
106
+ - Truncates long wire content
107
+ - Preserves line breaks
108
+ - Displays “See more” affordance
109
+ - Integrates interaction menu
110
+
111
+ ---
112
+
113
+ ## WireUploadLayout
114
+
115
+ Composer layout for creating and publishing new wires.
116
+
117
+ ### Props
118
+
119
+ ```ts
120
+ WireUploadLayout({
121
+ profilePic,
122
+ userName,
123
+ onPressVideoUploadScreen,
124
+ onPressWireUpload,
125
+ });
126
+ ```
127
+
128
+ - Supports:
129
+
130
+ - Multiline text input
131
+ - Image and video attachments
132
+ - Multiple media selection
133
+ - Automatic video thumbnail generation
134
+
135
+ - Returns wire text and heading via callback
136
+
137
+ ---
138
+
139
+ ## WireViewLayout
140
+
141
+ Full wire detail view for reading and interacting with a single wire.
142
+
143
+ ### Props
144
+
145
+ ```ts
146
+ WireViewLayout({
147
+ content,
148
+ channelLogo,
149
+ userName,
150
+ subscribersCount,
151
+ timeAgo,
152
+ viewsText,
153
+ isItMe,
154
+ onPressDeleteButton,
155
+ });
156
+ ```
157
+
158
+ - Renders full wire content with preserved formatting
159
+ - Shows interaction menu
160
+ - Conditionally exposes delete action for owner
161
+
162
+ ---
163
+
164
+ ## Typical usage
165
+
166
+ ```ts
167
+ <WireCardLayout
168
+ content={wire.text}
169
+ userName={wire.user.name}
170
+ subscribersCount={wire.subscribers}
171
+ timeAgo={wire.timeAgo}
172
+ viewsText={wire.views}
173
+ />
174
+
175
+ <WireUploadLayout
176
+ userName="Areesh"
177
+ onPressWireUpload={(text, heading) => createWire(text, heading)}
178
+ />
179
+ ```
180
+
181
+ ---
182
+
183
+ ## Design philosophy
184
+
185
+ - Text-first, lightweight content
186
+ - UI-only package
187
+ - No API calls or persistence logic
188
+ - Preserves author formatting and intent
189
+ - Designed to scale with feeds and detail views
190
+
191
+ ---
192
+
193
+ ## License
194
+
195
+ ```
196
+ MIT License
197
+
198
+ Copyright (c) 2025 WeReform / BEGENONE
199
+
200
+ Permission is hereby granted, free of charge, to any person obtaining a copy
201
+ of this software and associated documentation files (the “Software”), to deal
202
+ in the Software without restriction, including without limitation the rights
203
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
204
+ copies of the Software, and to permit persons to whom the Software is
205
+ furnished to do so, subject to the following conditions:
206
+
207
+ The above copyright notice and this permission notice shall be included in
208
+ all copies or substantial portions of the Software.
209
+
210
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
211
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
212
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
213
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
214
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
215
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
216
+ THE SOFTWARE.
217
+ ```
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@wereform/pkgm-wire",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "main": "dist/index.js",
5
- "scripts": {
6
- "build": "babel src --out-dir dist --extensions .js,.jsx"
7
- },
5
+ "files": [
6
+ "dist",
7
+ "README.md"
8
+ ],
8
9
  "publishConfig": {
9
10
  "access": "public"
10
11
  },
@@ -14,10 +15,10 @@
14
15
  "react-native": "*"
15
16
  },
16
17
  "dependencies": {
17
- "@wereform/pkgm-channel": "^1.0.0",
18
- "@wereform/pkgm-settings": "^1.0.0",
19
- "@wereform/pkgm-shared": "^1.0.0",
20
- "@wereform/pkgm-video": "^1.0.0",
18
+ "@wereform/pkgm-channel": "^1.0.3",
19
+ "@wereform/pkgm-settings": "^1.0.2",
20
+ "@wereform/pkgm-shared": "^1.0.2",
21
+ "@wereform/pkgm-video": "^1.0.2",
21
22
  "expo-image-picker": "^17.0.8",
22
23
  "expo-video-thumbnails": "^10.0.7"
23
24
  },
@@ -26,5 +27,8 @@
26
27
  "@babel/core": "^7.28.5",
27
28
  "@babel/preset-env": "^7.28.5",
28
29
  "metro-react-native-babel-preset": "^0.77.0"
30
+ },
31
+ "scripts": {
32
+ "build": "babel src --out-dir dist --extensions .js,.jsx"
29
33
  }
30
- }
34
+ }
package/babel.config.js DELETED
@@ -1,3 +0,0 @@
1
- module.exports = {
2
- presets: ["module:metro-react-native-babel-preset"],
3
- };
File without changes
package/packageJSON.md DELETED
@@ -1,29 +0,0 @@
1
- {
2
- "name": "@begenone/pkgm-wire",
3
- "version": "1.0.0",
4
- "private": true,
5
- "main": "dist/index.js",
6
- "peerDependencies": {
7
- "@expo/vector-icons": "_",
8
- "react": "_",
9
- "react-native": "_"
10
- },
11
- "scripts": {
12
- "build": "babel src --out-dir dist --extensions .js,.jsx"
13
- },
14
- "dependencies": {
15
- "@begenone/pkgm-channel": "workspace:_",
16
- "@begenone/pkgm-settings": "workspace:_",
17
- "@begenone/pkgm-shared": "workspace:_",
18
- "@begenone/pkgm-video": "workspace:_",
19
- "@begenone/pkgm-wire": "workspace:_",
20
- "expo-image-picker": "^17.0.8",
21
- "expo-video-thumbnails": "^10.0.7"
22
- },
23
- "devDependencies": {
24
- "@babel/cli": "^7.28.3",
25
- "@babel/core": "^7.28.5",
26
- "@babel/preset-env": "^7.28.5",
27
- "metro-react-native-babel-preset": "^0.77.0"
28
- }
29
- }
@@ -1,58 +0,0 @@
1
- import { Image, Pressable, Text, View } from "react-native";
2
- import { WireChannelMetadataStyles } from "../styles/WireChannelMetadataStyles";
3
- import { Ionicons } from "@expo/vector-icons";
4
-
5
- export function WireChannelMetadata({
6
- channelLogo,
7
- userName,
8
- subscribersCount,
9
- timeAgo,
10
- viewsText,
11
- containerStyles,
12
- }) {
13
- return (
14
- <View style={WireChannelMetadataStyles.channelMetaContainer}>
15
- <View style={WireChannelMetadataStyles.channelMetaContainer_ColumnOne}>
16
- <Image
17
- source={{
18
- uri:
19
- channelLogo ||
20
- "https://begenone-images.s3.us-east-1.amazonaws.com/default-user-photo.jpg",
21
- }}
22
- style={WireChannelMetadataStyles.userImage}
23
- />
24
- <View style={WireChannelMetadataStyles.nameSubcountContainer}>
25
- <Text style={WireChannelMetadataStyles.userName}>
26
- {userName || "Default Username"}
27
- </Text>
28
- <View style={WireChannelMetadataStyles.subCountContainer}>
29
- <Text style={WireChannelMetadataStyles.subCount}>
30
- {subscribersCount || "0"}
31
- </Text>
32
- <Text style={WireChannelMetadataStyles.subText}>Subscribers</Text>
33
- </View>
34
- </View>
35
- </View>
36
- <View
37
- style={[WireChannelMetadataStyles.dateViewsContainer, containerStyles]}
38
- >
39
- <View style={WireChannelMetadataStyles.dateContainer}>
40
- <Text style={WireChannelMetadataStyles.dateText}>
41
- {timeAgo || "14 Hours Ago"}
42
- </Text>
43
- <View style={WireChannelMetadataStyles.dateIcon}>
44
- <Ionicons name="calendar" size={16} color="white" />
45
- </View>
46
- </View>
47
- <View style={WireChannelMetadataStyles.viewsContainer}>
48
- <Text style={WireChannelMetadataStyles.viewsText}>
49
- {viewsText || "0"}
50
- </Text>
51
- <View style={WireChannelMetadataStyles.eyeIcon}>
52
- <Ionicons name="eye-outline" size={16} color="white" />
53
- </View>
54
- </View>
55
- </View>
56
- </View>
57
- );
58
- }
File without changes
package/src/index.js DELETED
@@ -1,3 +0,0 @@
1
- export { WireCardLayout } from "./layout/WireCardLayout.jsx";
2
- export { WireViewLayout } from "./layout/WireViewLayout.jsx";
3
- export { WireUploadLayout } from "./layout/WireUploadLayout.jsx";
@@ -1,66 +0,0 @@
1
- import { Text, TouchableOpacity, View } from "react-native";
2
- import { MenuChannelMeta, MenuInteraction } from "@wereform/pkgm-shared";
3
- import { Ionicons } from "@expo/vector-icons";
4
- import { WireChannelMetadata } from "../components/WireChannelMetadata";
5
- import { WireCardLayoutStyles } from "../styles/WireCardLayoutStyles";
6
-
7
- export function WireCardLayout({
8
- content,
9
- channelLogo,
10
- userName,
11
- subscribersCount,
12
- timeAgo,
13
- viewsText,
14
- onPress,
15
- }) {
16
- const limit = 8;
17
-
18
- const contentText =
19
- content ??
20
- `Lorem ipsum dolor sit amet consectetur adipisicing elit. Vero quidem
21
- distinctio porro qui minus totam eius. Sed laudantium nisi expedita
22
- distinctio dignissimos dicta praesentium nihil iste velit cumque!
23
- Assumenda illum veritatis, ipsam sint
24
-
25
- vero corporis distinctio rem
26
- quisquam natus iste. Unde esse consequuntur maiores repellendus, cum
27
- voluptatem vero incidunt temporibus.`;
28
-
29
- // Only compute finalText if we actually have content
30
- const finalText = contentText
31
- ? contentText.replace(/\r\n/g, "\n").split("\n")
32
- : [];
33
-
34
- return (
35
- <TouchableOpacity style={WireCardLayoutStyles.container} onPress={onPress}>
36
- <View>
37
- <WireChannelMetadata
38
- channelLogo={
39
- channelLogo ||
40
- "https://begenone-images.s3.us-east-1.amazonaws.com/default-user-photo.jpg"
41
- }
42
- userName={userName}
43
- subscribersCount={subscribersCount}
44
- timeAgo={timeAgo}
45
- viewsText={viewsText}
46
- />
47
-
48
- <View style={WireCardLayoutStyles.mainTextContainer}>
49
- {finalText.length > 0 && (
50
- <Text numberOfLines={limit} style={WireCardLayoutStyles.mainText}>
51
- {finalText.map((text, index) => (
52
- <Text key={index}>
53
- {text.trim().replace(/\s+/g, " ")}
54
- {index < finalText.length - 1 ? "\n" : ""}
55
- </Text>
56
- ))}
57
- </Text>
58
- )}
59
- <Text> </Text>
60
- <Text style={WireCardLayoutStyles.seeMore}>See more →</Text>
61
- </View>
62
- </View>
63
- <MenuInteraction containerStyles={{ marginBottom: 12 }} />
64
- </TouchableOpacity>
65
- );
66
- }
@@ -1,241 +0,0 @@
1
- import { useState } from "react";
2
- import {
3
- Image,
4
- ScrollView,
5
- StyleSheet,
6
- Text,
7
- TextInput,
8
- TouchableOpacity,
9
- View,
10
- } from "react-native";
11
-
12
- import * as ImagePicker from "expo-image-picker";
13
- import * as VideoThumbnails from "expo-video-thumbnails";
14
- import { Ionicons } from "@expo/vector-icons";
15
- import { WireUploadStyles } from "../styles/WireUploadStyles";
16
- import { CustomizedButton, DropDown, InputField } from "@wereform/pkgm-shared";
17
-
18
- export function WireUploadLayout({
19
- profilePic,
20
- userName,
21
- onPressVideoUploadScreen,
22
- onPressWireUpload,
23
- }) {
24
- const [wireText, setWireText] = useState(``);
25
- const [media, setMedia] = useState(null); // image/video URI
26
- const [thumbnails, setThumbnails] = useState([]);
27
- const [heading, setHeading] = useState("Default Heading!");
28
-
29
- const pickMedia = async () => {
30
- let result = await ImagePicker.launchImageLibraryAsync({
31
- mediaTypes: ["images", "videos"],
32
- allowsMultipleSelection: true,
33
- selectionLimit: 4,
34
- quality: 1,
35
- });
36
-
37
- if (result.canceled) return;
38
-
39
- const assets = result.assets;
40
-
41
- // Save raw assets
42
- setMedia(assets);
43
-
44
- // Generate thumbnails for videos, or use image URI directly
45
- const finalThumbs = await Promise.all(
46
- assets.map(async asset => {
47
- const isVideo =
48
- asset.type === "video" || asset.mimeType?.startsWith("video");
49
-
50
- if (isVideo) {
51
- try {
52
- const { uri } = await VideoThumbnails.getThumbnailAsync(asset.uri, {
53
- time: 1000,
54
- });
55
- return uri;
56
- } catch (err) {
57
- console.log("Video thumbnail error:", err);
58
- return null;
59
- }
60
- }
61
-
62
- // Image → use directly
63
- return asset.uri;
64
- })
65
- );
66
-
67
- console.log(finalThumbs);
68
-
69
- setThumbnails(finalThumbs);
70
- };
71
-
72
- console.log(wireText);
73
-
74
- return (
75
- <ScrollView>
76
- <View style={WireUploadStyles.container}>
77
- <View style={WireUploadStyles.profileSection}>
78
- <Image
79
- source={{
80
- uri:
81
- profilePic ||
82
- "https://begenone-images.s3.us-east-1.amazonaws.com/default-user-photo.jpg",
83
- }}
84
- style={WireUploadStyles.userImage}
85
- />
86
-
87
- <View style={WireUploadStyles.userInfo}>
88
- <Text style={WireUploadStyles.userName}>
89
- {userName || "Default Username"}
90
- </Text>
91
-
92
- {/* Link to user's public-facing channel page */}
93
- {/* <TouchableOpacity
94
- onPress={() => Linking.openURL("https://begenone.com")}
95
- >
96
- <Text style={WireUploadStyles.channelSettingsText}>
97
- View Channel
98
- </Text>
99
- </TouchableOpacity> */}
100
- </View>
101
- </View>
102
- {/* 1 — Composer Input */}
103
- <View style={WireUploadStyles.wireInputContainer}>
104
- <View
105
- style={{
106
- flexDirection: "row",
107
- justifyContent: "space-between",
108
- alignItems: "center",
109
- }}
110
- >
111
- <Text
112
- style={{
113
- color: "#fff",
114
- fontWeight: "900",
115
- fontSize: 24,
116
- paddingBottom: 12,
117
- flexGrow: 1,
118
- justifyContent: "flex-start",
119
- }}
120
- >
121
- Create <Text style={{ color: "#ff6000" }}>Wire</Text>
122
- </Text>
123
- <TouchableOpacity onPress={onPressVideoUploadScreen}>
124
- <Text
125
- style={{
126
- color: "#fff",
127
- fontWeight: "500",
128
- fontSize: 14,
129
- paddingBottom: 12,
130
- // flexGrow: 1,
131
-
132
- alignSelf: "center",
133
- }}
134
- >
135
- Upload <Text style={{ color: "#ff6000" }}>Video</Text>
136
- </Text>
137
- </TouchableOpacity>
138
- </View>
139
- <View style={WireUploadStyles.wireInputTextContainer}>
140
- <InputField
141
- multiline
142
- placeholder="Write your Wire..."
143
- inputWrapper={WireUploadStyles.inputWrapper}
144
- inputStyle={WireUploadStyles.aboutTextArea}
145
- value={wireText}
146
- onChangeText={setWireText}
147
- />
148
-
149
- {/* 2 — Media Preview (always below text) */}
150
- <View style={WireUploadStyles.mediaContainer}>
151
- {thumbnails.map((uri, index) => (
152
- <TouchableOpacity key={index} onPress={pickMedia}>
153
- <Image
154
- source={{ uri }}
155
- style={WireUploadStyles.mediaThumb}
156
- resizeMode="cover"
157
- />
158
- </TouchableOpacity>
159
- ))}
160
- </View>
161
-
162
- {/* 3 — Upload Button */}
163
- <View style={WireUploadStyles.uploadButtonContainer}>
164
- <TouchableOpacity style={WireUploadStyles.AIGenerateButton}>
165
- <Ionicons name="sparkles-outline" size={24} color="#fff" />
166
- </TouchableOpacity>
167
- <TouchableOpacity
168
- onPress={pickMedia}
169
- style={WireUploadStyles.uploadImageButton}
170
- >
171
- <Ionicons name="image" size={24} color="#fff" />
172
- </TouchableOpacity>
173
- </View>
174
- </View>
175
-
176
- <DropDown
177
- styles={{
178
- marginLeft: 0,
179
- marginRight: 0,
180
- marginTop: 18,
181
- // paddingRight: 24,
182
- }}
183
- iconStyles={{ paddingRight: 16 }}
184
- selectText={"Select Age Group"}
185
- data={[
186
- { key: 1, label: "Under 14 of age" },
187
- { key: 2, label: "Above 14 of age" },
188
- ]}
189
- />
190
-
191
- <DropDown
192
- styles={{ marginLeft: 0, marginRight: 0, marginTop: 18 }}
193
- selectText={"Comments"}
194
- iconStyles={{ paddingRight: 16 }}
195
- data={[
196
- { key: 1, label: "Turn — ON" },
197
- { key: 2, label: "Turn — OFF" },
198
- ]}
199
- />
200
- </View>
201
-
202
- <View
203
- style={{
204
- flexDirection: "row",
205
- width: "auto",
206
- justifyContent: "space-between",
207
-
208
- marginTop: 60,
209
- marginLeft: 24,
210
- marginRight: 24,
211
- }}
212
- >
213
- <CustomizedButton
214
- label={"Post Wire"}
215
- style={{
216
- backgroundColor: "#ff6000",
217
- marginRight: 6,
218
- }}
219
- fontWeight={"900"}
220
- textColor={"#fff"}
221
- onPress={() => onPressWireUpload(wireText, heading)}
222
- />
223
- {/* <CustomizedButton
224
- label={"Schedule"}
225
- style={{
226
- backgroundColor: "#202020",
227
- marginLeft: 6,
228
- }}
229
- fontWeight={"900"}
230
- textColor={"#404040"}
231
- /> */}
232
- </View>
233
-
234
- {/* 4 — Future AI Row */}
235
- {/* <WireAIBar text={text} onChange={setText} /> */}
236
- </View>
237
- </ScrollView>
238
- );
239
- }
240
-
241
- const styles = StyleSheet.create({});
@@ -1,105 +0,0 @@
1
- import { ScrollView, Text, View } from "react-native";
2
- import { WireChannelMetadata } from "../components/WireChannelMetadata";
3
- import { WireCardLayoutStyles } from "../styles/WireCardLayoutStyles";
4
- import {
5
- MenuInteraction,
6
- MenuChannelMeta,
7
- CustomizedButton,
8
- } from "@wereform/pkgm-shared";
9
- import { WireViewLayoutStyles } from "../styles/WireViewLayoutStyles";
10
- import { useState } from "react";
11
-
12
- export function WireViewLayout({
13
- content,
14
- channelLogo,
15
- userName,
16
- subscribersCount,
17
- timeAgo,
18
- viewsText,
19
- isItMe,
20
- onPressDeleteButton,
21
- }) {
22
- const [isPressed, setPressed] = useState(false);
23
-
24
- const contentText =
25
- content ??
26
- `Curiosity is the real engine of progress. You don’t need certainty — you need movement. Every experiment, every failure, every weird idea you chase sharpens your understanding of reality.
27
-
28
- Stop waiting to “figure it out” first. Dive in, break things, rebuild smarter. The mind grows through friction, not comfort.
29
-
30
- Mastery isn’t perfection; it’s the relentless act of returning to the edge — again and again — until the unknown feels like home. The goal isn’t to win. It’s to keep becoming.
31
-
32
- #curiosity #growth #mindset #learning`;
33
-
34
- // Only compute finalText if we actually have content
35
- const finalText = contentText
36
- ? contentText.replace(/\r\n/g, "\n").split("\n")
37
- : [];
38
-
39
- function togglePressed() {
40
- setPressed(prev => !prev);
41
- }
42
-
43
- return (
44
- <ScrollView
45
- style={WireViewLayoutStyles.container}
46
- contentContainerStyle={{ flexGrow: 1 }}
47
- >
48
- <View style={WireViewLayoutStyles.secondaryContainer}>
49
- <MenuChannelMeta
50
- containerStyles={{
51
- marginTop: 0,
52
- paddingBottom: 12,
53
- marginLeft: 0,
54
- marginRight: 0,
55
- }}
56
- channelLogo={channelLogo}
57
- userName={userName}
58
- subscribersCount={subscribersCount}
59
- timeAgo={timeAgo}
60
- viewsText={viewsText}
61
- />
62
- <View>
63
- <Text style={WireViewLayoutStyles.mainText}>
64
- {finalText.length > 0 && (
65
- <Text style={WireViewLayoutStyles.mainText}>
66
- {finalText.map((text, index) => (
67
- <Text key={index}>
68
- {text.trim().replace(/\s+/g, " ")}
69
- {index < finalText.length - 1 ? "\n" : ""}
70
- </Text>
71
- ))}
72
- </Text>
73
- )}
74
- </Text>
75
- </View>
76
- </View>
77
- <View>
78
- <MenuInteraction pressed={togglePressed} />
79
-
80
- {isItMe && isPressed && (
81
- <CustomizedButton
82
- label={"Delete"}
83
- textColor={"white"}
84
- style={[
85
- { backgroundColor: "red", marginTop: 12 },
86
- isItMe
87
- ? {
88
- position: "absolute",
89
- width: 80,
90
- height: 35,
91
- right: 24,
92
- bottom: 48,
93
- }
94
- : "",
95
- ]}
96
- onPress={() => {
97
- console.log("DELETE PRESSED");
98
- onPressDeleteButton();
99
- }}
100
- />
101
- )}
102
- </View>
103
- </ScrollView>
104
- );
105
- }
@@ -1,37 +0,0 @@
1
- import { StyleSheet } from "react-native";
2
- import { globalStyles } from "./globalStyles";
3
-
4
- export const WireCardLayoutStyles = StyleSheet.create({
5
- container: {
6
- width: "auto",
7
- minHeight: 200,
8
- justifyContent: "space-between",
9
- // aspectRatio: 1 / 1,
10
- margin: 12,
11
- padding: 12,
12
- backgroundColor: globalStyles.colors.colorPrimary350,
13
- borderRadius: globalStyles.borders.borderPrimary100,
14
- },
15
-
16
- mainTextContainer: {
17
- borderRadius: 12,
18
- paddingVertical: 12,
19
- paddingHorizontal: 10,
20
- marginTop: 10,
21
- maxHeight: 360,
22
- },
23
-
24
- mainText: {
25
- color: "#ddd",
26
- fontSize: 15,
27
- lineHeight: 22,
28
- letterSpacing: 0.3,
29
- },
30
-
31
- seeMore: {
32
- color: "#fff",
33
- fontWeight: "600",
34
- marginTop: 4,
35
- fontSize: 14,
36
- },
37
- });
@@ -1,104 +0,0 @@
1
- import { Platform, StyleSheet } from "react-native";
2
- import { globalStyles } from "./globalStyles";
3
-
4
- export const WireChannelMetadataStyles = StyleSheet.create({
5
- dateViewsContainer: {
6
- flexDirection: "column",
7
- width: "auto",
8
- justifyContent: "center",
9
- alignItems: "flex-end",
10
- },
11
-
12
- dateContainer: {
13
- flexDirection: "row",
14
- paddingBottom: 4,
15
- // rowGap: 20,
16
- },
17
-
18
- // dateIcon: {
19
- // marginRight: 8,
20
- // },
21
-
22
- viewsContainer: {
23
- flexDirection: "row",
24
- justifyContent: "flex-end",
25
- },
26
-
27
- // eyeIcon: {
28
- // marginRight: 8,
29
- // },
30
-
31
- dateText: {
32
- color: globalStyles.colors.colorPrimary600,
33
- marginRight: 8,
34
- fontSize: Platform.OS === "ios" ? 14 : 12,
35
- },
36
-
37
- viewsText: {
38
- color: globalStyles.colors.colorPrimary600,
39
- marginRight: 8,
40
- fontSize: Platform.OS === "ios" ? 14 : 12,
41
- },
42
-
43
- channelMetaContainer: {
44
- width: "auto",
45
- flexDirection: "row",
46
- backgroundColor: globalStyles.colors.colorPrimary200,
47
- justifyContent: "space-between",
48
- // margin: 12,
49
- padding: 12,
50
- borderRadius: globalStyles.borders.borderPrimary100,
51
- },
52
-
53
- channelMetaContainer_ColumnOne: {
54
- flexDirection: "row",
55
- },
56
-
57
- userImage: {
58
- width: 40,
59
- height: 40,
60
- borderRadius: globalStyles.borders.borderPrimary50,
61
- },
62
-
63
- nameSubcountContainer: {
64
- flexDirection: "column",
65
- justifyContent: "center",
66
- paddingLeft: 12,
67
- },
68
-
69
- userName: {
70
- color: "#fff",
71
- fontSize: 16,
72
- paddingBottom: 4,
73
- fontWeight: "bold",
74
- },
75
-
76
- subCountContainer: {
77
- flexDirection: "row",
78
- },
79
-
80
- subCount: {
81
- color: globalStyles.colors.colorPrimary600,
82
- paddingRight: 6,
83
- fontSize: 12,
84
- fontWeight: "bold",
85
- },
86
-
87
- subText: {
88
- color: "#fff",
89
- fontSize: 12,
90
- },
91
-
92
- subscribeButtonContainer: {
93
- backgroundColor: globalStyles.colors.colorPrimary600,
94
- width: 100,
95
- borderRadius: globalStyles.borders.borderPrimary400,
96
- alignItems: "center",
97
- justifyContent: "center",
98
- },
99
-
100
- subscribeButtonText: {
101
- color: "#fff",
102
- fontWeight: "bold",
103
- },
104
- });
@@ -1,132 +0,0 @@
1
- import { StyleSheet } from "react-native";
2
- import { globalStyles } from "./globalStyles";
3
-
4
- export const WireUploadStyles = StyleSheet.create({
5
- container: {
6
- flex: 1,
7
- backgroundColor: "#141414",
8
- marginBottom: 120,
9
- // paddingHorizontal: 16,
10
- // paddingTop: 20,
11
- },
12
-
13
- profileSection: {
14
- flexDirection: "row",
15
- alignItems: "center",
16
- // paddingHorizontal: 36,
17
-
18
- borderBottomWidth: 1,
19
- paddingTop: 18,
20
- paddingBottom: 18,
21
- marginLeft: 36,
22
- marginRight: 36,
23
- borderColor: globalStyles.colors.colorPrimary450,
24
- },
25
- userImage: {
26
- width: 60,
27
- height: 60,
28
- borderRadius: 12,
29
- marginRight: 16,
30
- },
31
- userInfo: {
32
- flexDirection: "column",
33
- justifyContent: "center",
34
- },
35
- userName: {
36
- color: "white",
37
- fontSize: 18,
38
- fontWeight: "600",
39
- },
40
- channelSettingsText: {
41
- color: "#ff6600",
42
- marginTop: 4,
43
- },
44
-
45
- // /////////////////
46
-
47
- wireInputContainer: {
48
- marginRight: 24,
49
- marginLeft: 24,
50
- marginTop: 24,
51
- },
52
-
53
- wireInputTextContainer: {
54
- backgroundColor: "#202020",
55
- borderRadius: 12,
56
- },
57
-
58
- inputWrapper: {
59
- backgroundColor: "#202020",
60
- width: "auto",
61
- borderBottomRightRadius: 0,
62
- borderBottomLeftRadius: 0,
63
- },
64
-
65
- aboutTextArea: {
66
- textAlignVertical: "top",
67
- // whiteSpace: "pre-line",
68
- whiteSpace: "pre",
69
-
70
- height: "auto",
71
- minHeight: 200,
72
- color: "white",
73
- paddingTop: 16,
74
- marginTop: 0,
75
- lineHeight: 24,
76
- fontWeight: 400,
77
- fontSize: 18,
78
- paddingBottom: 36,
79
- },
80
-
81
- media: {
82
- width: "auto",
83
- height: 200,
84
- borderRadius: 14,
85
- // marginBottom: 16,
86
- backgroundColor: "#000",
87
- },
88
-
89
- uploadButtonContainer: {
90
- flexDirection: "row",
91
- alignItems: "center",
92
- justifyContent: "flex-end",
93
- },
94
-
95
- AIGenerateButton: {
96
- paddingRight: 24,
97
- },
98
-
99
- uploadImageButton: {
100
- paddingRight: 24,
101
- // backgroundColor: "#252525",
102
- paddingVertical: 24,
103
- borderRadius: 12,
104
- // marginBottom: 20,
105
- // marginTop: 20,
106
- },
107
-
108
- uploadButtonText: {
109
- color: "#fff",
110
- fontSize: 14,
111
- fontWeight: "600",
112
- marginLeft: 8,
113
- },
114
-
115
- mediaContainer: {
116
- flexDirection: "row",
117
- flexWrap: "wrap",
118
- gap: 10,
119
- width: "auto",
120
- marginBottom: 16,
121
- paddingLeft: 6,
122
- paddingRight: 6,
123
- justifyContent: "space-evenly",
124
- },
125
-
126
- mediaThumb: {
127
- width: 120,
128
- height: 120,
129
- borderRadius: 12,
130
- backgroundColor: "#000",
131
- },
132
- });
@@ -1,27 +0,0 @@
1
- import { StyleSheet } from "react-native";
2
- import { globalStyles } from "./globalStyles";
3
-
4
- export const WireViewLayoutStyles = StyleSheet.create({
5
- container: {
6
- width: "auto",
7
- margin: 12,
8
- paddingTop: 12,
9
- paddingBottom: 12,
10
- paddingLeft: 18,
11
- paddingRight: 18,
12
- backgroundColor: globalStyles.colors.colorPrimary350,
13
- borderRadius: globalStyles.borders.borderPrimary200,
14
- marginBottom: 96,
15
- },
16
-
17
- secondaryContainer: {
18
- flexDirection: "column",
19
- paddingBottom: 24,
20
- },
21
-
22
- mainText: {
23
- color: "#fff",
24
- lineHeight: 28,
25
- fontSize: 18,
26
- },
27
- });
@@ -1,28 +0,0 @@
1
- export const globalStyles = {
2
- colors: {
3
- colorPrimary50: "rgba(21, 21, 21, .7)",
4
- colorPrimary100: "#151515",
5
-
6
- colorPrimary200: "#252525",
7
- colorPrimary250: "rgba(37, 37, 37, .9)",
8
-
9
- colorPrimary300: "#3C3C3C",
10
- colorPrimary350: "rgba(60,60,60,.2)",
11
-
12
- colorPrimary400: "#7F7F7F",
13
- colorPrimary450: "rgba(127, 127, 127, .3)",
14
-
15
- colorPrimary500: "#D3D3D3",
16
-
17
- colorPrimary600: "#ff6600ff",
18
-
19
- colorPrimary700: "#FF8800",
20
- },
21
- borders: {
22
- borderPrimary50: 8,
23
- borderPrimary100: 10,
24
- borderPrimary200: 12,
25
- borderPrimary300: 15,
26
- borderPrimary400: 30,
27
- },
28
- };
File without changes
File without changes
File without changes
File without changes