@adminide-stack/yantra-mobile 12.0.69-alpha.20 โ 12.0.69-alpha.22
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/lib/features/chat/connectorConnect.js +2 -17
- package/lib/features/chat/connectorConnect.js.map +1 -1
- package/lib/features/messaging/ContactsScreen.js +61 -3
- package/lib/features/messaging/ContactsScreen.js.map +1 -1
- package/lib/features/messaging/MessageActions.js +11 -4
- package/lib/features/messaging/MessageActions.js.map +1 -1
- package/lib/features/messaging/NativeChatExperience.js +4 -1
- package/lib/features/messaging/NativeChatExperience.js.map +1 -1
- package/lib/features/messaging/chatInviteLink.js +2 -2
- package/lib/features/messaging/chatInviteLink.js.map +1 -1
- package/lib/features/messaging/emojiCatalog.js +26 -2
- package/lib/features/messaging/emojiCatalog.js.map +1 -1
- package/lib/features/messaging/emojiKeywords.js +1592 -0
- package/lib/features/messaging/emojiKeywords.js.map +1 -0
- package/lib/features/messaging/useContactMatches.js +13 -1
- package/lib/features/messaging/useContactMatches.js.map +1 -1
- package/lib/hooks/useHostConnectorCard.js +1 -1
- package/lib/hooks/useHostConnectorCard.js.map +1 -1
- package/lib/screens/Chat/index.js +1 -1
- package/package.json +5 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emojiKeywords.js","sources":["../../../src/features/messaging/emojiKeywords.ts"],"sourcesContent":["/**\n * Emoji search index for the Tapback picker: one emoji per line, then its words.\n * GENERATED by tools/gen-emoji-keywords.mjs from emojilib - do not edit by hand.\n */\n// prettier-ignore\nexport const EMOJI_KEYWORDS_SOURCE = `\n๐ grinning face smile happy joy grin\n๐ smiley face happy joy haha smile funny\n๐ smile face happy joy funny haha laugh like\n๐ grin face happy smile joy kawaii\n๐ laughing happy joy lol satisfied haha face glad xd laugh\n๐
sweat smile face hot happy laugh relief\n๐ joy face cry tears weep happy happytears haha\n๐คฃ rofl face rolling floor laughing lol haha\nโบ๏ธ relaxed face blush massage happiness\n๐ blush face smile happy flushed crush embarrassed shy joy\n๐ innocent face angel heaven halo\n๐ slightly smiling face smile\n๐ upside down face flipped silly smile\n๐ wink face happy mischievous secret smile eye\n๐ relieved face relaxed phew massage happiness\n๐ heart eyes face love like affection valentines infatuation crush\n๐ฅฐ smiling face with three hearts love like affection valentines infatuation crush adore\n๐ kissing heart face love like affection valentines infatuation kiss\n๐ kissing love like face 3 valentines infatuation kiss\n๐ kissing smiling eyes face affection valentines infatuation kiss\n๐ kissing closed eyes face love like affection valentines infatuation kiss\n๐ yum happy joy tongue smile face silly yummy nom delicious savouring\n๐ stuck out tongue face prank childish playful mischievous smile\n๐ stuck out tongue closed eyes face prank playful mischievous smile\n๐ stuck out tongue winking eye face prank childish playful mischievous smile wink\n๐คช zany face goofy crazy\n๐คจ raised eyebrow face distrust scepticism disapproval disbelief surprise\n๐ง monocle face stuffy wealthy\n๐ค nerd face nerdy geek dork\n๐ sunglasses face cool smile summer beach sunglass\n๐คฉ star struck face smile starry eyes grinning\n๐ฅณ partying face celebration woohoo\n๐ smirk face smile mean prank smug sarcasm\n๐ unamused indifference bored serious sarcasm unimpressed skeptical dubious\n๐ disappointed face sad upset depressed\n๐ pensive face sad depressed upset\n๐ worried face concern nervous\n๐ confused face indifference huh weird hmmm\n๐ slightly frowning face disappointed sad upset\nโน frowning face sad upset frown\n๐ฃ persevere face sick no upset oops\n๐ confounded face confused sick unwell oops\n๐ซ tired face sick whine upset frustrated\n๐ฉ weary face tired sleepy sad frustrated upset\n๐ฅบ pleading face begging mercy\n๐ข cry face tears sad depressed upset\n๐ญ sob face cry tears sad upset depressed\n๐ค triumph face gas phew proud pride\n๐ angry mad face annoyed frustrated\n๐ก rage angry mad hate despise\n๐คฌ symbols over mouth face swearing cursing cussing profanity expletive\n๐คฏ exploding head face shocked mind blown\n๐ณ flushed face blush shy flattered\n๐ฅต hot face feverish heat red sweating\n๐ฅถ cold face blue freezing frozen frostbite icicles\n๐ฑ scream face munch scared omg\n๐จ fearful face scared terrified nervous oops huh\n๐ฐ cold sweat face nervous\n๐ฅ disappointed relieved face phew sweat nervous\n๐ sweat face hot sad tired exercise\n๐ค hugs face smile hug\n๐ค thinking face hmmm think consider\n๐คญ hand over mouth face whoops shock surprise\n๐คซ shushing face quiet shhh\n๐คฅ lying face lie pinocchio\n๐ถ no mouth face hellokitty\n๐ neutral face indifference meh\n๐ expressionless face indifferent meh deadpan\n๐ฌ grimacing face grimace teeth\n๐ roll eyes face eyeroll frustrated\n๐ฏ hushed face woo shh\n๐ฆ frowning face aw what\n๐ง anguished face stunned nervous\n๐ฎ open mouth face surprise impressed wow whoa\n๐ฒ astonished face xox surprised poisoned\n๐ด sleeping face tired sleepy night zzz\n๐คค drooling face\n๐ช sleepy face tired rest nap\n๐ต dizzy face spent unconscious xox\n๐ค zipper mouth face sealed secret\n๐ฅด woozy face dizzy intoxicated tipsy wavy\n๐คข nauseated face vomit gross green sick ill\n๐คฎ vomiting face sick\n๐คง sneezing face gesundheit sneeze sick allergy\n๐ท mask face sick ill disease\n๐ค face with thermometer sick temperature cold fever\n๐ค face with head bandage injured clumsy hurt\n๐ค money mouth face rich dollar\n๐ค cowboy hat face cowgirl\n๐ smiling imp devil horns\n๐ฟ imp devil angry horns\n๐น japanese ogre monster red mask halloween scary creepy devil demon\n๐บ japanese goblin red evil mask monster scary creepy\n๐คก clown face\n๐ฉ poop hankey shitface fail turd shit\n๐ป ghost halloween spooky scary\n๐ skull dead skeleton creepy death\nโ skull and crossbones poison danger deadly scary death pirate evil\n๐ฝ alien ufo paul weird\n๐พ space invader game arcade play\n๐ค robot computer machine bot\n๐ jack o lantern halloween light pumpkin creepy fall\n๐บ smiley cat animal cats happy smile\n๐ธ smile cat animal cats\n๐น joy cat animal cats haha happy tears\n๐ป heart eyes cat animal love like affection cats valentines\n๐ผ smirk cat animal cats\n๐ฝ kissing cat animal cats kiss\n๐ scream cat animal cats munch scared\n๐ฟ crying cat face animal tears weep sad cats upset cry\n๐พ pouting cat animal cats\n๐คฒ palms up hands gesture cupped prayer\n๐ open hands fingers butterfly\n๐ raised hands gesture hooray yea celebration\n๐ clap hands praise applause congrats yay\n๐ค handshake agreement shake\n๐ thumbsup yes awesome good agree accept cool hand like\n๐ 1 thumbsdown no dislike hand\n๐ facepunch angry violence fist hit attack hand\nโ fist fingers hand grasp\n๐ค fist left hand fistbump\n๐ค fist right hand fistbump\n๐ค crossed fingers good lucky\nโ v fingers ohyeah hand peace victory two\n๐ค love you hand fingers gesture\n๐ค metal hand fingers\n๐ ok hand fingers limbs perfect okay\n๐ point left direction fingers hand\n๐ point right fingers hand direction\nโ point up hand fingers direction\n๐ point down fingers hand direction\n๐ point up 2 fingers hand direction\nโ raised hand fingers stop highfive palm ban\n๐ค raised back of hand fingers backhand\n๐ raised hand with fingers splayed palm\n๐ vulcan salute hand fingers spock\n๐ wave hands gesture goodbye solong farewell hello hi palm\n๐ค call me hand hands gesture\n๐ช muscle arm flex hand summer strong biceps\n๐ fu hand fingers rude middle flipping\nโ writing hand stationery write compose\n๐ pray please hope wish namaste highfive\n๐ฆถ foot kick stomp\n๐ฆต leg kick limb\n๐ ring wedding propose marriage valentines diamond fashion jewelry gem engagement\n๐ lipstick female girl fashion woman\n๐ kiss face lips love like affection valentines\n๐ lips mouth kiss\n๐ฆท tooth teeth dentist\n๐
tongue mouth playful\n๐ ear face hear sound listen\n๐ nose smell sniff\n๐ฃ footprints feet tracking walking beach\n๐ eye face look see watch stare\n๐ eyes look watch stalk peek see\n๐ง brain smart intelligent\n๐ฃ speaking head user person human sing say talk\n๐ค bust in silhouette user person human\n๐ฅ busts in silhouette user person human group team\n๐ถ baby child boy girl toddler\n๐ง girl female woman teenager\n๐ง child young\n๐ฆ boy man male guy teenager\n๐ฉ woman female girls lady\n๐ง adult person\n๐จ man mustache father dad guy classy sir moustache\n๐ฑโโ๏ธ blonde woman female girl person\n๐ฑ blonde man male boy guy person\n๐ง bearded person bewhiskered\n๐ต older woman human female women lady old elder senior\n๐ง older adult human elder senior\n๐ด older man human male men old elder senior\n๐ฒ man with gua pi mao male boy chinese\n๐ง woman with headscarf female hijab mantilla tichel\n๐ณโโ๏ธ woman with turban female indian hinduism arabs\n๐ณ man with turban male indian hinduism arabs\n๐ฎโโ๏ธ policewoman woman police law legal enforcement arrest 911 female\n๐ฎ policeman man police law legal enforcement arrest 911\n๐ทโโ๏ธ construction worker woman female human wip build labor\n๐ท construction worker man male human wip guy build labor\n๐โโ๏ธ guardswoman uk gb british female royal woman\n๐ guardsman uk gb british male guy royal\n๐ต๏ธโโ๏ธ female detective human spy woman\n๐ต male detective human spy\n๐ฉโโ๏ธ woman health worker doctor nurse therapist healthcare human\n๐จโโ๏ธ man health worker doctor nurse therapist healthcare human\n๐ฉโ๐พ woman farmer rancher gardener human\n๐จโ๐พ man farmer rancher gardener human\n๐ฉโ๐ณ woman cook chef human\n๐จโ๐ณ man cook chef human\n๐ฉโ๐ woman student graduate human\n๐จโ๐ man student graduate human\n๐ฉโ๐ค woman singer rockstar entertainer human\n๐จโ๐ค man singer rockstar entertainer human\n๐ฉโ๐ซ woman teacher instructor professor human\n๐จโ๐ซ man teacher instructor professor human\n๐ฉโ๐ญ woman factory worker assembly industrial human\n๐จโ๐ญ man factory worker assembly industrial human\n๐ฉโ๐ป woman technologist coder developer engineer programmer software human laptop computer\n๐จโ๐ป man technologist coder developer engineer programmer software human laptop computer\n๐ฉโ๐ผ woman office worker business manager human\n๐จโ๐ผ man office worker business manager human\n๐ฉโ๐ง woman mechanic plumber human wrench\n๐จโ๐ง man mechanic plumber human wrench\n๐ฉโ๐ฌ woman scientist biologist chemist engineer physicist human\n๐จโ๐ฌ man scientist biologist chemist engineer physicist human\n๐ฉโ๐จ woman artist painter human\n๐จโ๐จ man artist painter human\n๐ฉโ๐ woman firefighter fireman human\n๐จโ๐ man firefighter fireman human\n๐ฉโโ๏ธ woman pilot aviator plane human\n๐จโโ๏ธ man pilot aviator plane human\n๐ฉโ๐ woman astronaut space rocket human\n๐จโ๐ man astronaut space rocket human\n๐ฉโโ๏ธ woman judge justice court human\n๐จโโ๏ธ man judge justice court human\n๐ฐ bride with veil couple marriage wedding woman\n๐คต man in tuxedo couple marriage wedding groom\n๐ธ princess girl woman female blond crown royal queen\n๐คด prince boy man male crown royal king\n๐ฆธโโ๏ธ woman superhero female good heroine superpowers\n๐ฆธโโ๏ธ man superhero male good hero superpowers\n๐ฆนโโ๏ธ woman supervillain female evil bad criminal heroine superpowers\n๐ฆนโโ๏ธ man supervillain male evil bad criminal hero superpowers\n๐คถ mrs claus woman female xmas\n๐
santa festival man male xmas\n๐งโโ๏ธ sorceress woman female mage witch\n๐งโโ๏ธ wizard man male mage sorcerer\n๐งโโ๏ธ woman elf female\n๐งโโ๏ธ man elf male\n๐งโโ๏ธ woman vampire female\n๐งโโ๏ธ man vampire male dracula\n๐งโโ๏ธ woman zombie female undead\n๐งโโ๏ธ man zombie male dracula undead\n๐งโโ๏ธ woman genie female\n๐งโโ๏ธ man genie male\n๐งโโ๏ธ mermaid woman female merwoman ariel\n๐งโโ๏ธ merman man male triton\n๐งโโ๏ธ woman fairy female\n๐งโโ๏ธ man fairy male\n๐ผ angel heaven wings halo\n๐คฐ pregnant woman baby\n๐คฑ breastfeeding nursing baby\n๐โโ๏ธ bowing woman female girl\n๐ bowing man male boy\n๐ tipping hand woman female girl human information\n๐โโ๏ธ tipping hand man male boy human information\n๐
no good woman female girl nope\n๐
โโ๏ธ no good man male boy nope\n๐ ok woman women girl female pink human\n๐โโ๏ธ ok man men boy male blue human\n๐ raising hand woman female girl\n๐โโ๏ธ raising hand man male boy\n๐คฆโโ๏ธ woman facepalming female girl disbelief\n๐คฆโโ๏ธ man facepalming male boy disbelief\n๐คท woman shrugging female girl confused indifferent doubt\n๐คทโโ๏ธ man shrugging male boy confused indifferent doubt\n๐ pouting woman female girl\n๐โโ๏ธ pouting man male boy\n๐ frowning woman female girl sad depressed discouraged unhappy\n๐โโ๏ธ frowning man male boy sad depressed discouraged unhappy\n๐ haircut woman female girl\n๐โโ๏ธ haircut man male boy\n๐ massage woman female girl head\n๐โโ๏ธ massage man male boy head\n๐งโโ๏ธ woman in steamy room female spa steamroom sauna\n๐งโโ๏ธ man in steamy room male spa steamroom sauna\n๐
nail care beauty manicure finger fashion\n๐คณ selfie camera phone\n๐ dancer female girl woman fun\n๐บ man dancing male boy fun dancer\n๐ฏ dancing women female bunny girls\n๐ฏโโ๏ธ dancing men male bunny boys\n๐ด business suit levitating levitate hover jump\n๐ถโโ๏ธ walking woman human feet steps female\n๐ถ walking man human feet steps\n๐โโ๏ธ running woman walking exercise race female\n๐ running man walking exercise race\n๐ซ couple pair people human love date dating like affection valentines marriage\n๐ญ two women holding hands pair friendship couple love like female people human\n๐ฌ two men holding hands pair couple love like bromance friendship people human\n๐ couple with heart woman man pair love like affection human dating valentines marriage\n๐ฉโโค๏ธโ๐ฉ couple with heart woman pair love like affection human dating valentines marriage\n๐จโโค๏ธโ๐จ couple with heart man pair love like affection human dating valentines marriage\n๐ couplekiss man woman pair valentines love like dating marriage\n๐ฉโโค๏ธโ๐โ๐ฉ couplekiss woman pair valentines love like dating marriage\n๐จโโค๏ธโ๐โ๐จ couplekiss man pair valentines love like dating marriage\n๐ช family man woman boy home parents child mom dad father mother people human\n๐จโ๐ฉโ๐ง family man woman girl home parents people human child\n๐จโ๐ฉโ๐งโ๐ฆ family man woman girl boy home parents people human children\n๐จโ๐ฉโ๐ฆโ๐ฆ family man woman boy home parents people human children\n๐จโ๐ฉโ๐งโ๐ง family man woman girl home parents people human children\n๐ฉโ๐ฉโ๐ฆ family woman boy home parents people human children\n๐ฉโ๐ฉโ๐ง family woman girl home parents people human children\n๐ฉโ๐ฉโ๐งโ๐ฆ family woman girl boy home parents people human children\n๐ฉโ๐ฉโ๐ฆโ๐ฆ family woman boy home parents people human children\n๐ฉโ๐ฉโ๐งโ๐ง family woman girl home parents people human children\n๐จโ๐จโ๐ฆ family man boy home parents people human children\n๐จโ๐จโ๐ง family man girl home parents people human children\n๐จโ๐จโ๐งโ๐ฆ family man girl boy home parents people human children\n๐จโ๐จโ๐ฆโ๐ฆ family man boy home parents people human children\n๐จโ๐จโ๐งโ๐ง family man girl home parents people human children\n๐ฉโ๐ฆ family woman boy home parent people human child\n๐ฉโ๐ง family woman girl home parent people human child\n๐ฉโ๐งโ๐ฆ family woman girl boy home parent people human children\n๐ฉโ๐ฆโ๐ฆ family woman boy home parent people human children\n๐ฉโ๐งโ๐ง family woman girl home parent people human children\n๐จโ๐ฆ family man boy home parent people human child\n๐จโ๐ง family man girl home parent people human child\n๐จโ๐งโ๐ฆ family man girl boy home parent people human children\n๐จโ๐ฆโ๐ฆ family man boy home parent people human children\n๐จโ๐งโ๐ง family man girl home parent people human children\n๐งถ yarn ball crochet knit\n๐งต thread needle sewing spool string\n๐งฅ coat jacket\n๐ฅผ labcoat doctor experiment scientist chemist\n๐ womans clothes fashion female\n๐ tshirt fashion cloth casual shirt tee\n๐ jeans fashion shopping\n๐ necktie shirt suitup formal fashion cloth business\n๐ dress clothes fashion shopping\n๐ bikini swimming female woman girl fashion beach summer\n๐ kimono dress fashion women female japanese\n๐ฅฟ flat shoe ballet slipper\n๐ high heel fashion shoes female pumps stiletto\n๐ก sandal shoes fashion\n๐ข boot shoes fashion\n๐ mans shoe fashion male\n๐ athletic shoe shoes sports sneakers\n๐ฅพ hiking boot backpacking camping\n๐งฆ socks stockings clothes\n๐งค gloves hands winter clothes\n๐งฃ scarf neck winter clothes\n๐ฉ tophat magic gentleman classy circus\n๐งข billed hat cap baseball\n๐ womans hat fashion accessories female lady spring\n๐ mortar board school college degree university graduation cap hat legal learn education\nโ rescue worker helmet construction build\n๐ crown king kod leader royalty lord\n๐ pouch bag accessories shopping\n๐ purse fashion accessories money sales shopping\n๐ handbag fashion accessory accessories shopping\n๐ผ briefcase business documents work law legal job career\n๐ school satchel student education bag backpack\n๐งณ luggage packing travel\n๐ eyeglasses fashion accessories eyesight nerdy dork geek\n๐ถ dark sunglasses face cool accessories\n๐ฅฝ goggles eyes protection safety\n๐ closed umbrella weather rain drizzle\n๐ถ dog animal friend nature woof puppy pet faithful\n๐ฑ cat animal meow nature pet kitten\n๐ญ mouse animal nature rodent\n๐น hamster animal nature\n๐ฐ rabbit animal nature pet spring magic bunny\n๐ฆ fox face animal nature\n๐ป bear animal nature wild\n๐ผ panda face animal nature\n๐จ koala animal nature\n๐ฏ tiger animal cat danger wild nature roar\n๐ฆ lion animal nature\n๐ฎ cow beef ox animal nature moo milk\n๐ท pig animal oink nature\n๐ฝ pig nose animal oink\n๐ธ frog animal nature croak toad\n๐ต monkey face animal nature circus\n๐ see no evil monkey animal nature haha\n๐ hear no evil animal monkey nature\n๐ speak no evil monkey animal nature omg\n๐ monkey animal nature banana circus\n๐ chicken animal cluck nature bird\n๐ง penguin animal nature\n๐ฆ bird animal nature fly tweet spring\n๐ค baby chick animal chicken bird\n๐ฃ hatching chick animal chicken egg born baby bird\n๐ฅ hatched chick animal chicken baby bird\n๐ฆ duck animal nature bird mallard\n๐ฆ
eagle animal nature bird\n๐ฆ owl animal nature bird hoot\n๐ฆ bat animal nature blind vampire\n๐บ wolf animal nature wild\n๐ boar animal nature\n๐ด horse animal brown nature\n๐ฆ unicorn animal nature mystical\n๐ honeybee animal insect nature bug spring honey\n๐ bug animal insect nature worm\n๐ฆ butterfly animal insect nature caterpillar\n๐ snail slow animal shell\n๐ shell nature sea beach\n๐ beetle animal insect nature ladybug\n๐ ant animal insect nature bug\n๐ฆ mosquito animal nature insect malaria\n๐ฆ grasshopper animal cricket chirp\n๐ท spider animal arachnid\n๐ธ spider web animal insect arachnid silk\n๐ฆ scorpion animal arachnid\n๐ข turtle animal slow nature tortoise\n๐ snake animal evil nature hiss python\n๐ฆ lizard animal nature reptile\n๐ฆ t rex animal nature dinosaur tyrannosaurus extinct\n๐ฆ sauropod animal nature dinosaur brachiosaurus brontosaurus diplodocus extinct\n๐ octopus animal creature ocean sea nature beach\n๐ฆ squid animal nature ocean sea\n๐ฆ shrimp animal ocean nature seafood\n๐ฆ lobster animal nature bisque claws seafood\n๐ฆ crab animal crustacean\n๐ก blowfish animal nature food sea ocean\n๐ tropical fish animal swim ocean beach nemo\n๐ fish animal food nature\n๐ฌ dolphin animal nature fish sea ocean flipper fins beach\n๐ณ whale animal nature sea ocean\n๐ whale2 animal nature sea ocean\n๐ฆ shark animal nature fish sea ocean jaws fins beach\n๐ crocodile animal nature reptile lizard alligator\n๐
tiger2 animal nature roar\n๐ leopard animal nature\n๐ฆ zebra animal nature stripes safari\n๐ฆ gorilla animal nature circus\n๐ elephant animal nature nose th circus\n๐ฆ hippopotamus animal nature\n๐ฆ rhinoceros animal nature horn\n๐ช dromedary camel animal hot desert hump\n๐ฆ giraffe animal nature spots safari\n๐ฆ kangaroo animal nature australia joey hop marsupial\n๐ซ camel animal nature hot desert hump\n๐ water buffalo animal nature ox cow\n๐ ox animal cow beef\n๐ cow2 beef ox animal nature moo milk\n๐ racehorse animal gamble luck\n๐ pig2 animal nature\n๐ ram animal sheep nature\n๐ sheep animal nature wool shipit\n๐ฆ llama animal nature alpaca\n๐ goat animal nature\n๐ฆ deer animal nature horns venison\n๐ dog2 animal nature friend doge pet faithful\n๐ฉ poodle dog animal 101 nature pet\n๐ cat2 animal meow pet cats\n๐ rooster animal nature chicken\n๐ฆ turkey animal bird\n๐ฆ peacock animal nature peahen bird\n๐ฆ parrot animal nature bird pirate talk\n๐ฆข swan animal nature bird\n๐ dove animal bird\n๐ rabbit2 animal nature pet magic spring\n๐ฆ raccoon animal nature\n๐ฆก badger animal nature honey\n๐ rat animal mouse rodent\n๐ mouse2 animal nature rodent\n๐ฟ chipmunk animal nature rodent squirrel\n๐ฆ hedgehog animal nature spiny\n๐พ paw prints animal tracking footprints dog cat pet feet\n๐ dragon animal myth nature chinese green\n๐ฒ dragon face animal myth nature chinese green\n๐ต cactus vegetable plant nature\n๐ christmas tree festival vacation december xmas celebration\n๐ฒ evergreen tree plant nature\n๐ณ deciduous tree plant nature\n๐ด palm tree plant vegetable nature summer beach mojito tropical\n๐ฑ seedling plant nature grass lawn spring\n๐ฟ herb vegetable plant medicine weed grass lawn\nโ shamrock vegetable plant nature irish clover\n๐ four leaf clover vegetable plant nature lucky irish\n๐ bamboo plant nature vegetable panda\n๐ tanabata tree plant nature branch summer\n๐ leaves nature plant tree vegetable grass lawn spring\n๐ fallen leaf nature plant vegetable leaves\n๐ maple leaf nature plant vegetable ca fall\n๐พ ear of rice nature plant\n๐บ hibiscus plant vegetable flowers beach\n๐ป sunflower nature plant fall\n๐น rose flowers valentines love spring\n๐ฅ wilted flower plant nature\n๐ท tulip flowers plant nature summer spring\n๐ผ blossom nature flowers yellow\n๐ธ cherry blossom nature plant spring flower\n๐ bouquet flowers nature spring\n๐ mushroom plant vegetable\n๐ earth americas globe world usa international\n๐ earth africa globe world international\n๐ earth asia globe world east international\n๐ full moon nature yellow twilight planet space night evening sleep\n๐ waning gibbous moon nature twilight planet space night evening sleep\n๐ last quarter moon nature twilight planet space night evening sleep\n๐ waning crescent moon nature twilight planet space night evening sleep\n๐ new moon nature twilight planet space night evening sleep\n๐ waxing crescent moon nature twilight planet space night evening sleep\n๐ first quarter moon nature twilight planet space night evening sleep\n๐ waxing gibbous moon nature night sky gray twilight planet space evening sleep\n๐ new moon with face nature twilight planet space night evening sleep\n๐ full moon with face nature twilight planet space night evening sleep\n๐ first quarter moon with face nature twilight planet space night evening sleep\n๐ last quarter moon with face nature twilight planet space night evening sleep\n๐ sun with face nature morning sky\n๐ crescent moon night sleep sky evening magic\nโญ star night yellow\n๐ star2 night sparkle awesome good magic\n๐ซ dizzy star sparkle shoot magic\nโจ sparkles stars shine shiny cool awesome good magic\nโ comet space\nโ๏ธ sunny weather nature brightness summer beach spring\n๐ค sun behind small cloud weather\nโ
partly sunny weather nature cloudy morning fall spring\n๐ฅ sun behind large cloud weather\n๐ฆ sun behind rain cloud weather\nโ๏ธ cloud weather sky\n๐ง cloud with rain weather\nโ cloud with lightning and rain weather\n๐ฉ cloud with lightning weather thunder\nโก zap thunder weather fast\n๐ฅ fire hot cook flame\n๐ฅ boom bomb explode explosion collision blown\nโ๏ธ snowflake winter season cold weather christmas xmas\n๐จ cloud with snow weather\nโ snowman winter season cold weather christmas xmas frozen\nโ snowman with snow winter season cold weather christmas xmas frozen\n๐ฌ wind face gust air\n๐จ dash wind air fast shoo fart smoke puff\n๐ช tornado weather cyclone twister\n๐ซ fog weather\nโ open umbrella weather spring\nโ umbrella rainy weather spring\n๐ง droplet water drip faucet spring\n๐ฆ sweat drops water drip oops\n๐ ocean sea water wave nature tsunami disaster\n๐ green apple fruit nature\n๐ apple fruit mac school\n๐ pear fruit nature food\n๐ tangerine food fruit nature orange\n๐ lemon fruit nature\n๐ banana fruit food monkey\n๐ watermelon fruit food picnic summer\n๐ grapes fruit food wine\n๐ strawberry fruit food nature\n๐ melon fruit nature food\n๐ cherries food fruit\n๐ peach fruit nature food\n๐ฅญ mango fruit food tropical\n๐ pineapple fruit nature food\n๐ฅฅ coconut fruit nature food palm\n๐ฅ kiwi fruit food\n๐
tomato fruit vegetable nature food\n๐ eggplant vegetable nature food aubergine\n๐ฅ avocado fruit food\n๐ฅฆ broccoli fruit food vegetable\n๐ฅฌ leafy greens food vegetable plant cabbage kale lettuce\n๐ฅ cucumber fruit food pickle\n๐ถ hot pepper food spicy chilli chili\n๐ฝ corn food vegetable plant\n๐ฅ carrot vegetable food orange\n๐ฅ potato food tuber vegatable starch\n๐ sweet potato food nature\n๐ฅ croissant food bread french\n๐ฅฏ bagel food bread bakery schmear\n๐ bread food wheat breakfast toast\n๐ฅ baguette bread food french\n๐ฅจ pretzel food bread twisted\n๐ง cheese food chadder\n๐ฅ egg food chicken breakfast\n๐ณ fried egg food breakfast kitchen\n๐ฅ pancakes food breakfast flapjacks hotcakes\n๐ฅ bacon food breakfast pork pig meat\n๐ฅฉ steak food cow meat cut chop lambchop porkchop\n๐ poultry leg food meat drumstick bird chicken turkey\n๐ meat on bone good food drumstick\n๐ฆด bone skeleton\n๐ญ hotdog food frankfurter\n๐ hamburger meat beef cheeseburger mcdonalds\n๐ fries chips snack\n๐ pizza food party\n๐ฅช sandwich food lunch bread\n๐ฅ stuffed flatbread food gyro\n๐ฎ taco food mexican\n๐ฏ burrito food mexican\n๐ฅ green salad food healthy lettuce\n๐ฅ shallow pan of food cooking casserole paella\n๐ฅซ canned food soup\n๐ spaghetti food italian noodle\n๐ ramen food japanese noodle chopsticks\n๐ฒ stew food meat soup\n๐ curry food spicy hot indian\n๐ฃ sushi food fish japanese rice\n๐ฑ bento food japanese box\n๐ค fried shrimp food animal appetizer summer\n๐ rice ball food japanese\n๐ rice food china asian\n๐ rice cracker food japanese\n๐ฅ fish cake food japan sea beach narutomaki pink swirl kamaboko surimi ramen\n๐ฅ fortune cookie food prophecy\n๐ฅฎ moon cake food autumn\n๐ข oden food japanese\n๐ก dango food dessert sweet japanese barbecue meat\n๐ง shaved ice hot dessert summer\n๐จ ice cream food hot dessert\n๐ฆ icecream food hot dessert summer\n๐ฅง pie food dessert pastry\n๐ง cupcake food dessert bakery sweet\n๐ฐ cake food dessert\n๐ birthday food dessert cake\n๐ฎ custard dessert food\n๐ญ lollipop food snack candy sweet\n๐ฌ candy snack dessert sweet lolly\n๐ซ chocolate bar food snack dessert sweet\n๐ฟ popcorn food films snack\n๐ฉ doughnut food dessert snack sweet donut\n๐ฅ dumpling food empanada pierogi potsticker\n๐ช cookie food snack oreo chocolate sweet dessert\n๐ฐ chestnut food squirrel\n๐ฅ peanuts food nut\n๐ฏ honey pot bees sweet kitchen\n๐ฅ milk glass beverage drink cow\n๐ผ baby bottle food container milk\nโ coffee beverage caffeine latte espresso\n๐ต tea drink bowl breakfast green british\n๐ฅค cup with straw drink soda\n๐ถ sake wine drink drunk beverage japanese alcohol booze\n๐บ beer relax beverage drink drunk party pub summer alcohol booze\n๐ป beers relax beverage drink drunk party pub summer alcohol booze\n๐ฅ clinking glasses beverage drink party alcohol celebrate cheers wine champagne toast\n๐ท wine glass drink beverage drunk alcohol booze\n๐ฅ tumbler glass drink beverage drunk alcohol liquor booze bourbon scotch whisky shot\n๐ธ cocktail drink drunk alcohol beverage booze mojito\n๐น tropical drink beverage cocktail summer beach alcohol booze mojito\n๐พ champagne drink wine bottle celebration\n๐ฅ spoon cutlery kitchen tableware\n๐ด fork and knife cutlery kitchen\n๐ฝ plate with cutlery food eat meal lunch dinner restaurant\n๐ฅฃ bowl with spoon food breakfast cereal oatmeal porridge\n๐ฅก takeout box food leftovers\n๐ฅข chopsticks food\n๐ง salt condiment shaker\nโฝ soccer sports football\n๐ basketball sports balls nba\n๐ football sports balls nfl\nโพ baseball sports balls\n๐ฅ softball sports balls\n๐พ tennis sports balls green\n๐ volleyball sports balls\n๐ rugby football sports team\n๐ฅ flying disc sports frisbee ultimate\n๐ฑ 8ball pool hobby game luck magic\nโณ golf sports business flag hole summer\n๐๏ธโโ๏ธ golfing woman sports business female\n๐ golfing man sports business\n๐ ping pong sports pingpong\n๐ธ badminton sports\n๐ฅ
goal net sports\n๐ ice hockey sports\n๐ field hockey sports\n๐ฅ lacrosse sports ball stick\n๐ cricket sports\n๐ฟ ski sports winter cold snow\nโท skier sports winter snow\n๐ snowboarder sports winter\n๐คบ person fencing sports sword\n๐คผโโ๏ธ women wrestling sports wrestlers\n๐คผโโ๏ธ men wrestling sports wrestlers\n๐คธโโ๏ธ woman cartwheeling gymnastics\n๐คธโโ๏ธ man cartwheeling gymnastics\n๐คพโโ๏ธ woman playing handball sports\n๐คพโโ๏ธ man playing handball sports\nโธ ice skate sports\n๐ฅ curling stone sports\n๐น skateboard board\n๐ท sled sleigh luge toboggan\n๐น bow and arrow sports\n๐ฃ fishing pole and fish food hobby summer\n๐ฅ boxing glove sports fighting\n๐ฅ martial arts uniform judo karate taekwondo\n๐ฃโโ๏ธ rowing woman sports hobby water ship female\n๐ฃ rowing man sports hobby water ship\n๐งโโ๏ธ climbing woman sports hobby female rock\n๐งโโ๏ธ climbing man sports hobby male rock\n๐โโ๏ธ swimming woman sports exercise human athlete water summer female\n๐ swimming man sports exercise human athlete water summer\n๐คฝโโ๏ธ woman playing water polo sports pool\n๐คฝโโ๏ธ man playing water polo sports pool\n๐งโโ๏ธ woman in lotus position female meditation yoga serenity zen mindfulness\n๐งโโ๏ธ man in lotus position male meditation yoga serenity zen mindfulness\n๐โโ๏ธ surfing woman sports ocean sea summer beach female\n๐ surfing man sports ocean sea summer beach\nโน๏ธโโ๏ธ basketball woman sports human female\nโน basketball man sports human\n๐๏ธโโ๏ธ weight lifting woman sports training exercise female\n๐ weight lifting man sports training exercise\n๐ดโโ๏ธ biking woman sports bike exercise hipster female\n๐ด biking man sports bike exercise hipster\n๐ตโโ๏ธ mountain biking woman transportation sports human race bike female\n๐ต mountain biking man transportation sports human race bike\n๐ horse racing animal betting competition gambling luck\n๐ trophy win award contest place ftw ceremony\n๐ฝ running shirt with sash play pageant\n๐
medal sports award winning\n๐ medal military award winning army\n๐ฅ 1st place medal award winning first\n๐ฅ 2nd place medal award second\n๐ฅ 3rd place medal award third\n๐ reminder ribbon sports cause support awareness\n๐ต rosette flower decoration military\n๐ซ ticket event concert pass\n๐ tickets sports concert entrance\n๐ญ performing arts acting theater drama\n๐จ art design paint draw colors\n๐ช circus tent festival carnival party\n๐คนโโ๏ธ woman juggling juggle balance skill multitask\n๐คนโโ๏ธ man juggling juggle balance skill multitask\n๐ค microphone sound music pa sing talkshow\n๐ง headphones music score gadgets\n๐ผ musical score treble clef compose\n๐น musical keyboard piano instrument compose\n๐ฅ drum music instrument drumsticks snare\n๐ท saxophone music instrument jazz blues\n๐บ trumpet music brass\n๐ธ guitar music instrument\n๐ป violin music instrument orchestra symphony\n๐ฌ clapper movie film record\n๐ฎ video game play console ps4 controller\n๐ฏ dart game play bar target bullseye\n๐ฒ game die dice random tabletop play luck\nโ chess pawn expendable\n๐ฐ slot machine bet gamble vegas luck casino\n๐งฉ jigsaw interlocking puzzle piece\n๐ณ bowling sports fun play\n๐ red car transportation vehicle\n๐ taxi uber vehicle cars transportation\n๐ blue car transportation vehicle\n๐ bus car vehicle transportation\n๐ trolleybus bart transportation vehicle\n๐ racing car sports race fast formula f1\n๐ police car vehicle cars transportation law legal enforcement\n๐ ambulance health 911 hospital\n๐ fire engine transportation cars vehicle\n๐ minibus vehicle car transportation\n๐ truck cars transportation\n๐ articulated lorry vehicle cars transportation express\n๐ tractor vehicle car farming agriculture\n๐ด kick scooter vehicle razor\n๐ motorcycle race sports fast\n๐ฒ bike sports bicycle exercise hipster\n๐ต motor scooter vehicle vespa sasha\n๐จ rotating light police ambulance 911 emergency alert error pinged law legal\n๐ oncoming police car vehicle law legal enforcement 911\n๐ oncoming bus vehicle transportation\n๐ oncoming automobile car vehicle transportation\n๐ oncoming taxi vehicle cars uber\n๐ก aerial tramway transportation vehicle ski\n๐ mountain cableway transportation vehicle ski\n๐ suspension railway vehicle transportation\n๐ railway car transportation vehicle\n๐ train transportation vehicle carriage public travel\n๐ monorail transportation vehicle\n๐ bullettrain side transportation vehicle\n๐
bullettrain front transportation vehicle speed fast public travel\n๐ light rail transportation vehicle\n๐ mountain railway transportation vehicle\n๐ steam locomotive transportation vehicle train\n๐ train2 transportation vehicle\n๐ metro transportation mrt underground tube\n๐ tram transportation vehicle\n๐ station transportation vehicle public\n๐ธ flying saucer transportation vehicle ufo\n๐ helicopter transportation vehicle fly\n๐ฉ small airplane flight transportation fly vehicle\nโ๏ธ airplane vehicle transportation flight fly\n๐ซ flight departure airport landing\n๐ฌ flight arrival airport boarding\nโต sailboat ship summer transportation water sailing\n๐ฅ motor boat ship\n๐ค speedboat ship transportation vehicle summer\nโด ferry boat ship yacht\n๐ณ passenger ship yacht cruise ferry\n๐ rocket launch ship staffmode nasa fly\n๐ฐ artificial satellite communication gps orbit spaceflight nasa iss\n๐บ seat sit airplane transport bus flight fly\n๐ถ canoe boat paddle water ship\nโ anchor ship ferry sea boat\n๐ง construction wip progress caution warning\nโฝ fuelpump petroleum\n๐ busstop transportation wait\n๐ฆ vertical traffic light transportation driving\n๐ฅ traffic light transportation signal\n๐ข ship transportation titanic deploy\n๐ก ferris wheel photo carnival londoneye\n๐ข roller coaster carnival playground photo fun\n๐ carousel horse photo carnival\n๐ building construction wip working progress\n๐ foggy photo mountain\n๐ผ tokyo tower photo japanese\n๐ญ factory building industry pollution smoke\nโฒ fountain photo summer water fresh\n๐ rice scene photo japan asia tsukimi\nโฐ mountain photo nature environment\n๐ mountain snow photo nature environment winter cold\n๐ป mount fuji photo mountain nature japanese\n๐ volcano photo nature disaster\n๐พ japan nation country japanese asia\n๐ camping photo outdoors tent\nโบ tent photo camping outdoors\n๐ national park photo environment nature\n๐ฃ motorway road cupertino interstate highway\n๐ค railway track train transportation\n๐
sunrise morning view vacation photo\n๐ sunrise over mountains view vacation photo\n๐ desert photo warm saharah\n๐ beach umbrella weather summer sunny sand mojito\n๐ desert island photo tropical mojito\n๐ city sunrise photo dawn\n๐ city sunset photo evening sky buildings\n๐ cityscape photo urban\n๐ night with stars evening city downtown\n๐ bridge at night photo sanfrancisco\n๐ milky way photo space stars\n๐ stars night photo\n๐ sparkler stars night shine\n๐ fireworks photo festival carnival congratulations\n๐ rainbow nature happy photo sky spring\n๐ houses buildings photo\n๐ฐ european castle building royalty history\n๐ฏ japanese castle photo building\n๐ stadium photo place sports concert venue\n๐ฝ statue of liberty american newyork\n๐ house building home\n๐ก house with garden home plant nature\n๐ derelict house abandon evict broken building\n๐ข office building bureau work\n๐ฌ department store building shopping mall\n๐ฃ post office building envelope communication\n๐ค european post office building email\n๐ฅ hospital building health surgery doctor\n๐ฆ bank building money sales cash business enterprise\n๐จ hotel building accomodation checkin\n๐ช convenience store building shopping groceries\n๐ซ school building student education learn teach\n๐ฉ love hotel like affection dating\n๐ wedding love like affection couple marriage bride groom\n๐ classical building art culture history\nโช church building religion christ\n๐ mosque islam worship minaret\n๐ synagogue judaism worship temple jewish\n๐ kaaba mecca mosque islam\nโฉ shinto shrine temple japan kyoto\nโ watch time accessories\n๐ฑ iphone technology apple gadgets dial\n๐ฒ calling iphone incoming\n๐ป computer technology laptop screen display monitor\nโจ keyboard technology computer type input text\n๐ฅ desktop computer technology computing screen\n๐จ printer paper ink\n๐ฑ computer mouse click\n๐ฒ trackball technology trackpad\n๐น joystick game play\n๐ clamp tool\n๐ฝ minidisc technology record data disk 90s\n๐พ floppy disk oldschool technology save 90s 80s\n๐ฟ cd technology dvd disk disc 90s\n๐ dvd cd disk disc\n๐ผ vhs record video oldschool 90s 80s\n๐ท camera gadgets photography\n๐ธ camera flash photography gadgets\n๐น video camera film record\n๐ฅ movie camera film record\n๐ฝ film projector video tape record movie\n๐ film strip movie\n๐ telephone receiver technology communication dial\nโ๏ธ phone technology communication dial telephone\n๐ pager bbcall oldschool 90s\n๐ fax communication technology\n๐บ tv technology program oldschool show television\n๐ป radio communication music podcast program\n๐ studio microphone sing recording artist talkshow\n๐ level slider scale\n๐ control knobs dial\n๐งญ compass magnetic navigation orienteering\nโฑ stopwatch time deadline\nโฒ timer clock alarm\nโฐ alarm clock time wake\n๐ฐ mantelpiece clock time\nโณ hourglass flowing sand oldschool time countdown\nโ hourglass time clock oldschool limit exam quiz test\n๐ก satellite communication future radio space\n๐ battery power energy sustain\n๐ electric plug charger power\n๐ก bulb light electricity idea\n๐ฆ flashlight dark camping sight night\n๐ฏ candle fire wax\n๐งฏ fire extinguisher quench\n๐ wastebasket bin trash rubbish garbage toss\n๐ข oil drum barrell\n๐ธ money with wings dollar bills payment sale\n๐ต dollar money sales bill currency\n๐ด yen money sales japanese dollar currency\n๐ถ euro money sales dollar currency\n๐ท pound british sterling money sales bills uk england currency\n๐ฐ moneybag dollar payment coins sale\n๐ณ credit card money sales dollar bill payment shopping\n๐ gem blue ruby diamond jewelry\nโ balance scale law fairness weight\n๐งฐ toolbox tools diy fix maintainer mechanic\n๐ง wrench tools diy ikea fix maintainer\n๐จ hammer tools build create\nโ hammer and pick tools build create\n๐ hammer and wrench tools build create\nโ pick tools dig\n๐ฉ nut and bolt handy tools fix\nโ gear cog\n๐งฑ brick bricks\nโ chains lock arrest\n๐งฒ magnet attraction magnetic\n๐ซ gun violence weapon pistol revolver\n๐ฃ bomb boom explode explosion terrorism\n๐งจ firecracker dynamite boom explode explosion explosive\n๐ช hocho knife blade cutlery kitchen weapon\n๐ก dagger weapon\nโ crossed swords weapon\n๐ก shield protection security\n๐ฌ smoking kills tobacco cigarette joint smoke\nโฐ coffin vampire dead die death rip graveyard cemetery casket funeral box\nโฑ funeral urn dead die death rip ashes\n๐บ amphora vase jar\n๐ฎ crystal ball disco party magic circus\n๐ฟ prayer beads dhikr religious\n๐งฟ nazar amulet bead charm\n๐ barber hair salon style\nโ alembic distilling science experiment chemistry\n๐ญ telescope stars space zoom science astronomy\n๐ฌ microscope laboratory experiment zoomin science study\n๐ณ hole embarrassing\n๐ pill health medicine doctor pharmacy drug\n๐ syringe health hospital drugs blood medicine needle doctor nurse\n๐งฌ dna biologist genetics life\n๐ฆ microbe amoeba bacteria germs\n๐งซ petri dish bacteria biology culture lab\n๐งช test tube chemistry experiment lab science\n๐ก thermometer weather temperature hot cold\n๐งน broom cleaning sweeping witch\n๐งบ basket laundry\n๐งป toilet paper roll\n๐ท label sale tag\n๐ bookmark favorite label save\n๐ฝ toilet restroom wc washroom bathroom potty\n๐ฟ shower clean water bathroom\n๐ bathtub clean shower bathroom\n๐ bath clean shower bathroom\n๐งผ soap bar bathing cleaning lather\n๐งฝ sponge absorbing cleaning porous\n๐งด lotion bottle moisturizer sunscreen\n๐ key lock door password\n๐ old key lock door password\n๐ couch and lamp read chill\n๐ sleeping bed rest\n๐ bed sleep rest\n๐ช door house entry exit\n๐ bellhop bell service\n๐งธ teddy bear plush stuffed\n๐ผ framed picture photography\n๐บ world map location direction\nโฑ parasol on ground weather summer\n๐ฟ moyai rock moai\n๐ shopping mall buy purchase\n๐ shopping cart trolley\n๐ balloon party celebration birthday circus\n๐ flags fish japanese koinobori carp banner\n๐ ribbon decoration pink girl bowtie\n๐ gift present birthday christmas xmas\n๐ confetti ball festival party birthday circus\n๐ tada party congratulations birthday magic circus celebration\n๐ dolls japanese toy kimono\n๐ wind chime nature ding spring bell\n๐ crossed flags japanese nation country border\n๐ฎ izakaya lantern light paper halloween spooky\n๐งง red envelope gift\nโ๏ธ email letter postal inbox communication\n๐ฉ envelope with arrow email communication\n๐จ incoming envelope email inbox\n๐ง e mail communication inbox\n๐ love letter email like affection envelope valentines\n๐ฎ postbox email letter envelope\n๐ช mailbox closed email communication inbox\n๐ซ mailbox email inbox communication\n๐ฌ mailbox with mail email inbox communication\n๐ญ mailbox with no mail email inbox\n๐ฆ package mail gift cardboard box moving\n๐ฏ postal horn instrument music\n๐ฅ inbox tray email documents\n๐ค outbox tray inbox email\n๐ scroll documents ancient history paper\n๐ page with curl documents office paper\n๐ bookmark tabs favorite save order tidy\n๐งพ receipt accounting expenses\n๐ bar chart graph presentation stats\n๐ chart with upwards trend graph presentation stats recovery business economics money sales good success\n๐ chart with downwards trend graph presentation stats recession business economics money sales bad failure\n๐ page facing up documents office paper information\n๐
date calendar schedule\n๐ calendar schedule date planning\n๐ spiral calendar date schedule planning\n๐ card index business stationery\n๐ card file box business stationery\n๐ณ ballot box election vote\n๐ file cabinet filing organizing\n๐ clipboard stationery documents\n๐ spiral notepad memo stationery\n๐ file folder documents business office\n๐ open file folder documents load\n๐ card index dividers organizing business stationery\n๐ newspaper roll press headline\n๐ฐ newspaper press headline\n๐ notebook stationery record notes paper study\n๐ closed book read library knowledge textbook learn\n๐ green book read library knowledge study\n๐ blue book read library knowledge learn study\n๐ orange book read library knowledge textbook study\n๐ notebook with decorative cover classroom notes record paper study\n๐ ledger notes paper\n๐ books literature library study\n๐ open book read library knowledge literature learn study\n๐งท safety pin diaper\n๐ link rings url\n๐ paperclip documents stationery\n๐ paperclips documents stationery\nโ๏ธ scissors stationery cut\n๐ triangular ruler stationery math architect sketch\n๐ straight ruler stationery calculate length math school drawing architect sketch\n๐งฎ abacus calculation\n๐ pushpin stationery mark here\n๐ round pushpin stationery location map here\n๐ closed lock with key security privacy\n๐ lock security password padlock\n๐ unlock privacy security\n๐ lock with ink pen security secret\n๐ pen stationery writing write\n๐ fountain pen stationery writing write\nโ๏ธ black nib pen stationery writing write\n๐ memo write documents stationery pencil paper writing legal exam quiz test study compose\nโ๏ธ pencil2 stationery write paper writing school study\n๐ crayon drawing creativity\n๐ paintbrush drawing creativity art\n๐ mag search zoom find detective\n๐ mag right search zoom find detective\nโค๏ธ heart love like valentines\n๐งก orange heart love like affection valentines\n๐ yellow heart love like affection valentines\n๐ green heart love like affection valentines\n๐ blue heart love like affection valentines\n๐ purple heart love like affection valentines\n๐ค black heart evil\n๐ broken heart sad sorry break heartbreak\nโฃ heavy heart exclamation decoration love\n๐ two hearts love like affection valentines heart\n๐ revolving hearts love like affection valentines\n๐ heartbeat love like affection valentines pink heart\n๐ heartpulse like love affection valentines pink\n๐ sparkling heart love like affection valentines\n๐ cupid love like heart affection valentines\n๐ gift heart love valentines\n๐ heart decoration love like\nโฎ peace symbol hippie\nโ latin cross christianity\nโช star and crescent islam\n๐ om hinduism buddhism sikhism jainism\nโธ wheel of dharma hinduism buddhism sikhism jainism\nโก star of david judaism\n๐ฏ six pointed star religion jewish hexagram\n๐ menorah hanukkah candles jewish\nโฏ yin yang balance\nโฆ orthodox cross suppedaneum religion\n๐ place of worship religion church temple prayer\nโ ophiuchus sign constellation astrology\nโ aries sign zodiac astrology\nโ taurus sign zodiac astrology\nโ gemini sign zodiac astrology\nโ cancer sign zodiac astrology\nโ leo sign zodiac astrology\nโ virgo sign zodiac astrology\nโ libra sign zodiac astrology\nโ scorpius sign zodiac astrology scorpio\nโ sagittarius sign zodiac astrology\nโ capricorn sign zodiac astrology\nโ aquarius sign zodiac astrology\nโ pisces sign zodiac astrology\n๐ id words\nโ atom symbol science physics chemistry\n๐ณ u7a7a kanji japanese chinese empty sky\n๐น u5272 cut divide chinese kanji\nโข radioactive nuclear danger\nโฃ biohazard danger\n๐ด mobile phone off mute silence quiet\n๐ณ vibration mode phone\n๐ถ u6709 chinese have kanji\n๐ u7121 nothing chinese kanji japanese\n๐ธ u7533 chinese japanese kanji\n๐บ u55b6 japanese\n๐ท๏ธ u6708 chinese month moon japanese kanji\nโด๏ธ eight pointed black star shape polygon\n๐ vs words\n๐ accept ok good chinese kanji agree yes\n๐ฎ white flower japanese spring\n๐ ideograph advantage chinese kanji obtain get circle\nใ๏ธ secret privacy chinese sshh kanji\nใ๏ธ congratulations chinese kanji japanese\n๐ด u5408 japanese chinese join kanji\n๐ต u6e80 full chinese japanese kanji\n๐ฒ u7981 kanji japanese chinese forbidden limit restricted\n๐
ฐ๏ธ a alphabet letter\n๐
ฑ๏ธ b alphabet letter\n๐ ab alphabet\n๐ cl alphabet words\n๐
พ๏ธ o2 alphabet letter\n๐ sos help words emergency 911\nโ no entry limit security privacy bad denied stop circle\n๐ name badge fire forbid\n๐ซ no entry sign forbid stop limit denied disallow circle\nโ x no delete remove cancel red\nโญ o circle round\n๐ stop sign\n๐ข anger angry mad\nโจ๏ธ hotsprings bath warm relax\n๐ท no pedestrians rules crossing walking circle\n๐ฏ do not litter trash bin garbage circle\n๐ณ no bicycles cyclist prohibited circle\n๐ฑ non potable water drink faucet tap circle\n๐ underage 18 drink pub night minor circle\n๐ต no mobile phones iphone mute circle\nโ exclamation danger surprise punctuation wow warning\nโ grey exclamation surprise punctuation gray wow warning\nโ question doubt confused\nโ grey question doubts gray huh confused\nโผ๏ธ bangbang exclamation surprise\nโ๏ธ interrobang wat punctuation surprise\n๐ฏ 100 score perfect numbers century exam quiz test pass hundred\n๐
low brightness sun afternoon warm summer\n๐ high brightness sun light\n๐ฑ trident weapon spear\nโ fleur de lis decorative scout\nใฝ๏ธ part alternation mark graph presentation stats business economics bad\nโ ๏ธ warning exclamation wip alert error problem issue\n๐ธ children crossing school warning danger sign driving\n๐ฐ beginner badge shield\nโป๏ธ recycle arrow environment garbage trash\n๐ฏ u6307 chinese point kanji\n๐น chart graph presentation stats\nโ๏ธ sparkle stars awesome good fireworks\nโณ๏ธ eight spoked asterisk star sparkle\nโ negative squared cross mark x no deny\nโ
white check mark ok agree vote election answer tick\n๐ diamond shape with a dot inside jewel blue gem crystal fancy\n๐ cyclone weather swirl blue cloud vortex spiral whirlpool spin tornado hurricane typhoon\nโฟ loop tape cassette\n๐ globe with meridians earth international world internet interweb i18n\nโ๏ธ m alphabet letter\n๐ง atm money sales cash payment bank\n๐ค zzz sleepy tired dream\n๐๏ธ sa japanese katakana\n๐ passport control custom\n๐ customs passport border\n๐ baggage claim airport transport\n๐
left luggage travel\nโฟ wheelchair disabled a11y accessibility\n๐ญ no smoking cigarette smell smoke\n๐พ wc toilet restroom\n๐
ฟ๏ธ parking cars alphabet letter\n๐ฐ potable water liquid restroom cleaning faucet\n๐น mens toilet restroom wc gender male\n๐บ womens woman female toilet loo restroom gender\n๐ผ baby symbol child\n๐ป restroom toilet refresh wc gender\n๐ฎ put litter in its place sign human info\n๐ฆ cinema record film movie curtain stage theater\n๐ถ signal strength reception phone internet connection wifi bluetooth bars\n๐ koko here katakana japanese destination\n๐ ng words shape icon\n๐ ok good agree yes\n๐ up above high\n๐ cool words\n๐ new words start\n๐ free words\n0๏ธโฃ zero 0 numbers null\n1๏ธโฃ one numbers 1\n2๏ธโฃ two numbers 2 prime\n3๏ธโฃ three 3 numbers prime\n4๏ธโฃ four 4 numbers\n5๏ธโฃ five 5 numbers prime\n6๏ธโฃ six 6 numbers\n7๏ธโฃ seven 7 numbers prime\n8๏ธโฃ eight 8 numbers\n9๏ธโฃ nine numbers 9\n๐ keycap ten numbers 10\n*โฃ asterisk star keycap\n๐ข 1234 numbers\nโ๏ธ eject button\nโถ๏ธ arrow forward right direction play\nโธ pause button\nโญ next track button forward\nโน stop button\nโบ record button\nโฏ play or pause button\nโฎ previous track button backward\nโฉ fast forward play speed continue\nโช rewind play\n๐ twisted rightwards arrows shuffle music random\n๐ repeat loop record\n๐ repeat one loop\nโ๏ธ arrow backward left direction\n๐ผ arrow up small triangle direction point forward top\n๐ฝ arrow down small direction bottom\nโซ arrow double up direction top\nโฌ arrow double down direction bottom\nโก๏ธ arrow right next\nโฌ
๏ธ arrow left previous back\nโฌ๏ธ arrow up continue top direction\nโฌ๏ธ arrow down direction bottom\nโ๏ธ arrow upper right point direction diagonal northeast\nโ๏ธ arrow lower right direction diagonal southeast\nโ๏ธ arrow lower left direction diagonal southwest\nโ๏ธ arrow upper left point direction diagonal northwest\nโ๏ธ arrow up down direction way vertical\nโ๏ธ left right arrow shape direction horizontal sideways\n๐ arrows counterclockwise sync cycle\nโช๏ธ arrow right hook return rotate direction\nโฉ๏ธ leftwards arrow with hook back return undo enter\nโคด๏ธ arrow heading up direction top\nโคต๏ธ arrow heading down direction bottom\n#๏ธโฃ hash symbol twitter\nโน๏ธ information source alphabet letter\n๐ค abc alphabet\n๐ก abcd alphabet\n๐ capital abcd alphabet words\n๐ฃ symbols music note ampersand percent glyphs characters\n๐ต musical note score tone sound\n๐ถ notes music score\nใฐ๏ธ wavy dash draw line moustache mustache squiggle scribble\nโฐ curly loop scribble draw shape squiggle\nโ๏ธ heavy check mark ok nike answer yes tick\n๐ arrows clockwise sync cycle round repeat\nโ heavy plus sign math calculation addition more increase\nโ heavy minus sign math calculation subtract less\nโ heavy division sign divide math calculation\nโ๏ธ heavy multiplication x math calculation\nโพ infinity forever\n๐ฒ heavy dollar sign money sales payment currency buck\n๐ฑ currency exchange money sales dollar travel\nยฉ๏ธ copyright ip license circle law legal\nยฎ๏ธ registered alphabet circle\nโข๏ธ tm trademark brand law legal\n๐ end words arrow\n๐ back arrow words return\n๐ on arrow words\n๐ top words\n๐ soon arrow words\nโ๏ธ ballot box with check ok agree confirm vote election yes tick\n๐ radio button input old music circle\nโช white circle shape round\nโซ black circle shape button round\n๐ด red circle shape error danger\n๐ต large blue circle shape icon button\n๐ธ small orange diamond shape jewel gem\n๐น small blue diamond shape jewel gem\n๐ถ large orange diamond shape jewel gem\n๐ท large blue diamond shape jewel gem\n๐บ small red triangle shape direction up top\nโช๏ธ black small square shape icon\nโซ๏ธ white small square shape icon\nโฌ black large square shape icon button\nโฌ white large square shape icon stone button\n๐ป small red triangle down shape direction bottom\nโผ๏ธ black medium square shape button icon\nโป๏ธ white medium square shape stone icon\nโพ black medium small square icon shape button\nโฝ white medium small square shape stone icon button\n๐ฒ black square button shape input frame\n๐ณ white square button shape input\n๐ speaker sound volume silence broadcast\n๐ sound volume speaker broadcast\n๐ loud sound volume noise noisy speaker broadcast\n๐ mute sound volume silence quiet\n๐ฃ mega sound speaker volume\n๐ข loudspeaker volume sound\n๐ bell sound notification christmas xmas chime\n๐ no bell sound volume mute quiet silent\n๐ black joker poker cards game play magic\n๐ mahjong game play chinese kanji\nโ ๏ธ spades poker cards suits magic\nโฃ๏ธ clubs poker cards magic suits\nโฅ๏ธ hearts poker cards magic suits\nโฆ๏ธ diamonds poker cards magic suits\n๐ด flower playing cards game sunset red\n๐ญ thought balloon bubble cloud speech thinking dream\n๐ฏ right anger bubble caption speech thinking mad\n๐ฌ speech balloon bubble words message talk chatting\n๐จ left speech bubble words message talk chatting\n๐ clock1 time late early schedule\n๐ clock2 time late early schedule\n๐ clock3 time late early schedule\n๐ clock4 time late early schedule\n๐ clock5 time late early schedule\n๐ clock6 time late early schedule dawn dusk\n๐ clock7 time late early schedule\n๐ clock8 time late early schedule\n๐ clock9 time late early schedule\n๐ clock10 time late early schedule\n๐ clock11 time late early schedule\n๐ clock12 time noon midnight midday late early schedule\n๐ clock130 time late early schedule\n๐ clock230 time late early schedule\n๐ clock330 time late early schedule\n๐ clock430 time late early schedule\n๐ clock530 time late early schedule\n๐ก clock630 time late early schedule\n๐ข clock730 time late early schedule\n๐ฃ clock830 time late early schedule\n๐ค clock930 time late early schedule\n๐ฅ clock1030 time late early schedule\n๐ฆ clock1130 time late early schedule\n๐ง clock1230 time late early schedule\n๐ณ white flag losing loser lost surrender fail\n๐ด black flag pirate\n๐ดโโ ๏ธ pirate flag skull crossbones banner\n๐ checkered flag contest finishline race gokart\n๐ฉ triangular flag on post mark milestone place\n๐ณ๏ธโ๐ rainbow flag pride gay lgbt glbt queer homosexual lesbian bisexual transgender\n๐บ๐ณ united nations un flag banner\n๐ฆ๐ซ afghanistan af flag nation country banner\n๐ฆ๐ฝ aland islands flag nation country banner\n๐ฆ๐ฑ albania al flag nation country banner\n๐ฉ๐ฟ algeria dz flag nation country banner\n๐ฆ๐ธ american samoa ws flag nation country banner\n๐ฆ๐ฉ andorra ad flag nation country banner\n๐ฆ๐ด angola ao flag nation country banner\n๐ฆ๐ฎ anguilla ai flag nation country banner\n๐ฆ๐ถ antarctica aq flag nation country banner\n๐ฆ๐ฌ antigua barbuda flag nation country banner\n๐ฆ๐ท argentina ar flag nation country banner\n๐ฆ๐ฒ armenia am flag nation country banner\n๐ฆ๐ผ aruba aw flag nation country banner\n๐ฆ๐บ australia au flag nation country banner\n๐ฆ๐น austria at flag nation country banner\n๐ฆ๐ฟ azerbaijan az flag nation country banner\n๐ง๐ธ bahamas bs flag nation country banner\n๐ง๐ญ bahrain bh flag nation country banner\n๐ง๐ฉ bangladesh bd flag nation country banner\n๐ง๐ง barbados bb flag nation country banner\n๐ง๐พ belarus by flag nation country banner\n๐ง๐ช belgium be flag nation country banner\n๐ง๐ฟ belize bz flag nation country banner\n๐ง๐ฏ benin bj flag nation country banner\n๐ง๐ฒ bermuda bm flag nation country banner\n๐ง๐น bhutan bt flag nation country banner\n๐ง๐ด bolivia bo flag nation country banner\n๐ง๐ถ caribbean netherlands bonaire flag nation country banner\n๐ง๐ฆ bosnia herzegovina flag nation country banner\n๐ง๐ผ botswana bw flag nation country banner\n๐ง๐ท brazil br flag nation country banner\n๐ฎ๐ด british indian ocean territory flag nation country banner\n๐ป๐ฌ british virgin islands bvi flag nation country banner\n๐ง๐ณ brunei bn darussalam flag nation country banner\n๐ง๐ฌ bulgaria bg flag nation country banner\n๐ง๐ซ burkina faso flag nation country banner\n๐ง๐ฎ burundi bi flag nation country banner\n๐จ๐ป cape verde cabo flag nation country banner\n๐ฐ๐ญ cambodia kh flag nation country banner\n๐จ๐ฒ cameroon cm flag nation country banner\n๐จ๐ฆ canada ca flag nation country banner\n๐ฎ๐จ canary islands flag nation country banner\n๐ฐ๐พ cayman islands flag nation country banner\n๐จ๐ซ central african republic flag nation country banner\n๐น๐ฉ chad td flag nation country banner\n๐จ๐ฑ chile flag nation country banner\n๐จ๐ณ cn china chinese prc flag country nation banner\n๐จ๐ฝ christmas island flag nation country banner\n๐จ๐จ cocos islands keeling flag nation country banner\n๐จ๐ด colombia co flag nation country banner\n๐ฐ๐ฒ comoros km flag nation country banner\n๐จ๐ฌ congo brazzaville flag nation country banner\n๐จ๐ฉ congo kinshasa democratic republic flag nation country banner\n๐จ๐ฐ cook islands flag nation country banner\n๐จ๐ท costa rica flag nation country banner\n๐ญ๐ท croatia hr flag nation country banner\n๐จ๐บ cuba cu flag nation country banner\n๐จ๐ผ curacao flag nation country banner\n๐จ๐พ cyprus cy flag nation country banner\n๐จ๐ฟ czech republic cz flag nation country banner\n๐ฉ๐ฐ denmark dk flag nation country banner\n๐ฉ๐ฏ djibouti dj flag nation country banner\n๐ฉ๐ฒ dominica dm flag nation country banner\n๐ฉ๐ด dominican republic flag nation country banner\n๐ช๐จ ecuador ec flag nation country banner\n๐ช๐ฌ egypt eg flag nation country banner\n๐ธ๐ป el salvador flag nation country banner\n๐ฌ๐ถ equatorial guinea gn flag nation country banner\n๐ช๐ท eritrea er flag nation country banner\n๐ช๐ช estonia ee flag nation country banner\n๐ช๐น ethiopia et flag nation country banner\n๐ช๐บ eu european union flag banner\n๐ซ๐ฐ falkland islands malvinas flag nation country banner\n๐ซ๐ด faroe islands flag nation country banner\n๐ซ๐ฏ fiji fj flag nation country banner\n๐ซ๐ฎ finland fi flag nation country banner\n๐ซ๐ท fr banner flag nation france french country\n๐ฌ๐ซ french guiana flag nation country banner\n๐ต๐ซ french polynesia flag nation country banner\n๐น๐ซ french southern territories flag nation country banner\n๐ฌ๐ฆ gabon ga flag nation country banner\n๐ฌ๐ฒ gambia gm flag nation country banner\n๐ฌ๐ช georgia ge flag nation country banner\n๐ฉ๐ช de german nation flag country banner\n๐ฌ๐ญ ghana gh flag nation country banner\n๐ฌ๐ฎ gibraltar gi flag nation country banner\n๐ฌ๐ท greece gr flag nation country banner\n๐ฌ๐ฑ greenland gl flag nation country banner\n๐ฌ๐ฉ grenada gd flag nation country banner\n๐ฌ๐ต guadeloupe gp flag nation country banner\n๐ฌ๐บ guam gu flag nation country banner\n๐ฌ๐น guatemala gt flag nation country banner\n๐ฌ๐ฌ guernsey gg flag nation country banner\n๐ฌ๐ณ guinea gn flag nation country banner\n๐ฌ๐ผ guinea bissau gw flag nation country banner\n๐ฌ๐พ guyana gy flag nation country banner\n๐ญ๐น haiti ht flag nation country banner\n๐ญ๐ณ honduras hn flag nation country banner\n๐ญ๐ฐ hong kong flag nation country banner\n๐ญ๐บ hungary hu flag nation country banner\n๐ฎ๐ธ iceland is flag nation country banner\n๐ฎ๐ณ india in flag nation country banner\n๐ฎ๐ฉ indonesia flag nation country banner\n๐ฎ๐ท iran islamic republic flag nation country banner\n๐ฎ๐ถ iraq iq flag nation country banner\n๐ฎ๐ช ireland ie flag nation country banner\n๐ฎ๐ฒ isle of man flag nation country banner\n๐ฎ๐ฑ israel il flag nation country banner\n๐ฎ๐น it italy flag nation country banner\n๐จ๐ฎ cote divoire ivory coast flag nation country banner\n๐ฏ๐ฒ jamaica jm flag nation country banner\n๐ฏ๐ต jp japanese nation flag country banner\n๐ฏ๐ช jersey je flag nation country banner\n๐ฏ๐ด jordan jo flag nation country banner\n๐ฐ๐ฟ kazakhstan kz flag nation country banner\n๐ฐ๐ช kenya ke flag nation country banner\n๐ฐ๐ฎ kiribati ki flag nation country banner\n๐ฝ๐ฐ kosovo xk flag nation country banner\n๐ฐ๐ผ kuwait kw flag nation country banner\n๐ฐ๐ฌ kyrgyzstan kg flag nation country banner\n๐ฑ๐ฆ laos lao democratic republic flag nation country banner\n๐ฑ๐ป latvia lv flag nation country banner\n๐ฑ๐ง lebanon lb flag nation country banner\n๐ฑ๐ธ lesotho ls flag nation country banner\n๐ฑ๐ท liberia lr flag nation country banner\n๐ฑ๐พ libya ly flag nation country banner\n๐ฑ๐ฎ liechtenstein li flag nation country banner\n๐ฑ๐น lithuania lt flag nation country banner\n๐ฑ๐บ luxembourg lu flag nation country banner\n๐ฒ๐ด macau macao flag nation country banner\n๐ฒ๐ฐ macedonia flag nation country banner\n๐ฒ๐ฌ madagascar mg flag nation country banner\n๐ฒ๐ผ malawi mw flag nation country banner\n๐ฒ๐พ malaysia my flag nation country banner\n๐ฒ๐ป maldives mv flag nation country banner\n๐ฒ๐ฑ mali ml flag nation country banner\n๐ฒ๐น malta mt flag nation country banner\n๐ฒ๐ญ marshall islands flag nation country banner\n๐ฒ๐ถ martinique mq flag nation country banner\n๐ฒ๐ท mauritania mr flag nation country banner\n๐ฒ๐บ mauritius mu flag nation country banner\n๐พ๐น mayotte yt flag nation country banner\n๐ฒ๐ฝ mexico mx flag nation country banner\n๐ซ๐ฒ micronesia federated states flag nation country banner\n๐ฒ๐ฉ moldova republic flag nation country banner\n๐ฒ๐จ monaco mc flag nation country banner\n๐ฒ๐ณ mongolia mn flag nation country banner\n๐ฒ๐ช montenegro me flag nation country banner\n๐ฒ๐ธ montserrat ms flag nation country banner\n๐ฒ๐ฆ morocco ma flag nation country banner\n๐ฒ๐ฟ mozambique mz flag nation country banner\n๐ฒ๐ฒ myanmar mm flag nation country banner\n๐ณ๐ฆ namibia na flag nation country banner\n๐ณ๐ท nauru nr flag nation country banner\n๐ณ๐ต nepal np flag nation country banner\n๐ณ๐ฑ netherlands nl flag nation country banner\n๐ณ๐จ new caledonia flag nation country banner\n๐ณ๐ฟ new zealand flag nation country banner\n๐ณ๐ฎ nicaragua ni flag nation country banner\n๐ณ๐ช niger ne flag nation country banner\n๐ณ๐ฌ nigeria flag nation country banner\n๐ณ๐บ niue nu flag nation country banner\n๐ณ๐ซ norfolk island flag nation country banner\n๐ฒ๐ต northern mariana islands flag nation country banner\n๐ฐ๐ต north korea nation flag country banner\n๐ณ๐ด norway no flag nation country banner\n๐ด๐ฒ oman flag nation country banner\n๐ต๐ฐ pakistan pk flag nation country banner\n๐ต๐ผ palau pw flag nation country banner\n๐ต๐ธ palestinian territories palestine flag nation country banner\n๐ต๐ฆ panama pa flag nation country banner\n๐ต๐ฌ papua new guinea flag nation country banner\n๐ต๐พ paraguay py flag nation country banner\n๐ต๐ช peru pe flag nation country banner\n๐ต๐ญ philippines ph flag nation country banner\n๐ต๐ณ pitcairn islands flag nation country banner\n๐ต๐ฑ poland pl flag nation country banner\n๐ต๐น portugal pt flag nation country banner\n๐ต๐ท puerto rico flag nation country banner\n๐ถ๐ฆ qatar qa flag nation country banner\n๐ท๐ช reunion flag nation country banner\n๐ท๐ด romania ro flag nation country banner\n๐ท๐บ ru russian federation flag nation country banner\n๐ท๐ผ rwanda rw flag nation country banner\n๐ง๐ฑ st barthelemy saint flag nation country banner\n๐ธ๐ญ st helena saint ascension tristan cunha flag nation country banner\n๐ฐ๐ณ st kitts nevis saint flag nation country banner\n๐ฑ๐จ st lucia saint flag nation country banner\n๐ต๐ฒ st pierre miquelon saint flag nation country banner\n๐ป๐จ st vincent grenadines saint flag nation country banner\n๐ผ๐ธ samoa ws flag nation country banner\n๐ธ๐ฒ san marino flag nation country banner\n๐ธ๐น sao tome principe flag nation country banner\n๐ธ๐ฆ saudi arabia flag nation country banner\n๐ธ๐ณ senegal sn flag nation country banner\n๐ท๐ธ serbia rs flag nation country banner\n๐ธ๐จ seychelles sc flag nation country banner\n๐ธ๐ฑ sierra leone flag nation country banner\n๐ธ๐ฌ singapore sg flag nation country banner\n๐ธ๐ฝ sint maarten dutch flag nation country banner\n๐ธ๐ฐ slovakia sk flag nation country banner\n๐ธ๐ฎ slovenia si flag nation country banner\n๐ธ๐ง solomon islands flag nation country banner\n๐ธ๐ด somalia so flag nation country banner\n๐ฟ๐ฆ south africa flag nation country banner\n๐ฌ๐ธ south georgia sandwich islands flag nation country banner\n๐ฐ๐ท kr south korea nation flag country banner\n๐ธ๐ธ south sudan sd flag nation country banner\n๐ช๐ธ es spain flag nation country banner\n๐ฑ๐ฐ sri lanka flag nation country banner\n๐ธ๐ฉ sudan sd flag nation country banner\n๐ธ๐ท suriname sr flag nation country banner\n๐ธ๐ฟ swaziland sz flag nation country banner\n๐ธ๐ช sweden se flag nation country banner\n๐จ๐ญ switzerland ch flag nation country banner\n๐ธ๐พ syria syrian arab republic flag nation country banner\n๐น๐ผ taiwan tw flag nation country banner\n๐น๐ฏ tajikistan tj flag nation country banner\n๐น๐ฟ tanzania united republic flag nation country banner\n๐น๐ญ thailand th flag nation country banner\n๐น๐ฑ timor leste flag nation country banner\n๐น๐ฌ togo tg flag nation country banner\n๐น๐ฐ tokelau tk flag nation country banner\n๐น๐ด tonga to flag nation country banner\n๐น๐น trinidad tobago flag nation country banner\n๐น๐ณ tunisia tn flag nation country banner\n๐น๐ท tr turkey flag nation country banner\n๐น๐ฒ turkmenistan flag nation country banner\n๐น๐จ turks caicos islands flag nation country banner\n๐น๐ป tuvalu flag nation country banner\n๐บ๐ฌ uganda ug flag nation country banner\n๐บ๐ฆ ukraine ua flag nation country banner\n๐ฆ๐ช united arab emirates flag nation country banner\n๐ฌ๐ง uk united kingdom great britain northern ireland flag nation country banner british english england\n๐ด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ england flag english\n๐ด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ scotland flag scottish\n๐ด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ wales flag welsh\n๐บ๐ธ us united states america flag nation country banner\n๐ป๐ฎ us virgin islands flag nation country banner\n๐บ๐พ uruguay uy flag nation country banner\n๐บ๐ฟ uzbekistan uz flag nation country banner\n๐ป๐บ vanuatu vu flag nation country banner\n๐ป๐ฆ vatican city flag nation country banner\n๐ป๐ช venezuela ve bolivarian republic flag nation country banner\n๐ป๐ณ vietnam viet nam flag nation country banner\n๐ผ๐ซ wallis futuna flag nation country banner\n๐ช๐ญ western sahara flag nation country banner\n๐พ๐ช yemen ye flag nation country banner\n๐ฟ๐ฒ zambia zm flag nation country banner\n๐ฟ๐ผ zimbabwe zw flag nation country banner\n๐ฅฒ smiling face with tear happy sad grateful touched\n๐ฎโ๐จ face exhaling sigh relief tired exhale\n๐ฅธ disguised face disguise glasses mustache incognito\n๐ฅฑ yawning face yawn tired sleepy bored\n๐ค pinched fingers italian what gesture\n๐ค pinching hand small tiny little\n๐ฆพ mechanical arm robot strong prosthetic\n๐ซถ heart hands love support\n๐ซก saluting face salute respect yes\n๐ซ melting face melt hot embarrassed\n๐ซข face with open eyes and hand over mouth shock surprise gasp\n๐ซฃ face with peeking eye peek shy scared\n๐ซฅ dotted line face invisible hidden\n๐ค white heart love pure\n๐ค brown heart love\nโค๏ธโ๐ฅ heart on fire love passion burning\nโค๏ธโ๐ฉน mending heart healing recovery love\n๐ซ blueberries fruit berry\n๐ง beverage box juice drink\n๐ง bubble tea boba drink milk\n`;\n"],"names":[],"mappings":"AAKO,MAAM,qBAAwB,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA"}
|
|
@@ -64,6 +64,7 @@ function readMatches(data) {
|
|
|
64
64
|
}
|
|
65
65
|
function useContactMatches(gql, contacts, viewer, phone) {
|
|
66
66
|
const [permission, setPermission] = React.useState(contacts ? "undetermined" : "unsupported");
|
|
67
|
+
const [limited, setLimited] = React.useState(false);
|
|
67
68
|
const [loading, setLoading] = React.useState(true);
|
|
68
69
|
const [error, setError] = React.useState(null);
|
|
69
70
|
const [peers, setPeers] = React.useState([]);
|
|
@@ -119,6 +120,10 @@ function useContactMatches(gql, contacts, viewer, phone) {
|
|
|
119
120
|
setError(null);
|
|
120
121
|
try {
|
|
121
122
|
await loadPeers();
|
|
123
|
+
if (contacts.isLimited) {
|
|
124
|
+
const isLimited = await contacts.isLimited().catch(() => false);
|
|
125
|
+
if (mounted.current) setLimited(isLimited);
|
|
126
|
+
}
|
|
122
127
|
const raw = await contacts.read();
|
|
123
128
|
const regions = [contacts.defaultRegion, regionFromE164(viewer == null ? void 0 : viewer.phoneE164)];
|
|
124
129
|
const normalized = normalizeContacts(raw, regions, (_a = viewer == null ? void 0 : viewer.phoneE164) != null ? _a : null);
|
|
@@ -217,15 +222,22 @@ function useContactMatches(gql, contacts, viewer, phone) {
|
|
|
217
222
|
setPermission(status);
|
|
218
223
|
if (status === "granted") await sync();
|
|
219
224
|
}, [contacts, sync]);
|
|
225
|
+
const chooseMoreContacts = React.useMemo(() => (contacts == null ? void 0 : contacts.chooseMoreContacts) ? async () => {
|
|
226
|
+
var _a;
|
|
227
|
+
await ((_a = contacts.chooseMoreContacts) == null ? void 0 : _a.call(contacts));
|
|
228
|
+
await sync();
|
|
229
|
+
} : void 0, [contacts, sync]);
|
|
220
230
|
const onYantra = React.useMemo(() => mergeOnYantra(peers, fromBook, viewer == null ? void 0 : viewer.userId), [peers, fromBook, viewer == null ? void 0 : viewer.userId]);
|
|
221
231
|
return {
|
|
222
232
|
permission,
|
|
233
|
+
limited,
|
|
223
234
|
loading,
|
|
224
235
|
error,
|
|
225
236
|
onYantra,
|
|
226
237
|
invitable,
|
|
227
238
|
requestAccess,
|
|
228
239
|
refresh: sync,
|
|
229
|
-
openSettings: async () => contacts == null ? void 0 : contacts.openSettings()
|
|
240
|
+
openSettings: async () => contacts == null ? void 0 : contacts.openSettings(),
|
|
241
|
+
chooseMoreContacts
|
|
230
242
|
};
|
|
231
243
|
}export{useContactMatches};//# sourceMappingURL=useContactMatches.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useContactMatches.js","sources":["../../../src/features/messaging/useContactMatches.ts"],"sourcesContent":["/**\n * The contact sync: read the address book, work out who is already here.\n *\n * The whole pipeline runs in the remote, so all of it is fixable by a surface\n * deploy: normalise -> hash -> ask the server -> split into \"on Yantra\" and\n * \"invite\". Only the address-book read itself is a host seam, because that is\n * the one part needing a native module.\n *\n * With phone-based membership (issue #1312), contact matching delegates to\n * the ChatPhoneSeam, which calls the `yantra-messenger` connector to match\n * E.164 phone numbers against chat members.\n *\n * NOTHING LEAVES THE DEVICE IN PLAINTEXT (legacy mode). Numbers are hashed\n * before the query. See sha256.ts and the server's chat-contact-directory.ts\n * for what that does and does not buy - it is not anonymity, but it does mean\n * we never upload or store the address book of someone who never signed up.\n *\n * If a ChatPhoneSeam is available, it takes precedence for matching.\n */\nimport * as React from 'react';\nimport { CONTACT_MATCHES_QUERY, YANTRA_CHAT_MEMBERS_QUERY } from './chatOperations';\nimport { collectLookupNumbers, normalizeContacts, regionFromE164, type NormalizedContact } from './phoneNumbers';\nimport { sha256 } from './sha256';\nimport type { ChatContactsSeam, ChatGraphQLSeam, ChatPermissionStatus, ChatViewer, ChatPhoneSeam } from './chatHost';\n\nexport interface MatchedContact extends NormalizedContact {\n /** Present when this contact already has an account. */\n match?: { userId: string; displayName: string; picture?: string | null };\n}\n\nexport interface ContactMatchesState {\n permission: ChatPermissionStatus | 'unsupported';\n loading: boolean;\n error: string | null;\n /** Contacts already on Yantra - tap to open a DM. */\n onYantra: MatchedContact[];\n /** Everyone else - tap to invite. */\n invitable: MatchedContact[];\n /** Prompts, then syncs on success. */\n requestAccess: () => Promise<void>;\n /** Re-read the address book and re-match. */\n refresh: () => Promise<void>;\n openSettings: () => Promise<void>;\n}\n\ninterface DirectoryMember {\n phoneE164: string;\n userId: string;\n displayName: string;\n avatarUrl?: string | null;\n}\n\nfunction memberToContact(row: DirectoryMember): MatchedContact {\n return {\n id: `member:${row.userId}`,\n displayName: row.displayName,\n imageUri: row.avatarUrl ?? null,\n e164: row.phoneE164 ? [row.phoneE164] : [],\n match: {\n userId: String(row.userId),\n displayName: row.displayName,\n picture: row.avatarUrl ?? null,\n },\n };\n}\n\nfunction mergeOnYantra(\n peers: MatchedContact[],\n fromBook: MatchedContact[],\n viewerUserId?: string | null,\n): MatchedContact[] {\n const byUser = new Map<string, MatchedContact>();\n for (const row of [...peers, ...fromBook]) {\n const uid = row.match?.userId;\n if (!uid || uid === viewerUserId || !/^[a-f0-9]{24}$/i.test(uid)) continue;\n const existing = byUser.get(uid);\n if (!existing) {\n byUser.set(uid, row);\n continue;\n }\n byUser.set(uid, {\n ...existing,\n displayName: existing.displayName || row.displayName,\n imageUri: existing.imageUri || row.imageUri,\n e164: Array.from(new Set([...existing.e164, ...row.e164])),\n match: {\n ...existing.match!,\n displayName: existing.match?.displayName || row.match?.displayName || existing.displayName,\n picture: existing.match?.picture || row.match?.picture,\n },\n });\n }\n return Array.from(byUser.values()).sort((a, b) => a.displayName.localeCompare(b.displayName));\n}\n\ninterface WireMatch {\n phoneHash?: string;\n userId?: string;\n displayName?: string | null;\n username?: string | null;\n picture?: string | null;\n}\n\n/**\n * The server returns AnyObject, so the payload arrives untyped and possibly as\n * a bare array or wrapped. Normalising defensively here beats trusting a shape\n * the schema does not enforce.\n */\nfunction readMatches(data: unknown): WireMatch[] {\n const raw = (data as { chatContactMatches?: unknown })?.chatContactMatches;\n if (Array.isArray(raw)) return raw as WireMatch[];\n if (raw && typeof raw === 'object' && Array.isArray((raw as { matches?: unknown }).matches)) {\n return (raw as { matches: WireMatch[] }).matches;\n }\n return [];\n}\n\nexport function useContactMatches(\n gql: ChatGraphQLSeam,\n contacts: ChatContactsSeam | undefined,\n viewer: ChatViewer | null,\n phone?: ChatPhoneSeam,\n): ContactMatchesState {\n const [permission, setPermission] = React.useState<ChatPermissionStatus | 'unsupported'>(\n contacts ? 'undetermined' : 'unsupported',\n );\n const [loading, setLoading] = React.useState(true);\n const [error, setError] = React.useState<string | null>(null);\n const [peers, setPeers] = React.useState<MatchedContact[]>([]);\n const [fromBook, setFromBook] = React.useState<MatchedContact[]>([]);\n const [invitable, setInvitable] = React.useState<MatchedContact[]>([]);\n const mounted = React.useRef(true);\n\n React.useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const loadPeers = React.useCallback(async () => {\n try {\n let rows: DirectoryMember[] = [];\n if (phone?.listMembers) {\n const matches = await phone.listMembers();\n rows = Object.values(matches).map((m) => ({\n phoneE164: m.phoneE164,\n userId: m.userId,\n displayName: m.displayName,\n avatarUrl: m.avatarUrl ?? null,\n }));\n } else {\n const res = await gql.query<{ yantraChatMembers?: DirectoryMember[] | null }>(\n YANTRA_CHAT_MEMBERS_QUERY,\n );\n if (res.errors?.length) {\n if (!mounted.current) return;\n setError(res.errors[0].message);\n return;\n }\n rows = res.data?.yantraChatMembers ?? [];\n }\n if (!mounted.current) return;\n const viewerId = viewer?.userId;\n setPeers(\n rows\n .filter((r) => Boolean(r.userId) && r.userId !== viewerId && /^[a-f0-9]{24}$/i.test(r.userId))\n .map(memberToContact),\n );\n } catch (e) {\n if (!mounted.current) return;\n setError(e instanceof Error ? e.message : 'Could not load Yantra Chat members');\n }\n }, [gql, phone, viewer?.userId]);\n\n const sync = React.useCallback(async () => {\n if (!contacts) {\n await loadPeers();\n if (mounted.current) setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n await loadPeers();\n const raw = await contacts.read();\n // Normalisation drops unmatchable numbers and the viewer's own\n // card, which almost everyone has saved.\n // Numbers saved without a country code are read against the device region AND the\n // viewer's verified country: the device may report US for a user whose contacts are Indian.\n const regions = [contacts.defaultRegion, regionFromE164(viewer?.phoneE164)];\n const normalized = normalizeContacts(raw, regions, viewer?.phoneE164 ?? null);\n const numbers = collectLookupNumbers(normalized);\n\n if (!numbers.length) {\n if (!mounted.current) return;\n setFromBook([]);\n setInvitable(normalized);\n setLoading(false);\n return;\n }\n\n let matchedNumbers: Map<string, any>;\n\n if (phone?.matchContacts) {\n // New phone-based membership: use connector to match by E.164 phone number\n try {\n const matches = await phone.matchContacts(numbers);\n matchedNumbers = new Map(Object.entries(matches).map(([phoneE164, match]) => [phoneE164, match]));\n } catch (err) {\n if (!mounted.current) return;\n setError(err instanceof Error ? err.message : 'Could not match contacts');\n setFromBook([]);\n setInvitable(normalized);\n setLoading(false);\n return;\n }\n } else {\n // Legacy hashed directory approach\n const byHash = new Map<string, string>();\n for (const n of numbers) byHash.set(sha256(n), n);\n\n const res = await gql.query(CONTACT_MATCHES_QUERY, { phoneHashes: Array.from(byHash.keys()) });\n if (!mounted.current) return;\n\n matchedNumbers = new Map<string, any>();\n for (const m of readMatches(res.data)) {\n const number = m?.phoneHash ? byHash.get(m.phoneHash) : undefined;\n if (number && m?.userId) matchedNumbers.set(number, m);\n }\n\n if (res.errors?.length) {\n setError(res.errors[0].message);\n }\n }\n\n const here: MatchedContact[] = [];\n const rest: MatchedContact[] = [];\n for (const c of normalized) {\n const hit = c.e164.map((n) => matchedNumbers.get(n)).find(Boolean);\n if (hit?.userId) {\n here.push({\n ...c,\n match: {\n userId: String(hit.userId),\n // Prefer the name from THEIR account over the one in\n // your address book only when yours is missing -\n // you called them \"Mum\" for a reason.\n displayName: c.displayName || hit.displayName || hit.username || 'Unknown',\n picture: hit.avatarUrl ?? hit.picture ?? null,\n },\n });\n } else {\n rest.push(c);\n }\n }\n\n here.sort((a, b) => a.displayName.localeCompare(b.displayName));\n rest.sort((a, b) => a.displayName.localeCompare(b.displayName));\n setFromBook(here);\n setInvitable(rest);\n } catch (e) {\n if (!mounted.current) return;\n setError(e instanceof Error ? e.message : 'Could not read your contacts.');\n } finally {\n if (mounted.current) setLoading(false);\n }\n }, [contacts, gql, viewer, phone, loadPeers]);\n\n React.useEffect(() => {\n void loadPeers().finally(() => {\n if (mounted.current) setLoading(false);\n });\n }, [loadPeers]);\n\n // Check the CURRENT status without prompting, so the screen can offer the\n // right action - ask, or deep-link to Settings after a previous denial.\n React.useEffect(() => {\n let cancelled = false;\n if (!contacts) {\n setPermission('unsupported');\n return () => undefined;\n }\n void (async () => {\n const status = await contacts.getPermission();\n if (cancelled || !mounted.current) return;\n setPermission(status);\n if (status === 'granted') void sync();\n })();\n return () => {\n cancelled = true;\n };\n }, [contacts, sync]);\n\n const requestAccess = React.useCallback(async () => {\n if (!contacts) return;\n const status = await contacts.requestPermission();\n if (!mounted.current) return;\n setPermission(status);\n if (status === 'granted') await sync();\n }, [contacts, sync]);\n\n const onYantra = React.useMemo(\n () => mergeOnYantra(peers, fromBook, viewer?.userId),\n [peers, fromBook, viewer?.userId],\n );\n\n return {\n permission,\n loading,\n error,\n onYantra,\n invitable,\n requestAccess,\n refresh: sync,\n openSettings: async () => contacts?.openSettings(),\n };\n}\n"],"names":["_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useContactMatches.js","sources":["../../../src/features/messaging/useContactMatches.ts"],"sourcesContent":["/**\n * The contact sync: read the address book, work out who is already here.\n *\n * The whole pipeline runs in the remote, so all of it is fixable by a surface\n * deploy: normalise -> hash -> ask the server -> split into \"on Yantra\" and\n * \"invite\". Only the address-book read itself is a host seam, because that is\n * the one part needing a native module.\n *\n * With phone-based membership (issue #1312), contact matching delegates to\n * the ChatPhoneSeam, which calls the `yantra-messenger` connector to match\n * E.164 phone numbers against chat members.\n *\n * NOTHING LEAVES THE DEVICE IN PLAINTEXT (legacy mode). Numbers are hashed\n * before the query. See sha256.ts and the server's chat-contact-directory.ts\n * for what that does and does not buy - it is not anonymity, but it does mean\n * we never upload or store the address book of someone who never signed up.\n *\n * If a ChatPhoneSeam is available, it takes precedence for matching.\n */\nimport * as React from 'react';\nimport { CONTACT_MATCHES_QUERY, YANTRA_CHAT_MEMBERS_QUERY } from './chatOperations';\nimport { collectLookupNumbers, normalizeContacts, regionFromE164, type NormalizedContact } from './phoneNumbers';\nimport { sha256 } from './sha256';\nimport type { ChatContactsSeam, ChatGraphQLSeam, ChatPermissionStatus, ChatViewer, ChatPhoneSeam } from './chatHost';\n\nexport interface MatchedContact extends NormalizedContact {\n /** Present when this contact already has an account. */\n match?: { userId: string; displayName: string; picture?: string | null };\n}\n\nexport interface ContactMatchesState {\n permission: ChatPermissionStatus | 'unsupported';\n /** Granted for selected contacts only (iOS 18 Limited Access). */\n limited: boolean;\n loading: boolean;\n error: string | null;\n /** Contacts already on Yantra - tap to open a DM. */\n onYantra: MatchedContact[];\n /** Everyone else - tap to invite. */\n invitable: MatchedContact[];\n /** Prompts, then syncs on success. */\n requestAccess: () => Promise<void>;\n /** Re-read the address book and re-match. */\n refresh: () => Promise<void>;\n openSettings: () => Promise<void>;\n /** Present when the host can show the iOS contact access picker. */\n chooseMoreContacts?: () => Promise<void>;\n}\n\ninterface DirectoryMember {\n phoneE164: string;\n userId: string;\n displayName: string;\n avatarUrl?: string | null;\n}\n\nfunction memberToContact(row: DirectoryMember): MatchedContact {\n return {\n id: `member:${row.userId}`,\n displayName: row.displayName,\n imageUri: row.avatarUrl ?? null,\n e164: row.phoneE164 ? [row.phoneE164] : [],\n match: {\n userId: String(row.userId),\n displayName: row.displayName,\n picture: row.avatarUrl ?? null,\n },\n };\n}\n\nfunction mergeOnYantra(\n peers: MatchedContact[],\n fromBook: MatchedContact[],\n viewerUserId?: string | null,\n): MatchedContact[] {\n const byUser = new Map<string, MatchedContact>();\n for (const row of [...peers, ...fromBook]) {\n const uid = row.match?.userId;\n if (!uid || uid === viewerUserId || !/^[a-f0-9]{24}$/i.test(uid)) continue;\n const existing = byUser.get(uid);\n if (!existing) {\n byUser.set(uid, row);\n continue;\n }\n byUser.set(uid, {\n ...existing,\n displayName: existing.displayName || row.displayName,\n imageUri: existing.imageUri || row.imageUri,\n e164: Array.from(new Set([...existing.e164, ...row.e164])),\n match: {\n ...existing.match!,\n displayName: existing.match?.displayName || row.match?.displayName || existing.displayName,\n picture: existing.match?.picture || row.match?.picture,\n },\n });\n }\n return Array.from(byUser.values()).sort((a, b) => a.displayName.localeCompare(b.displayName));\n}\n\ninterface WireMatch {\n phoneHash?: string;\n userId?: string;\n displayName?: string | null;\n username?: string | null;\n picture?: string | null;\n}\n\n/**\n * The server returns AnyObject, so the payload arrives untyped and possibly as\n * a bare array or wrapped. Normalising defensively here beats trusting a shape\n * the schema does not enforce.\n */\nfunction readMatches(data: unknown): WireMatch[] {\n const raw = (data as { chatContactMatches?: unknown })?.chatContactMatches;\n if (Array.isArray(raw)) return raw as WireMatch[];\n if (raw && typeof raw === 'object' && Array.isArray((raw as { matches?: unknown }).matches)) {\n return (raw as { matches: WireMatch[] }).matches;\n }\n return [];\n}\n\nexport function useContactMatches(\n gql: ChatGraphQLSeam,\n contacts: ChatContactsSeam | undefined,\n viewer: ChatViewer | null,\n phone?: ChatPhoneSeam,\n): ContactMatchesState {\n const [permission, setPermission] = React.useState<ChatPermissionStatus | 'unsupported'>(\n contacts ? 'undetermined' : 'unsupported',\n );\n const [limited, setLimited] = React.useState(false);\n const [loading, setLoading] = React.useState(true);\n const [error, setError] = React.useState<string | null>(null);\n const [peers, setPeers] = React.useState<MatchedContact[]>([]);\n const [fromBook, setFromBook] = React.useState<MatchedContact[]>([]);\n const [invitable, setInvitable] = React.useState<MatchedContact[]>([]);\n const mounted = React.useRef(true);\n\n React.useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const loadPeers = React.useCallback(async () => {\n try {\n let rows: DirectoryMember[] = [];\n if (phone?.listMembers) {\n const matches = await phone.listMembers();\n rows = Object.values(matches).map((m) => ({\n phoneE164: m.phoneE164,\n userId: m.userId,\n displayName: m.displayName,\n avatarUrl: m.avatarUrl ?? null,\n }));\n } else {\n const res = await gql.query<{ yantraChatMembers?: DirectoryMember[] | null }>(\n YANTRA_CHAT_MEMBERS_QUERY,\n );\n if (res.errors?.length) {\n if (!mounted.current) return;\n setError(res.errors[0].message);\n return;\n }\n rows = res.data?.yantraChatMembers ?? [];\n }\n if (!mounted.current) return;\n const viewerId = viewer?.userId;\n setPeers(\n rows\n .filter((r) => Boolean(r.userId) && r.userId !== viewerId && /^[a-f0-9]{24}$/i.test(r.userId))\n .map(memberToContact),\n );\n } catch (e) {\n if (!mounted.current) return;\n setError(e instanceof Error ? e.message : 'Could not load Yantra Chat members');\n }\n }, [gql, phone, viewer?.userId]);\n\n const sync = React.useCallback(async () => {\n if (!contacts) {\n await loadPeers();\n if (mounted.current) setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n await loadPeers();\n // Re-checked on every sync: the user can widen or narrow access in Settings at any time.\n if (contacts.isLimited) {\n const isLimited = await contacts.isLimited().catch(() => false);\n if (mounted.current) setLimited(isLimited);\n }\n const raw = await contacts.read();\n // Normalisation drops unmatchable numbers and the viewer's own\n // card, which almost everyone has saved.\n // Numbers saved without a country code are read against the device region AND the\n // viewer's verified country: the device may report US for a user whose contacts are Indian.\n const regions = [contacts.defaultRegion, regionFromE164(viewer?.phoneE164)];\n const normalized = normalizeContacts(raw, regions, viewer?.phoneE164 ?? null);\n const numbers = collectLookupNumbers(normalized);\n\n if (!numbers.length) {\n if (!mounted.current) return;\n setFromBook([]);\n setInvitable(normalized);\n setLoading(false);\n return;\n }\n\n let matchedNumbers: Map<string, any>;\n\n if (phone?.matchContacts) {\n // New phone-based membership: use connector to match by E.164 phone number\n try {\n const matches = await phone.matchContacts(numbers);\n matchedNumbers = new Map(Object.entries(matches).map(([phoneE164, match]) => [phoneE164, match]));\n } catch (err) {\n if (!mounted.current) return;\n setError(err instanceof Error ? err.message : 'Could not match contacts');\n setFromBook([]);\n setInvitable(normalized);\n setLoading(false);\n return;\n }\n } else {\n // Legacy hashed directory approach\n const byHash = new Map<string, string>();\n for (const n of numbers) byHash.set(sha256(n), n);\n\n const res = await gql.query(CONTACT_MATCHES_QUERY, { phoneHashes: Array.from(byHash.keys()) });\n if (!mounted.current) return;\n\n matchedNumbers = new Map<string, any>();\n for (const m of readMatches(res.data)) {\n const number = m?.phoneHash ? byHash.get(m.phoneHash) : undefined;\n if (number && m?.userId) matchedNumbers.set(number, m);\n }\n\n if (res.errors?.length) {\n setError(res.errors[0].message);\n }\n }\n\n const here: MatchedContact[] = [];\n const rest: MatchedContact[] = [];\n for (const c of normalized) {\n const hit = c.e164.map((n) => matchedNumbers.get(n)).find(Boolean);\n if (hit?.userId) {\n here.push({\n ...c,\n match: {\n userId: String(hit.userId),\n // Prefer the name from THEIR account over the one in\n // your address book only when yours is missing -\n // you called them \"Mum\" for a reason.\n displayName: c.displayName || hit.displayName || hit.username || 'Unknown',\n picture: hit.avatarUrl ?? hit.picture ?? null,\n },\n });\n } else {\n rest.push(c);\n }\n }\n\n here.sort((a, b) => a.displayName.localeCompare(b.displayName));\n rest.sort((a, b) => a.displayName.localeCompare(b.displayName));\n setFromBook(here);\n setInvitable(rest);\n } catch (e) {\n if (!mounted.current) return;\n setError(e instanceof Error ? e.message : 'Could not read your contacts.');\n } finally {\n if (mounted.current) setLoading(false);\n }\n }, [contacts, gql, viewer, phone, loadPeers]);\n\n React.useEffect(() => {\n void loadPeers().finally(() => {\n if (mounted.current) setLoading(false);\n });\n }, [loadPeers]);\n\n // Check the CURRENT status without prompting, so the screen can offer the\n // right action - ask, or deep-link to Settings after a previous denial.\n React.useEffect(() => {\n let cancelled = false;\n if (!contacts) {\n setPermission('unsupported');\n return () => undefined;\n }\n void (async () => {\n const status = await contacts.getPermission();\n if (cancelled || !mounted.current) return;\n setPermission(status);\n if (status === 'granted') void sync();\n })();\n return () => {\n cancelled = true;\n };\n }, [contacts, sync]);\n\n const requestAccess = React.useCallback(async () => {\n if (!contacts) return;\n const status = await contacts.requestPermission();\n if (!mounted.current) return;\n setPermission(status);\n if (status === 'granted') await sync();\n }, [contacts, sync]);\n\n // Reopens the address book afterwards: the user may have just shared more people.\n const chooseMoreContacts = React.useMemo(\n () =>\n contacts?.chooseMoreContacts\n ? async () => {\n await contacts.chooseMoreContacts?.();\n await sync();\n }\n : undefined,\n [contacts, sync],\n );\n\n const onYantra = React.useMemo(\n () => mergeOnYantra(peers, fromBook, viewer?.userId),\n [peers, fromBook, viewer?.userId],\n );\n\n return {\n permission,\n limited,\n loading,\n error,\n onYantra,\n invitable,\n requestAccess,\n refresh: sync,\n openSettings: async () => contacts?.openSettings(),\n chooseMoreContacts,\n };\n}\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsx}from'react/jsx-runtime';import {useMemo,useCallback}from'react';import {PendingConnectorConnectCard}from'../features/chat/ConnectorConnectPrompt.js';import {displayConnectorConnectMessages,displayConnectorConnectText}from'
|
|
1
|
+
import {jsx}from'react/jsx-runtime';import {useMemo,useCallback}from'react';import {PendingConnectorConnectCard}from'../features/chat/ConnectorConnectPrompt.js';import {displayConnectorConnectMessages,displayConnectorConnectText}from'common';function displayStreaming(text) {
|
|
2
2
|
return text ? displayConnectorConnectText(text, true) || null : null;
|
|
3
3
|
}
|
|
4
4
|
function useHostConnectorCard(chat, channelId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHostConnectorCard.js","sources":["../../src/hooks/useHostConnectorCard.tsx"],"sourcesContent":["/**\n * The `[CONNECTOR_CONNECT]` card for a native surface chat (shop, travel, jobs,\n * resume), built on the surface's HOST screen.\n *\n * The surface UI ships as a federated remote that must not bundle the host's data\n * stack (Apollo, redux, `common`, expo-web-browser) - see useShoppingHostChat. So\n * the host does everything protocol-shaped: it cleans the thread before the remote\n * sees it (the markers and the card's replies are not shown as text) and hands the\n * remote a render function for the card, which the remote only places above its\n * composer. The card is a host component; rendered inside the remote's tree it\n * still reads the host's providers, which wrap that tree.\n *\n * The reply goes to the host channel directly - not through the surface's own\n * `onSend`, which may route text to a local lane or wrap it in context - and only\n * counts as sent when the channel took it (sent, or parked in the durable outbox,\n * whose row then settles the request).\n */\nimport React, { useCallback, useMemo, type ReactNode } from 'react';\nimport { PendingConnectorConnectCard } from '../features/chat/ConnectorConnectPrompt';\nimport { displayConnectorConnectMessages, displayConnectorConnectText } from '../features/chat/connectorConnect';\nimport type { useChatStream } from './useChatStream';\n\ntype HostChatStream = Pick<ReturnType<typeof useChatStream>, 'messages' | 'queuedMessages' | 'sendMessage'>;\n\nexport interface HostConnectorCard {\n /** The card for the request still waiting in the thread (renders nothing when none is). */\n renderConnectorCard: (isDark: boolean) => ReactNode;\n /** A thread as the remote's transcript should show it: markers and card replies out. */\n displayMessages: <T extends { role: string; content: string }>(messages: ReadonlyArray<T>) => T[];\n /** The streaming reply as the remote should show it: a half-written marker never flashes. */\n displayStreaming: (text: string | null | undefined) => string | null;\n}\n\n/** The streaming reply as a remote shows it; module-level so its identity never changes. */\nfunction displayStreaming(text: string | null | undefined): string | null {\n return text ? displayConnectorConnectText(text, true) || null : null;\n}\n\nexport function useHostConnectorCard(chat: HostChatStream, channelId: string): HostConnectorCard {\n const { messages, queuedMessages, sendMessage } = chat;\n\n // The thread plus the outbox: a reply parked while the gateway is down is the\n // newest user row, so the request reads as answered and the card stays gone.\n const rows = useMemo(\n () => [\n ...messages.map((m) => ({ role: m.role, content: m.content })),\n ...queuedMessages.map((q) => ({ role: 'user', content: q.text })),\n ],\n [messages, queuedMessages],\n );\n\n const send = useCallback(\n async (text: string) => (await sendMessage(text, undefined, channelId)) !== 'failed',\n [sendMessage, channelId],\n );\n\n const renderConnectorCard = useCallback(\n (isDark: boolean) => <PendingConnectorConnectCard messages={rows} send={send} isDark={isDark} />,\n [rows, send],\n );\n\n return useMemo(\n () => ({ renderConnectorCard, displayMessages: displayConnectorConnectMessages, displayStreaming }),\n [renderConnectorCard],\n );\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useHostConnectorCard.js","sources":["../../src/hooks/useHostConnectorCard.tsx"],"sourcesContent":["/**\n * The `[CONNECTOR_CONNECT]` card for a native surface chat (shop, travel, jobs,\n * resume), built on the surface's HOST screen.\n *\n * The surface UI ships as a federated remote that must not bundle the host's data\n * stack (Apollo, redux, `common`, expo-web-browser) - see useShoppingHostChat. So\n * the host does everything protocol-shaped: it cleans the thread before the remote\n * sees it (the markers and the card's replies are not shown as text) and hands the\n * remote a render function for the card, which the remote only places above its\n * composer. The card is a host component; rendered inside the remote's tree it\n * still reads the host's providers, which wrap that tree.\n *\n * The reply goes to the host channel directly - not through the surface's own\n * `onSend`, which may route text to a local lane or wrap it in context - and only\n * counts as sent when the channel took it (sent, or parked in the durable outbox,\n * whose row then settles the request).\n */\nimport React, { useCallback, useMemo, type ReactNode } from 'react';\nimport { PendingConnectorConnectCard } from '../features/chat/ConnectorConnectPrompt';\nimport { displayConnectorConnectMessages, displayConnectorConnectText } from '../features/chat/connectorConnect';\nimport type { useChatStream } from './useChatStream';\n\ntype HostChatStream = Pick<ReturnType<typeof useChatStream>, 'messages' | 'queuedMessages' | 'sendMessage'>;\n\nexport interface HostConnectorCard {\n /** The card for the request still waiting in the thread (renders nothing when none is). */\n renderConnectorCard: (isDark: boolean) => ReactNode;\n /** A thread as the remote's transcript should show it: markers and card replies out. */\n displayMessages: <T extends { role: string; content: string }>(messages: ReadonlyArray<T>) => T[];\n /** The streaming reply as the remote should show it: a half-written marker never flashes. */\n displayStreaming: (text: string | null | undefined) => string | null;\n}\n\n/** The streaming reply as a remote shows it; module-level so its identity never changes. */\nfunction displayStreaming(text: string | null | undefined): string | null {\n return text ? displayConnectorConnectText(text, true) || null : null;\n}\n\nexport function useHostConnectorCard(chat: HostChatStream, channelId: string): HostConnectorCard {\n const { messages, queuedMessages, sendMessage } = chat;\n\n // The thread plus the outbox: a reply parked while the gateway is down is the\n // newest user row, so the request reads as answered and the card stays gone.\n const rows = useMemo(\n () => [\n ...messages.map((m) => ({ role: m.role, content: m.content })),\n ...queuedMessages.map((q) => ({ role: 'user', content: q.text })),\n ],\n [messages, queuedMessages],\n );\n\n const send = useCallback(\n async (text: string) => (await sendMessage(text, undefined, channelId)) !== 'failed',\n [sendMessage, channelId],\n );\n\n const renderConnectorCard = useCallback(\n (isDark: boolean) => <PendingConnectorConnectCard messages={rows} send={send} isDark={isDark} />,\n [rows, send],\n );\n\n return useMemo(\n () => ({ renderConnectorCard, displayMessages: displayConnectorConnectMessages, displayStreaming }),\n [renderConnectorCard],\n );\n}\n"],"names":[],"mappings":"kPAmCA,SAAS,iBAAiB,IAAgD,EAAA;AACxE,EAAA,OAAO,IAAO,GAAA,2BAAA,CAA4B,IAAM,EAAA,IAAI,KAAK,IAAO,GAAA,IAAA;AAClE;AACgB,SAAA,oBAAA,CAAqB,MAAsB,SAAsC,EAAA;AAC/F,EAAM,MAAA;AAAA,IACJ,QAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACE,GAAA,IAAA;AAIJ,EAAA,MAAM,OAAO,OAAQ,CAAA,MAAM,CAAC,GAAG,QAAA,CAAS,IAAI,CAAM,CAAA,MAAA;AAAA,IAChD,MAAM,CAAE,CAAA,IAAA;AAAA,IACR,SAAS,CAAE,CAAA;AAAA,GACX,CAAA,CAAA,EAAG,GAAG,cAAA,CAAe,IAAI,CAAM,CAAA,MAAA;AAAA,IAC/B,IAAM,EAAA,MAAA;AAAA,IACN,SAAS,CAAE,CAAA;AAAA,IACX,CAAC,CAAA,EAAG,CAAC,QAAA,EAAU,cAAc,CAAC,CAAA;AAChC,EAAA,MAAM,IAAO,GAAA,WAAA,CAAY,OAAO,IAAA,KAAkB,MAAM,WAAY,CAAA,IAAA,EAAM,MAAW,EAAA,SAAS,CAAO,KAAA,QAAA,EAAU,CAAC,WAAA,EAAa,SAAS,CAAC,CAAA;AACvI,EAAA,MAAM,mBAAsB,GAAA,WAAA,CAAY,CAAC,MAAA,yBAAqB,2BAA4B,EAAA,EAAA,QAAA,EAAU,IAAM,EAAA,IAAA,EAAY,MAAgB,EAAA,CAAA,EAAI,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AACtJ,EAAA,OAAO,QAAQ,OAAO;AAAA,IACpB,mBAAA;AAAA,IACA,eAAiB,EAAA,+BAAA;AAAA,IACjB;AAAA,GACF,CAAA,EAAI,CAAC,mBAAmB,CAAC,CAAA;AAC3B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useMemo,useLayoutEffect,useCallback,useState,useRef,useEffect}from'react';import {useWindowDimensions,Keyboard,View,StyleSheet,Pressable}from'react-native';import {getDefaultLeftItems,Box,Text,InputToolBar}from'@admin-layout/gluestack-ui-mobile';import {useSafeAreaInsets,SafeAreaView}from'react-native-safe-area-context';import {useNavigation,useRoute,CommonActions}from'@react-navigation/native';import {MessageActionBar}from'../../features/chat/MessageActionBar.js';import {ChatTranscript}from'../../features/chat/ChatTranscript.js';import {AskUserCard}from'../../features/chat/AskUserCard.js';import {pendingAskUser}from'../../features/chat/askUser.js';import {PendingConnectorConnectCard}from'../../features/chat/ConnectorConnectPrompt.js';import {QueuedFollowUps}from'../../features/chat/QueuedFollowUps.js';import {displayConnectorConnectMessages,displayConnectorConnectText}from'
|
|
1
|
+
import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useMemo,useLayoutEffect,useCallback,useState,useRef,useEffect}from'react';import {useWindowDimensions,Keyboard,View,StyleSheet,Pressable}from'react-native';import {getDefaultLeftItems,Box,Text,InputToolBar}from'@admin-layout/gluestack-ui-mobile';import {useSafeAreaInsets,SafeAreaView}from'react-native-safe-area-context';import {useNavigation,useRoute,CommonActions}from'@react-navigation/native';import {MessageActionBar}from'../../features/chat/MessageActionBar.js';import {ChatTranscript}from'../../features/chat/ChatTranscript.js';import {AskUserCard}from'../../features/chat/AskUserCard.js';import {pendingAskUser}from'../../features/chat/askUser.js';import {PendingConnectorConnectCard}from'../../features/chat/ConnectorConnectPrompt.js';import {QueuedFollowUps}from'../../features/chat/QueuedFollowUps.js';import {displayConnectorConnectMessages,displayConnectorConnectText}from'common';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useChatLiveStream}from'../../contexts/ChatLiveStreamContext.js';import {KeyboardAwareScreen,KeyboardComposerDock}from'../../components/KeyboardComposerDock.js';import {YantraBrandLoader,YANTRA_LOADER_SIZE_COMPACT}from'../../components/YantraBrandLoader.js';import ThinkingIndicator from'../../components/ThinkingIndicator.js';import {mobileTokens}from'../../theme/mobileTokens.js';import {useAppTheme}from'../../theme/AppThemeProvider.js';import DeepSearchModal from'../Home/components/DeepSearchModal.js';import {normalizeSummaryText,extractDeepSearchSources}from'../Home/deepSearchUtils.js';import {AudioRecorderPanel}from'../../features/audio-input/AudioRecorderPanel.js';import {NativeDictationBar}from'../../features/audio-input/NativeDictationBar.js';import {isNativeDictationAvailable}from'../../features/audio-input/nativeDictation.js';import {useImageAttachments}from'../../features/attachments/useImageAttachments.js';import {ComposerAttachmentBar}from'../../features/attachments/ComposerAttachmentBar.js';import {useComposerAttachMenu}from'../../features/attachments/ComposerAttachMenu.js';import {hasComposerAttachments,takeComposerAttachments}from'../../features/attachments/composerAttachmentHandoff.js';import {MicErrorBoundary}from'../../features/audio-input/MicErrorBoundary.js';import {requestMicPermission}from'../../features/audio-input/useAudioPermission.js';import {shouldRedirectToShop}from'../../features/shopping/chat/homeShoppingIntent.js';import {replaceWithShopNative,shopHandoffParams,pushShopNative}from'../../features/shopping/chat/openShopNative.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adminide-stack/yantra-mobile",
|
|
3
|
-
"version": "12.0.69-alpha.
|
|
3
|
+
"version": "12.0.69-alpha.22",
|
|
4
4
|
"description": "Sample core for higher packages to depend on",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
"build:clean": "rimraf lib",
|
|
14
14
|
"build:lib": "rollup -c rollup.config.mjs",
|
|
15
15
|
"build:lib:watch": "yarn build:lib -- --watch",
|
|
16
|
+
"gen:emoji-keywords": "node tools/gen-emoji-keywords.mjs",
|
|
16
17
|
"jest": "./node_modules/.bin/jest",
|
|
17
18
|
"prepublish": "yarn build",
|
|
18
19
|
"test": "jest",
|
|
@@ -25,7 +26,7 @@
|
|
|
25
26
|
"uuid": "^9.0.0"
|
|
26
27
|
},
|
|
27
28
|
"devDependencies": {
|
|
28
|
-
"common": "12.0.69-alpha.
|
|
29
|
+
"common": "12.0.69-alpha.22"
|
|
29
30
|
},
|
|
30
31
|
"peerDependencies": {
|
|
31
32
|
"@admin-layout/gluestack-ui-mobile": "*",
|
|
@@ -41,7 +42,7 @@
|
|
|
41
42
|
"@messenger-box/platform-mobile": "*",
|
|
42
43
|
"@react-native-async-storage/async-storage": "*",
|
|
43
44
|
"@react-navigation/native": "*",
|
|
44
|
-
"common": "12.0.69-alpha.
|
|
45
|
+
"common": "12.0.69-alpha.20",
|
|
45
46
|
"expo-constants": "*",
|
|
46
47
|
"expo-secure-store": "*",
|
|
47
48
|
"expo-web-browser": "*",
|
|
@@ -58,5 +59,5 @@
|
|
|
58
59
|
"typescript": {
|
|
59
60
|
"definition": "lib/index.d.ts"
|
|
60
61
|
},
|
|
61
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "4dbcd3ab1cf3d76ada56146666fdf3d151cdd62a"
|
|
62
63
|
}
|